Index: lldb/bindings/interface/SBPlatform.i =================================================================== --- lldb/bindings/interface/SBPlatform.i +++ lldb/bindings/interface/SBPlatform.i @@ -126,6 +126,18 @@ SBPlatform (const char *); + %feature("docstring", " + Create a platform instance using a specific platform plugin name, debugger, + script name and user-provided dictionary. + + :param platform_name: name of the platform plugin to use to create the platform + :param debugger: debugger instance owning the platform + :param script_name: name of the script class and module to use to create the platform + :param dict: user-provided dictionary that can be used when instanciating a platform + ") + SBPlatform (const char *, const SBDebugger&, + const char *, const SBStructuredData&); + ~SBPlatform(); static SBPlatform GetHostPlatform(); Index: lldb/include/lldb/API/SBDebugger.h =================================================================== --- lldb/include/lldb/API/SBDebugger.h +++ lldb/include/lldb/API/SBDebugger.h @@ -420,6 +420,7 @@ const SBFileSpec &trace_description_file); private: + friend class SBPlatform; friend class SBCommandInterpreter; friend class SBInputReader; friend class SBListener; Index: lldb/include/lldb/API/SBPlatform.h =================================================================== --- lldb/include/lldb/API/SBPlatform.h +++ lldb/include/lldb/API/SBPlatform.h @@ -96,6 +96,9 @@ SBPlatform(const char *platform_name); + SBPlatform(const char *platform_name, const SBDebugger &debugger, + const char *script_name, const SBStructuredData &dict); + SBPlatform(const SBPlatform &rhs); SBPlatform &operator=(const SBPlatform &rhs); Index: lldb/include/lldb/API/SBStructuredData.h =================================================================== --- lldb/include/lldb/API/SBStructuredData.h +++ lldb/include/lldb/API/SBStructuredData.h @@ -93,6 +93,7 @@ friend class SBLaunchInfo; friend class SBDebugger; friend class SBTarget; + friend class SBPlatform; friend class SBProcess; friend class SBThread; friend class SBThreadPlan; Index: lldb/include/lldb/Interpreter/OptionGroupPlatform.h =================================================================== --- lldb/include/lldb/Interpreter/OptionGroupPlatform.h +++ lldb/include/lldb/Interpreter/OptionGroupPlatform.h @@ -9,19 +9,22 @@ #ifndef LLDB_INTERPRETER_OPTIONGROUPPLATFORM_H #define LLDB_INTERPRETER_OPTIONGROUPPLATFORM_H +#include "lldb/Interpreter/OptionGroupPythonClassWithDict.h" #include "lldb/Interpreter/Options.h" #include "lldb/Utility/ConstString.h" #include "llvm/Support/VersionTuple.h" namespace lldb_private { +class CommandObjectPlatformSelect; // PlatformOptionGroup // // Make platform options available to any commands that need the settings. class OptionGroupPlatform : public OptionGroup { public: OptionGroupPlatform(bool include_platform_option) - : m_include_platform_option(include_platform_option) {} + : m_include_platform_option(include_platform_option), + m_class_options("scripted platform", true, 'C', 'K', 'V', 0) {} ~OptionGroupPlatform() override = default; @@ -60,11 +63,14 @@ bool PlatformMatches(const lldb::PlatformSP &platform_sp) const; protected: + friend class CommandObjectPlatformSelect; + std::string m_platform_name; ConstString m_sdk_sysroot; ConstString m_sdk_build; llvm::VersionTuple m_os_version; bool m_include_platform_option; + OptionGroupPythonClassWithDict m_class_options; }; } // namespace lldb_private Index: lldb/include/lldb/Target/Platform.h =================================================================== --- lldb/include/lldb/Target/Platform.h +++ lldb/include/lldb/Target/Platform.h @@ -21,6 +21,7 @@ #include "lldb/Core/UserSettingsController.h" #include "lldb/Host/File.h" #include "lldb/Interpreter/Options.h" +#include "lldb/Interpreter/ScriptedMetadata.h" #include "lldb/Utility/ArchSpec.h" #include "lldb/Utility/ConstString.h" #include "lldb/Utility/FileSpec.h" @@ -99,7 +100,8 @@ static void SetHostPlatform(const lldb::PlatformSP &platform_sp); - static lldb::PlatformSP Create(llvm::StringRef name); + static lldb::PlatformSP Create(llvm::StringRef name, const Debugger *debugger, + const ScriptedMetadata *metadata); /// Augments the triple either with information from platform or the host /// system (if platform is null). @@ -974,7 +976,7 @@ class PlatformList { public: - PlatformList() = default; + PlatformList(Debugger &debugger) : m_debugger(debugger) {} ~PlatformList() = default; @@ -1029,13 +1031,16 @@ } } - lldb::PlatformSP GetOrCreate(llvm::StringRef name); + lldb::PlatformSP GetOrCreate(llvm::StringRef name, + const ScriptedMetadata *metadata); lldb::PlatformSP GetOrCreate(const ArchSpec &arch, const ArchSpec &process_host_arch, - ArchSpec *platform_arch_ptr, Status &error); + ArchSpec *platform_arch_ptr, Status &error, + const ScriptedMetadata *metadata); lldb::PlatformSP GetOrCreate(const ArchSpec &arch, const ArchSpec &process_host_arch, - ArchSpec *platform_arch_ptr); + ArchSpec *platform_arch_ptr, + const ScriptedMetadata *metadata); /// Get the platform for the given list of architectures. /// @@ -1051,9 +1056,11 @@ /// given architecture. lldb::PlatformSP GetOrCreate(llvm::ArrayRef archs, const ArchSpec &process_host_arch, - std::vector &candidates); + std::vector &candidates, + const ScriptedMetadata *metadata); - lldb::PlatformSP Create(llvm::StringRef name); + lldb::PlatformSP Create(llvm::StringRef name, + const ScriptedMetadata *metadata); /// Detect a binary in memory that will determine which Platform and /// DynamicLoader should be used in this target/process, and update @@ -1090,6 +1097,7 @@ private: PlatformList(const PlatformList &) = delete; const PlatformList &operator=(const PlatformList &) = delete; + Debugger &m_debugger; }; class OptionGroupPlatformRSync : public lldb_private::OptionGroup { Index: lldb/include/lldb/lldb-private-interfaces.h =================================================================== --- lldb/include/lldb/lldb-private-interfaces.h +++ lldb/include/lldb/lldb-private-interfaces.h @@ -26,6 +26,7 @@ } // namespace llvm namespace lldb_private { +class ScriptedMetadata; typedef lldb::ABISP (*ABICreateInstance)(lldb::ProcessSP process_sp, const ArchSpec &arch); typedef std::unique_ptr (*ArchitectureCreateInstance)( @@ -77,8 +78,9 @@ typedef Status (*StructuredDataFilterLaunchInfo)(ProcessLaunchInfo &launch_info, Target *target); typedef SystemRuntime *(*SystemRuntimeCreateInstance)(Process *process); -typedef lldb::PlatformSP (*PlatformCreateInstance)(bool force, - const ArchSpec *arch); +typedef lldb::PlatformSP (*PlatformCreateInstance)( + bool force, const ArchSpec *arch, const Debugger *debugger, + const ScriptedMetadata *metadata); typedef lldb::ProcessSP (*ProcessCreateInstance)( lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const FileSpec *crash_file_path, bool can_connect); Index: lldb/source/API/SBDebugger.cpp =================================================================== --- lldb/source/API/SBDebugger.cpp +++ lldb/source/API/SBDebugger.cpp @@ -1498,7 +1498,8 @@ if (m_opaque_sp) { if (platform_name_cstr && platform_name_cstr[0]) { PlatformList &platforms = m_opaque_sp->GetPlatformList(); - if (PlatformSP platform_sp = platforms.GetOrCreate(platform_name_cstr)) + if (PlatformSP platform_sp = platforms.GetOrCreate( + platform_name_cstr, /*metadata = */ nullptr)) platforms.SetSelectedPlatform(platform_sp); else sb_error.ref().SetErrorString("platform not found"); Index: lldb/source/API/SBPlatform.cpp =================================================================== --- lldb/source/API/SBPlatform.cpp +++ lldb/source/API/SBPlatform.cpp @@ -7,13 +7,16 @@ //===----------------------------------------------------------------------===// #include "lldb/API/SBPlatform.h" +#include "lldb/API/SBDebugger.h" #include "lldb/API/SBEnvironment.h" #include "lldb/API/SBError.h" #include "lldb/API/SBFileSpec.h" #include "lldb/API/SBLaunchInfo.h" #include "lldb/API/SBPlatform.h" +#include "lldb/API/SBStructuredData.h" #include "lldb/API/SBUnixSignals.h" #include "lldb/Host/File.h" +#include "lldb/Interpreter/ScriptedMetadata.h" #include "lldb/Target/Platform.h" #include "lldb/Target/Target.h" #include "lldb/Utility/ArchSpec.h" @@ -292,7 +295,31 @@ SBPlatform::SBPlatform(const char *platform_name) { LLDB_INSTRUMENT_VA(this, platform_name); - m_opaque_sp = Platform::Create(platform_name); + m_opaque_sp = Platform::Create(platform_name, /*debugger = */ nullptr, + /*metadata = */ nullptr); +} + +SBPlatform::SBPlatform(const char *platform_name, const SBDebugger &debugger, + const char *script_name, const SBStructuredData &dict) { + LLDB_INSTRUMENT_VA(this, platform_name, debugger, script_name, dict); + + if (!script_name || !dict.IsValid() || !dict.m_impl_up) + return; + + StructuredData::ObjectSP obj_sp = dict.m_impl_up->GetObjectSP(); + + if (!obj_sp) + return; + + StructuredData::DictionarySP dict_sp = + std::make_shared(obj_sp); + if (!dict_sp || dict_sp->GetType() == lldb::eStructuredDataTypeInvalid) + return; + + const ScriptedMetadata metadata(script_name, dict_sp); + + m_opaque_sp = + Platform::Create(platform_name, debugger.m_opaque_sp.get(), &metadata); } SBPlatform::SBPlatform(const SBPlatform &rhs) { Index: lldb/source/Commands/CommandObjectPlatform.h =================================================================== --- lldb/source/Commands/CommandObjectPlatform.h +++ lldb/source/Commands/CommandObjectPlatform.h @@ -10,6 +10,7 @@ #define LLDB_SOURCE_COMMANDS_COMMANDOBJECTPLATFORM_H #include "lldb/Interpreter/CommandObjectMultiword.h" +#include "lldb/Interpreter/OptionGroupPlatform.h" namespace lldb_private { @@ -27,6 +28,23 @@ operator=(const CommandObjectPlatform &) = delete; }; +class CommandObjectPlatformSelect : public CommandObjectParsed { +public: + CommandObjectPlatformSelect(CommandInterpreter &interpreter); + + ~CommandObjectPlatformSelect() override = default; + + void HandleCompletion(CompletionRequest &request) override; + + Options *GetOptions() override; + +protected: + bool DoExecute(Args &args, CommandReturnObject &result) override; + + OptionGroupOptions m_option_group; + OptionGroupPlatform m_platform_options; +}; + } // namespace lldb_private #endif // LLDB_SOURCE_COMMANDS_COMMANDOBJECTPLATFORM_H Index: lldb/source/Commands/CommandObjectPlatform.cpp =================================================================== --- lldb/source/Commands/CommandObjectPlatform.cpp +++ lldb/source/Commands/CommandObjectPlatform.cpp @@ -139,63 +139,58 @@ }; // "platform select " -class CommandObjectPlatformSelect : public CommandObjectParsed { -public: - CommandObjectPlatformSelect(CommandInterpreter &interpreter) - : CommandObjectParsed(interpreter, "platform select", - "Create a platform if needed and select it as the " - "current platform.", - "platform select ", 0), - m_platform_options( - false) // Don't include the "--platform" option by passing false - { - m_option_group.Append(&m_platform_options, LLDB_OPT_SET_ALL, 1); - m_option_group.Finalize(); - CommandArgumentData platform_arg{eArgTypePlatform, eArgRepeatPlain}; - m_arguments.push_back({platform_arg}); - } +CommandObjectPlatformSelect::CommandObjectPlatformSelect( + CommandInterpreter &interpreter) + : CommandObjectParsed(interpreter, "platform select", + "Create a platform if needed and select it as the " + "current platform.", + "platform select ", 0), + m_platform_options( + false) // Don't include the "--platform" option by passing false +{ + m_option_group.Append(&m_platform_options, LLDB_OPT_SET_ALL, 1); + m_option_group.Append(&m_platform_options.m_class_options, + LLDB_OPT_SET_1 | LLDB_OPT_SET_2, LLDB_OPT_SET_ALL); + m_option_group.Finalize(); + CommandArgumentData platform_arg{eArgTypePlatform, eArgRepeatPlain}; + m_arguments.push_back({platform_arg}); +} - ~CommandObjectPlatformSelect() override = default; +void CommandObjectPlatformSelect::HandleCompletion(CompletionRequest &request) { + CommandCompletions::PlatformPluginNames(GetCommandInterpreter(), request, + nullptr); +} - void HandleCompletion(CompletionRequest &request) override { - CommandCompletions::PlatformPluginNames(GetCommandInterpreter(), request, - nullptr); - } +Options *CommandObjectPlatformSelect::GetOptions() { return &m_option_group; } - Options *GetOptions() override { return &m_option_group; } +bool CommandObjectPlatformSelect::DoExecute(Args &args, + CommandReturnObject &result) { + if (args.GetArgumentCount() == 1) { + const char *platform_name = args.GetArgumentAtIndex(0); + if (platform_name && platform_name[0]) { + const bool select = true; + m_platform_options.SetPlatformName(platform_name); + Status error; + ArchSpec platform_arch; + PlatformSP platform_sp(m_platform_options.CreatePlatformWithOptions( + m_interpreter, ArchSpec(), select, error, platform_arch)); + if (platform_sp) { + GetDebugger().GetPlatformList().SetSelectedPlatform(platform_sp); -protected: - bool DoExecute(Args &args, CommandReturnObject &result) override { - if (args.GetArgumentCount() == 1) { - const char *platform_name = args.GetArgumentAtIndex(0); - if (platform_name && platform_name[0]) { - const bool select = true; - m_platform_options.SetPlatformName(platform_name); - Status error; - ArchSpec platform_arch; - PlatformSP platform_sp(m_platform_options.CreatePlatformWithOptions( - m_interpreter, ArchSpec(), select, error, platform_arch)); - if (platform_sp) { - GetDebugger().GetPlatformList().SetSelectedPlatform(platform_sp); - - platform_sp->GetStatus(result.GetOutputStream()); - result.SetStatus(eReturnStatusSuccessFinishResult); - } else { - result.AppendError(error.AsCString()); - } + platform_sp->GetStatus(result.GetOutputStream()); + result.SetStatus(eReturnStatusSuccessFinishResult); } else { - result.AppendError("invalid platform name"); + result.AppendError(error.AsCString()); } } else { - result.AppendError( - "platform create takes a platform name as an argument\n"); + result.AppendError("invalid platform name"); } - return result.Succeeded(); + } else { + result.AppendError( + "platform create takes a platform name as an argument\n"); } - - OptionGroupOptions m_option_group; - OptionGroupPlatform m_platform_options; -}; + return result.Succeeded(); +} // "platform list" class CommandObjectPlatformList : public CommandObjectParsed { Index: lldb/source/Core/Debugger.cpp =================================================================== --- lldb/source/Core/Debugger.cpp +++ lldb/source/Core/Debugger.cpp @@ -764,7 +764,7 @@ m_error_stream_sp(std::make_shared(stderr, false)), m_input_recorder(nullptr), m_broadcaster_manager_sp(BroadcasterManager::MakeBroadcasterManager()), - m_terminal_state(), m_target_list(*this), m_platform_list(), + m_terminal_state(), m_target_list(*this), m_platform_list(*this), m_listener_sp(Listener::MakeListener("lldb.Debugger")), m_source_manager_up(), m_source_file_cache(), m_command_interpreter_up( Index: lldb/source/Interpreter/OptionGroupPlatform.cpp =================================================================== --- lldb/source/Interpreter/OptionGroupPlatform.cpp +++ lldb/source/Interpreter/OptionGroupPlatform.cpp @@ -10,6 +10,7 @@ #include "lldb/Host/OptionParser.h" #include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Interpreter/ScriptedMetadata.h" #include "lldb/Target/Platform.h" using namespace lldb; @@ -22,8 +23,10 @@ PlatformSP platform_sp; + const ScriptedMetadata metadata(m_class_options); + if (!m_platform_name.empty()) { - platform_sp = platforms.Create(m_platform_name); + platform_sp = platforms.Create(m_platform_name, &metadata); if (!platform_sp) { error.SetErrorStringWithFormatv( "unable to find a plug-in for the platform named \"{0}\"", @@ -41,7 +44,8 @@ } } } else if (arch.IsValid()) { - platform_sp = platforms.GetOrCreate(arch, {}, &platform_arch, error); + platform_sp = + platforms.GetOrCreate(arch, {}, &platform_arch, error, &metadata); } if (platform_sp) { Index: lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp =================================================================== --- lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp +++ lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp @@ -511,7 +511,7 @@ process->SetCanRunCode(false); PlatformSP platform_sp = process->GetTarget().GetDebugger().GetPlatformList().Create( - PlatformDarwinKernel::GetPluginNameStatic()); + PlatformDarwinKernel::GetPluginNameStatic(), /*metadata = */ nullptr); if (platform_sp.get()) process->GetTarget().SetPlatform(platform_sp); } Index: lldb/source/Plugins/Platform/Android/PlatformAndroid.h =================================================================== --- lldb/source/Plugins/Platform/Android/PlatformAndroid.h +++ lldb/source/Plugins/Platform/Android/PlatformAndroid.h @@ -28,7 +28,9 @@ static void Terminate(); // lldb_private::PluginInterface functions - static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static llvm::StringRef GetPluginNameStatic(bool is_host) { return is_host ? Platform::GetHostPlatformName() : "remote-android"; Index: lldb/source/Plugins/Platform/Android/PlatformAndroid.cpp =================================================================== --- lldb/source/Plugins/Platform/Android/PlatformAndroid.cpp +++ lldb/source/Plugins/Platform/Android/PlatformAndroid.cpp @@ -59,7 +59,9 @@ PlatformLinux::Terminate(); } -PlatformSP PlatformAndroid::CreateInstance(bool force, const ArchSpec *arch) { +PlatformSP PlatformAndroid::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { Log *log = GetLog(LLDBLog::Platform); if (log) { const char *arch_name; Index: lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h =================================================================== --- lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h +++ lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h @@ -24,7 +24,9 @@ static void Terminate(); // lldb_private::PluginInterface functions - static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static llvm::StringRef GetPluginNameStatic(bool is_host) { return is_host ? Platform::GetHostPlatformName() : "remote-freebsd"; Index: lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp =================================================================== --- lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp +++ lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp @@ -44,8 +44,9 @@ static uint32_t g_initialize_count = 0; - -PlatformSP PlatformFreeBSD::CreateInstance(bool force, const ArchSpec *arch) { +PlatformSP PlatformFreeBSD::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { Log *log = GetLog(LLDBLog::Platform); LLDB_LOG(log, "force = {0}, arch=({1}, {2})", force, arch ? arch->GetArchitectureName() : "", Index: lldb/source/Plugins/Platform/Linux/PlatformLinux.h =================================================================== --- lldb/source/Plugins/Platform/Linux/PlatformLinux.h +++ lldb/source/Plugins/Platform/Linux/PlatformLinux.h @@ -24,7 +24,9 @@ static void Terminate(); // lldb_private::PluginInterface functions - static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static llvm::StringRef GetPluginNameStatic(bool is_host) { return is_host ? Platform::GetHostPlatformName() : "remote-linux"; Index: lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp =================================================================== --- lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp +++ lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp @@ -41,8 +41,9 @@ static uint32_t g_initialize_count = 0; - -PlatformSP PlatformLinux::CreateInstance(bool force, const ArchSpec *arch) { +PlatformSP PlatformLinux::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { Log *log = GetLog(LLDBLog::Platform); LLDB_LOG(log, "force = {0}, arch=({1}, {2})", force, arch ? arch->GetArchitectureName() : "", Index: lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp @@ -552,7 +552,9 @@ PluginManager::UnregisterPlugin(PlatformiOSSimulator::CreateInstance); } - static PlatformSP CreateInstance(bool force, const ArchSpec *arch) { + static PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { if (shouldSkipSimulatorPlatform(force, arch)) return nullptr; @@ -597,7 +599,9 @@ PluginManager::UnregisterPlugin(PlatformAppleTVSimulator::CreateInstance); } - static PlatformSP CreateInstance(bool force, const ArchSpec *arch) { + static PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { if (shouldSkipSimulatorPlatform(force, arch)) return nullptr; return PlatformAppleSimulator::CreateInstance( @@ -639,7 +643,9 @@ PlatformAppleWatchSimulator::CreateInstance); } - static PlatformSP CreateInstance(bool force, const ArchSpec *arch) { + static PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { if (shouldSkipSimulatorPlatform(force, arch)) return nullptr; return PlatformAppleSimulator::CreateInstance( Index: lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h +++ lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h @@ -48,7 +48,9 @@ ~PlatformDarwin() override; - static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static void DebuggerInitialize(lldb_private::Debugger &debugger); Index: lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp @@ -106,9 +106,11 @@ return "Darwin platform plug-in."; } -PlatformSP PlatformDarwin::CreateInstance(bool force, const ArchSpec *arch) { - // We only create subclasses of the PlatformDarwin plugin. - return PlatformSP(); +PlatformSP PlatformDarwin::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { + // We only create subclasses of the PlatformDarwin plugin. + return PlatformSP(); } #define LLDB_PROPERTIES_platformdarwin Index: lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h +++ lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h @@ -36,7 +36,9 @@ class PlatformDarwinKernel : public PlatformDarwin { public: - static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static void DebuggerInitialize(Debugger &debugger); Index: lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp @@ -72,8 +72,10 @@ PlatformDarwin::Terminate(); } -PlatformSP PlatformDarwinKernel::CreateInstance(bool force, - const ArchSpec *arch) { +PlatformSP +PlatformDarwinKernel::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { Log *log = GetLog(LLDBLog::Platform); if (log) { const char *arch_name; @@ -968,7 +970,7 @@ PlatformSP platform_sp = process->GetTarget().GetDebugger().GetPlatformList().Create( - PlatformDarwinKernel::GetPluginNameStatic()); + PlatformDarwinKernel::GetPluginNameStatic(), /*metadata = */ nullptr); if (platform_sp) process->GetTarget().SetPlatform(platform_sp); Index: lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h +++ lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h @@ -32,7 +32,9 @@ public: PlatformMacOSX(); - static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static void Initialize(); Index: lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp @@ -90,7 +90,9 @@ return "Local Mac OS X user platform plug-in."; } -PlatformSP PlatformMacOSX::CreateInstance(bool force, const ArchSpec *arch) { +PlatformSP PlatformMacOSX::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { // The only time we create an instance is when we are creating a remote // macosx platform which is handled by PlatformRemoteMacOSX. return PlatformSP(); Index: lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleBridge.h =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleBridge.h +++ lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleBridge.h @@ -24,7 +24,9 @@ public: PlatformRemoteAppleBridge(); - static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static void Initialize(); Index: lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleBridge.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleBridge.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleBridge.cpp @@ -56,8 +56,10 @@ PlatformDarwin::Terminate(); } -PlatformSP PlatformRemoteAppleBridge::CreateInstance(bool force, - const ArchSpec *arch) { +PlatformSP +PlatformRemoteAppleBridge::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { Log *log = GetLog(LLDBLog::Platform); if (log) { const char *arch_name; Index: lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleTV.h =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleTV.h +++ lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleTV.h @@ -26,8 +26,9 @@ PlatformRemoteAppleTV(); // Class Functions - static lldb::PlatformSP CreateInstance(bool force, - const lldb_private::ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static void Initialize(); Index: lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleTV.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleTV.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleTV.cpp @@ -57,8 +57,10 @@ PlatformDarwin::Terminate(); } -PlatformSP PlatformRemoteAppleTV::CreateInstance(bool force, - const ArchSpec *arch) { +PlatformSP +PlatformRemoteAppleTV::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { Log *log = GetLog(LLDBLog::Platform); if (log) { const char *arch_name; Index: lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.h =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.h +++ lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.h @@ -22,7 +22,9 @@ public: PlatformRemoteAppleWatch(); - static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static void Initialize(); Index: lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.cpp @@ -54,8 +54,10 @@ PlatformDarwin::Terminate(); } -PlatformSP PlatformRemoteAppleWatch::CreateInstance(bool force, - const ArchSpec *arch) { +PlatformSP +PlatformRemoteAppleWatch::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { Log *log = GetLog(LLDBLog::Platform); if (log) { const char *arch_name; Index: lldb/source/Plugins/Platform/MacOSX/PlatformRemoteMacOSX.h =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformRemoteMacOSX.h +++ lldb/source/Plugins/Platform/MacOSX/PlatformRemoteMacOSX.h @@ -27,7 +27,9 @@ public: PlatformRemoteMacOSX(); - static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static void Initialize(); Index: lldb/source/Plugins/Platform/MacOSX/PlatformRemoteMacOSX.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformRemoteMacOSX.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformRemoteMacOSX.cpp @@ -57,8 +57,10 @@ PlatformDarwin::Terminate(); } -PlatformSP PlatformRemoteMacOSX::CreateInstance(bool force, - const ArchSpec *arch) { +PlatformSP +PlatformRemoteMacOSX::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { Log *log = GetLog(LLDBLog::Platform); if (log) { const char *arch_name; Index: lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h +++ lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h @@ -22,7 +22,9 @@ public: PlatformRemoteiOS(); - static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static void Initialize(); Index: lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp @@ -52,7 +52,9 @@ PlatformDarwin::Terminate(); } -PlatformSP PlatformRemoteiOS::CreateInstance(bool force, const ArchSpec *arch) { +PlatformSP PlatformRemoteiOS::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { Log *log = GetLog(LLDBLog::Platform); if (log) { const char *arch_name; Index: lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.h =================================================================== --- lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.h +++ lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.h @@ -24,7 +24,9 @@ static void Terminate(); // lldb_private::PluginInterface functions - static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static llvm::StringRef GetPluginNameStatic(bool is_host) { return is_host ? Platform::GetHostPlatformName() : "remote-netbsd"; Index: lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.cpp =================================================================== --- lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.cpp +++ lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.cpp @@ -39,8 +39,9 @@ static uint32_t g_initialize_count = 0; - -PlatformSP PlatformNetBSD::CreateInstance(bool force, const ArchSpec *arch) { +PlatformSP PlatformNetBSD::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { Log *log = GetLog(LLDBLog::Platform); LLDB_LOG(log, "force = {0}, arch=({1}, {2})", force, arch ? arch->GetArchitectureName() : "", Index: lldb/source/Plugins/Platform/OpenBSD/PlatformOpenBSD.h =================================================================== --- lldb/source/Plugins/Platform/OpenBSD/PlatformOpenBSD.h +++ lldb/source/Plugins/Platform/OpenBSD/PlatformOpenBSD.h @@ -23,7 +23,9 @@ static void Terminate(); // lldb_private::PluginInterface functions - static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static llvm::StringRef GetPluginNameStatic(bool is_host) { return is_host ? Platform::GetHostPlatformName() : "remote-openbsd"; Index: lldb/source/Plugins/Platform/OpenBSD/PlatformOpenBSD.cpp =================================================================== --- lldb/source/Plugins/Platform/OpenBSD/PlatformOpenBSD.cpp +++ lldb/source/Plugins/Platform/OpenBSD/PlatformOpenBSD.cpp @@ -39,8 +39,9 @@ static uint32_t g_initialize_count = 0; - -PlatformSP PlatformOpenBSD::CreateInstance(bool force, const ArchSpec *arch) { +PlatformSP PlatformOpenBSD::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { Log *log = GetLog(LLDBLog::Platform); LLDB_LOG(log, "force = {0}, arch=({1}, {2})", force, arch ? arch->GetArchitectureName() : "", Index: lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp =================================================================== --- lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp +++ lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp @@ -310,7 +310,8 @@ if (!m_remote_platform_sp) m_remote_platform_sp = platform_gdb_server::PlatformRemoteGDBServer::CreateInstance( - /*force=*/true, nullptr); + /*force=*/true, /*arch=*/nullptr, /*debugger=*/nullptr, + /*metadata=*/nullptr); if (m_remote_platform_sp && error.Success()) error = m_remote_platform_sp->ConnectRemote(args); Index: lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.h =================================================================== --- lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.h +++ lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.h @@ -70,7 +70,9 @@ } private: - static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static void DebuggerInitialize(Debugger &debugger); PlatformQemuUser() : Platform(/*is_host=*/true) {} Index: lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.cpp =================================================================== --- lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.cpp +++ lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.cpp @@ -103,7 +103,9 @@ } } -PlatformSP PlatformQemuUser::CreateInstance(bool force, const ArchSpec *arch) { +PlatformSP PlatformQemuUser::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { if (force) return PlatformSP(new PlatformQemuUser()); return nullptr; Index: lldb/source/Plugins/Platform/Windows/PlatformWindows.h =================================================================== --- lldb/source/Plugins/Platform/Windows/PlatformWindows.h +++ lldb/source/Plugins/Platform/Windows/PlatformWindows.h @@ -22,8 +22,9 @@ static void Terminate(); // lldb_private::PluginInterface functions - static lldb::PlatformSP CreateInstance(bool force, - const lldb_private::ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static llvm::StringRef GetPluginNameStatic(bool is_host) { return is_host ? Platform::GetHostPlatformName() : "remote-windows"; Index: lldb/source/Plugins/Platform/Windows/PlatformWindows.cpp =================================================================== --- lldb/source/Plugins/Platform/Windows/PlatformWindows.cpp +++ lldb/source/Plugins/Platform/Windows/PlatformWindows.cpp @@ -41,8 +41,9 @@ static uint32_t g_initialize_count = 0; -PlatformSP PlatformWindows::CreateInstance(bool force, - const lldb_private::ArchSpec *arch) { +PlatformSP PlatformWindows::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { // The only time we create an instance is when we are creating a remote // windows platform const bool is_host = false; @@ -137,10 +138,12 @@ "can't connect to the host platform '{0}', always connected", GetPluginName()); } else { - if (!m_remote_platform_sp) + if (!m_remote_platform_sp) { m_remote_platform_sp = platform_gdb_server::PlatformRemoteGDBServer::CreateInstance( - /*force=*/true, nullptr); + /*force=*/true, /*arch=*/nullptr, /*debugger=*/nullptr, + /*metadata=*/nullptr); + } if (m_remote_platform_sp) { if (error.Success()) { Index: lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h =================================================================== --- lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h +++ lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h @@ -26,7 +26,9 @@ static void Terminate(); - static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); + static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata); static llvm::StringRef GetPluginNameStatic() { return "remote-gdb-server"; } Index: lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp =================================================================== --- lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp +++ lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp @@ -64,8 +64,10 @@ Platform::Terminate(); } -PlatformSP PlatformRemoteGDBServer::CreateInstance(bool force, - const ArchSpec *arch) { +PlatformSP +PlatformRemoteGDBServer::CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { bool create = force; if (!create) { create = !arch->TripleVendorWasSpecified() && !arch->TripleOSWasSpecified(); Index: lldb/source/Target/Platform.cpp =================================================================== --- lldb/source/Target/Platform.cpp +++ lldb/source/Target/Platform.cpp @@ -164,40 +164,6 @@ return FileSpecList(); } -// PlatformSP -// Platform::FindPlugin (Process *process, ConstString plugin_name) -//{ -// PlatformCreateInstance create_callback = nullptr; -// if (plugin_name) -// { -// create_callback = -// PluginManager::GetPlatformCreateCallbackForPluginName (plugin_name); -// if (create_callback) -// { -// ArchSpec arch; -// if (process) -// { -// arch = process->GetTarget().GetArchitecture(); -// } -// PlatformSP platform_sp(create_callback(process, &arch)); -// if (platform_sp) -// return platform_sp; -// } -// } -// else -// { -// for (uint32_t idx = 0; (create_callback = -// PluginManager::GetPlatformCreateCallbackAtIndex(idx)) != nullptr; -// ++idx) -// { -// PlatformSP platform_sp(create_callback(process, nullptr)); -// if (platform_sp) -// return platform_sp; -// } -// } -// return PlatformSP(); -//} - Status Platform::GetSharedModule( const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr, @@ -251,14 +217,15 @@ module_spec); } -PlatformSP Platform::Create(llvm::StringRef name) { +PlatformSP Platform::Create(llvm::StringRef name, const Debugger *debugger, + const ScriptedMetadata *metadata) { lldb::PlatformSP platform_sp; if (name == GetHostPlatformName()) return GetHostPlatform(); if (PlatformCreateInstance create_callback = PluginManager::GetPlatformCreateCallbackForPluginName(name)) - return create_callback(true, nullptr); + return create_callback(true, nullptr, debugger, metadata); return nullptr; } @@ -1967,19 +1934,20 @@ return {}; } -PlatformSP PlatformList::GetOrCreate(llvm::StringRef name) { +PlatformSP PlatformList::GetOrCreate(llvm::StringRef name, + const ScriptedMetadata *metadata) { std::lock_guard guard(m_mutex); for (const PlatformSP &platform_sp : m_platforms) { if (platform_sp->GetName() == name) return platform_sp; } - return Create(name); + return Create(name, metadata); } PlatformSP PlatformList::GetOrCreate(const ArchSpec &arch, const ArchSpec &process_host_arch, - ArchSpec *platform_arch_ptr, - Status &error) { + ArchSpec *platform_arch_ptr, Status &error, + const ScriptedMetadata *metadata) { std::lock_guard guard(m_mutex); // First try exact arch matches across all platforms already created for (const auto &platform_sp : m_platforms) { @@ -2002,7 +1970,8 @@ for (idx = 0; (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex(idx)); ++idx) { - PlatformSP platform_sp = create_callback(false, &arch); + PlatformSP platform_sp = + create_callback(false, &arch, &m_debugger, metadata); if (platform_sp && platform_sp->IsCompatibleArchitecture( arch, process_host_arch, ArchSpec::ExactMatch, platform_arch_ptr)) { @@ -2014,7 +1983,8 @@ for (idx = 0; (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex(idx)); ++idx) { - PlatformSP platform_sp = create_callback(false, &arch); + PlatformSP platform_sp = + create_callback(false, &arch, &m_debugger, metadata); if (platform_sp && platform_sp->IsCompatibleArchitecture( arch, process_host_arch, ArchSpec::CompatibleMatch, platform_arch_ptr)) { @@ -2029,16 +1999,19 @@ PlatformSP PlatformList::GetOrCreate(const ArchSpec &arch, const ArchSpec &process_host_arch, - ArchSpec *platform_arch_ptr) { + ArchSpec *platform_arch_ptr, + const ScriptedMetadata *metadata) { Status error; if (arch.IsValid()) - return GetOrCreate(arch, process_host_arch, platform_arch_ptr, error); + return GetOrCreate(arch, process_host_arch, platform_arch_ptr, error, + metadata); return nullptr; } PlatformSP PlatformList::GetOrCreate(llvm::ArrayRef archs, const ArchSpec &process_host_arch, - std::vector &candidates) { + std::vector &candidates, + const ScriptedMetadata *metadata) { candidates.clear(); candidates.reserve(archs.size()); @@ -2067,7 +2040,9 @@ // Collect a list of candidate platforms for the architectures. for (const ArchSpec &arch : archs) { - if (PlatformSP platform = GetOrCreate(arch, process_host_arch, nullptr)) + if (PlatformSP platform = GetOrCreate(arch, process_host_arch, + /*platform_arch_ptr = */ nullptr, + /*metadata = */ nullptr)) candidates.push_back(platform); } @@ -2088,9 +2063,10 @@ return nullptr; } -PlatformSP PlatformList::Create(llvm::StringRef name) { +PlatformSP PlatformList::Create(llvm::StringRef name, + const ScriptedMetadata *metadata) { std::lock_guard guard(m_mutex); - PlatformSP platform_sp = Platform::Create(name); + PlatformSP platform_sp = Platform::Create(name, &m_debugger, metadata); m_platforms.push_back(platform_sp); return platform_sp; } @@ -2104,7 +2080,8 @@ (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex(idx)); ++idx) { ArchSpec arch; - PlatformSP platform_sp = create_callback(true, &arch); + PlatformSP platform_sp = + create_callback(true, &arch, &m_debugger, /*metadata = */ nullptr); if (platform_sp) { if (platform_sp->LoadPlatformBinaryAndSetup(process, addr, notify)) return true; Index: lldb/source/Target/Process.cpp =================================================================== --- lldb/source/Target/Process.cpp +++ lldb/source/Target/Process.cpp @@ -2931,7 +2931,8 @@ ArchSpec::CompatibleMatch, nullptr)) { ArchSpec platform_arch; platform_sp = GetTarget().GetDebugger().GetPlatformList().GetOrCreate( - target_arch, process_host_arch, &platform_arch); + target_arch, process_host_arch, &platform_arch, + /*metadata = */ nullptr); if (platform_sp) { GetTarget().SetPlatform(platform_sp); GetTarget().SetArchitecture(platform_arch); Index: lldb/source/Target/Target.cpp =================================================================== --- lldb/source/Target/Target.cpp +++ lldb/source/Target/Target.cpp @@ -1503,8 +1503,9 @@ other, {}, ArchSpec::CompatibleMatch, nullptr)) { ArchSpec platform_arch; if (PlatformSP arch_platform_sp = - GetDebugger().GetPlatformList().GetOrCreate(other, {}, - &platform_arch)) { + GetDebugger().GetPlatformList().GetOrCreate( + other, /*process_host_arch = */ {}, &platform_arch, + /*metadata = */ nullptr)) { SetPlatform(arch_platform_sp); if (platform_arch.IsValid()) other = platform_arch; Index: lldb/source/Target/TargetList.cpp =================================================================== --- lldb/source/Target/TargetList.cpp +++ lldb/source/Target/TargetList.cpp @@ -184,8 +184,9 @@ std::vector archs; for (const ModuleSpec &spec : module_specs.ModuleSpecs()) archs.push_back(spec.GetArchitecture()); - if (PlatformSP platform_for_archs_sp = - platform_list.GetOrCreate(archs, {}, candidates)) { + if (PlatformSP platform_for_archs_sp = platform_list.GetOrCreate( + archs, /*process_host_arch = */ {}, candidates, + /*metadata = */ nullptr)) { platform_sp = platform_for_archs_sp; } else if (candidates.empty()) { error.SetErrorString("no matching platforms found for this file"); @@ -218,7 +219,9 @@ if (!prefer_platform_arch && arch.IsValid()) { if (!platform_sp->IsCompatibleArchitecture( arch, {}, ArchSpec::CompatibleMatch, nullptr)) { - platform_sp = platform_list.GetOrCreate(arch, {}, &platform_arch); + platform_sp = + platform_list.GetOrCreate(arch, /*process_host_arch = */ {}, + &platform_arch, /*metadata = */ nullptr); if (platform_sp) platform_list.SetSelectedPlatform(platform_sp); } @@ -228,8 +231,9 @@ ArchSpec fixed_platform_arch; if (!platform_sp->IsCompatibleArchitecture( platform_arch, {}, ArchSpec::CompatibleMatch, nullptr)) { - platform_sp = - platform_list.GetOrCreate(platform_arch, {}, &fixed_platform_arch); + platform_sp = platform_list.GetOrCreate( + platform_arch, /*process_host_arch = */ {}, &fixed_platform_arch, + /*metadata = */ nullptr); if (platform_sp) platform_list.SetSelectedPlatform(platform_sp); } @@ -260,8 +264,9 @@ if (arch.IsValid()) { if (!platform_sp || !platform_sp->IsCompatibleArchitecture( arch, {}, ArchSpec::CompatibleMatch, nullptr)) - platform_sp = - debugger.GetPlatformList().GetOrCreate(specified_arch, {}, &arch); + platform_sp = debugger.GetPlatformList().GetOrCreate( + specified_arch, /*process_host_arch = */ {}, &arch, + /*metadata = */ nullptr); } if (!platform_sp) Index: lldb/unittests/Core/DiagnosticEventTest.cpp =================================================================== --- lldb/unittests/Core/DiagnosticEventTest.cpp +++ lldb/unittests/Core/DiagnosticEventTest.cpp @@ -39,7 +39,8 @@ []() { Debugger::Initialize(nullptr); }); ArchSpec arch("x86_64-apple-macosx-"); Platform::SetHostPlatform( - PlatformRemoteMacOSX::CreateInstance(true, &arch)); + PlatformRemoteMacOSX::CreateInstance(true, &arch, /*debugger=*/nullptr, + /*metadata=*/nullptr)); } void TearDown() override { PlatformMacOSX::Terminate(); Index: lldb/unittests/Expression/DWARFExpressionTest.cpp =================================================================== --- lldb/unittests/Expression/DWARFExpressionTest.cpp +++ lldb/unittests/Expression/DWARFExpressionTest.cpp @@ -369,8 +369,9 @@ // Set up a mock process. ArchSpec arch("i386-pc-linux"); - Platform::SetHostPlatform( - platform_linux::PlatformLinux::CreateInstance(true, &arch)); + Platform::SetHostPlatform(platform_linux::PlatformLinux::CreateInstance( + true, &arch, /*debugger=*/nullptr, + /*metadata=*/nullptr)); lldb::DebuggerSP debugger_sp = Debugger::CreateInstance(); ASSERT_TRUE(debugger_sp); lldb::TargetSP target_sp; @@ -409,7 +410,9 @@ // Set up a wasm target ArchSpec arch("wasm32-unknown-unknown-wasm"); lldb::PlatformSP host_platform_sp = - platform_linux::PlatformLinux::CreateInstance(true, &arch); + platform_linux::PlatformLinux::CreateInstance(true, &arch, + /*debugger=*/nullptr, + /*metadata=*/nullptr); ASSERT_TRUE(host_platform_sp); Platform::SetHostPlatform(host_platform_sp); lldb::DebuggerSP debugger_sp = Debugger::CreateInstance(); @@ -488,7 +491,9 @@ // Set up a wasm target ArchSpec arch("wasm32-unknown-unknown-wasm"); lldb::PlatformSP host_platform_sp = - platform_linux::PlatformLinux::CreateInstance(true, &arch); + platform_linux::PlatformLinux::CreateInstance(true, &arch, + /*debugger=*/nullptr, + /*metadata=*/nullptr); ASSERT_TRUE(host_platform_sp); Platform::SetHostPlatform(host_platform_sp); lldb::DebuggerSP debugger_sp = Debugger::CreateInstance(); Index: lldb/unittests/Interpreter/TestCommandPaths.cpp =================================================================== --- lldb/unittests/Interpreter/TestCommandPaths.cpp +++ lldb/unittests/Interpreter/TestCommandPaths.cpp @@ -104,8 +104,10 @@ TEST_F(VerifyUserMultiwordCmdPathTest, TestErrors) { ArchSpec arch("x86_64-apple-macosx-"); - Platform::SetHostPlatform(PlatformRemoteMacOSX::CreateInstance(true, &arch)); - + Platform::SetHostPlatform( + PlatformRemoteMacOSX::CreateInstance(true, &arch, /*debugger=*/nullptr, + /*metadata=*/nullptr)); + DebuggerSP debugger_sp = Debugger::CreateInstance(); ASSERT_TRUE(debugger_sp); Index: lldb/unittests/Platform/PlatformAppleSimulatorTest.cpp =================================================================== --- lldb/unittests/Platform/PlatformAppleSimulatorTest.cpp +++ lldb/unittests/Platform/PlatformAppleSimulatorTest.cpp @@ -9,10 +9,13 @@ #include "gtest/gtest.h" #include "Plugins/Platform/MacOSX/PlatformAppleSimulator.h" +#include "Plugins/Platform/MacOSX/PlatformMacOSX.h" #include "Plugins/Platform/MacOSX/PlatformRemoteAppleTV.h" #include "Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.h" +#include "Plugins/Platform/MacOSX/PlatformRemoteMacOSX.h" #include "Plugins/Platform/MacOSX/PlatformRemoteiOS.h" #include "TestingSupport/SubsystemRAII.h" +#include "lldb/Core/Debugger.h" #include "lldb/Host/FileSystem.h" #include "lldb/Host/HostInfo.h" #include "lldb/Target/Platform.h" @@ -20,16 +23,36 @@ using namespace lldb; using namespace lldb_private; +static std::once_flag platform_initialize_flag; +static std::once_flag debugger_initialize_flag; + class PlatformAppleSimulatorTest : public ::testing::Test { SubsystemRAII subsystems; + +public: + void SetUp() override { + std::call_once(platform_initialize_flag, + []() { PlatformMacOSX::Initialize(); }); + std::call_once(debugger_initialize_flag, + []() { Debugger::Initialize(nullptr); }); + ArchSpec arch("x86_64-apple-macosx-"); + Platform::SetHostPlatform( + PlatformRemoteMacOSX::CreateInstance(true, &arch, /*debugger=*/nullptr, + /*metadata=*/nullptr)); + } + void TearDown() override { PlatformMacOSX::Terminate(); } + +protected: + DebuggerSP m_debugger_sp = nullptr; }; #ifdef __APPLE__ static void testSimPlatformArchHasSimEnvironment(llvm::StringRef name) { - auto platform_sp = Platform::Create(name); + auto platform_sp = Platform::Create(name, /*debugger=*/nullptr, + /*metadata=*/nullptr); ASSERT_TRUE(platform_sp); int num_arches = 0; @@ -58,12 +81,13 @@ }; for (auto sim : sim_platforms) { - PlatformList list; + PlatformList list(*m_debugger_sp.get()); ArchSpec arch = platform_arch; arch.GetTriple().setOS(sim); arch.GetTriple().setEnvironment(llvm::Triple::Simulator); - auto platform_sp = list.GetOrCreate(arch, {}, nullptr); + auto platform_sp = list.GetOrCreate(arch, {}, /*platform_arch_ptr=*/nullptr, + /*metadata=*/nullptr); EXPECT_TRUE(platform_sp); } } @@ -78,10 +102,10 @@ llvm::Triple::WatchOS, }; - PlatformList list; - list.GetOrCreate("remote-ios"); - list.GetOrCreate("remote-tvos"); - list.GetOrCreate("remote-watchos"); + PlatformList list(*m_debugger_sp.get()); + list.GetOrCreate("remote-ios", /*metadata=*/nullptr); + list.GetOrCreate("remote-tvos", /*metadata=*/nullptr); + list.GetOrCreate("remote-watchos", /*metadata=*/nullptr); for (auto sim : sim_platforms) { ArchSpec arch = platform_arch; @@ -89,7 +113,9 @@ arch.GetTriple().setEnvironment(llvm::Triple::Simulator); Status error; - auto platform_sp = list.GetOrCreate(arch, {}, nullptr, error); + auto platform_sp = + list.GetOrCreate(arch, {}, /*platform_arch_ptr=*/nullptr, error, + /*metadata=*/nullptr); EXPECT_TRUE(platform_sp); EXPECT_TRUE(platform_sp->GetName().contains("simulator")); } Index: lldb/unittests/Platform/PlatformSiginfoTest.cpp =================================================================== --- lldb/unittests/Platform/PlatformSiginfoTest.cpp +++ lldb/unittests/Platform/PlatformSiginfoTest.cpp @@ -82,15 +82,19 @@ switch (arch.GetTriple().getOS()) { case llvm::Triple::FreeBSD: - platform_sp = - platform_freebsd::PlatformFreeBSD::CreateInstance(true, &arch); + platform_sp = platform_freebsd::PlatformFreeBSD::CreateInstance( + true, &arch, /*debugger=*/nullptr, + /*metadata=*/nullptr); break; case llvm::Triple::Linux: - platform_sp = platform_linux::PlatformLinux::CreateInstance(true, &arch); + platform_sp = platform_linux::PlatformLinux::CreateInstance( + true, &arch, /*debugger=*/nullptr, + /*metadata=*/nullptr); break; case llvm::Triple::NetBSD: - platform_sp = - platform_netbsd::PlatformNetBSD::CreateInstance(true, &arch); + platform_sp = platform_netbsd::PlatformNetBSD::CreateInstance( + true, &arch, /*debugger=*/nullptr, + /*metadata=*/nullptr); break; default: llvm_unreachable("unknown ostype in triple"); Index: lldb/unittests/Platform/PlatformTest.cpp =================================================================== --- lldb/unittests/Platform/PlatformTest.cpp +++ lldb/unittests/Platform/PlatformTest.cpp @@ -10,6 +10,7 @@ #include "Plugins/Platform/POSIX/PlatformPOSIX.h" #include "TestingSupport/SubsystemRAII.h" +#include "lldb/Core/Debugger.h" #include "lldb/Core/PluginManager.h" #include "lldb/Host/FileSystem.h" #include "lldb/Host/HostInfo.h" @@ -18,6 +19,8 @@ using namespace lldb; using namespace lldb_private; +static std::once_flag debugger_initialize_flag; + class TestPlatform : public PlatformPOSIX { public: TestPlatform() : PlatformPOSIX(false) {} @@ -59,7 +62,9 @@ PluginManager::UnregisterPlugin(PlatformThumb::CreateInstance); } - static PlatformSP CreateInstance(bool force, const ArchSpec *arch) { + static PlatformSP CreateInstance(bool force, const ArchSpec *arch, + const Debugger *debugger, + const ScriptedMetadata *metadata) { return std::make_shared(); } @@ -76,12 +81,21 @@ SubsystemRAII subsystems; protected: - PlatformList list; + PlatformList *list = nullptr; + DebuggerSP m_debugger_sp = nullptr; + + void SetUp() override { + std::call_once(debugger_initialize_flag, + []() { Debugger::Initialize(nullptr); }); + list = new PlatformList(*m_debugger_sp.get()); + } + + void TearDown() override { delete list; } void SetHostPlatform(const PlatformSP &platform_sp) { Platform::SetHostPlatform(platform_sp); ASSERT_EQ(Platform::GetHostPlatform(), platform_sp); - list.Append(platform_sp, /*set_selected=*/true); + list->Append(platform_sp, /*set_selected=*/true); } }; @@ -93,7 +107,8 @@ std::vector candidates; // The host platform matches all architectures. - PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates); + PlatformSP platform_sp = + list->GetOrCreate(archs, {}, candidates, /*metadata=*/nullptr); ASSERT_TRUE(platform_sp); EXPECT_EQ(platform_sp, Platform::GetHostPlatform()); } @@ -106,13 +121,14 @@ std::vector candidates; // The host platform matches no architectures. - PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates); + PlatformSP platform_sp = + list->GetOrCreate(archs, {}, candidates, /*metadata=*/nullptr); ASSERT_FALSE(platform_sp); // The selected platform matches all architectures. const PlatformSP selected_platform_sp = std::make_shared(); - list.Append(selected_platform_sp, /*set_selected=*/true); - platform_sp = list.GetOrCreate(archs, {}, candidates); + list->Append(selected_platform_sp, /*set_selected=*/true); + platform_sp = list->GetOrCreate(archs, {}, candidates, /*metadata=*/nullptr); ASSERT_TRUE(platform_sp); EXPECT_EQ(platform_sp, selected_platform_sp); } @@ -125,15 +141,16 @@ std::vector candidates; // The host platform matches one architecture. - PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates); + PlatformSP platform_sp = + list->GetOrCreate(archs, {}, candidates, /*metadata=*/nullptr); ASSERT_TRUE(platform_sp); EXPECT_EQ(platform_sp, Platform::GetHostPlatform()); // The selected and host platform each match one architecture. // The selected platform is preferred. const PlatformSP selected_platform_sp = std::make_shared(); - list.Append(selected_platform_sp, /*set_selected=*/true); - platform_sp = list.GetOrCreate(archs, {}, candidates); + list->Append(selected_platform_sp, /*set_selected=*/true); + platform_sp = list->GetOrCreate(archs, {}, candidates, /*metadata=*/nullptr); ASSERT_TRUE(platform_sp); EXPECT_EQ(platform_sp, selected_platform_sp); } @@ -144,14 +161,15 @@ SetHostPlatform(std::make_shared()); const PlatformSP selected_platform_sp = std::make_shared(); - list.Append(selected_platform_sp, /*set_selected=*/true); + list->Append(selected_platform_sp, /*set_selected=*/true); const std::vector archs = {ArchSpec("thumbv7-apple-ps4"), ArchSpec("thumbv7f-apple-ps4")}; std::vector candidates; // The host platform matches one architecture. - PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates); + PlatformSP platform_sp = + list->GetOrCreate(archs, {}, candidates, /*metadata=*/nullptr); ASSERT_TRUE(platform_sp); EXPECT_EQ(platform_sp->GetName(), "thumb"); Index: lldb/unittests/Process/ProcessEventDataTest.cpp =================================================================== --- lldb/unittests/Process/ProcessEventDataTest.cpp +++ lldb/unittests/Process/ProcessEventDataTest.cpp @@ -142,7 +142,9 @@ TEST_F(ProcessEventDataTest, DoOnRemoval) { ArchSpec arch("x86_64-apple-macosx-"); - Platform::SetHostPlatform(PlatformRemoteMacOSX::CreateInstance(true, &arch)); + Platform::SetHostPlatform( + PlatformRemoteMacOSX::CreateInstance(true, &arch, /*debugger=*/nullptr, + /*metadata=*/nullptr)); DebuggerSP debugger_sp = Debugger::CreateInstance(); ASSERT_TRUE(debugger_sp); @@ -182,7 +184,9 @@ TEST_F(ProcessEventDataTest, ShouldStop) { ArchSpec arch("x86_64-apple-macosx-"); - Platform::SetHostPlatform(PlatformRemoteMacOSX::CreateInstance(true, &arch)); + Platform::SetHostPlatform( + PlatformRemoteMacOSX::CreateInstance(true, &arch, /*debugger=*/nullptr, + /*metadata=*/nullptr)); DebuggerSP debugger_sp = Debugger::CreateInstance(); ASSERT_TRUE(debugger_sp); Index: lldb/unittests/Target/ExecutionContextTest.cpp =================================================================== --- lldb/unittests/Target/ExecutionContextTest.cpp +++ lldb/unittests/Target/ExecutionContextTest.cpp @@ -72,8 +72,9 @@ TEST_F(ExecutionContextTest, GetByteOrderTarget) { ArchSpec arch("powerpc64-pc-linux"); - Platform::SetHostPlatform( - platform_linux::PlatformLinux::CreateInstance(true, &arch)); + Platform::SetHostPlatform(platform_linux::PlatformLinux::CreateInstance( + true, &arch, /*debugger=*/nullptr, + /*metadata=*/nullptr)); DebuggerSP debugger_sp = Debugger::CreateInstance(); ASSERT_TRUE(debugger_sp); @@ -94,8 +95,9 @@ TEST_F(ExecutionContextTest, GetByteOrderProcess) { ArchSpec arch("powerpc64-pc-linux"); - Platform::SetHostPlatform( - platform_linux::PlatformLinux::CreateInstance(true, &arch)); + Platform::SetHostPlatform(platform_linux::PlatformLinux::CreateInstance( + true, &arch, /*debugger=*/nullptr, + /*metadata=*/nullptr)); DebuggerSP debugger_sp = Debugger::CreateInstance(); ASSERT_TRUE(debugger_sp); Index: lldb/unittests/Target/StackFrameRecognizerTest.cpp =================================================================== --- lldb/unittests/Target/StackFrameRecognizerTest.cpp +++ lldb/unittests/Target/StackFrameRecognizerTest.cpp @@ -32,8 +32,9 @@ // Pretend Linux is the host platform. platform_linux::PlatformLinux::Initialize(); ArchSpec arch("powerpc64-pc-linux"); - Platform::SetHostPlatform( - platform_linux::PlatformLinux::CreateInstance(true, &arch)); + Platform::SetHostPlatform(platform_linux::PlatformLinux::CreateInstance( + true, &arch, /*debugger=*/nullptr, + /*metadata=*/nullptr)); } void TearDown() override { Index: lldb/unittests/Thread/ThreadTest.cpp =================================================================== --- lldb/unittests/Thread/ThreadTest.cpp +++ lldb/unittests/Thread/ThreadTest.cpp @@ -91,8 +91,9 @@ TEST_F(ThreadTest, SetStopInfo) { ArchSpec arch("powerpc64-pc-linux"); - Platform::SetHostPlatform( - platform_linux::PlatformLinux::CreateInstance(true, &arch)); + Platform::SetHostPlatform(platform_linux::PlatformLinux::CreateInstance( + true, &arch, /*debugger=*/nullptr, + /*metadata=*/nullptr)); DebuggerSP debugger_sp = Debugger::CreateInstance(); ASSERT_TRUE(debugger_sp); @@ -126,8 +127,9 @@ TEST_F(ThreadTest, GetPrivateStopInfo) { ArchSpec arch("powerpc64-pc-linux"); - Platform::SetHostPlatform( - platform_linux::PlatformLinux::CreateInstance(true, &arch)); + Platform::SetHostPlatform(platform_linux::PlatformLinux::CreateInstance( + true, &arch, /*debugger=*/nullptr, + /*metadata=*/nullptr)); DebuggerSP debugger_sp = Debugger::CreateInstance(); ASSERT_TRUE(debugger_sp);