155 lines · cpp
1//===-- PlatformRemoteMacOSX.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 <memory>10#include <string>11#include <vector>12 13#include "PlatformRemoteMacOSX.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/Host/HostInfo.h"22#include "lldb/Target/Process.h"23#include "lldb/Target/Target.h"24#include "lldb/Utility/ArchSpec.h"25#include "lldb/Utility/FileSpec.h"26#include "lldb/Utility/LLDBLog.h"27#include "lldb/Utility/Log.h"28#include "lldb/Utility/StreamString.h"29 30using namespace lldb;31using namespace lldb_private;32 33/// Default Constructor34PlatformRemoteMacOSX::PlatformRemoteMacOSX() : PlatformRemoteDarwinDevice() {}35 36// Static Variables37static uint32_t g_initialize_count = 0;38 39// Static Functions40void PlatformRemoteMacOSX::Initialize() {41 PlatformDarwin::Initialize();42 43 if (g_initialize_count++ == 0) {44 PluginManager::RegisterPlugin(PlatformRemoteMacOSX::GetPluginNameStatic(),45 PlatformRemoteMacOSX::GetDescriptionStatic(),46 PlatformRemoteMacOSX::CreateInstance);47 }48}49 50void PlatformRemoteMacOSX::Terminate() {51 if (g_initialize_count > 0) {52 if (--g_initialize_count == 0) {53 PluginManager::UnregisterPlugin(PlatformRemoteMacOSX::CreateInstance);54 }55 }56 57 PlatformDarwin::Terminate();58}59 60PlatformSP PlatformRemoteMacOSX::CreateInstance(bool force,61 const ArchSpec *arch) {62 Log *log = GetLog(LLDBLog::Platform);63 if (log) {64 const char *arch_name;65 if (arch && arch->GetArchitectureName())66 arch_name = arch->GetArchitectureName();67 else68 arch_name = "<null>";69 70 const char *triple_cstr =71 arch ? arch->GetTriple().getTriple().c_str() : "<null>";72 73 LLDB_LOGF(log, "PlatformRemoteMacOSX::%s(force=%s, arch={%s,%s})",74 __FUNCTION__, force ? "true" : "false", arch_name, triple_cstr);75 }76 77 bool create = force;78 if (!create && arch && arch->IsValid()) {79 const llvm::Triple &triple = arch->GetTriple();80 switch (triple.getVendor()) {81 case llvm::Triple::Apple:82 create = true;83 break;84 85#if defined(__APPLE__)86 // Only accept "unknown" for vendor if the host is Apple and it "unknown"87 // wasn't specified (it was just returned because it was NOT specified)88 case llvm::Triple::UnknownVendor:89 create = !arch->TripleVendorWasSpecified();90 break;91#endif92 default:93 break;94 }95 96 if (create) {97 switch (triple.getOS()) {98 case llvm::Triple::Darwin: // Deprecated, but still support Darwin for99 // historical reasons100 case llvm::Triple::MacOSX:101 break;102#if defined(__APPLE__)103 // Only accept "vendor" for vendor if the host is Apple and it "unknown"104 // wasn't specified (it was just returned because it was NOT specified)105 case llvm::Triple::UnknownOS:106 create = !arch->TripleOSWasSpecified();107 break;108#endif109 default:110 create = false;111 break;112 }113 }114 }115 116 if (create) {117 LLDB_LOGF(log, "PlatformRemoteMacOSX::%s() creating platform",118 __FUNCTION__);119 return std::make_shared<PlatformRemoteMacOSX>();120 }121 122 LLDB_LOGF(log, "PlatformRemoteMacOSX::%s() aborting creation of platform",123 __FUNCTION__);124 125 return PlatformSP();126}127 128std::vector<ArchSpec>129PlatformRemoteMacOSX::GetSupportedArchitectures(const ArchSpec &host_info) {130 // macOS for ARM64 support both native and translated x86_64 processes131 std::vector<ArchSpec> result;132 ARMGetSupportedArchitectures(result, llvm::Triple::MacOSX);133 134 // We can't use x86GetSupportedArchitectures() because it uses135 // the system architecture for some of its return values and also136 // has a 32bits variant.137 result.push_back(ArchSpec("x86_64-apple-macosx"));138 result.push_back(ArchSpec("x86_64-apple-ios-macabi"));139 result.push_back(ArchSpec("arm64-apple-ios"));140 result.push_back(ArchSpec("arm64e-apple-ios"));141 return result;142}143 144llvm::StringRef PlatformRemoteMacOSX::GetDescriptionStatic() {145 return "Remote Mac OS X user platform plug-in.";146}147 148llvm::StringRef PlatformRemoteMacOSX::GetDeviceSupportDirectoryName() {149 return "macOS DeviceSupport";150}151 152llvm::StringRef PlatformRemoteMacOSX::GetPlatformName() {153 return "MacOSX.platform";154}155