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-exception |
6 | // |
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 | |
29 | using namespace lldb; |
30 | using namespace lldb_private; |
31 | |
32 | // Static Variables |
33 | static uint32_t g_initialize_count = 0; |
34 | |
35 | // Static Functions |
36 | void PlatformRemoteAppleWatch::Initialize() { |
37 | PlatformDarwin::Initialize(); |
38 | |
39 | if (g_initialize_count++ == 0) { |
40 | PluginManager::RegisterPlugin( |
41 | name: PlatformRemoteAppleWatch::GetPluginNameStatic(), |
42 | description: PlatformRemoteAppleWatch::GetDescriptionStatic(), |
43 | create_callback: PlatformRemoteAppleWatch::CreateInstance); |
44 | } |
45 | } |
46 | |
47 | void PlatformRemoteAppleWatch::Terminate() { |
48 | if (g_initialize_count > 0) { |
49 | if (--g_initialize_count == 0) { |
50 | PluginManager::UnregisterPlugin(create_callback: PlatformRemoteAppleWatch::CreateInstance); |
51 | } |
52 | } |
53 | |
54 | PlatformDarwin::Terminate(); |
55 | } |
56 | |
57 | PlatformSP PlatformRemoteAppleWatch::CreateInstance(bool force, |
58 | const ArchSpec *arch) { |
59 | Log *log = GetLog(mask: LLDBLog::Platform); |
60 | if (log) { |
61 | const char *arch_name; |
62 | if (arch && arch->GetArchitectureName()) |
63 | arch_name = arch->GetArchitectureName(); |
64 | else |
65 | 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 and |
90 | // "unknown" wasn't specified (it was just returned because it was NOT |
91 | // specified) |
92 | case llvm::Triple::UnknownVendor: |
93 | create = !arch->TripleVendorWasSpecified(); |
94 | break; |
95 | |
96 | #endif |
97 | default: |
98 | break; |
99 | } |
100 | if (create) { |
101 | switch (triple.getOS()) { |
102 | case llvm::Triple::WatchOS: // This is the right triple value for Apple |
103 | // Watch debugging |
104 | 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's |
120 | // a local system environment. |
121 | if (force == false) { |
122 | create = false; |
123 | } |
124 | #endif |
125 | |
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 | |
139 | llvm::StringRef PlatformRemoteAppleWatch::GetDescriptionStatic() { |
140 | return "Remote Apple Watch platform plug-in." ; |
141 | } |
142 | |
143 | /// Default Constructor |
144 | PlatformRemoteAppleWatch::PlatformRemoteAppleWatch() |
145 | : PlatformRemoteDarwinDevice() {} |
146 | |
147 | std::vector<ArchSpec> |
148 | PlatformRemoteAppleWatch::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 | |
183 | llvm::StringRef PlatformRemoteAppleWatch::GetDeviceSupportDirectoryName() { |
184 | return "watchOS DeviceSupport" ; |
185 | } |
186 | |
187 | llvm::StringRef PlatformRemoteAppleWatch::GetPlatformName() { |
188 | return "WatchOS.platform" ; |
189 | } |
190 | |