1dd2054d3SJonas Devlieghere //===-- PlatformRemoteMacOSX.cpp -------------------------------------===//
2dd2054d3SJonas Devlieghere //
3dd2054d3SJonas Devlieghere // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4dd2054d3SJonas Devlieghere // See https://llvm.org/LICENSE.txt for license information.
5dd2054d3SJonas Devlieghere // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6dd2054d3SJonas Devlieghere //
7dd2054d3SJonas Devlieghere //===----------------------------------------------------------------------===//
8dd2054d3SJonas Devlieghere
9dd2054d3SJonas Devlieghere #include <memory>
10dd2054d3SJonas Devlieghere #include <string>
11dd2054d3SJonas Devlieghere #include <vector>
12dd2054d3SJonas Devlieghere
13dd2054d3SJonas Devlieghere #include "PlatformRemoteMacOSX.h"
14dd2054d3SJonas Devlieghere
15dd2054d3SJonas Devlieghere #include "lldb/Breakpoint/BreakpointLocation.h"
16dd2054d3SJonas Devlieghere #include "lldb/Core/Module.h"
17dd2054d3SJonas Devlieghere #include "lldb/Core/ModuleList.h"
18dd2054d3SJonas Devlieghere #include "lldb/Core/ModuleSpec.h"
19dd2054d3SJonas Devlieghere #include "lldb/Core/PluginManager.h"
20dd2054d3SJonas Devlieghere #include "lldb/Host/Host.h"
21dd2054d3SJonas Devlieghere #include "lldb/Host/HostInfo.h"
22dd2054d3SJonas Devlieghere #include "lldb/Target/Process.h"
23dd2054d3SJonas Devlieghere #include "lldb/Target/Target.h"
24dd2054d3SJonas Devlieghere #include "lldb/Utility/ArchSpec.h"
25dd2054d3SJonas Devlieghere #include "lldb/Utility/FileSpec.h"
26c34698a8SPavel Labath #include "lldb/Utility/LLDBLog.h"
27dd2054d3SJonas Devlieghere #include "lldb/Utility/Log.h"
28dd2054d3SJonas Devlieghere #include "lldb/Utility/StreamString.h"
29dd2054d3SJonas Devlieghere
30dd2054d3SJonas Devlieghere using namespace lldb;
31dd2054d3SJonas Devlieghere using namespace lldb_private;
32dd2054d3SJonas Devlieghere
33dd2054d3SJonas Devlieghere /// Default Constructor
PlatformRemoteMacOSX()34dd2054d3SJonas Devlieghere PlatformRemoteMacOSX::PlatformRemoteMacOSX() : PlatformRemoteDarwinDevice() {}
35dd2054d3SJonas Devlieghere
36dd2054d3SJonas Devlieghere // Static Variables
37dd2054d3SJonas Devlieghere static uint32_t g_initialize_count = 0;
38dd2054d3SJonas Devlieghere
39dd2054d3SJonas Devlieghere // Static Functions
Initialize()40dd2054d3SJonas Devlieghere void PlatformRemoteMacOSX::Initialize() {
41dd2054d3SJonas Devlieghere PlatformDarwin::Initialize();
42dd2054d3SJonas Devlieghere
43dd2054d3SJonas Devlieghere if (g_initialize_count++ == 0) {
44dd2054d3SJonas Devlieghere PluginManager::RegisterPlugin(PlatformRemoteMacOSX::GetPluginNameStatic(),
45dd2054d3SJonas Devlieghere PlatformRemoteMacOSX::GetDescriptionStatic(),
46dd2054d3SJonas Devlieghere PlatformRemoteMacOSX::CreateInstance);
47dd2054d3SJonas Devlieghere }
48dd2054d3SJonas Devlieghere }
49dd2054d3SJonas Devlieghere
Terminate()50dd2054d3SJonas Devlieghere void PlatformRemoteMacOSX::Terminate() {
51dd2054d3SJonas Devlieghere if (g_initialize_count > 0) {
52dd2054d3SJonas Devlieghere if (--g_initialize_count == 0) {
53dd2054d3SJonas Devlieghere PluginManager::UnregisterPlugin(PlatformRemoteMacOSX::CreateInstance);
54dd2054d3SJonas Devlieghere }
55dd2054d3SJonas Devlieghere }
56dd2054d3SJonas Devlieghere
57dd2054d3SJonas Devlieghere PlatformDarwin::Terminate();
58dd2054d3SJonas Devlieghere }
59dd2054d3SJonas Devlieghere
CreateInstance(bool force,const ArchSpec * arch)60*d6678404SMed Ismail Bennani PlatformSP PlatformRemoteMacOSX::CreateInstance(bool force,
61*d6678404SMed Ismail Bennani const ArchSpec *arch) {
62a007a6d8SPavel Labath Log *log = GetLog(LLDBLog::Platform);
63dd2054d3SJonas Devlieghere if (log) {
64dd2054d3SJonas Devlieghere const char *arch_name;
65dd2054d3SJonas Devlieghere if (arch && arch->GetArchitectureName())
66dd2054d3SJonas Devlieghere arch_name = arch->GetArchitectureName();
67dd2054d3SJonas Devlieghere else
68dd2054d3SJonas Devlieghere arch_name = "<null>";
69dd2054d3SJonas Devlieghere
70dd2054d3SJonas Devlieghere const char *triple_cstr =
71dd2054d3SJonas Devlieghere arch ? arch->GetTriple().getTriple().c_str() : "<null>";
72dd2054d3SJonas Devlieghere
73d75cc085SJonas Devlieghere LLDB_LOGF(log, "PlatformRemoteMacOSX::%s(force=%s, arch={%s,%s})",
74d75cc085SJonas Devlieghere __FUNCTION__, force ? "true" : "false", arch_name, triple_cstr);
75dd2054d3SJonas Devlieghere }
76dd2054d3SJonas Devlieghere
77dd2054d3SJonas Devlieghere bool create = force;
78dd2054d3SJonas Devlieghere if (!create && arch && arch->IsValid()) {
79dd2054d3SJonas Devlieghere const llvm::Triple &triple = arch->GetTriple();
80dd2054d3SJonas Devlieghere switch (triple.getVendor()) {
81dd2054d3SJonas Devlieghere case llvm::Triple::Apple:
82dd2054d3SJonas Devlieghere create = true;
83dd2054d3SJonas Devlieghere break;
84dd2054d3SJonas Devlieghere
85dd2054d3SJonas Devlieghere #if defined(__APPLE__)
86dd2054d3SJonas Devlieghere // Only accept "unknown" for vendor if the host is Apple and it "unknown"
87dd2054d3SJonas Devlieghere // wasn't specified (it was just returned because it was NOT specified)
88dd2054d3SJonas Devlieghere case llvm::Triple::UnknownVendor:
89dd2054d3SJonas Devlieghere create = !arch->TripleVendorWasSpecified();
90dd2054d3SJonas Devlieghere break;
91dd2054d3SJonas Devlieghere #endif
92dd2054d3SJonas Devlieghere default:
93dd2054d3SJonas Devlieghere break;
94dd2054d3SJonas Devlieghere }
95dd2054d3SJonas Devlieghere
96dd2054d3SJonas Devlieghere if (create) {
97dd2054d3SJonas Devlieghere switch (triple.getOS()) {
98dd2054d3SJonas Devlieghere case llvm::Triple::Darwin: // Deprecated, but still support Darwin for
99dd2054d3SJonas Devlieghere // historical reasons
100dd2054d3SJonas Devlieghere case llvm::Triple::MacOSX:
101dd2054d3SJonas Devlieghere break;
102dd2054d3SJonas Devlieghere #if defined(__APPLE__)
103dd2054d3SJonas Devlieghere // Only accept "vendor" for vendor if the host is Apple and it "unknown"
104dd2054d3SJonas Devlieghere // wasn't specified (it was just returned because it was NOT specified)
105dd2054d3SJonas Devlieghere case llvm::Triple::UnknownOS:
106dd2054d3SJonas Devlieghere create = !arch->TripleOSWasSpecified();
107dd2054d3SJonas Devlieghere break;
108dd2054d3SJonas Devlieghere #endif
109dd2054d3SJonas Devlieghere default:
110dd2054d3SJonas Devlieghere create = false;
111dd2054d3SJonas Devlieghere break;
112dd2054d3SJonas Devlieghere }
113dd2054d3SJonas Devlieghere }
114dd2054d3SJonas Devlieghere }
115dd2054d3SJonas Devlieghere
116dd2054d3SJonas Devlieghere if (create) {
117dd2054d3SJonas Devlieghere LLDB_LOGF(log, "PlatformRemoteMacOSX::%s() creating platform",
118dd2054d3SJonas Devlieghere __FUNCTION__);
119dd2054d3SJonas Devlieghere return std::make_shared<PlatformRemoteMacOSX>();
120dd2054d3SJonas Devlieghere }
121dd2054d3SJonas Devlieghere
122dd2054d3SJonas Devlieghere LLDB_LOGF(log, "PlatformRemoteMacOSX::%s() aborting creation of platform",
123dd2054d3SJonas Devlieghere __FUNCTION__);
124dd2054d3SJonas Devlieghere
125dd2054d3SJonas Devlieghere return PlatformSP();
126dd2054d3SJonas Devlieghere }
127dd2054d3SJonas Devlieghere
128dde487e5SJonas Devlieghere std::vector<ArchSpec>
GetSupportedArchitectures(const ArchSpec & host_info)129dde487e5SJonas Devlieghere PlatformRemoteMacOSX::GetSupportedArchitectures(const ArchSpec &host_info) {
130dd2054d3SJonas Devlieghere // macOS for ARM64 support both native and translated x86_64 processes
131e7c48f3cSPavel Labath std::vector<ArchSpec> result;
1328faca2edSJonas Devlieghere ARMGetSupportedArchitectures(result, llvm::Triple::MacOSX);
133dd2054d3SJonas Devlieghere
134e7c48f3cSPavel Labath // We can't use x86GetSupportedArchitectures() because it uses
135dd2054d3SJonas Devlieghere // the system architecture for some of its return values and also
136dd2054d3SJonas Devlieghere // has a 32bits variant.
137e7c48f3cSPavel Labath result.push_back(ArchSpec("x86_64-apple-macosx"));
138e7c48f3cSPavel Labath result.push_back(ArchSpec("x86_64-apple-ios-macabi"));
139e7c48f3cSPavel Labath result.push_back(ArchSpec("arm64-apple-ios"));
140e7c48f3cSPavel Labath result.push_back(ArchSpec("arm64e-apple-ios"));
141e7c48f3cSPavel Labath return result;
142dd2054d3SJonas Devlieghere }
143dd2054d3SJonas Devlieghere
GetDescriptionStatic()144a458ef4fSPavel Labath llvm::StringRef PlatformRemoteMacOSX::GetDescriptionStatic() {
145dd2054d3SJonas Devlieghere return "Remote Mac OS X user platform plug-in.";
146dd2054d3SJonas Devlieghere }
147dd2054d3SJonas Devlieghere
GetDeviceSupportDirectoryName()148dd2054d3SJonas Devlieghere llvm::StringRef PlatformRemoteMacOSX::GetDeviceSupportDirectoryName() {
149dd2054d3SJonas Devlieghere return "macOS DeviceSupport";
150dd2054d3SJonas Devlieghere }
151dd2054d3SJonas Devlieghere
GetPlatformName()152dd2054d3SJonas Devlieghere llvm::StringRef PlatformRemoteMacOSX::GetPlatformName() {
153dd2054d3SJonas Devlieghere return "MacOSX.platform";
154dd2054d3SJonas Devlieghere }
155