brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · 460f6d8 Raw
155 lines · cpp
1//===-- PlatformRemoteMacOSX.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 <memory>10#include <string>11#include <vector>12 13#include "PlatformRemoteMacOSX.h"14 15#include "lldb/Breakpoint/BreakpointLocation.h"16#include "lldb/Core/Module.h"17#include "lldb/Core/ModuleList.h"18#include "lldb/Core/ModuleSpec.h"19#include "lldb/Core/PluginManager.h"20#include "lldb/Host/Host.h"21#include "lldb/Host/HostInfo.h"22#include "lldb/Target/Process.h"23#include "lldb/Target/Target.h"24#include "lldb/Utility/ArchSpec.h"25#include "lldb/Utility/FileSpec.h"26#include "lldb/Utility/LLDBLog.h"27#include "lldb/Utility/Log.h"28#include "lldb/Utility/StreamString.h"29 30using namespace lldb;31using namespace lldb_private;32 33/// Default Constructor34PlatformRemoteMacOSX::PlatformRemoteMacOSX() : PlatformRemoteDarwinDevice() {}35 36// Static Variables37static uint32_t g_initialize_count = 0;38 39// Static Functions40void PlatformRemoteMacOSX::Initialize() {41  PlatformDarwin::Initialize();42 43  if (g_initialize_count++ == 0) {44    PluginManager::RegisterPlugin(PlatformRemoteMacOSX::GetPluginNameStatic(),45                                  PlatformRemoteMacOSX::GetDescriptionStatic(),46                                  PlatformRemoteMacOSX::CreateInstance);47  }48}49 50void PlatformRemoteMacOSX::Terminate() {51  if (g_initialize_count > 0) {52    if (--g_initialize_count == 0) {53      PluginManager::UnregisterPlugin(PlatformRemoteMacOSX::CreateInstance);54    }55  }56 57  PlatformDarwin::Terminate();58}59 60PlatformSP PlatformRemoteMacOSX::CreateInstance(bool force,61                                                const ArchSpec *arch) {62  Log *log = GetLog(LLDBLog::Platform);63  if (log) {64    const char *arch_name;65    if (arch && arch->GetArchitectureName())66      arch_name = arch->GetArchitectureName();67    else68      arch_name = "<null>";69 70    const char *triple_cstr =71        arch ? arch->GetTriple().getTriple().c_str() : "<null>";72 73    LLDB_LOGF(log, "PlatformRemoteMacOSX::%s(force=%s, arch={%s,%s})",74              __FUNCTION__, force ? "true" : "false", arch_name, triple_cstr);75  }76 77  bool create = force;78  if (!create && arch && arch->IsValid()) {79    const llvm::Triple &triple = arch->GetTriple();80    switch (triple.getVendor()) {81    case llvm::Triple::Apple:82      create = true;83      break;84 85#if defined(__APPLE__)86    // Only accept "unknown" for vendor if the host is Apple and it "unknown"87    // wasn't specified (it was just returned because it was NOT specified)88    case llvm::Triple::UnknownVendor:89      create = !arch->TripleVendorWasSpecified();90      break;91#endif92    default:93      break;94    }95 96    if (create) {97      switch (triple.getOS()) {98      case llvm::Triple::Darwin: // Deprecated, but still support Darwin for99                                 // historical reasons100      case llvm::Triple::MacOSX:101        break;102#if defined(__APPLE__)103      // Only accept "vendor" for vendor if the host is Apple and it "unknown"104      // wasn't specified (it was just returned because it was NOT specified)105      case llvm::Triple::UnknownOS:106        create = !arch->TripleOSWasSpecified();107        break;108#endif109      default:110        create = false;111        break;112      }113    }114  }115 116  if (create) {117    LLDB_LOGF(log, "PlatformRemoteMacOSX::%s() creating platform",118              __FUNCTION__);119    return std::make_shared<PlatformRemoteMacOSX>();120  }121 122  LLDB_LOGF(log, "PlatformRemoteMacOSX::%s() aborting creation of platform",123            __FUNCTION__);124 125  return PlatformSP();126}127 128std::vector<ArchSpec>129PlatformRemoteMacOSX::GetSupportedArchitectures(const ArchSpec &host_info) {130  // macOS for ARM64 support both native and translated x86_64 processes131  std::vector<ArchSpec> result;132  ARMGetSupportedArchitectures(result, llvm::Triple::MacOSX);133 134  // We can't use x86GetSupportedArchitectures() because it uses135  // the system architecture for some of its return values and also136  // has a 32bits variant.137  result.push_back(ArchSpec("x86_64-apple-macosx"));138  result.push_back(ArchSpec("x86_64-apple-ios-macabi"));139  result.push_back(ArchSpec("arm64-apple-ios"));140  result.push_back(ArchSpec("arm64e-apple-ios"));141  return result;142}143 144llvm::StringRef PlatformRemoteMacOSX::GetDescriptionStatic() {145  return "Remote Mac OS X user platform plug-in.";146}147 148llvm::StringRef PlatformRemoteMacOSX::GetDeviceSupportDirectoryName() {149  return "macOS DeviceSupport";150}151 152llvm::StringRef PlatformRemoteMacOSX::GetPlatformName() {153  return "MacOSX.platform";154}155