190 lines · cpp
1//===-- PlatformRemoteAppleWatch.cpp --------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include <string>10#include <vector>11 12#include "PlatformRemoteAppleWatch.h"13 14#include "lldb/Breakpoint/BreakpointLocation.h"15#include "lldb/Core/Module.h"16#include "lldb/Core/ModuleList.h"17#include "lldb/Core/ModuleSpec.h"18#include "lldb/Core/PluginManager.h"19#include "lldb/Host/Host.h"20#include "lldb/Target/Process.h"21#include "lldb/Target/Target.h"22#include "lldb/Utility/ArchSpec.h"23#include "lldb/Utility/FileSpec.h"24#include "lldb/Utility/LLDBLog.h"25#include "lldb/Utility/Log.h"26#include "lldb/Utility/Status.h"27#include "lldb/Utility/StreamString.h"28 29using namespace lldb;30using namespace lldb_private;31 32// Static Variables33static uint32_t g_initialize_count = 0;34 35// Static Functions36void PlatformRemoteAppleWatch::Initialize() {37 PlatformDarwin::Initialize();38 39 if (g_initialize_count++ == 0) {40 PluginManager::RegisterPlugin(41 PlatformRemoteAppleWatch::GetPluginNameStatic(),42 PlatformRemoteAppleWatch::GetDescriptionStatic(),43 PlatformRemoteAppleWatch::CreateInstance);44 }45}46 47void PlatformRemoteAppleWatch::Terminate() {48 if (g_initialize_count > 0) {49 if (--g_initialize_count == 0) {50 PluginManager::UnregisterPlugin(PlatformRemoteAppleWatch::CreateInstance);51 }52 }53 54 PlatformDarwin::Terminate();55}56 57PlatformSP PlatformRemoteAppleWatch::CreateInstance(bool force,58 const ArchSpec *arch) {59 Log *log = GetLog(LLDBLog::Platform);60 if (log) {61 const char *arch_name;62 if (arch && arch->GetArchitectureName())63 arch_name = arch->GetArchitectureName();64 else65 arch_name = "<null>";66 67 const char *triple_cstr =68 arch ? arch->GetTriple().getTriple().c_str() : "<null>";69 70 LLDB_LOGF(log, "PlatformRemoteAppleWatch::%s(force=%s, arch={%s,%s})",71 __FUNCTION__, force ? "true" : "false", arch_name, triple_cstr);72 }73 74 bool create = force;75 if (!create && arch && arch->IsValid()) {76 switch (arch->GetMachine()) {77 case llvm::Triple::arm:78 case llvm::Triple::aarch64:79 case llvm::Triple::aarch64_32:80 case llvm::Triple::thumb: {81 const llvm::Triple &triple = arch->GetTriple();82 llvm::Triple::VendorType vendor = triple.getVendor();83 switch (vendor) {84 case llvm::Triple::Apple:85 create = true;86 break;87 88#if defined(__APPLE__)89 // Only accept "unknown" for the vendor if the host is Apple and90 // "unknown" wasn't specified (it was just returned because it was NOT91 // specified)92 case llvm::Triple::UnknownVendor:93 create = !arch->TripleVendorWasSpecified();94 break;95 96#endif97 default:98 break;99 }100 if (create) {101 switch (triple.getOS()) {102 case llvm::Triple::WatchOS: // This is the right triple value for Apple103 // Watch debugging104 break;105 106 default:107 create = false;108 break;109 }110 }111 } break;112 default:113 break;114 }115 }116 117#if defined(__APPLE__) && \118 (defined(__arm__) || defined(__arm64__) || defined(__aarch64__))119 // If lldb is running on a watch, this isn't a RemoteWatch environment; it's120 // a local system environment.121 if (force == false) {122 create = false;123 }124#endif125 126 if (create) {127 LLDB_LOGF(log, "PlatformRemoteAppleWatch::%s() creating platform",128 __FUNCTION__);129 130 return lldb::PlatformSP(new PlatformRemoteAppleWatch());131 }132 133 LLDB_LOGF(log, "PlatformRemoteAppleWatch::%s() aborting creation of platform",134 __FUNCTION__);135 136 return lldb::PlatformSP();137}138 139llvm::StringRef PlatformRemoteAppleWatch::GetDescriptionStatic() {140 return "Remote Apple Watch platform plug-in.";141}142 143/// Default Constructor144PlatformRemoteAppleWatch::PlatformRemoteAppleWatch()145 : PlatformRemoteDarwinDevice() {}146 147std::vector<ArchSpec>148PlatformRemoteAppleWatch::GetSupportedArchitectures(const ArchSpec &host_info) {149 ArchSpec system_arch(GetSystemArchitecture());150 151 const ArchSpec::Core system_core = system_arch.GetCore();152 switch (system_core) {153 default:154 case ArchSpec::eCore_arm_arm64:155 return {156 ArchSpec("arm64-apple-watchos"), ArchSpec("armv7k-apple-watchos"),157 ArchSpec("armv7s-apple-watchos"), ArchSpec("armv7-apple-watchos"),158 ArchSpec("thumbv7k-apple-watchos"), ArchSpec("thumbv7-apple-watchos"),159 ArchSpec("thumbv7s-apple-watchos"), ArchSpec("arm64_32-apple-watchos")};160 161 case ArchSpec::eCore_arm_armv7k:162 return {163 ArchSpec("armv7k-apple-watchos"), ArchSpec("armv7s-apple-watchos"),164 ArchSpec("armv7-apple-watchos"), ArchSpec("thumbv7k-apple-watchos"),165 ArchSpec("thumbv7-apple-watchos"), ArchSpec("thumbv7s-apple-watchos"),166 ArchSpec("arm64_32-apple-watchos")};167 168 case ArchSpec::eCore_arm_armv7s:169 return {170 ArchSpec("armv7s-apple-watchos"), ArchSpec("armv7k-apple-watchos"),171 ArchSpec("armv7-apple-watchos"), ArchSpec("thumbv7k-apple-watchos"),172 ArchSpec("thumbv7-apple-watchos"), ArchSpec("thumbv7s-apple-watchos"),173 ArchSpec("arm64_32-apple-watchos")};174 175 case ArchSpec::eCore_arm_armv7:176 return {ArchSpec("armv7-apple-watchos"), ArchSpec("armv7k-apple-watchos"),177 ArchSpec("thumbv7k-apple-watchos"),178 ArchSpec("thumbv7-apple-watchos"),179 ArchSpec("arm64_32-apple-watchos")};180 }181}182 183llvm::StringRef PlatformRemoteAppleWatch::GetDeviceSupportDirectoryName() {184 return "watchOS DeviceSupport";185}186 187llvm::StringRef PlatformRemoteAppleWatch::GetPlatformName() {188 return "WatchOS.platform";189}190