1 //===-- PlatformRemoteAppleWatch.cpp ----------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include <string> 11 #include <vector> 12 13 #include "PlatformRemoteAppleWatch.h" 14 15 #include "lldb/Breakpoint/BreakpointLocation.h" 16 #include "lldb/Core/Module.h" 17 #include "lldb/Core/ModuleList.h" 18 #include "lldb/Core/ModuleSpec.h" 19 #include "lldb/Core/PluginManager.h" 20 #include "lldb/Host/Host.h" 21 #include "lldb/Target/Process.h" 22 #include "lldb/Target/Target.h" 23 #include "lldb/Utility/ArchSpec.h" 24 #include "lldb/Utility/FileSpec.h" 25 #include "lldb/Utility/Log.h" 26 #include "lldb/Utility/Status.h" 27 #include "lldb/Utility/StreamString.h" 28 29 using namespace lldb; 30 using namespace lldb_private; 31 32 //------------------------------------------------------------------ 33 // Static Variables 34 //------------------------------------------------------------------ 35 static uint32_t g_initialize_count = 0; 36 37 //------------------------------------------------------------------ 38 // Static Functions 39 //------------------------------------------------------------------ 40 void PlatformRemoteAppleWatch::Initialize() { 41 PlatformDarwin::Initialize(); 42 43 if (g_initialize_count++ == 0) { 44 PluginManager::RegisterPlugin( 45 PlatformRemoteAppleWatch::GetPluginNameStatic(), 46 PlatformRemoteAppleWatch::GetDescriptionStatic(), 47 PlatformRemoteAppleWatch::CreateInstance); 48 } 49 } 50 51 void PlatformRemoteAppleWatch::Terminate() { 52 if (g_initialize_count > 0) { 53 if (--g_initialize_count == 0) { 54 PluginManager::UnregisterPlugin(PlatformRemoteAppleWatch::CreateInstance); 55 } 56 } 57 58 PlatformDarwin::Terminate(); 59 } 60 61 PlatformSP PlatformRemoteAppleWatch::CreateInstance(bool force, 62 const ArchSpec *arch) { 63 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PLATFORM)); 64 if (log) { 65 const char *arch_name; 66 if (arch && arch->GetArchitectureName()) 67 arch_name = arch->GetArchitectureName(); 68 else 69 arch_name = "<null>"; 70 71 const char *triple_cstr = 72 arch ? arch->GetTriple().getTriple().c_str() : "<null>"; 73 74 log->Printf("PlatformRemoteAppleWatch::%s(force=%s, arch={%s,%s})", 75 __FUNCTION__, force ? "true" : "false", arch_name, triple_cstr); 76 } 77 78 bool create = force; 79 if (!create && arch && arch->IsValid()) { 80 switch (arch->GetMachine()) { 81 case llvm::Triple::arm: 82 case llvm::Triple::aarch64: 83 case llvm::Triple::thumb: { 84 const llvm::Triple &triple = arch->GetTriple(); 85 llvm::Triple::VendorType vendor = triple.getVendor(); 86 switch (vendor) { 87 case llvm::Triple::Apple: 88 create = true; 89 break; 90 91 #if defined(__APPLE__) 92 // Only accept "unknown" for the vendor if the host is Apple and 93 // "unknown" wasn't specified (it was just returned because it was NOT 94 // specified) 95 case llvm::Triple::UnknownArch: 96 create = !arch->TripleVendorWasSpecified(); 97 break; 98 99 #endif 100 default: 101 break; 102 } 103 if (create) { 104 switch (triple.getOS()) { 105 case llvm::Triple::WatchOS: // This is the right triple value for Apple 106 // Watch debugging 107 break; 108 109 default: 110 create = false; 111 break; 112 } 113 } 114 } break; 115 default: 116 break; 117 } 118 } 119 120 #if defined(__APPLE__) && \ 121 (defined(__arm__) || defined(__arm64__) || defined(__aarch64__)) 122 // If lldb is running on a watch, this isn't a RemoteWatch environment; it's 123 // a local system environment. 124 if (force == false) { 125 create = false; 126 } 127 #endif 128 129 if (create) { 130 if (log) 131 log->Printf("PlatformRemoteAppleWatch::%s() creating platform", 132 __FUNCTION__); 133 134 return lldb::PlatformSP(new PlatformRemoteAppleWatch()); 135 } 136 137 if (log) 138 log->Printf("PlatformRemoteAppleWatch::%s() aborting creation of platform", 139 __FUNCTION__); 140 141 return lldb::PlatformSP(); 142 } 143 144 lldb_private::ConstString PlatformRemoteAppleWatch::GetPluginNameStatic() { 145 static ConstString g_name("remote-watchos"); 146 return g_name; 147 } 148 149 const char *PlatformRemoteAppleWatch::GetDescriptionStatic() { 150 return "Remote Apple Watch platform plug-in."; 151 } 152 153 //------------------------------------------------------------------ 154 /// Default Constructor 155 //------------------------------------------------------------------ 156 PlatformRemoteAppleWatch::PlatformRemoteAppleWatch() 157 : PlatformRemoteDarwinDevice() {} 158 159 bool PlatformRemoteAppleWatch::GetSupportedArchitectureAtIndex(uint32_t idx, 160 ArchSpec &arch) { 161 ArchSpec system_arch(GetSystemArchitecture()); 162 163 const ArchSpec::Core system_core = system_arch.GetCore(); 164 switch (system_core) { 165 default: 166 switch (idx) { 167 case 0: 168 arch.SetTriple("arm64-apple-watchos"); 169 return true; 170 case 1: 171 arch.SetTriple("armv7k-apple-watchos"); 172 return true; 173 case 2: 174 arch.SetTriple("armv7s-apple-watchos"); 175 return true; 176 case 3: 177 arch.SetTriple("armv7-apple-watchos"); 178 return true; 179 case 4: 180 arch.SetTriple("thumbv7k-apple-watchos"); 181 return true; 182 case 5: 183 arch.SetTriple("thumbv7-apple-watchos"); 184 return true; 185 case 6: 186 arch.SetTriple("thumbv7s-apple-watchos"); 187 return true; 188 default: 189 break; 190 } 191 break; 192 193 case ArchSpec::eCore_arm_arm64: 194 switch (idx) { 195 case 0: 196 arch.SetTriple("arm64-apple-watchos"); 197 return true; 198 case 1: 199 arch.SetTriple("armv7k-apple-watchos"); 200 return true; 201 case 2: 202 arch.SetTriple("armv7s-apple-watchos"); 203 return true; 204 case 3: 205 arch.SetTriple("armv7-apple-watchos"); 206 return true; 207 case 4: 208 arch.SetTriple("thumbv7k-apple-watchos"); 209 return true; 210 case 5: 211 arch.SetTriple("thumbv7-apple-watchos"); 212 return true; 213 case 6: 214 arch.SetTriple("thumbv7s-apple-watchos"); 215 return true; 216 default: 217 break; 218 } 219 break; 220 221 case ArchSpec::eCore_arm_armv7k: 222 switch (idx) { 223 case 0: 224 arch.SetTriple("armv7k-apple-watchos"); 225 return true; 226 case 1: 227 arch.SetTriple("armv7s-apple-watchos"); 228 return true; 229 case 2: 230 arch.SetTriple("armv7-apple-watchos"); 231 return true; 232 case 3: 233 arch.SetTriple("thumbv7k-apple-watchos"); 234 return true; 235 case 4: 236 arch.SetTriple("thumbv7-apple-watchos"); 237 return true; 238 case 5: 239 arch.SetTriple("thumbv7s-apple-watchos"); 240 return true; 241 default: 242 break; 243 } 244 break; 245 246 case ArchSpec::eCore_arm_armv7s: 247 switch (idx) { 248 case 0: 249 arch.SetTriple("armv7s-apple-watchos"); 250 return true; 251 case 1: 252 arch.SetTriple("armv7k-apple-watchos"); 253 return true; 254 case 2: 255 arch.SetTriple("armv7-apple-watchos"); 256 return true; 257 case 3: 258 arch.SetTriple("thumbv7k-apple-watchos"); 259 return true; 260 case 4: 261 arch.SetTriple("thumbv7-apple-watchos"); 262 return true; 263 case 5: 264 arch.SetTriple("thumbv7s-apple-watchos"); 265 return true; 266 default: 267 break; 268 } 269 break; 270 271 case ArchSpec::eCore_arm_armv7: 272 switch (idx) { 273 case 0: 274 arch.SetTriple("armv7-apple-watchos"); 275 return true; 276 case 1: 277 arch.SetTriple("armv7k-apple-watchos"); 278 return true; 279 case 2: 280 arch.SetTriple("thumbv7k-apple-watchos"); 281 return true; 282 case 3: 283 arch.SetTriple("thumbv7-apple-watchos"); 284 return true; 285 default: 286 break; 287 } 288 break; 289 } 290 arch.Clear(); 291 return false; 292 } 293 294 void PlatformRemoteAppleWatch::GetDeviceSupportDirectoryNames (std::vector<std::string> &dirnames) 295 { 296 dirnames.clear(); 297 dirnames.push_back("watchOS DeviceSupport"); 298 } 299 300 std::string PlatformRemoteAppleWatch::GetPlatformName () 301 { 302 return "WatchOS.platform"; 303 } 304