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-exception |
6 | // |
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 | |
28 | using namespace lldb; |
29 | using namespace lldb_private; |
30 | |
31 | /// Default Constructor |
32 | PlatformRemoteAppleBridge::PlatformRemoteAppleBridge() |
33 | : PlatformRemoteDarwinDevice () {} |
34 | |
35 | // Static Variables |
36 | static uint32_t g_initialize_count = 0; |
37 | |
38 | // Static Functions |
39 | void PlatformRemoteAppleBridge::Initialize() { |
40 | PlatformDarwin::Initialize(); |
41 | |
42 | if (g_initialize_count++ == 0) { |
43 | PluginManager::RegisterPlugin(name: PlatformRemoteAppleBridge::GetPluginNameStatic(), |
44 | description: PlatformRemoteAppleBridge::GetDescriptionStatic(), |
45 | create_callback: PlatformRemoteAppleBridge::CreateInstance); |
46 | } |
47 | } |
48 | |
49 | void PlatformRemoteAppleBridge::Terminate() { |
50 | if (g_initialize_count > 0) { |
51 | if (--g_initialize_count == 0) { |
52 | PluginManager::UnregisterPlugin(create_callback: PlatformRemoteAppleBridge::CreateInstance); |
53 | } |
54 | } |
55 | |
56 | PlatformDarwin::Terminate(); |
57 | } |
58 | |
59 | PlatformSP PlatformRemoteAppleBridge::CreateInstance(bool force, |
60 | const ArchSpec *arch) { |
61 | Log *log = GetLog(mask: LLDBLog::Platform); |
62 | if (log) { |
63 | const char *arch_name; |
64 | if (arch && arch->GetArchitectureName()) |
65 | arch_name = arch->GetArchitectureName(); |
66 | else |
67 | 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 and |
89 | // it "unknown" wasn't specified (it was just returned because it |
90 | // was NOT specified) |
91 | case llvm::Triple::UnknownVendor: |
92 | create = !arch->TripleVendorWasSpecified(); |
93 | break; |
94 | |
95 | #endif |
96 | default: |
97 | break; |
98 | } |
99 | if (create) { |
100 | // Suppress warning "switch statement contains 'default' but no 'case' labels". |
101 | #ifdef _MSC_VER |
102 | #pragma warning(push) |
103 | #pragma warning(disable : 4065) |
104 | #endif |
105 | switch (triple.getOS()) { |
106 | case llvm::Triple::BridgeOS: |
107 | break; |
108 | default: |
109 | create = false; |
110 | break; |
111 | } |
112 | #ifdef _MSC_VER |
113 | #pragma warning(pop) |
114 | #endif |
115 | } |
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 | |
136 | llvm::StringRef PlatformRemoteAppleBridge::GetDescriptionStatic() { |
137 | return "Remote BridgeOS platform plug-in." ; |
138 | } |
139 | |
140 | std::vector<ArchSpec> PlatformRemoteAppleBridge::GetSupportedArchitectures( |
141 | const ArchSpec &process_host_arch) { |
142 | return {ArchSpec("arm64-apple-bridgeos" )}; |
143 | } |
144 | |
145 | llvm::StringRef PlatformRemoteAppleBridge::GetDeviceSupportDirectoryName() { |
146 | return "BridgeOS DeviceSupport" ; |
147 | } |
148 | |
149 | llvm::StringRef PlatformRemoteAppleBridge::GetPlatformName() { |
150 | return "BridgeOS.platform" ; |
151 | } |
152 | |