164 lines · cpp
1//===-- PlatformRemoteAppleTV.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 "PlatformRemoteAppleTV.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/// Default Constructor33PlatformRemoteAppleTV::PlatformRemoteAppleTV()34 : PlatformRemoteDarwinDevice () {}35 36// Static Variables37static uint32_t g_initialize_count = 0;38 39// Static Functions40void PlatformRemoteAppleTV::Initialize() {41 PlatformDarwin::Initialize();42 43 if (g_initialize_count++ == 0) {44 PluginManager::RegisterPlugin(PlatformRemoteAppleTV::GetPluginNameStatic(),45 PlatformRemoteAppleTV::GetDescriptionStatic(),46 PlatformRemoteAppleTV::CreateInstance);47 }48}49 50void PlatformRemoteAppleTV::Terminate() {51 if (g_initialize_count > 0) {52 if (--g_initialize_count == 0) {53 PluginManager::UnregisterPlugin(PlatformRemoteAppleTV::CreateInstance);54 }55 }56 57 PlatformDarwin::Terminate();58}59 60PlatformSP PlatformRemoteAppleTV::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, "PlatformRemoteAppleTV::%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 switch (arch->GetMachine()) {80 case llvm::Triple::arm:81 case llvm::Triple::aarch64:82 case llvm::Triple::thumb: {83 const llvm::Triple &triple = arch->GetTriple();84 llvm::Triple::VendorType vendor = triple.getVendor();85 switch (vendor) {86 case llvm::Triple::Apple:87 create = true;88 break;89 90#if defined(__APPLE__)91 // Only accept "unknown" for the vendor if the host is Apple and92 // "unknown" wasn't specified (it was just returned because it was NOT93 // specified)94 case llvm::Triple::UnknownVendor:95 create = !arch->TripleVendorWasSpecified();96 break;97 98#endif99 default:100 break;101 }102 if (create) {103 switch (triple.getOS()) {104 case llvm::Triple::TvOS: // This is the right triple value for Apple TV105 // debugging106 break;107 108 default:109 create = false;110 break;111 }112 }113 } break;114 default:115 break;116 }117 }118 119 if (create) {120 LLDB_LOGF(log, "PlatformRemoteAppleTV::%s() creating platform",121 __FUNCTION__);122 123 return lldb::PlatformSP(new PlatformRemoteAppleTV());124 }125 126 LLDB_LOGF(log, "PlatformRemoteAppleTV::%s() aborting creation of platform",127 __FUNCTION__);128 129 return lldb::PlatformSP();130}131 132llvm::StringRef PlatformRemoteAppleTV::GetDescriptionStatic() {133 return "Remote Apple TV platform plug-in.";134}135 136std::vector<ArchSpec> PlatformRemoteAppleTV::GetSupportedArchitectures(137 const ArchSpec &process_host_arch) {138 ArchSpec system_arch(GetSystemArchitecture());139 140 const ArchSpec::Core system_core = system_arch.GetCore();141 switch (system_core) {142 default:143 case ArchSpec::eCore_arm_arm64:144 return {ArchSpec("arm64-apple-tvos"), ArchSpec("armv7s-apple-tvos"),145 ArchSpec("armv7-apple-tvos"), ArchSpec("thumbv7s-apple-tvos"),146 ArchSpec("thumbv7-apple-tvos")};147 148 case ArchSpec::eCore_arm_armv7s:149 return {ArchSpec("armv7s-apple-tvos"), ArchSpec("armv7-apple-tvos"),150 ArchSpec("thumbv7s-apple-tvos"), ArchSpec("thumbv7-apple-tvos")};151 152 case ArchSpec::eCore_arm_armv7:153 return {ArchSpec("armv7-apple-tvos"), ArchSpec("thumbv7-apple-tvos")};154 }155}156 157llvm::StringRef PlatformRemoteAppleTV::GetDeviceSupportDirectoryName() {158 return "tvOS DeviceSupport";159}160 161llvm::StringRef PlatformRemoteAppleTV::GetPlatformName() {162 return "AppleTVOS.platform";163}164