brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.8 KiB · 7dc8b9b Raw
190 lines · cpp
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-exception6//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 29using namespace lldb;30using namespace lldb_private;31 32// Static Variables33static uint32_t g_initialize_count = 0;34 35// Static Functions36void PlatformRemoteAppleWatch::Initialize() {37  PlatformDarwin::Initialize();38 39  if (g_initialize_count++ == 0) {40    PluginManager::RegisterPlugin(41        PlatformRemoteAppleWatch::GetPluginNameStatic(),42        PlatformRemoteAppleWatch::GetDescriptionStatic(),43        PlatformRemoteAppleWatch::CreateInstance);44  }45}46 47void PlatformRemoteAppleWatch::Terminate() {48  if (g_initialize_count > 0) {49    if (--g_initialize_count == 0) {50      PluginManager::UnregisterPlugin(PlatformRemoteAppleWatch::CreateInstance);51    }52  }53 54  PlatformDarwin::Terminate();55}56 57PlatformSP PlatformRemoteAppleWatch::CreateInstance(bool force,58                                                    const ArchSpec *arch) {59  Log *log = GetLog(LLDBLog::Platform);60  if (log) {61    const char *arch_name;62    if (arch && arch->GetArchitectureName())63      arch_name = arch->GetArchitectureName();64    else65      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 and90      // "unknown" wasn't specified (it was just returned because it was NOT91      // specified)92      case llvm::Triple::UnknownVendor:93        create = !arch->TripleVendorWasSpecified();94        break;95 96#endif97      default:98        break;99      }100      if (create) {101        switch (triple.getOS()) {102        case llvm::Triple::WatchOS: // This is the right triple value for Apple103                                    // Watch debugging104          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's120  // a local system environment.121  if (force == false) {122    create = false;123  }124#endif125 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 139llvm::StringRef PlatformRemoteAppleWatch::GetDescriptionStatic() {140  return "Remote Apple Watch platform plug-in.";141}142 143/// Default Constructor144PlatformRemoteAppleWatch::PlatformRemoteAppleWatch()145    : PlatformRemoteDarwinDevice() {}146 147std::vector<ArchSpec>148PlatformRemoteAppleWatch::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 183llvm::StringRef PlatformRemoteAppleWatch::GetDeviceSupportDirectoryName() {184  return "watchOS DeviceSupport";185}186 187llvm::StringRef PlatformRemoteAppleWatch::GetPlatformName() {188  return "WatchOS.platform";189}190