158 lines · cpp
1//===-- PlatformRemoteiOS.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 "PlatformRemoteiOS.h"10 11#include "lldb/Breakpoint/BreakpointLocation.h"12#include "lldb/Core/Module.h"13#include "lldb/Core/ModuleList.h"14#include "lldb/Core/ModuleSpec.h"15#include "lldb/Core/PluginManager.h"16#include "lldb/Host/Host.h"17#include "lldb/Target/Process.h"18#include "lldb/Target/Target.h"19#include "lldb/Utility/ArchSpec.h"20#include "lldb/Utility/FileSpec.h"21#include "lldb/Utility/LLDBLog.h"22#include "lldb/Utility/Log.h"23#include "lldb/Utility/Status.h"24#include "lldb/Utility/StreamString.h"25 26using namespace lldb;27using namespace lldb_private;28 29LLDB_PLUGIN_DEFINE(PlatformRemoteiOS)30 31// Static Variables32static uint32_t g_initialize_count = 0;33 34// Static Functions35void PlatformRemoteiOS::Initialize() {36 PlatformDarwin::Initialize();37 38 if (g_initialize_count++ == 0) {39 PluginManager::RegisterPlugin(PlatformRemoteiOS::GetPluginNameStatic(),40 PlatformRemoteiOS::GetDescriptionStatic(),41 PlatformRemoteiOS::CreateInstance);42 }43}44 45void PlatformRemoteiOS::Terminate() {46 if (g_initialize_count > 0) {47 if (--g_initialize_count == 0) {48 PluginManager::UnregisterPlugin(PlatformRemoteiOS::CreateInstance);49 }50 }51 52 PlatformDarwin::Terminate();53}54 55PlatformSP PlatformRemoteiOS::CreateInstance(bool force, const ArchSpec *arch) {56 Log *log = GetLog(LLDBLog::Platform);57 if (log) {58 const char *arch_name;59 if (arch && arch->GetArchitectureName())60 arch_name = arch->GetArchitectureName();61 else62 arch_name = "<null>";63 64 const char *triple_cstr =65 arch ? arch->GetTriple().getTriple().c_str() : "<null>";66 67 LLDB_LOGF(log, "PlatformRemoteiOS::%s(force=%s, arch={%s,%s})",68 __FUNCTION__, force ? "true" : "false", arch_name, triple_cstr);69 }70 71 bool create = force;72 if (!create && arch && arch->IsValid()) {73 switch (arch->GetMachine()) {74 case llvm::Triple::arm:75 case llvm::Triple::aarch64:76 case llvm::Triple::thumb: {77 const llvm::Triple &triple = arch->GetTriple();78 llvm::Triple::VendorType vendor = triple.getVendor();79 switch (vendor) {80 case llvm::Triple::Apple:81 create = true;82 break;83 84#if defined(__APPLE__)85 // Only accept "unknown" for the vendor if the host is Apple and86 // "unknown" wasn't specified (it was just returned because it was NOT87 // specified)88 case llvm::Triple::UnknownVendor:89 create = !arch->TripleVendorWasSpecified();90 break;91 92#endif93 default:94 break;95 }96 if (create) {97 switch (triple.getOS()) {98 case llvm::Triple::Darwin: // Deprecated, but still support Darwin for99 // historical reasons100 case llvm::Triple::IOS: // This is the right triple value for iOS101 // debugging102 break;103 104 default:105 create = false;106 break;107 }108 }109 } break;110 default:111 break;112 }113 }114 115 if (create) {116 if (log)117 LLDB_LOGF(log, "PlatformRemoteiOS::%s() creating platform", __FUNCTION__);118 119 return lldb::PlatformSP(new PlatformRemoteiOS());120 }121 122 if (log)123 LLDB_LOGF(log, "PlatformRemoteiOS::%s() aborting creation of platform",124 __FUNCTION__);125 126 return lldb::PlatformSP();127}128 129llvm::StringRef PlatformRemoteiOS::GetDescriptionStatic() {130 return "Remote iOS platform plug-in.";131}132 133/// Default Constructor134PlatformRemoteiOS::PlatformRemoteiOS()135 : PlatformRemoteDarwinDevice() {}136 137std::vector<ArchSpec> PlatformRemoteiOS::GetSupportedArchitectures(138 const ArchSpec &process_host_arch) {139 std::vector<ArchSpec> result;140 ARMGetSupportedArchitectures(result, llvm::Triple::IOS);141 return result;142}143 144bool PlatformRemoteiOS::CheckLocalSharedCache() const {145 // You can run iPhone and iPad apps on Mac with Apple Silicon. At the146 // platform level there's no way to distinguish them from remote iOS147 // applications. Make sure we still read from our own shared cache.148 return true;149}150 151llvm::StringRef PlatformRemoteiOS::GetDeviceSupportDirectoryName() {152 return "iOS DeviceSupport";153}154 155llvm::StringRef PlatformRemoteiOS::GetPlatformName() {156 return "iPhoneOS.platform";157}158