diff --git a/lldb/source/Plugins/Platform/MacOSX/CMakeLists.txt b/lldb/source/Plugins/Platform/MacOSX/CMakeLists.txt --- a/lldb/source/Plugins/Platform/MacOSX/CMakeLists.txt +++ b/lldb/source/Plugins/Platform/MacOSX/CMakeLists.txt @@ -19,9 +19,6 @@ list(APPEND PLUGIN_PLATFORM_MACOSX_DARWIN_ONLY_SOURCES PlatformAppleSimulator.cpp - PlatformiOSSimulator.cpp - PlatformAppleTVSimulator.cpp - PlatformAppleWatchSimulator.cpp ) if(CMAKE_SYSTEM_NAME MATCHES "Darwin") diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h --- a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h @@ -13,6 +13,7 @@ #include "Plugins/Platform/MacOSX/PlatformDarwin.h" #include "Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.h" +#include "lldb/Utility/ConstString.h" #include "lldb/Utility/FileSpec.h" #include "llvm/ADT/Optional.h" @@ -26,10 +27,29 @@ // Class Methods PlatformAppleSimulator( + const char *class_name, const char *description, + lldb_private::ConstString plugin_name, llvm::Triple::OSType preferred_os, + llvm::SmallVector supported_triples, + llvm::StringRef sdk, lldb_private::XcodeSDK::Type sdk_type, CoreSimulatorSupport::DeviceType::ProductFamilyID kind); + static lldb::PlatformSP + CreateInstance(const char *class_name, const char *description, + lldb_private::ConstString plugin_name, + llvm::SmallVector supported_arch, + llvm::Triple::OSType preferred_os, + llvm::SmallVector supported_os, + llvm::SmallVector supported_triples, + llvm::StringRef sdk, lldb_private::XcodeSDK::Type sdk_type, + CoreSimulatorSupport::DeviceType::ProductFamilyID kind, + bool force, const lldb_private::ArchSpec *arch); + virtual ~PlatformAppleSimulator(); + lldb_private::ConstString GetPluginName() override { return m_plugin_name; } + const char *GetDescription() override { return m_description; } + uint32_t GetPluginVersion() override { return 1; } + lldb_private::Status LaunchProcess(lldb_private::ProcessLaunchInfo &launch_info) override; @@ -47,7 +67,32 @@ bool GetSupportedArchitectureAtIndex(uint32_t idx, lldb_private::ArchSpec &arch) override; + lldb_private::Status ResolveExecutable( + const lldb_private::ModuleSpec &module_spec, lldb::ModuleSP &module_sp, + const lldb_private::FileSpecList *module_search_paths_ptr) override; + + lldb_private::Status + GetSharedModule(const lldb_private::ModuleSpec &module_spec, + lldb_private::Process *process, lldb::ModuleSP &module_sp, + const lldb_private::FileSpecList *module_search_paths_ptr, + lldb::ModuleSP *old_module_sp_ptr, + bool *did_create_ptr) override; + + uint32_t + FindProcesses(const lldb_private::ProcessInstanceInfoMatch &match_info, + lldb_private::ProcessInstanceInfoList &process_infos) override; + + void + AddClangModuleCompilationOptions(lldb_private::Target *target, + std::vector &options) override { + return PlatformDarwin::AddClangModuleCompilationOptionsForSDKType( + target, options, m_sdk_type); + } + protected: + const char *m_class_name; + const char *m_description; + lldb_private::ConstString m_plugin_name; std::mutex m_core_sim_path_mutex; llvm::Optional m_core_simulator_framework_path; llvm::Optional m_device; @@ -56,7 +101,9 @@ lldb_private::FileSpec GetCoreSimulatorPath(); llvm::Triple::OSType m_os_type = llvm::Triple::UnknownOS; - llvm::ArrayRef m_supported_triples = {}; + llvm::SmallVector m_supported_triples = {}; + llvm::StringRef m_sdk; + lldb_private::XcodeSDK::Type m_sdk_type; void LoadCoreSimulator(); @@ -68,6 +115,11 @@ PlatformAppleSimulator(const PlatformAppleSimulator &) = delete; const PlatformAppleSimulator & operator=(const PlatformAppleSimulator &) = delete; + lldb_private::Status + + GetSymbolFile(const lldb_private::FileSpec &platform_file, + const lldb_private::UUID *uuid_ptr, + lldb_private::FileSpec &local_file); }; #endif // LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMAPPLESIMULATOR_H diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp --- a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp @@ -12,16 +12,21 @@ #include #endif -#include -#include -#include "lldb/Host/PseudoTerminal.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/PluginManager.h" #include "lldb/Host/HostInfo.h" +#include "lldb/Host/PseudoTerminal.h" #include "lldb/Target/Process.h" #include "lldb/Utility/LLDBAssert.h" +#include "lldb/Utility/Log.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/StreamString.h" + #include "llvm/Support/Threading.h" +#include +#include + using namespace lldb; using namespace lldb_private; @@ -29,15 +34,17 @@ #define UNSUPPORTED_ERROR ("Apple simulators aren't supported on this platform") #endif -// Static Functions -void PlatformAppleSimulator::Initialize() { PlatformDarwin::Initialize(); } - -void PlatformAppleSimulator::Terminate() { PlatformDarwin::Terminate(); } - /// Default Constructor PlatformAppleSimulator::PlatformAppleSimulator( + const char *class_name, const char *description, ConstString plugin_name, + llvm::Triple::OSType preferred_os, + llvm::SmallVector supported_triples, + llvm::StringRef sdk, lldb_private::XcodeSDK::Type sdk_type, CoreSimulatorSupport::DeviceType::ProductFamilyID kind) - : PlatformDarwin(true), m_kind(kind) {} + : PlatformDarwin(true), m_class_name(class_name), + m_description(description), m_plugin_name(plugin_name), m_kind(kind), + m_os_type(preferred_os), m_supported_triples(supported_triples), + m_sdk(sdk), m_sdk_type(sdk_type) {} /// Destructor. /// @@ -73,6 +80,12 @@ } void PlatformAppleSimulator::GetStatus(Stream &strm) { + Platform::GetStatus(strm); + if (!m_sdk.empty()) + strm << " SDK Path: \"" << m_sdk << "\"\n"; + else + strm << " SDK Path: error: unable to locate SDK\n"; + #if defined(__APPLE__) // This will get called by subclasses, so just output status on the current // simulator @@ -87,31 +100,30 @@ strm.Printf("Available devices:\n"); for (size_t i = 0; i < num_devices; ++i) { CoreSimulatorSupport::Device device = devices.GetDeviceAtIndex(i); - strm.Printf(" %s: %s\n", device.GetUDID().c_str(), - device.GetName().c_str()); + strm << " " << device.GetUDID() << ": " << device.GetName() << "\n"; } if (m_device.hasValue() && m_device->operator bool()) { - strm.Printf("Current device: %s: %s", m_device->GetUDID().c_str(), - m_device->GetName().c_str()); + strm << "Current device: " << m_device->GetUDID() << ": " + << m_device->GetName(); if (m_device->GetState() == CoreSimulatorSupport::Device::State::Booted) { - strm.Printf(" state = booted"); + strm << " state = booted"; } - strm.Printf("\nType \"platform connect \" where is a device " - "UDID or a device name to disconnect and connect to a " - "different device.\n"); + strm << "\nType \"platform connect \" where is a device " + "UDID or a device name to disconnect and connect to a " + "different device.\n"; } else { - strm.Printf("No current device is selected, \"platform connect \" " - "where is a device UDID or a device name to connect to " - "a specific device.\n"); + strm << "No current device is selected, \"platform connect \" " + "where is a device UDID or a device name to connect to " + "a specific device.\n"; } } else { - strm.Printf("No devices are available.\n"); + strm << "No devices are available.\n"; } #else - strm.Printf(UNSUPPORTED_ERROR); + strm << UNSUPPORTED_ERROR; #endif } @@ -261,3 +273,402 @@ arch = ArchSpec(m_supported_triples[idx]); return true; } + +PlatformSP PlatformAppleSimulator::CreateInstance( + const char *class_name, const char *description, ConstString plugin_name, + llvm::SmallVector supported_arch, + llvm::Triple::OSType preferred_os, + llvm::SmallVector supported_os, + llvm::SmallVector supported_triples, + llvm::StringRef sdk, lldb_private::XcodeSDK::Type sdk_type, + CoreSimulatorSupport::DeviceType::ProductFamilyID kind, bool force, + const ArchSpec *arch) { + Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PLATFORM)); + if (log) { + const char *arch_name; + if (arch && arch->GetArchitectureName()) + arch_name = arch->GetArchitectureName(); + else + arch_name = ""; + + const char *triple_cstr = + arch ? arch->GetTriple().getTriple().c_str() : ""; + + LLDB_LOGF(log, "%s::%s(force=%s, arch={%s,%s})", class_name, __FUNCTION__, + force ? "true" : "false", arch_name, triple_cstr); + } + + bool create = force; + if (!create && arch && arch->IsValid()) { + if (std::count(supported_arch.begin(), supported_arch.end(), + arch->GetMachine())) { + const llvm::Triple &triple = arch->GetTriple(); + switch (triple.getVendor()) { + case llvm::Triple::Apple: + create = true; + break; + +#if defined(__APPLE__) + // Only accept "unknown" for the vendor if the host is Apple and if + // "unknown" wasn't specified (it was just returned because it was NOT + // specified) + case llvm::Triple::UnknownVendor: + create = !arch->TripleVendorWasSpecified(); + break; +#endif + default: + break; + } + + if (create) { + if (std::count(supported_os.begin(), supported_os.end(), triple.getOS())) + create = true; +#if defined(__APPLE__) + // Only accept "unknown" for the OS if the host is Apple and it + // "unknown" wasn't specified (it was just returned because it was NOT + // specified) + else if (triple.getOS() == llvm::Triple::UnknownOS) + create = !arch->TripleOSWasSpecified(); +#endif + else + create = false; + } + } + } + if (create) { + LLDB_LOGF(log, "%s::%s() creating platform", class_name, __FUNCTION__); + + return PlatformSP(new PlatformAppleSimulator( + class_name, description, plugin_name, preferred_os, supported_triples, + sdk, sdk_type, kind)); + } + + LLDB_LOGF(log, "%s::%s() aborting creation of platform", class_name, + __FUNCTION__); + + return PlatformSP(); +} + +Status PlatformAppleSimulator::ResolveExecutable( + const ModuleSpec &module_spec, lldb::ModuleSP &exe_module_sp, + const FileSpecList *module_search_paths_ptr) { + Status error; + // Nothing special to do here, just use the actual file and architecture + + ModuleSpec resolved_module_spec(module_spec); + + // If we have "ls" as the exe_file, resolve the executable loation based on + // the current path variables + // TODO: resolve bare executables in the Platform SDK + // if (!resolved_exe_file.Exists()) + // resolved_exe_file.ResolveExecutableLocation (); + + // Resolve any executable within a bundle on MacOSX + // TODO: verify that this handles shallow bundles, if not then implement one + // ourselves + Host::ResolveExecutableInBundle(resolved_module_spec.GetFileSpec()); + + if (FileSystem::Instance().Exists(resolved_module_spec.GetFileSpec())) { + if (resolved_module_spec.GetArchitecture().IsValid()) { + error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp, + NULL, NULL, NULL); + + if (exe_module_sp && exe_module_sp->GetObjectFile()) + return error; + exe_module_sp.reset(); + } + // No valid architecture was specified or the exact ARM slice wasn't found + // so ask the platform for the architectures that we should be using (in + // the correct order) and see if we can find a match that way + StreamString arch_names; + ArchSpec platform_arch; + for (uint32_t idx = 0; GetSupportedArchitectureAtIndex( + idx, resolved_module_spec.GetArchitecture()); + ++idx) { + // Only match x86 with x86 and x86_64 with x86_64... + if (!module_spec.GetArchitecture().IsValid() || + module_spec.GetArchitecture().GetCore() == + resolved_module_spec.GetArchitecture().GetCore()) { + error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp, + NULL, NULL, NULL); + // Did we find an executable using one of the + if (error.Success()) { + if (exe_module_sp && exe_module_sp->GetObjectFile()) + break; + else + error.SetErrorToGenericError(); + } + + if (idx > 0) + arch_names.PutCString(", "); + arch_names.PutCString(platform_arch.GetArchitectureName()); + } + } + + if (error.Fail() || !exe_module_sp) { + if (FileSystem::Instance().Readable(resolved_module_spec.GetFileSpec())) { + error.SetErrorStringWithFormat( + "'%s' doesn't contain any '%s' platform architectures: %s", + resolved_module_spec.GetFileSpec().GetPath().c_str(), + GetPluginName().GetCString(), arch_names.GetString().str().c_str()); + } else { + error.SetErrorStringWithFormat( + "'%s' is not readable", + resolved_module_spec.GetFileSpec().GetPath().c_str()); + } + } + } else { + error.SetErrorStringWithFormat("'%s' does not exist", + module_spec.GetFileSpec().GetPath().c_str()); + } + + return error; +} + +Status PlatformAppleSimulator::GetSymbolFile(const FileSpec &platform_file, + const UUID *uuid_ptr, + FileSpec &local_file) { + Status error; + char platform_file_path[PATH_MAX]; + if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path))) { + char resolved_path[PATH_MAX]; + + if (!m_sdk.empty()) { + ::snprintf(resolved_path, sizeof(resolved_path), "%s/%s", + m_sdk.str().c_str(), platform_file_path); + + // First try in the SDK and see if the file is in there + local_file.SetFile(resolved_path, FileSpec::Style::native); + FileSystem::Instance().Resolve(local_file); + if (FileSystem::Instance().Exists(local_file)) + return error; + + // Else fall back to the actual path itself + local_file.SetFile(platform_file_path, FileSpec::Style::native); + FileSystem::Instance().Resolve(local_file); + if (FileSystem::Instance().Exists(local_file)) + return error; + } + error.SetErrorStringWithFormat( + "unable to locate a platform file for '%s' in platform '%s'", + platform_file_path, GetPluginName().GetCString()); + } else { + error.SetErrorString("invalid platform file argument"); + } + return error; +} + +Status PlatformAppleSimulator::GetSharedModule( + const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, + const FileSpecList *module_search_paths_ptr, ModuleSP *old_module_sp_ptr, + bool *did_create_ptr) { + // For iOS/tvOS/watchOS, the SDK files are all cached locally on the + // host system. So first we ask for the file in the cached SDK, then + // we attempt to get a shared module for the right architecture with + // the right UUID. + Status error; + ModuleSpec platform_module_spec(module_spec); + const FileSpec &platform_file = module_spec.GetFileSpec(); + error = GetSymbolFile(platform_file, module_spec.GetUUIDPtr(), + platform_module_spec.GetFileSpec()); + if (error.Success()) { + error = ResolveExecutable(platform_module_spec, module_sp, + module_search_paths_ptr); + } else { + const bool always_create = false; + error = ModuleList::GetSharedModule( + module_spec, module_sp, module_search_paths_ptr, old_module_sp_ptr, + did_create_ptr, always_create); + } + if (module_sp) + module_sp->SetPlatformFileSpec(platform_file); + + return error; +} + +uint32_t PlatformAppleSimulator::FindProcesses( + const ProcessInstanceInfoMatch &match_info, + ProcessInstanceInfoList &process_infos) { + ProcessInstanceInfoList all_osx_process_infos; + // First we get all OSX processes + const uint32_t n = Host::FindProcesses(match_info, all_osx_process_infos); + + // Now we filter them down to only the matching triples. + for (uint32_t i = 0; i < n; ++i) { + const ProcessInstanceInfo &proc_info = all_osx_process_infos[i]; + const llvm::Triple &triple = proc_info.GetArchitecture().GetTriple(); + if (triple.getOS() == m_os_type && + triple.getEnvironment() == llvm::Triple::Simulator) { + process_infos.push_back(proc_info); + } + } + return process_infos.size(); +} + +static llvm::StringRef GetXcodeSDKDir(std::string preferred, + std::string secondary) { + llvm::StringRef sdk; + sdk = HostInfo::GetXcodeSDKPath(XcodeSDK(std::move(preferred))); + if (sdk.empty()) + sdk = HostInfo::GetXcodeSDKPath(XcodeSDK(std::move(secondary))); + return sdk; +} + +static unsigned g_ios_initialize_count = 0; +static const char *g_ios_plugin_name = "ios-simulator"; +static const char *g_ios_description = "iPhone simulator platform plug-in."; + +/// IPhone Simulator Plugin. +struct PlatformiOSSimulator { + static void Initialize() { + if (g_ios_initialize_count++ == 0) { + PluginManager::RegisterPlugin(ConstString(g_ios_plugin_name), + g_ios_description, + PlatformiOSSimulator::CreateInstance); + } + } + + static void Terminate() { + if (g_ios_initialize_count > 0) + if (--g_ios_initialize_count == 0) + PluginManager::UnregisterPlugin(PlatformiOSSimulator::CreateInstance); + } + + static PlatformSP CreateInstance(bool force, const ArchSpec *arch) { + llvm::StringRef sdk; + sdk = HostInfo::GetXcodeSDKPath(XcodeSDK("iPhoneSimulator.Internal.sdk")); + if (sdk.empty()) + sdk = HostInfo::GetXcodeSDKPath(XcodeSDK("iPhoneSimulator.sdk")); + + return PlatformAppleSimulator::CreateInstance( + "PlatformiOSSimulator", g_ios_description, + ConstString(g_ios_plugin_name), + {llvm::Triple::aarch64, llvm::Triple::x86_64, llvm::Triple::x86}, + llvm::Triple::IOS, + {// Deprecated, but still support Darwin for historical reasons. + llvm::Triple::Darwin, llvm::Triple::MacOSX, + // IOS is not used for simulator triples, but accept it just in + // case. + llvm::Triple::IOS}, + { +#ifdef __APPLE__ +#if __arm64__ + "arm64e-apple-ios-simulator", "arm64-apple-ios-simulator", + "x86_64-apple-ios-simulator", "x86_64h-apple-ios-simulator", +#else + "x86_64h-apple-ios-simulator", "x86_64-apple-ios-simulator", + "i386-apple-ios-simulator", +#endif +#endif + }, + GetXcodeSDKDir("iPhoneSimulator.Internal.sdk", "iPhoneSimulator.sdk"), + XcodeSDK::Type::iPhoneSimulator, + CoreSimulatorSupport::DeviceType::ProductFamilyID::iPhone, force, arch); + } +}; + +static unsigned g_tvos_initialize_count = 0; +static const char *g_tvos_plugin_name = "tvos-simulator"; +static const char *g_tvos_description = "tvOS simulator platform plug-in."; + +/// Apple TV Simulator Plugin. +struct PlatformAppleTVSimulator { + static void Initialize() { + if (g_tvos_initialize_count++ == 0) { + PluginManager::RegisterPlugin(ConstString(g_tvos_plugin_name), + g_tvos_description, + PlatformAppleTVSimulator::CreateInstance); + } + } + + static void Terminate() { + if (g_tvos_initialize_count > 0) + if (--g_tvos_initialize_count == 0) + PluginManager::UnregisterPlugin(PlatformAppleTVSimulator::CreateInstance); + } + + static PlatformSP CreateInstance(bool force, const ArchSpec *arch) { + return PlatformAppleSimulator::CreateInstance( + "PlatformAppleTVSimulator", g_tvos_description, + ConstString(g_tvos_plugin_name), + {llvm::Triple::aarch64, llvm::Triple::x86_64}, llvm::Triple::TvOS, + {llvm::Triple::TvOS}, + { +#ifdef __APPLE__ +#if __arm64__ + "arm64e-apple-tvos-simulator", "arm64-apple-tvos-simulator", + "x86_64h-apple-tvos-simulator", "x86_64-apple-tvos-simulator", +#else + "x86_64h-apple-tvos-simulator", "x86_64-apple-tvos-simulator", +#endif +#endif + }, + GetXcodeSDKDir("AppleTVSimulator.Internal.sdk", "AppleTVSimulator.sdk"), + XcodeSDK::Type::AppleTVSimulator, + CoreSimulatorSupport::DeviceType::ProductFamilyID::appleTV, force, + arch); + } +}; + + +static unsigned g_watchos_initialize_count = 0; +static const char *g_watchos_plugin_name = "watchos-simulator"; +static const char *g_watchos_description = + "Apple Watch simulator platform plug-in."; + +/// Apple Watch Simulator Plugin. +struct PlatformAppleWatchSimulator { + static void Initialize() { + if (g_watchos_initialize_count++ == 0) { + PluginManager::RegisterPlugin( + ConstString(g_watchos_plugin_name), g_watchos_description, + PlatformAppleWatchSimulator::CreateInstance); + } + } + + static void Terminate() { + if (g_watchos_initialize_count > 0) + if (--g_watchos_initialize_count == 0) + PluginManager::UnregisterPlugin( + PlatformAppleWatchSimulator::CreateInstance); + } + + static PlatformSP CreateInstance(bool force, const ArchSpec *arch) { + return PlatformAppleSimulator::CreateInstance( + "PlatformAppleWatchSimulator", g_watchos_description, + ConstString(g_watchos_plugin_name), + {llvm::Triple::aarch64, llvm::Triple::x86_64, llvm::Triple::x86}, + llvm::Triple::WatchOS, {llvm::Triple::WatchOS}, + { +#ifdef __APPLE__ +#if __arm64__ + "arm64e-apple-watchos-simulator", "arm64-apple-watchos-simulator", +#else + "x86_64-apple-watchos-simulator", "x86_64h-apple-watchos-simulator", + "i386-apple-watchos-simulator", +#endif +#endif + }, + GetXcodeSDKDir("WatchSimulator.Internal.sdk", "WatchSimulator.sdk"), + XcodeSDK::Type::WatchSimulator, + CoreSimulatorSupport::DeviceType::ProductFamilyID::appleWatch, force, + arch); + } +}; + + +// Static Functions +void PlatformAppleSimulator::Initialize() { + PlatformDarwin::Initialize(); + PlatformiOSSimulator::Initialize(); + PlatformAppleTVSimulator::Initialize(); + PlatformAppleWatchSimulator::Initialize(); +} + +void PlatformAppleSimulator::Terminate() { + PlatformAppleWatchSimulator::Terminate(); + PlatformAppleTVSimulator::Terminate(); + PlatformiOSSimulator::Terminate(); + PlatformDarwin::Terminate(); +} + diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleTVSimulator.h b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleTVSimulator.h deleted file mode 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleTVSimulator.h +++ /dev/null @@ -1,85 +0,0 @@ -//===-- PlatformAppleTVSimulator.h ------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMAPPLETVSIMULATOR_H -#define LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMAPPLETVSIMULATOR_H - -#include "PlatformAppleSimulator.h" - -class PlatformAppleTVSimulator : public PlatformAppleSimulator { -public: - // Class Functions - static lldb::PlatformSP CreateInstance(bool force, - const lldb_private::ArchSpec *arch); - - static void Initialize(); - - static void Terminate(); - - static lldb_private::ConstString GetPluginNameStatic(); - - static const char *GetDescriptionStatic(); - - // Class Methods - PlatformAppleTVSimulator(); - - virtual ~PlatformAppleTVSimulator(); - - // lldb_private::PluginInterface functions - lldb_private::ConstString GetPluginName() override { - return GetPluginNameStatic(); - } - - uint32_t GetPluginVersion() override { return 1; } - - // lldb_private::Platform functions - lldb_private::Status ResolveExecutable( - const lldb_private::ModuleSpec &module_spec, lldb::ModuleSP &module_sp, - const lldb_private::FileSpecList *module_search_paths_ptr) override; - - const char *GetDescription() override { return GetDescriptionStatic(); } - - void GetStatus(lldb_private::Stream &strm) override; - - virtual lldb_private::Status - GetSymbolFile(const lldb_private::FileSpec &platform_file, - const lldb_private::UUID *uuid_ptr, - lldb_private::FileSpec &local_file); - - lldb_private::Status - GetSharedModule(const lldb_private::ModuleSpec &module_spec, - lldb_private::Process *process, lldb::ModuleSP &module_sp, - const lldb_private::FileSpecList *module_search_paths_ptr, - lldb::ModuleSP *old_module_sp_ptr, - bool *did_create_ptr) override; - - uint32_t - FindProcesses(const lldb_private::ProcessInstanceInfoMatch &match_info, - lldb_private::ProcessInstanceInfoList &process_infos) override; - - void - AddClangModuleCompilationOptions(lldb_private::Target *target, - std::vector &options) override { - return PlatformDarwin::AddClangModuleCompilationOptionsForSDKType( - target, options, lldb_private::XcodeSDK::Type::iPhoneSimulator); - } - -protected: - std::mutex m_sdk_dir_mutex; - std::string m_sdk_directory; - std::string m_build_update; - - llvm::StringRef GetSDKDirectoryAsCString(); - -private: - PlatformAppleTVSimulator(const PlatformAppleTVSimulator &) = delete; - const PlatformAppleTVSimulator & - operator=(const PlatformAppleTVSimulator &) = delete; -}; - -#endif // LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMAPPLETVSIMULATOR_H diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleTVSimulator.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleTVSimulator.cpp deleted file mode 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleTVSimulator.cpp +++ /dev/null @@ -1,342 +0,0 @@ -//===-- PlatformAppleTVSimulator.cpp --------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "PlatformAppleTVSimulator.h" - -#include "lldb/Breakpoint/BreakpointLocation.h" -#include "lldb/Core/Module.h" -#include "lldb/Core/ModuleList.h" -#include "lldb/Core/ModuleSpec.h" -#include "lldb/Core/PluginManager.h" -#include "lldb/Host/Host.h" -#include "lldb/Host/HostInfo.h" -#include "lldb/Target/Target.h" -#include "lldb/Utility/ArchSpec.h" -#include "lldb/Utility/FileSpec.h" -#include "lldb/Utility/Log.h" -#include "lldb/Utility/ProcessInfo.h" -#include "lldb/Utility/Status.h" -#include "lldb/Utility/StreamString.h" - -#include "llvm/Support/FileSystem.h" - -using namespace lldb; -using namespace lldb_private; - -namespace lldb_private { -class Process; -} - -// Static Variables -static uint32_t g_initialize_count = 0; - -// Static Functions -void PlatformAppleTVSimulator::Initialize() { - PlatformDarwin::Initialize(); - - if (g_initialize_count++ == 0) { - PluginManager::RegisterPlugin( - PlatformAppleTVSimulator::GetPluginNameStatic(), - PlatformAppleTVSimulator::GetDescriptionStatic(), - PlatformAppleTVSimulator::CreateInstance); - } -} - -void PlatformAppleTVSimulator::Terminate() { - if (g_initialize_count > 0) { - if (--g_initialize_count == 0) { - PluginManager::UnregisterPlugin(PlatformAppleTVSimulator::CreateInstance); - } - } - - PlatformDarwin::Terminate(); -} - -PlatformSP PlatformAppleTVSimulator::CreateInstance(bool force, - const ArchSpec *arch) { - Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PLATFORM)); - if (log) { - const char *arch_name; - if (arch && arch->GetArchitectureName()) - arch_name = arch->GetArchitectureName(); - else - arch_name = ""; - - const char *triple_cstr = - arch ? arch->GetTriple().getTriple().c_str() : ""; - - LLDB_LOGF(log, "PlatformAppleTVSimulator::%s(force=%s, arch={%s,%s})", - __FUNCTION__, force ? "true" : "false", arch_name, triple_cstr); - } - - bool create = force; - if (!create && arch && arch->IsValid()) { - switch (arch->GetMachine()) { - case llvm::Triple::aarch64: - case llvm::Triple::x86_64: { - const llvm::Triple &triple = arch->GetTriple(); - switch (triple.getVendor()) { - case llvm::Triple::Apple: - create = true; - break; - -#if defined(__APPLE__) - // Only accept "unknown" for the vendor if the host is Apple and it - // "unknown" wasn't specified (it was just returned because it was NOT - // specified) - case llvm::Triple::UnknownVendor: - create = !arch->TripleVendorWasSpecified(); - break; -#endif - default: - break; - } - - if (create) { - switch (triple.getOS()) { - case llvm::Triple::TvOS: - break; - -#if defined(__APPLE__) - // Only accept "unknown" for the OS if the host is Apple and it - // "unknown" wasn't specified (it was just returned because it was NOT - // specified) - case llvm::Triple::UnknownOS: - create = !arch->TripleOSWasSpecified(); - break; -#endif - default: - create = false; - break; - } - } - } break; - default: - break; - } - } - if (create) { - LLDB_LOGF(log, "PlatformAppleTVSimulator::%s() creating platform", - __FUNCTION__); - - return PlatformSP(new PlatformAppleTVSimulator()); - } - - LLDB_LOGF(log, "PlatformAppleTVSimulator::%s() aborting creation of platform", - __FUNCTION__); - - return PlatformSP(); -} - -lldb_private::ConstString PlatformAppleTVSimulator::GetPluginNameStatic() { - static ConstString g_name("tvos-simulator"); - return g_name; -} - -const char *PlatformAppleTVSimulator::GetDescriptionStatic() { - return "Apple TV simulator platform plug-in."; -} - -/// Default Constructor -PlatformAppleTVSimulator::PlatformAppleTVSimulator() - : PlatformAppleSimulator( - CoreSimulatorSupport::DeviceType::ProductFamilyID::appleTV) { -#ifdef __APPLE__ -#if __arm64__ - static const llvm::StringRef supported_triples[] = { - "arm64e-apple-tvos-simulator", - "arm64-apple-tvos-simulator", - "x86_64h-apple-tvos-simulator", - "x86_64-apple-tvos-simulator", - }; -#else - static const llvm::StringRef supported_triples[] = { - "x86_64h-apple-tvos-simulator", - "x86_64-apple-tvos-simulator", - }; -#endif - m_supported_triples = supported_triples; -#endif -} - -/// Destructor. -/// -/// The destructor is virtual since this class is designed to be -/// inherited from by the plug-in instance. -PlatformAppleTVSimulator::~PlatformAppleTVSimulator() {} - -void PlatformAppleTVSimulator::GetStatus(Stream &strm) { - Platform::GetStatus(strm); - llvm::StringRef sdk_directory = GetSDKDirectoryAsCString(); - if (!sdk_directory.empty()) - strm.Printf(" SDK Path: \"%s\"\n", sdk_directory.str().c_str()); - else - strm.PutCString(" SDK Path: error: unable to locate SDK\n"); -} - -Status PlatformAppleTVSimulator::ResolveExecutable( - const ModuleSpec &module_spec, lldb::ModuleSP &exe_module_sp, - const FileSpecList *module_search_paths_ptr) { - Status error; - // Nothing special to do here, just use the actual file and architecture - - ModuleSpec resolved_module_spec(module_spec); - - // If we have "ls" as the exe_file, resolve the executable loation based on - // the current path variables - // TODO: resolve bare executables in the Platform SDK - // if (!resolved_exe_file.Exists()) - // resolved_exe_file.ResolveExecutableLocation (); - - // Resolve any executable within a bundle on MacOSX - // TODO: verify that this handles shallow bundles, if not then implement one - // ourselves - Host::ResolveExecutableInBundle(resolved_module_spec.GetFileSpec()); - - if (FileSystem::Instance().Exists(resolved_module_spec.GetFileSpec())) { - if (resolved_module_spec.GetArchitecture().IsValid()) { - error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp, - NULL, NULL, NULL); - - if (exe_module_sp && exe_module_sp->GetObjectFile()) - return error; - exe_module_sp.reset(); - } - // No valid architecture was specified or the exact ARM slice wasn't found - // so ask the platform for the architectures that we should be using (in - // the correct order) and see if we can find a match that way - StreamString arch_names; - ArchSpec platform_arch; - for (uint32_t idx = 0; GetSupportedArchitectureAtIndex( - idx, resolved_module_spec.GetArchitecture()); - ++idx) { - // Only match x86 with x86 and x86_64 with x86_64... - if (!module_spec.GetArchitecture().IsValid() || - module_spec.GetArchitecture().GetCore() == - resolved_module_spec.GetArchitecture().GetCore()) { - error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp, - NULL, NULL, NULL); - // Did we find an executable using one of the - if (error.Success()) { - if (exe_module_sp && exe_module_sp->GetObjectFile()) - break; - else - error.SetErrorToGenericError(); - } - - if (idx > 0) - arch_names.PutCString(", "); - arch_names.PutCString(platform_arch.GetArchitectureName()); - } - } - - if (error.Fail() || !exe_module_sp) { - if (FileSystem::Instance().Readable(resolved_module_spec.GetFileSpec())) { - error.SetErrorStringWithFormat( - "'%s' doesn't contain any '%s' platform architectures: %s", - resolved_module_spec.GetFileSpec().GetPath().c_str(), - GetPluginName().GetCString(), arch_names.GetString().str().c_str()); - } else { - error.SetErrorStringWithFormat( - "'%s' is not readable", - resolved_module_spec.GetFileSpec().GetPath().c_str()); - } - } - } else { - error.SetErrorStringWithFormat("'%s' does not exist", - module_spec.GetFileSpec().GetPath().c_str()); - } - - return error; -} - -llvm::StringRef PlatformAppleTVSimulator::GetSDKDirectoryAsCString() { - llvm::StringRef sdk; - sdk = HostInfo::GetXcodeSDKPath(XcodeSDK("AppleTVSimulator.Internal.sdk")); - if (sdk.empty()) - sdk = HostInfo::GetXcodeSDKPath(XcodeSDK("AppleTVSimulator.sdk")); - return sdk; -} - -Status PlatformAppleTVSimulator::GetSymbolFile(const FileSpec &platform_file, - const UUID *uuid_ptr, - FileSpec &local_file) { - Status error; - char platform_file_path[PATH_MAX]; - if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path))) { - char resolved_path[PATH_MAX]; - - llvm::StringRef sdk_dir = GetSDKDirectoryAsCString(); - if (!sdk_dir.empty()) { - ::snprintf(resolved_path, sizeof(resolved_path), "%s/%s", - sdk_dir.str().c_str(), platform_file_path); - - // First try in the SDK and see if the file is in there - local_file.SetFile(resolved_path, FileSpec::Style::native); - FileSystem::Instance().Resolve(local_file); - if (FileSystem::Instance().Exists(local_file)) - return error; - - // Else fall back to the actual path itself - local_file.SetFile(platform_file_path, FileSpec::Style::native); - FileSystem::Instance().Resolve(local_file); - if (FileSystem::Instance().Exists(local_file)) - return error; - } - error.SetErrorStringWithFormat( - "unable to locate a platform file for '%s' in platform '%s'", - platform_file_path, GetPluginName().GetCString()); - } else { - error.SetErrorString("invalid platform file argument"); - } - return error; -} - -Status PlatformAppleTVSimulator::GetSharedModule( - const ModuleSpec &module_spec, lldb_private::Process *process, - ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr, - ModuleSP *old_module_sp_ptr, bool *did_create_ptr) { - // For AppleTV, the SDK files are all cached locally on the host system. So - // first we ask for the file in the cached SDK, then we attempt to get a - // shared module for the right architecture with the right UUID. - Status error; - ModuleSpec platform_module_spec(module_spec); - const FileSpec &platform_file = module_spec.GetFileSpec(); - error = GetSymbolFile(platform_file, module_spec.GetUUIDPtr(), - platform_module_spec.GetFileSpec()); - if (error.Success()) { - error = ResolveExecutable(platform_module_spec, module_sp, - module_search_paths_ptr); - } else { - const bool always_create = false; - error = ModuleList::GetSharedModule( - module_spec, module_sp, module_search_paths_ptr, old_module_sp_ptr, - did_create_ptr, always_create); - } - if (module_sp) - module_sp->SetPlatformFileSpec(platform_file); - - return error; -} - -uint32_t PlatformAppleTVSimulator::FindProcesses( - const ProcessInstanceInfoMatch &match_info, - ProcessInstanceInfoList &process_infos) { - ProcessInstanceInfoList all_osx_process_infos; - // First we get all OSX processes - const uint32_t n = Host::FindProcesses(match_info, all_osx_process_infos); - - // Now we filter them down to only the TvOS triples - for (uint32_t i = 0; i < n; ++i) { - const ProcessInstanceInfo &proc_info = all_osx_process_infos[i]; - if (proc_info.GetArchitecture().GetTriple().getOS() == llvm::Triple::TvOS) { - process_infos.push_back(proc_info); - } - } - return process_infos.size(); -} diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.h b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.h deleted file mode 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.h +++ /dev/null @@ -1,85 +0,0 @@ -//===-- PlatformAppleWatchSimulator.h ---------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMAPPLEWATCHSIMULATOR_H -#define LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMAPPLEWATCHSIMULATOR_H - -#include "PlatformAppleSimulator.h" - -class PlatformAppleWatchSimulator : public PlatformAppleSimulator { -public: - // Class Functions - static lldb::PlatformSP CreateInstance(bool force, - const lldb_private::ArchSpec *arch); - - static void Initialize(); - - static void Terminate(); - - static lldb_private::ConstString GetPluginNameStatic(); - - static const char *GetDescriptionStatic(); - - // Class Methods - PlatformAppleWatchSimulator(); - - virtual ~PlatformAppleWatchSimulator(); - - // lldb_private::PluginInterface functions - lldb_private::ConstString GetPluginName() override { - return GetPluginNameStatic(); - } - - uint32_t GetPluginVersion() override { return 1; } - - // lldb_private::Platform functions - lldb_private::Status ResolveExecutable( - const lldb_private::ModuleSpec &module_spec, lldb::ModuleSP &module_sp, - const lldb_private::FileSpecList *module_search_paths_ptr) override; - - const char *GetDescription() override { return GetDescriptionStatic(); } - - void GetStatus(lldb_private::Stream &strm) override; - - virtual lldb_private::Status - GetSymbolFile(const lldb_private::FileSpec &platform_file, - const lldb_private::UUID *uuid_ptr, - lldb_private::FileSpec &local_file); - - lldb_private::Status - GetSharedModule(const lldb_private::ModuleSpec &module_spec, - lldb_private::Process *process, lldb::ModuleSP &module_sp, - const lldb_private::FileSpecList *module_search_paths_ptr, - lldb::ModuleSP *old_module_sp_ptr, - bool *did_create_ptr) override; - - uint32_t - FindProcesses(const lldb_private::ProcessInstanceInfoMatch &match_info, - lldb_private::ProcessInstanceInfoList &process_infos) override; - - void - AddClangModuleCompilationOptions(lldb_private::Target *target, - std::vector &options) override { - return PlatformDarwin::AddClangModuleCompilationOptionsForSDKType( - target, options, lldb_private::XcodeSDK::Type::iPhoneSimulator); - } - -protected: - std::mutex m_sdk_dir_mutex; - std::string m_sdk_directory; - std::string m_build_update; - - llvm::StringRef GetSDKDirectoryAsCString(); - -private: - PlatformAppleWatchSimulator(const PlatformAppleWatchSimulator &) = delete; - const PlatformAppleWatchSimulator & - operator=(const PlatformAppleWatchSimulator &) = delete; -}; - -#endif // LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMAPPLEWATCHSIMULATOR_H diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.cpp deleted file mode 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.cpp +++ /dev/null @@ -1,344 +0,0 @@ -//===-- PlatformAppleWatchSimulator.cpp -----------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "PlatformAppleWatchSimulator.h" - -#include "lldb/Breakpoint/BreakpointLocation.h" -#include "lldb/Core/Module.h" -#include "lldb/Core/ModuleList.h" -#include "lldb/Core/ModuleSpec.h" -#include "lldb/Core/PluginManager.h" -#include "lldb/Host/Host.h" -#include "lldb/Host/HostInfo.h" -#include "lldb/Target/Process.h" -#include "lldb/Utility/ArchSpec.h" -#include "lldb/Utility/FileSpec.h" -#include "lldb/Utility/Log.h" -#include "lldb/Utility/ProcessInfo.h" -#include "lldb/Utility/Status.h" -#include "lldb/Utility/StreamString.h" - -using namespace lldb; -using namespace lldb_private; - -namespace lldb_private { -class Process; -} - -// Static Variables -static uint32_t g_initialize_count = 0; - -// Static Functions -void PlatformAppleWatchSimulator::Initialize() { - PlatformDarwin::Initialize(); - - if (g_initialize_count++ == 0) { - PluginManager::RegisterPlugin( - PlatformAppleWatchSimulator::GetPluginNameStatic(), - PlatformAppleWatchSimulator::GetDescriptionStatic(), - PlatformAppleWatchSimulator::CreateInstance); - } -} - -void PlatformAppleWatchSimulator::Terminate() { - if (g_initialize_count > 0) { - if (--g_initialize_count == 0) { - PluginManager::UnregisterPlugin( - PlatformAppleWatchSimulator::CreateInstance); - } - } - - PlatformDarwin::Terminate(); -} - -PlatformSP PlatformAppleWatchSimulator::CreateInstance(bool force, - const ArchSpec *arch) { - Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PLATFORM)); - if (log) { - const char *arch_name; - if (arch && arch->GetArchitectureName()) - arch_name = arch->GetArchitectureName(); - else - arch_name = ""; - - const char *triple_cstr = - arch ? arch->GetTriple().getTriple().c_str() : ""; - - LLDB_LOGF(log, "PlatformAppleWatchSimulator::%s(force=%s, arch={%s,%s})", - __FUNCTION__, force ? "true" : "false", arch_name, triple_cstr); - } - - bool create = force; - if (!create && arch && arch->IsValid()) { - switch (arch->GetMachine()) { - case llvm::Triple::aarch64: - case llvm::Triple::x86_64: - case llvm::Triple::x86: { - const llvm::Triple &triple = arch->GetTriple(); - switch (triple.getVendor()) { - case llvm::Triple::Apple: - create = true; - break; - -#if defined(__APPLE__) - // Only accept "unknown" for the vendor if the host is Apple and it - // "unknown" wasn't specified (it was just returned because it was NOT - // specified) - case llvm::Triple::UnknownVendor: - create = !arch->TripleVendorWasSpecified(); - break; -#endif - default: - break; - } - - if (create) { - switch (triple.getOS()) { - case llvm::Triple::WatchOS: - break; - -#if defined(__APPLE__) - // Only accept "unknown" for the OS if the host is Apple and it - // "unknown" wasn't specified (it was just returned because it was NOT - // specified) - case llvm::Triple::UnknownOS: - create = !arch->TripleOSWasSpecified(); - break; -#endif - default: - create = false; - break; - } - } - } break; - default: - break; - } - } - if (create) { - LLDB_LOGF(log, "PlatformAppleWatchSimulator::%s() creating platform", - __FUNCTION__); - - return PlatformSP(new PlatformAppleWatchSimulator()); - } - - LLDB_LOGF(log, - "PlatformAppleWatchSimulator::%s() aborting creation of platform", - __FUNCTION__); - - return PlatformSP(); -} - -lldb_private::ConstString PlatformAppleWatchSimulator::GetPluginNameStatic() { - static ConstString g_name("watchos-simulator"); - return g_name; -} - -const char *PlatformAppleWatchSimulator::GetDescriptionStatic() { - return "Apple Watch simulator platform plug-in."; -} - -/// Default Constructor -PlatformAppleWatchSimulator::PlatformAppleWatchSimulator() - : PlatformAppleSimulator( - CoreSimulatorSupport::DeviceType::ProductFamilyID::appleWatch) { -#ifdef __APPLE__ -#if __arm64__ - static const llvm::StringRef supported_triples[] = { - "arm64e-apple-watchos-simulator", - "arm64-apple-watchos-simulator", - }; -#else - static const llvm::StringRef supported_triples[] = { - "x86_64-apple-watchos-simulator", - "x86_64h-apple-watchos-simulator", - "i386-apple-watchos-simulator", - }; -#endif - m_supported_triples = supported_triples; -#endif -} - -/// Destructor. -/// -/// The destructor is virtual since this class is designed to be -/// inherited from by the plug-in instance. -PlatformAppleWatchSimulator::~PlatformAppleWatchSimulator() {} - -void PlatformAppleWatchSimulator::GetStatus(Stream &strm) { - Platform::GetStatus(strm); - llvm::StringRef sdk_directory = GetSDKDirectoryAsCString(); - if (!sdk_directory.empty()) - strm.Printf(" SDK Path: \"%s\"\n", sdk_directory.str().c_str()); - else - strm.PutCString(" SDK Path: error: unable to locate SDK\n"); -} - -Status PlatformAppleWatchSimulator::ResolveExecutable( - const ModuleSpec &module_spec, lldb::ModuleSP &exe_module_sp, - const FileSpecList *module_search_paths_ptr) { - Status error; - // Nothing special to do here, just use the actual file and architecture - - ModuleSpec resolved_module_spec(module_spec); - - // If we have "ls" as the exe_file, resolve the executable loation based on - // the current path variables - // TODO: resolve bare executables in the Platform SDK - // if (!resolved_exe_file.Exists()) - // resolved_exe_file.ResolveExecutableLocation (); - - // Resolve any executable within a bundle on MacOSX - // TODO: verify that this handles shallow bundles, if not then implement one - // ourselves - Host::ResolveExecutableInBundle(resolved_module_spec.GetFileSpec()); - - if (FileSystem::Instance().Exists(resolved_module_spec.GetFileSpec())) { - if (resolved_module_spec.GetArchitecture().IsValid()) { - error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp, - NULL, NULL, NULL); - - if (exe_module_sp && exe_module_sp->GetObjectFile()) - return error; - exe_module_sp.reset(); - } - // No valid architecture was specified or the exact ARM slice wasn't found - // so ask the platform for the architectures that we should be using (in - // the correct order) and see if we can find a match that way - StreamString arch_names; - ArchSpec platform_arch; - for (uint32_t idx = 0; GetSupportedArchitectureAtIndex( - idx, resolved_module_spec.GetArchitecture()); - ++idx) { - // Only match x86 with x86 and x86_64 with x86_64... - if (!module_spec.GetArchitecture().IsValid() || - module_spec.GetArchitecture().GetCore() == - resolved_module_spec.GetArchitecture().GetCore()) { - error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp, - NULL, NULL, NULL); - // Did we find an executable using one of the - if (error.Success()) { - if (exe_module_sp && exe_module_sp->GetObjectFile()) - break; - else - error.SetErrorToGenericError(); - } - - if (idx > 0) - arch_names.PutCString(", "); - arch_names.PutCString(platform_arch.GetArchitectureName()); - } - } - - if (error.Fail() || !exe_module_sp) { - if (FileSystem::Instance().Readable(resolved_module_spec.GetFileSpec())) { - error.SetErrorStringWithFormat( - "'%s' doesn't contain any '%s' platform architectures: %s", - resolved_module_spec.GetFileSpec().GetPath().c_str(), - GetPluginName().GetCString(), arch_names.GetString().str().c_str()); - } else { - error.SetErrorStringWithFormat( - "'%s' is not readable", - resolved_module_spec.GetFileSpec().GetPath().c_str()); - } - } - } else { - error.SetErrorStringWithFormat("'%s' does not exist", - module_spec.GetFileSpec().GetPath().c_str()); - } - - return error; -} - -llvm::StringRef PlatformAppleWatchSimulator::GetSDKDirectoryAsCString() { - llvm::StringRef sdk; - sdk = HostInfo::GetXcodeSDKPath(XcodeSDK("WatchSimulator.Internal.sdk")); - if (sdk.empty()) - sdk = HostInfo::GetXcodeSDKPath(XcodeSDK("WatchSimulator.sdk")); - return sdk; -} - -Status PlatformAppleWatchSimulator::GetSymbolFile(const FileSpec &platform_file, - const UUID *uuid_ptr, - FileSpec &local_file) { - Status error; - char platform_file_path[PATH_MAX]; - if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path))) { - char resolved_path[PATH_MAX]; - - llvm::StringRef sdk_dir = GetSDKDirectoryAsCString(); - if (!sdk_dir.empty()) { - ::snprintf(resolved_path, sizeof(resolved_path), "%s/%s", - sdk_dir.str().c_str(), platform_file_path); - - // First try in the SDK and see if the file is in there - local_file.SetFile(resolved_path, FileSpec::Style::native); - FileSystem::Instance().Resolve(local_file); - if (FileSystem::Instance().Exists(local_file)) - return error; - - // Else fall back to the actual path itself - local_file.SetFile(platform_file_path, FileSpec::Style::native); - FileSystem::Instance().Resolve(local_file); - if (FileSystem::Instance().Exists(local_file)) - return error; - } - error.SetErrorStringWithFormat( - "unable to locate a platform file for '%s' in platform '%s'", - platform_file_path, GetPluginName().GetCString()); - } else { - error.SetErrorString("invalid platform file argument"); - } - return error; -} - -Status PlatformAppleWatchSimulator::GetSharedModule( - const ModuleSpec &module_spec, lldb_private::Process *process, - ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr, - ModuleSP *old_module_sp_ptr, bool *did_create_ptr) { - // For AppleWatch, the SDK files are all cached locally on the host system. - // So first we ask for the file in the cached SDK, then we attempt to get a - // shared module for the right architecture with the right UUID. - Status error; - ModuleSpec platform_module_spec(module_spec); - const FileSpec &platform_file = module_spec.GetFileSpec(); - error = GetSymbolFile(platform_file, module_spec.GetUUIDPtr(), - platform_module_spec.GetFileSpec()); - if (error.Success()) { - error = ResolveExecutable(platform_module_spec, module_sp, - module_search_paths_ptr); - } else { - const bool always_create = false; - error = ModuleList::GetSharedModule( - module_spec, module_sp, module_search_paths_ptr, old_module_sp_ptr, - did_create_ptr, always_create); - } - if (module_sp) - module_sp->SetPlatformFileSpec(platform_file); - - return error; -} - -uint32_t PlatformAppleWatchSimulator::FindProcesses( - const ProcessInstanceInfoMatch &match_info, - ProcessInstanceInfoList &process_infos) { - ProcessInstanceInfoList all_osx_process_infos; - // First we get all OSX processes - const uint32_t n = Host::FindProcesses(match_info, all_osx_process_infos); - - // Now we filter them down to only the WatchOS triples - for (uint32_t i = 0; i < n; ++i) { - const ProcessInstanceInfo &proc_info = all_osx_process_infos[i]; - if (proc_info.GetArchitecture().GetTriple().getOS() == - llvm::Triple::WatchOS) { - process_infos.push_back(proc_info); - } - } - return process_infos.size(); -} - diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp --- a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp @@ -9,13 +9,11 @@ #include "PlatformMacOSX.h" #include "PlatformRemoteiOS.h" #if defined(__APPLE__) -#include "PlatformAppleTVSimulator.h" -#include "PlatformAppleWatchSimulator.h" +#include "PlatformAppleSimulator.h" #include "PlatformDarwinKernel.h" #include "PlatformRemoteAppleBridge.h" #include "PlatformRemoteAppleTV.h" #include "PlatformRemoteAppleWatch.h" -#include "PlatformiOSSimulator.h" #endif #include "lldb/Breakpoint/BreakpointLocation.h" #include "lldb/Core/Module.h" @@ -47,10 +45,8 @@ PlatformDarwin::Initialize(); PlatformRemoteiOS::Initialize(); #if defined(__APPLE__) - PlatformiOSSimulator::Initialize(); + PlatformAppleSimulator::Initialize(); PlatformDarwinKernel::Initialize(); - PlatformAppleTVSimulator::Initialize(); - PlatformAppleWatchSimulator::Initialize(); PlatformRemoteAppleTV::Initialize(); PlatformRemoteAppleWatch::Initialize(); PlatformRemoteAppleBridge::Initialize(); @@ -79,10 +75,8 @@ PlatformRemoteAppleBridge::Terminate(); PlatformRemoteAppleWatch::Terminate(); PlatformRemoteAppleTV::Terminate(); - PlatformAppleWatchSimulator::Terminate(); - PlatformAppleTVSimulator::Terminate(); PlatformDarwinKernel::Terminate(); - PlatformiOSSimulator::Terminate(); + PlatformAppleSimulator::Terminate(); #endif PlatformRemoteiOS::Terminate(); PlatformDarwin::Terminate(); diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h b/lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h deleted file mode 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h +++ /dev/null @@ -1,86 +0,0 @@ -//===-- PlatformiOSSimulator.h ----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMIOSSIMULATOR_H -#define LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMIOSSIMULATOR_H - -#include -#include - -#include "PlatformAppleSimulator.h" - -class PlatformiOSSimulator : public PlatformAppleSimulator { -public: - PlatformiOSSimulator(); - - ~PlatformiOSSimulator() override; - - // Class Functions - static lldb::PlatformSP CreateInstance(bool force, - const lldb_private::ArchSpec *arch); - - static void Initialize(); - - static void Terminate(); - - static lldb_private::ConstString GetPluginNameStatic(); - - static const char *GetDescriptionStatic(); - - // lldb_private::PluginInterface functions - lldb_private::ConstString GetPluginName() override { - return GetPluginNameStatic(); - } - - uint32_t GetPluginVersion() override { return 1; } - - // lldb_private::Platform functions - lldb_private::Status ResolveExecutable( - const lldb_private::ModuleSpec &module_spec, lldb::ModuleSP &module_sp, - const lldb_private::FileSpecList *module_search_paths_ptr) override; - - const char *GetDescription() override { return GetDescriptionStatic(); } - - void GetStatus(lldb_private::Stream &strm) override; - - virtual lldb_private::Status - GetSymbolFile(const lldb_private::FileSpec &platform_file, - const lldb_private::UUID *uuid_ptr, - lldb_private::FileSpec &local_file); - - lldb_private::Status - GetSharedModule(const lldb_private::ModuleSpec &module_spec, - lldb_private::Process *process, lldb::ModuleSP &module_sp, - const lldb_private::FileSpecList *module_search_paths_ptr, - lldb::ModuleSP *old_module_sp_ptr, - bool *did_create_ptr) override; - - uint32_t - FindProcesses(const lldb_private::ProcessInstanceInfoMatch &match_info, - lldb_private::ProcessInstanceInfoList &process_infos) override; - - void - AddClangModuleCompilationOptions(lldb_private::Target *target, - std::vector &options) override { - return PlatformDarwin::AddClangModuleCompilationOptionsForSDKType( - target, options, lldb_private::XcodeSDK::Type::iPhoneSimulator); - } - -protected: - std::mutex m_sdk_dir_mutex; - std::string m_sdk_directory; - std::string m_build_update; - - llvm::StringRef GetSDKDirectoryAsCString(); - -private: - PlatformiOSSimulator(const PlatformiOSSimulator &) = delete; - const PlatformiOSSimulator &operator=(const PlatformiOSSimulator &) = delete; -}; - -#endif // LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMIOSSIMULATOR_H diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp deleted file mode 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp +++ /dev/null @@ -1,349 +0,0 @@ -//===-- PlatformiOSSimulator.cpp ------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "PlatformiOSSimulator.h" - -#include "lldb/Breakpoint/BreakpointLocation.h" -#include "lldb/Core/Module.h" -#include "lldb/Core/ModuleList.h" -#include "lldb/Core/ModuleSpec.h" -#include "lldb/Core/PluginManager.h" -#include "lldb/Host/Host.h" -#include "lldb/Host/HostInfo.h" -#include "lldb/Target/Target.h" -#include "lldb/Utility/ArchSpec.h" -#include "lldb/Utility/FileSpec.h" -#include "lldb/Utility/Log.h" -#include "lldb/Utility/ProcessInfo.h" -#include "lldb/Utility/Status.h" -#include "lldb/Utility/StreamString.h" - -#include "llvm/Support/FileSystem.h" - -using namespace lldb; -using namespace lldb_private; - -namespace lldb_private { -class Process; -} - -// Static Variables -static uint32_t g_initialize_count = 0; - -// Static Functions -void PlatformiOSSimulator::Initialize() { - PlatformAppleSimulator::Initialize(); - - if (g_initialize_count++ == 0) { - PluginManager::RegisterPlugin(PlatformiOSSimulator::GetPluginNameStatic(), - PlatformiOSSimulator::GetDescriptionStatic(), - PlatformiOSSimulator::CreateInstance); - } -} - -void PlatformiOSSimulator::Terminate() { - if (g_initialize_count > 0) { - if (--g_initialize_count == 0) { - PluginManager::UnregisterPlugin(PlatformiOSSimulator::CreateInstance); - } - } - - PlatformAppleSimulator::Terminate(); -} - -PlatformSP PlatformiOSSimulator::CreateInstance(bool force, - const ArchSpec *arch) { - Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PLATFORM)); - if (log) { - const char *arch_name; - if (arch && arch->GetArchitectureName()) - arch_name = arch->GetArchitectureName(); - else - arch_name = ""; - - const char *triple_cstr = - arch ? arch->GetTriple().getTriple().c_str() : ""; - - LLDB_LOGF(log, "PlatformiOSSimulator::%s(force=%s, arch={%s,%s})", - __FUNCTION__, force ? "true" : "false", arch_name, triple_cstr); - } - - bool create = force; - if (!create && arch && arch->IsValid()) { - switch (arch->GetMachine()) { - case llvm::Triple::aarch64: - case llvm::Triple::x86_64: - case llvm::Triple::x86: { - const llvm::Triple &triple = arch->GetTriple(); - switch (triple.getVendor()) { - case llvm::Triple::Apple: - create = true; - break; - -#if defined(__APPLE__) - // Only accept "unknown" for the vendor if the host is Apple and it - // "unknown" wasn't specified (it was just returned because it was NOT - // specified) - case llvm::Triple::UnknownVendor: - create = !arch->TripleVendorWasSpecified(); - break; -#endif - default: - break; - } - - if (create) { - switch (triple.getOS()) { - case llvm::Triple::Darwin: // Deprecated, but still support Darwin for - // historical reasons - case llvm::Triple::MacOSX: - case llvm::Triple::IOS: // IOS is not used for simulator triples, but - // accept it just in case - break; - -#if defined(__APPLE__) - // Only accept "unknown" for the OS if the host is Apple and it - // "unknown" wasn't specified (it was just returned because it was NOT - // specified) - case llvm::Triple::UnknownOS: - create = !arch->TripleOSWasSpecified(); - break; -#endif - default: - create = false; - break; - } - } - } break; - default: - break; - } - } - if (create) { - LLDB_LOGF(log, "PlatformiOSSimulator::%s() creating platform", - __FUNCTION__); - - return PlatformSP(new PlatformiOSSimulator()); - } - - LLDB_LOGF(log, "PlatformiOSSimulator::%s() aborting creation of platform", - __FUNCTION__); - - return PlatformSP(); -} - -lldb_private::ConstString PlatformiOSSimulator::GetPluginNameStatic() { - static ConstString g_name("ios-simulator"); - return g_name; -} - -const char *PlatformiOSSimulator::GetDescriptionStatic() { - return "iOS simulator platform plug-in."; -} - -/// Default Constructor -PlatformiOSSimulator::PlatformiOSSimulator() - : PlatformAppleSimulator( - CoreSimulatorSupport::DeviceType::ProductFamilyID::iPhone) { -#ifdef __APPLE__ -#if __arm64__ - static const llvm::StringRef supported_triples[] = { - "arm64e-apple-ios-simulator", - "arm64-apple-ios-simulator", - "x86_64-apple-ios-simulator", - "x86_64h-apple-ios-simulator", - }; -#else - static const llvm::StringRef supported_triples[] = { - "x86_64h-apple-ios-simulator", - "x86_64-apple-ios-simulator", - "i386-apple-ios-simulator", - }; -#endif - m_supported_triples = supported_triples; -#endif -} - -/// Destructor. -/// -/// The destructor is virtual since this class is designed to be -/// inherited from by the plug-in instance. -PlatformiOSSimulator::~PlatformiOSSimulator() {} - -void PlatformiOSSimulator::GetStatus(Stream &strm) { - Platform::GetStatus(strm); - llvm::StringRef sdk_directory = GetSDKDirectoryAsCString(); - if (!sdk_directory.empty()) - strm.Printf(" SDK Path: \"%s\"\n", sdk_directory.str().c_str()); - else - strm.PutCString(" SDK Path: error: unable to locate SDK\n"); - PlatformAppleSimulator::GetStatus(strm); -} - -Status PlatformiOSSimulator::ResolveExecutable( - const ModuleSpec &module_spec, lldb::ModuleSP &exe_module_sp, - const FileSpecList *module_search_paths_ptr) { - Status error; - // Nothing special to do here, just use the actual file and architecture - - ModuleSpec resolved_module_spec(module_spec); - - // If we have "ls" as the exe_file, resolve the executable loation based on - // the current path variables - // TODO: resolve bare executables in the Platform SDK - // if (!resolved_exe_file.Exists()) - // resolved_exe_file.ResolveExecutableLocation (); - - // Resolve any executable within a bundle on MacOSX - // TODO: verify that this handles shallow bundles, if not then implement one - // ourselves - Host::ResolveExecutableInBundle(resolved_module_spec.GetFileSpec()); - - if (FileSystem::Instance().Exists(resolved_module_spec.GetFileSpec())) { - if (resolved_module_spec.GetArchitecture().IsValid()) { - error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp, - NULL, NULL, NULL); - - if (exe_module_sp && exe_module_sp->GetObjectFile()) - return error; - exe_module_sp.reset(); - } - // No valid architecture was specified or the exact ARM slice wasn't found - // so ask the platform for the architectures that we should be using (in - // the correct order) and see if we can find a match that way - StreamString arch_names; - ArchSpec platform_arch; - for (uint32_t idx = 0; GetSupportedArchitectureAtIndex( - idx, resolved_module_spec.GetArchitecture()); - ++idx) { - // Only match x86 with x86 and x86_64 with x86_64... - if (!module_spec.GetArchitecture().IsValid() || - module_spec.GetArchitecture().GetCore() == - resolved_module_spec.GetArchitecture().GetCore()) { - error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp, - NULL, NULL, NULL); - // Did we find an executable using one of the - if (error.Success()) { - if (exe_module_sp && exe_module_sp->GetObjectFile()) - break; - else - error.SetErrorToGenericError(); - } - - if (idx > 0) - arch_names.PutCString(", "); - arch_names.PutCString(platform_arch.GetArchitectureName()); - } - } - - if (error.Fail() || !exe_module_sp) { - if (FileSystem::Instance().Readable(resolved_module_spec.GetFileSpec())) { - error.SetErrorStringWithFormat( - "'%s' doesn't contain any '%s' platform architectures: %s", - resolved_module_spec.GetFileSpec().GetPath().c_str(), - GetPluginName().GetCString(), arch_names.GetString().str().c_str()); - } else { - error.SetErrorStringWithFormat( - "'%s' is not readable", - resolved_module_spec.GetFileSpec().GetPath().c_str()); - } - } - } else { - error.SetErrorStringWithFormat("'%s' does not exist", - module_spec.GetFileSpec().GetPath().c_str()); - } - - return error; -} - -llvm::StringRef PlatformiOSSimulator::GetSDKDirectoryAsCString() { - llvm::StringRef sdk; - sdk = HostInfo::GetXcodeSDKPath(XcodeSDK("iPhoneSimulator.Internal.sdk")); - if (sdk.empty()) - sdk = HostInfo::GetXcodeSDKPath(XcodeSDK("iPhoneSimulator.sdk")); - return sdk; -} - -Status PlatformiOSSimulator::GetSymbolFile(const FileSpec &platform_file, - const UUID *uuid_ptr, - FileSpec &local_file) { - Status error; - char platform_file_path[PATH_MAX]; - if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path))) { - char resolved_path[PATH_MAX]; - - llvm::StringRef sdk_dir = GetSDKDirectoryAsCString(); - if (!sdk_dir.empty()) { - ::snprintf(resolved_path, sizeof(resolved_path), "%s/%s", - sdk_dir.str().c_str(), platform_file_path); - - // First try in the SDK and see if the file is in there - local_file.SetFile(resolved_path, FileSpec::Style::native); - FileSystem::Instance().Resolve(local_file); - if (FileSystem::Instance().Exists(local_file)) - return error; - - // Else fall back to the actual path itself - local_file.SetFile(platform_file_path, FileSpec::Style::native); - FileSystem::Instance().Resolve(local_file); - if (FileSystem::Instance().Exists(local_file)) - return error; - } - error.SetErrorStringWithFormat( - "unable to locate a platform file for '%s' in platform '%s'", - platform_file_path, GetPluginName().GetCString()); - } else { - error.SetErrorString("invalid platform file argument"); - } - return error; -} - -Status PlatformiOSSimulator::GetSharedModule( - const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, - const FileSpecList *module_search_paths_ptr, ModuleSP *old_module_sp_ptr, - bool *did_create_ptr) { - // For iOS, the SDK files are all cached locally on the host system. So first - // we ask for the file in the cached SDK, then we attempt to get a shared - // module for the right architecture with the right UUID. - Status error; - ModuleSpec platform_module_spec(module_spec); - const FileSpec &platform_file = module_spec.GetFileSpec(); - error = GetSymbolFile(platform_file, module_spec.GetUUIDPtr(), - platform_module_spec.GetFileSpec()); - if (error.Success()) { - error = ResolveExecutable(platform_module_spec, module_sp, - module_search_paths_ptr); - } else { - const bool always_create = false; - error = ModuleList::GetSharedModule( - module_spec, module_sp, module_search_paths_ptr, old_module_sp_ptr, - did_create_ptr, always_create); - } - if (module_sp) - module_sp->SetPlatformFileSpec(platform_file); - - return error; -} - -uint32_t -PlatformiOSSimulator::FindProcesses(const ProcessInstanceInfoMatch &match_info, - ProcessInstanceInfoList &process_infos) { - ProcessInstanceInfoList all_osx_process_infos; - // First we get all OSX processes - const uint32_t n = Host::FindProcesses(match_info, all_osx_process_infos); - - // Now we filter them down to only the iOS triples - for (uint32_t i = 0; i < n; ++i) { - const ProcessInstanceInfo &proc_info = all_osx_process_infos[i]; - if (proc_info.GetArchitecture().GetTriple().getOS() == llvm::Triple::IOS) { - process_infos.push_back(proc_info); - } - } - return process_infos.size(); -} - diff --git a/lldb/unittests/Platform/PlatformAppleSimulatorTest.cpp b/lldb/unittests/Platform/PlatformAppleSimulatorTest.cpp --- a/lldb/unittests/Platform/PlatformAppleSimulatorTest.cpp +++ b/lldb/unittests/Platform/PlatformAppleSimulatorTest.cpp @@ -8,9 +8,7 @@ #include "gtest/gtest.h" -#include "Plugins/Platform/MacOSX/PlatformAppleTVSimulator.h" -#include "Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.h" -#include "Plugins/Platform/MacOSX/PlatformiOSSimulator.h" +#include "Plugins/Platform/MacOSX/PlatformAppleSimulator.h" #include "TestingSupport/SubsystemRAII.h" #include "lldb/Host/FileSystem.h" #include "lldb/Host/HostInfo.h" @@ -20,8 +18,7 @@ using namespace lldb_private; class PlatformAppleSimulatorTest : public ::testing::Test { - SubsystemRAII + SubsystemRAII subsystems; };