180814287SRaphael Isemann //===-- PlatformRemoteAppleBridge.cpp -------------------------------------===//
232762fd2SJason Molenda //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
632762fd2SJason Molenda //
732762fd2SJason Molenda //===----------------------------------------------------------------------===//
832762fd2SJason Molenda
932762fd2SJason Molenda #include <string>
1032762fd2SJason Molenda #include <vector>
1132762fd2SJason Molenda
1232762fd2SJason Molenda #include "PlatformRemoteAppleBridge.h"
1332762fd2SJason Molenda
1432762fd2SJason Molenda #include "lldb/Breakpoint/BreakpointLocation.h"
1532762fd2SJason Molenda #include "lldb/Core/Module.h"
1632762fd2SJason Molenda #include "lldb/Core/ModuleList.h"
1732762fd2SJason Molenda #include "lldb/Core/ModuleSpec.h"
1832762fd2SJason Molenda #include "lldb/Core/PluginManager.h"
1932762fd2SJason Molenda #include "lldb/Host/Host.h"
2032762fd2SJason Molenda #include "lldb/Target/Process.h"
2132762fd2SJason Molenda #include "lldb/Target/Target.h"
2232762fd2SJason Molenda #include "lldb/Utility/ArchSpec.h"
2332762fd2SJason Molenda #include "lldb/Utility/FileSpec.h"
24c34698a8SPavel Labath #include "lldb/Utility/LLDBLog.h"
2532762fd2SJason Molenda #include "lldb/Utility/Log.h"
2632762fd2SJason Molenda #include "lldb/Utility/StreamString.h"
2732762fd2SJason Molenda
2832762fd2SJason Molenda using namespace lldb;
2932762fd2SJason Molenda using namespace lldb_private;
3032762fd2SJason Molenda
3132762fd2SJason Molenda /// Default Constructor
PlatformRemoteAppleBridge()3232762fd2SJason Molenda PlatformRemoteAppleBridge::PlatformRemoteAppleBridge()
3332762fd2SJason Molenda : PlatformRemoteDarwinDevice () {}
3432762fd2SJason Molenda
3532762fd2SJason Molenda // Static Variables
3632762fd2SJason Molenda static uint32_t g_initialize_count = 0;
3732762fd2SJason Molenda
3832762fd2SJason Molenda // Static Functions
Initialize()3932762fd2SJason Molenda void PlatformRemoteAppleBridge::Initialize() {
4032762fd2SJason Molenda PlatformDarwin::Initialize();
4132762fd2SJason Molenda
4232762fd2SJason Molenda if (g_initialize_count++ == 0) {
4332762fd2SJason Molenda PluginManager::RegisterPlugin(PlatformRemoteAppleBridge::GetPluginNameStatic(),
4432762fd2SJason Molenda PlatformRemoteAppleBridge::GetDescriptionStatic(),
4532762fd2SJason Molenda PlatformRemoteAppleBridge::CreateInstance);
4632762fd2SJason Molenda }
4732762fd2SJason Molenda }
4832762fd2SJason Molenda
Terminate()4932762fd2SJason Molenda void PlatformRemoteAppleBridge::Terminate() {
5032762fd2SJason Molenda if (g_initialize_count > 0) {
5132762fd2SJason Molenda if (--g_initialize_count == 0) {
5232762fd2SJason Molenda PluginManager::UnregisterPlugin(PlatformRemoteAppleBridge::CreateInstance);
5332762fd2SJason Molenda }
5432762fd2SJason Molenda }
5532762fd2SJason Molenda
5632762fd2SJason Molenda PlatformDarwin::Terminate();
5732762fd2SJason Molenda }
5832762fd2SJason Molenda
CreateInstance(bool force,const ArchSpec * arch)5932762fd2SJason Molenda PlatformSP PlatformRemoteAppleBridge::CreateInstance(bool force,
6032762fd2SJason Molenda const ArchSpec *arch) {
61a007a6d8SPavel Labath Log *log = GetLog(LLDBLog::Platform);
6232762fd2SJason Molenda if (log) {
6332762fd2SJason Molenda const char *arch_name;
6432762fd2SJason Molenda if (arch && arch->GetArchitectureName())
6532762fd2SJason Molenda arch_name = arch->GetArchitectureName();
6632762fd2SJason Molenda else
6732762fd2SJason Molenda arch_name = "<null>";
6832762fd2SJason Molenda
6932762fd2SJason Molenda const char *triple_cstr =
7032762fd2SJason Molenda arch ? arch->GetTriple().getTriple().c_str() : "<null>";
7132762fd2SJason Molenda
7263e5fb76SJonas Devlieghere LLDB_LOGF(log, "PlatformRemoteAppleBridge::%s(force=%s, arch={%s,%s})",
7332762fd2SJason Molenda __FUNCTION__, force ? "true" : "false", arch_name, triple_cstr);
7432762fd2SJason Molenda }
7532762fd2SJason Molenda
7632762fd2SJason Molenda bool create = force;
7732762fd2SJason Molenda if (!create && arch && arch->IsValid()) {
7832762fd2SJason Molenda switch (arch->GetMachine()) {
7932762fd2SJason Molenda case llvm::Triple::aarch64: {
8032762fd2SJason Molenda const llvm::Triple &triple = arch->GetTriple();
8132762fd2SJason Molenda llvm::Triple::VendorType vendor = triple.getVendor();
8232762fd2SJason Molenda switch (vendor) {
8332762fd2SJason Molenda case llvm::Triple::Apple:
8432762fd2SJason Molenda create = true;
8532762fd2SJason Molenda break;
8632762fd2SJason Molenda
8732762fd2SJason Molenda #if defined(__APPLE__)
8832762fd2SJason Molenda // Only accept "unknown" for the vendor if the host is Apple and
8932762fd2SJason Molenda // it "unknown" wasn't specified (it was just returned because it
9032762fd2SJason Molenda // was NOT specified)
91d8024371SAdrian Prantl case llvm::Triple::UnknownVendor:
9232762fd2SJason Molenda create = !arch->TripleVendorWasSpecified();
9332762fd2SJason Molenda break;
9432762fd2SJason Molenda
9532762fd2SJason Molenda #endif
9632762fd2SJason Molenda default:
9732762fd2SJason Molenda break;
9832762fd2SJason Molenda }
9932762fd2SJason Molenda if (create) {
100bc056b3aSTatyana Krasnukha // Suppress warning "switch statement contains 'default' but no 'case' labels".
101bc056b3aSTatyana Krasnukha #ifdef _MSC_VER
102bc056b3aSTatyana Krasnukha #pragma warning(push)
103bc056b3aSTatyana Krasnukha #pragma warning(disable : 4065)
104bc056b3aSTatyana Krasnukha #endif
10532762fd2SJason Molenda switch (triple.getOS()) {
10625b3900fSJason Molenda // NEED_BRIDGEOS_TRIPLE case llvm::Triple::BridgeOS:
107bc056b3aSTatyana Krasnukha // break;
10832762fd2SJason Molenda
10932762fd2SJason Molenda default:
11032762fd2SJason Molenda create = false;
11132762fd2SJason Molenda break;
11232762fd2SJason Molenda }
113bc056b3aSTatyana Krasnukha #ifdef _MSC_VER
114bc056b3aSTatyana Krasnukha #pragma warning(pop)
115bc056b3aSTatyana Krasnukha #endif
11632762fd2SJason Molenda }
11732762fd2SJason Molenda } break;
11832762fd2SJason Molenda default:
11932762fd2SJason Molenda break;
12032762fd2SJason Molenda }
12132762fd2SJason Molenda }
12232762fd2SJason Molenda
12332762fd2SJason Molenda if (create) {
12463e5fb76SJonas Devlieghere LLDB_LOGF(log, "PlatformRemoteAppleBridge::%s() creating platform",
12532762fd2SJason Molenda __FUNCTION__);
12632762fd2SJason Molenda
12732762fd2SJason Molenda return lldb::PlatformSP(new PlatformRemoteAppleBridge());
12832762fd2SJason Molenda }
12932762fd2SJason Molenda
13063e5fb76SJonas Devlieghere LLDB_LOGF(log,
13163e5fb76SJonas Devlieghere "PlatformRemoteAppleBridge::%s() aborting creation of platform",
13232762fd2SJason Molenda __FUNCTION__);
13332762fd2SJason Molenda
13432762fd2SJason Molenda return lldb::PlatformSP();
13532762fd2SJason Molenda }
13632762fd2SJason Molenda
GetDescriptionStatic()137a458ef4fSPavel Labath llvm::StringRef PlatformRemoteAppleBridge::GetDescriptionStatic() {
13832762fd2SJason Molenda return "Remote BridgeOS platform plug-in.";
13932762fd2SJason Molenda }
14032762fd2SJason Molenda
GetSupportedArchitectures(const ArchSpec & process_host_arch)141*dde487e5SJonas Devlieghere std::vector<ArchSpec> PlatformRemoteAppleBridge::GetSupportedArchitectures(
142*dde487e5SJonas Devlieghere const ArchSpec &process_host_arch) {
143e7c48f3cSPavel Labath return {ArchSpec("arm64-apple-bridgeos")};
14432762fd2SJason Molenda }
14532762fd2SJason Molenda
GetDeviceSupportDirectoryName()146173bb3c2SJonas Devlieghere llvm::StringRef PlatformRemoteAppleBridge::GetDeviceSupportDirectoryName() {
147173bb3c2SJonas Devlieghere return "BridgeOS DeviceSupport";
14832762fd2SJason Molenda }
14932762fd2SJason Molenda
GetPlatformName()150173bb3c2SJonas Devlieghere llvm::StringRef PlatformRemoteAppleBridge::GetPlatformName() {
15132762fd2SJason Molenda return "BridgeOS.platform";
15232762fd2SJason Molenda }
153