152 lines · cpp
1//===-- PlatformRemoteAppleBridge.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 "PlatformRemoteAppleBridge.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/StreamString.h"27 28using namespace lldb;29using namespace lldb_private;30 31/// Default Constructor32PlatformRemoteAppleBridge::PlatformRemoteAppleBridge()33 : PlatformRemoteDarwinDevice () {}34 35// Static Variables36static uint32_t g_initialize_count = 0;37 38// Static Functions39void PlatformRemoteAppleBridge::Initialize() {40 PlatformDarwin::Initialize();41 42 if (g_initialize_count++ == 0) {43 PluginManager::RegisterPlugin(PlatformRemoteAppleBridge::GetPluginNameStatic(),44 PlatformRemoteAppleBridge::GetDescriptionStatic(),45 PlatformRemoteAppleBridge::CreateInstance);46 }47}48 49void PlatformRemoteAppleBridge::Terminate() {50 if (g_initialize_count > 0) {51 if (--g_initialize_count == 0) {52 PluginManager::UnregisterPlugin(PlatformRemoteAppleBridge::CreateInstance);53 }54 }55 56 PlatformDarwin::Terminate();57}58 59PlatformSP PlatformRemoteAppleBridge::CreateInstance(bool force,60 const ArchSpec *arch) {61 Log *log = GetLog(LLDBLog::Platform);62 if (log) {63 const char *arch_name;64 if (arch && arch->GetArchitectureName())65 arch_name = arch->GetArchitectureName();66 else67 arch_name = "<null>";68 69 const char *triple_cstr =70 arch ? arch->GetTriple().getTriple().c_str() : "<null>";71 72 LLDB_LOGF(log, "PlatformRemoteAppleBridge::%s(force=%s, arch={%s,%s})",73 __FUNCTION__, force ? "true" : "false", arch_name, triple_cstr);74 }75 76 bool create = force;77 if (!create && arch && arch->IsValid()) {78 switch (arch->GetMachine()) {79 case llvm::Triple::aarch64: {80 const llvm::Triple &triple = arch->GetTriple();81 llvm::Triple::VendorType vendor = triple.getVendor();82 switch (vendor) {83 case llvm::Triple::Apple:84 create = true;85 break;86 87#if defined(__APPLE__)88 // Only accept "unknown" for the vendor if the host is Apple and89 // it "unknown" wasn't specified (it was just returned because it90 // was NOT specified)91 case llvm::Triple::UnknownVendor:92 create = !arch->TripleVendorWasSpecified();93 break;94 95#endif96 default:97 break;98 }99 if (create) {100// Suppress warning "switch statement contains 'default' but no 'case' labels".101#ifdef _MSC_VER102#pragma warning(push)103#pragma warning(disable : 4065)104#endif105 switch (triple.getOS()) {106 case llvm::Triple::BridgeOS:107 break;108 default:109 create = false;110 break;111 }112#ifdef _MSC_VER113#pragma warning(pop)114#endif115 }116 } break;117 default:118 break;119 }120 }121 122 if (create) {123 LLDB_LOGF(log, "PlatformRemoteAppleBridge::%s() creating platform",124 __FUNCTION__);125 126 return lldb::PlatformSP(new PlatformRemoteAppleBridge());127 }128 129 LLDB_LOGF(log,130 "PlatformRemoteAppleBridge::%s() aborting creation of platform",131 __FUNCTION__);132 133 return lldb::PlatformSP();134}135 136llvm::StringRef PlatformRemoteAppleBridge::GetDescriptionStatic() {137 return "Remote BridgeOS platform plug-in.";138}139 140std::vector<ArchSpec> PlatformRemoteAppleBridge::GetSupportedArchitectures(141 const ArchSpec &process_host_arch) {142 return {ArchSpec("arm64-apple-bridgeos")};143}144 145llvm::StringRef PlatformRemoteAppleBridge::GetDeviceSupportDirectoryName() {146 return "BridgeOS DeviceSupport";147}148 149llvm::StringRef PlatformRemoteAppleBridge::GetPlatformName() {150 return "BridgeOS.platform";151}152