https://github.com/medismailben updated https://github.com/llvm/llvm-project/pull/97273
>From 16ef7297eef25d329631fd62d126bf7a7be24c4d Mon Sep 17 00:00:00 2001 From: Med Ismail Bennani <ism...@bennani.ma> Date: Fri, 19 Jul 2024 11:08:39 -0700 Subject: [PATCH 1/2] [lldb/Target] Add GetStartSymbol method to DynamicLoader plugins This patch introduces a new method to the dynamic loader plugin, to fetch its `start` symbol. This can be useful to resolve the `start` symbol address for instance. Signed-off-by: Med Ismail Bennani <ism...@bennani.ma> --- lldb/include/lldb/Target/DynamicLoader.h | 10 +++++++++- .../MacOSX-DYLD/DynamicLoaderDarwin.cpp | 20 +++++++++++++++++++ .../MacOSX-DYLD/DynamicLoaderDarwin.h | 2 ++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/lldb/include/lldb/Target/DynamicLoader.h b/lldb/include/lldb/Target/DynamicLoader.h index e508d192d2759..fd3b3924c2725 100644 --- a/lldb/include/lldb/Target/DynamicLoader.h +++ b/lldb/include/lldb/Target/DynamicLoader.h @@ -10,9 +10,11 @@ #define LLDB_TARGET_DYNAMICLOADER_H #include "lldb/Core/PluginInterface.h" +#include "lldb/Symbol/Symbol.h" #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/UUID.h" +#include "lldb/Utility/UnimplementedError.h" #include "lldb/lldb-defines.h" #include "lldb/lldb-forward.h" #include "lldb/lldb-private-enumerations.h" @@ -24,7 +26,6 @@ namespace lldb_private { class ModuleList; class Process; class SectionList; -class Symbol; class SymbolContext; class SymbolContextList; class Thread; @@ -329,6 +330,13 @@ class DynamicLoader : public PluginInterface { /// safe to call certain APIs or SPIs. virtual bool IsFullyInitialized() { return true; } + /// Return the `start` function \b symbol in the dynamic loader module. + /// This is the symbol the process will begin executing with + /// `process launch --stop-at-entry`. + virtual std::optional<lldb_private::Symbol> GetStartSymbol() { + return std::nullopt; + } + protected: // Utility methods for derived classes diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderDarwin.cpp b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderDarwin.cpp index 0e17d57fa9c4f..5c6331735bde8 100644 --- a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderDarwin.cpp +++ b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderDarwin.cpp @@ -609,6 +609,26 @@ void DynamicLoaderDarwin::UpdateDYLDImageInfoFromNewImageInfo( } } +std::optional<lldb_private::Symbol> DynamicLoaderDarwin::GetStartSymbol() { + Log *log = GetLog(LLDBLog::DynamicLoader); + + auto log_err = [log](llvm::StringLiteral err_msg) -> std::nullopt_t { + LLDB_LOGV(log, "{}", err_msg); + return std::nullopt; + }; + + ModuleSP dyld_sp = GetDYLDModule(); + if (!dyld_sp) + return log_err("Couldn't retrieve DYLD module. Cannot get `start` symbol."); + + const Symbol *symbol = + dyld_sp->FindFirstSymbolWithNameAndType(ConstString("_dyld_start")); + if (!symbol) + return log_err("Cannot find `start` symbol in DYLD module."); + + return *symbol; +} + void DynamicLoaderDarwin::SetDYLDModule(lldb::ModuleSP &dyld_module_sp) { m_dyld_module_wp = dyld_module_sp; } diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderDarwin.h b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderDarwin.h index 8f9a29c94173f..4ac55fdf6f3af 100644 --- a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderDarwin.h +++ b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderDarwin.h @@ -67,6 +67,8 @@ class DynamicLoaderDarwin : public lldb_private::DynamicLoader { // Clear method for classes derived from this one virtual void DoClear() = 0; + std::optional<lldb_private::Symbol> GetStartSymbol() override; + void SetDYLDModule(lldb::ModuleSP &dyld_module_sp); lldb::ModuleSP GetDYLDModule(); >From a3aea6522b889b87c13bd82388beb8ee30919424 Mon Sep 17 00:00:00 2001 From: Med Ismail Bennani <ism...@bennani.ma> Date: Sat, 20 Jul 2024 02:07:23 -0700 Subject: [PATCH 2/2] [lldb/Commands] Add `scripting template list` command with auto discovery This patch introduces a new `template` multiword sub-command to the `scripting` top-level command. As the name suggests, this sub-command operates on scripting templates, and currently has the ability to automatically discover the various scripting extensions that lldb supports. Signed-off-by: Med Ismail Bennani <ism...@bennani.ma> --- lldb/include/lldb/Core/PluginManager.h | 20 +++ .../Interfaces/ScriptedInterface.h | 7 + .../Interfaces/ScriptedInterfaceUsages.h | 43 ++++++ lldb/include/lldb/lldb-private-interfaces.h | 3 + .../Commands/CommandObjectScripting.cpp | 127 +++++++++++++++++- lldb/source/Commands/Options.td | 6 + lldb/source/Core/PluginManager.cpp | 65 +++++++++ lldb/source/Interpreter/CMakeLists.txt | 4 + .../Interpreter/Interfaces/CMakeLists.txt | 10 ++ .../Interfaces/ScriptedInterfaceUsages.cpp | 37 +++++ lldb/source/Plugins/CMakeLists.txt | 3 + .../Python/Interfaces/CMakeLists.txt | 9 +- .../CMakeLists.txt | 15 +++ .../OperatingSystemPythonInterface.cpp | 24 +++- .../OperatingSystemPythonInterface.h | 18 ++- .../CMakeLists.txt | 15 +++ .../ScriptedPlatformPythonInterface.cpp | 23 +++- .../ScriptedPlatformPythonInterface.h | 17 ++- .../CMakeLists.txt | 15 +++ .../ScriptedProcessPythonInterface.cpp | 36 ++++- .../ScriptedProcessPythonInterface.h | 18 ++- .../CMakeLists.txt | 15 +++ .../ScriptedThreadPlanPythonInterface.cpp | 25 +++- .../ScriptedThreadPlanPythonInterface.h | 18 ++- .../Python/ScriptInterpreterPython.cpp | 8 +- 25 files changed, 538 insertions(+), 43 deletions(-) create mode 100644 lldb/include/lldb/Interpreter/Interfaces/ScriptedInterfaceUsages.h create mode 100644 lldb/source/Interpreter/Interfaces/CMakeLists.txt create mode 100644 lldb/source/Interpreter/Interfaces/ScriptedInterfaceUsages.cpp create mode 100644 lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface/CMakeLists.txt rename lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/{ => OperatingSystemPythonInterface}/OperatingSystemPythonInterface.cpp (77%) rename lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/{ => OperatingSystemPythonInterface}/OperatingSystemPythonInterface.h (83%) create mode 100644 lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface/CMakeLists.txt rename lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/{ => ScriptedPlatformPythonInterface}/ScriptedPlatformPythonInterface.cpp (85%) rename lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/{ => ScriptedPlatformPythonInterface}/ScriptedPlatformPythonInterface.h (84%) create mode 100644 lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface/CMakeLists.txt rename lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/{ => ScriptedProcessPythonInterface}/ScriptedProcessPythonInterface.cpp (86%) rename lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/{ => ScriptedProcessPythonInterface}/ScriptedProcessPythonInterface.h (88%) create mode 100644 lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface/CMakeLists.txt rename lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/{ => ScriptedThreadPlanPythonInterface}/ScriptedThreadPlanPythonInterface.cpp (79%) rename lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/{ => ScriptedThreadPlanPythonInterface}/ScriptedThreadPlanPythonInterface.h (82%) diff --git a/lldb/include/lldb/Core/PluginManager.h b/lldb/include/lldb/Core/PluginManager.h index 38a291d9f0afd..a23f834f471fb 100644 --- a/lldb/include/lldb/Core/PluginManager.h +++ b/lldb/include/lldb/Core/PluginManager.h @@ -10,6 +10,7 @@ #define LLDB_CORE_PLUGINMANAGER_H #include "lldb/Core/Architecture.h" +#include "lldb/Interpreter/Interfaces/ScriptedInterfaceUsages.h" #include "lldb/Symbol/TypeSystem.h" #include "lldb/Utility/CompletionRequest.h" #include "lldb/Utility/FileSpec.h" @@ -487,6 +488,25 @@ class PluginManager { static LanguageSet GetAllTypeSystemSupportedLanguagesForExpressions(); + // Scripted Interface + static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, + ScriptedInterfaceCreateInstance create_callback, + lldb::ScriptLanguage language, + ScriptedInterfaceUsages usages); + + static bool UnregisterPlugin(ScriptedInterfaceCreateInstance create_callback); + + static uint32_t GetNumScriptedInterfaces(); + + static llvm::StringRef GetScriptedInterfaceNameAtIndex(uint32_t idx); + + static llvm::StringRef GetScriptedInterfaceDescriptionAtIndex(uint32_t idx); + + static lldb::ScriptLanguage GetScriptedInterfaceLanguageAtIndex(uint32_t idx); + + static ScriptedInterfaceUsages + GetScriptedInterfaceUsagesAtIndex(uint32_t idx); + // REPL static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, REPLCreateInstance create_callback, diff --git a/lldb/include/lldb/Interpreter/Interfaces/ScriptedInterface.h b/lldb/include/lldb/Interpreter/Interfaces/ScriptedInterface.h index 69504dbcda5dc..3ce47d0584a8a 100644 --- a/lldb/include/lldb/Interpreter/Interfaces/ScriptedInterface.h +++ b/lldb/include/lldb/Interpreter/Interfaces/ScriptedInterface.h @@ -9,6 +9,8 @@ #ifndef LLDB_INTERPRETER_INTERFACES_SCRIPTEDINTERFACE_H #define LLDB_INTERPRETER_INTERFACES_SCRIPTEDINTERFACE_H +#include "ScriptedInterfaceUsages.h" + #include "lldb/Core/StructuredDataImpl.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Log.h" @@ -68,6 +70,11 @@ class ScriptedInterface { return true; } + static bool CreateInstance(lldb::ScriptLanguage language, + ScriptedInterfaceUsages usages) { + return false; + } + protected: StructuredData::GenericSP m_object_instance_sp; }; diff --git a/lldb/include/lldb/Interpreter/Interfaces/ScriptedInterfaceUsages.h b/lldb/include/lldb/Interpreter/Interfaces/ScriptedInterfaceUsages.h new file mode 100644 index 0000000000000..36c0cfdca546e --- /dev/null +++ b/lldb/include/lldb/Interpreter/Interfaces/ScriptedInterfaceUsages.h @@ -0,0 +1,43 @@ +//===-- ScriptedInterfaceUsages.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_INTERPRETER_SCRIPTEDINTERFACEUSAGES_H +#define LLDB_INTERPRETER_SCRIPTEDINTERFACEUSAGES_H + +#include "lldb/lldb-types.h" + +#include "lldb/Utility/Stream.h" +#include "llvm/ADT/StringRef.h" + +namespace lldb_private { +class ScriptedInterfaceUsages { +public: + ScriptedInterfaceUsages() = default; + ScriptedInterfaceUsages(const std::vector<llvm::StringRef> ci_usages, + const std::vector<llvm::StringRef> sbapi_usages) + : m_command_interpreter_usages(ci_usages), m_sbapi_usages(sbapi_usages) {} + + const std::vector<llvm::StringRef> &GetCommandInterpreterUsages() const { + return m_command_interpreter_usages; + } + + const std::vector<llvm::StringRef> &GetSBAPIUsages() const { + return m_sbapi_usages; + } + + enum class UsageKind { CommandInterpreter, API }; + + void Dump(Stream &s, UsageKind kind) const; + +private: + std::vector<llvm::StringRef> m_command_interpreter_usages; + std::vector<llvm::StringRef> m_sbapi_usages; +}; +} // namespace lldb_private + +#endif // LLDB_INTERPRETER_SCRIPTEDINTERFACEUSAGES_H diff --git a/lldb/include/lldb/lldb-private-interfaces.h b/lldb/include/lldb/lldb-private-interfaces.h index 10eaf1e6a5add..87c5ff8d22fb6 100644 --- a/lldb/include/lldb/lldb-private-interfaces.h +++ b/lldb/include/lldb/lldb-private-interfaces.h @@ -25,6 +25,7 @@ class Value; } // namespace llvm namespace lldb_private { +class ScriptedInterfaceUsages; typedef lldb::ABISP (*ABICreateInstance)(lldb::ProcessSP process_sp, const ArchSpec &arch); typedef std::unique_ptr<Architecture> (*ArchitectureCreateInstance)( @@ -124,6 +125,8 @@ typedef lldb::REPLSP (*REPLCreateInstance)(Status &error, lldb::LanguageType language, Debugger *debugger, Target *target, const char *repl_options); +typedef bool (*ScriptedInterfaceCreateInstance)(lldb::ScriptLanguage language, + ScriptedInterfaceUsages usages); typedef int (*ComparisonFunction)(const void *, const void *); typedef void (*DebuggerInitializeCallback)(Debugger &debugger); /// Trace diff --git a/lldb/source/Commands/CommandObjectScripting.cpp b/lldb/source/Commands/CommandObjectScripting.cpp index fee0565a7c48a..9e45919afd884 100644 --- a/lldb/source/Commands/CommandObjectScripting.cpp +++ b/lldb/source/Commands/CommandObjectScripting.cpp @@ -8,12 +8,14 @@ #include "CommandObjectScripting.h" #include "lldb/Core/Debugger.h" +#include "lldb/Core/PluginManager.h" #include "lldb/DataFormatters/DataVisualization.h" #include "lldb/Host/Config.h" #include "lldb/Host/OptionParser.h" #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/CommandOptionArgumentTable.h" #include "lldb/Interpreter/CommandReturnObject.h" +#include "lldb/Interpreter/Interfaces/ScriptedInterfaceUsages.h" #include "lldb/Interpreter/OptionArgParser.h" #include "lldb/Interpreter/ScriptInterpreter.h" #include "lldb/Utility/Args.h" @@ -127,9 +129,127 @@ class CommandObjectScriptingRun : public CommandObjectRaw { CommandOptions m_options; }; -#pragma mark CommandObjectMultiwordScripting +#define LLDB_OPTIONS_scripting_template_list +#include "CommandOptions.inc" + +class CommandObjectScriptingTemplateList : public CommandObjectParsed { +public: + CommandObjectScriptingTemplateList(CommandInterpreter &interpreter) + : CommandObjectParsed( + interpreter, "scripting template list", + "List all the available scripting extension templates. ", + "scripting template list [--language <scripting-language> --]") {} + + ~CommandObjectScriptingTemplateList() override = default; + + Options *GetOptions() override { return &m_options; } + + class CommandOptions : public Options { + public: + CommandOptions() = default; + ~CommandOptions() override = default; + Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, + ExecutionContext *execution_context) override { + Status error; + const int short_option = m_getopt_table[option_idx].val; -// CommandObjectMultiwordScripting + switch (short_option) { + case 'l': + m_language = (lldb::ScriptLanguage)OptionArgParser::ToOptionEnum( + option_arg, GetDefinitions()[option_idx].enum_values, + eScriptLanguageNone, error); + if (!error.Success()) + error.SetErrorStringWithFormat("unrecognized value for language '%s'", + option_arg.str().c_str()); + break; + default: + llvm_unreachable("Unimplemented option"); + } + + return error; + } + + void OptionParsingStarting(ExecutionContext *execution_context) override { + m_language = lldb::eScriptLanguageDefault; + } + + llvm::ArrayRef<OptionDefinition> GetDefinitions() override { + return llvm::ArrayRef(g_scripting_template_list_options); + } + + lldb::ScriptLanguage m_language = lldb::eScriptLanguageDefault; + }; + +protected: + void DoExecute(Args &command, CommandReturnObject &result) override { + Stream &s = result.GetOutputStream(); + s.Printf("Available scripted extension templates:"); + + auto print_field = [&s](llvm::StringRef key, llvm::StringRef value, + bool check_validity = false) { + if (!check_validity || !value.empty()) { + s.IndentMore(); + s.Indent(); + s << key << ": " << value << '\n'; + s.IndentLess(); + } + }; + + size_t num_listed_interface = 0; + size_t num_templates = PluginManager::GetNumScriptedInterfaces(); + for (size_t i = 0; i < num_templates; i++) { + llvm::StringRef plugin_name = + PluginManager::GetScriptedInterfaceNameAtIndex(i); + if (plugin_name.empty()) + break; + + lldb::ScriptLanguage lang = + PluginManager::GetScriptedInterfaceLanguageAtIndex(i); + if (lang != m_options.m_language) + continue; + + if (!num_listed_interface) + s.EOL(); + + num_listed_interface++; + + llvm::StringRef desc = + PluginManager::GetScriptedInterfaceDescriptionAtIndex(i); + ScriptedInterfaceUsages usages = + PluginManager::GetScriptedInterfaceUsagesAtIndex(i); + + print_field("Name", plugin_name); + print_field("Language", ScriptInterpreter::LanguageToString(lang)); + print_field("Description", desc); + usages.Dump(s, ScriptedInterfaceUsages::UsageKind::API); + usages.Dump(s, ScriptedInterfaceUsages::UsageKind::CommandInterpreter); + + if (i != num_templates - 1) + s.EOL(); + } + + if (!num_listed_interface) + s << " None\n"; + } + +private: + CommandOptions m_options; +}; + +class CommandObjectMultiwordScriptingTemplate : public CommandObjectMultiword { +public: + CommandObjectMultiwordScriptingTemplate(CommandInterpreter &interpreter) + : CommandObjectMultiword( + interpreter, "scripting template", + "Commands for operating on the scripting templates.", + "scripting template [<subcommand-options>]") { + LoadSubCommand( + "list", + CommandObjectSP(new CommandObjectScriptingTemplateList(interpreter))); + } + + ~CommandObjectMultiwordScriptingTemplate() override = default; +}; CommandObjectMultiwordScripting::CommandObjectMultiwordScripting( CommandInterpreter &interpreter) @@ -139,6 +259,9 @@ CommandObjectMultiwordScripting::CommandObjectMultiwordScripting( "scripting <subcommand> [<subcommand-options>]") { LoadSubCommand("run", CommandObjectSP(new CommandObjectScriptingRun(interpreter))); + LoadSubCommand("template", + CommandObjectSP( + new CommandObjectMultiwordScriptingTemplate(interpreter))); } CommandObjectMultiwordScripting::~CommandObjectMultiwordScripting() = default; diff --git a/lldb/source/Commands/Options.td b/lldb/source/Commands/Options.td index 24e97f3bb97d3..6e5ed21b22ad8 100644 --- a/lldb/source/Commands/Options.td +++ b/lldb/source/Commands/Options.td @@ -841,6 +841,12 @@ let Command = "scripting run" in { " language. If none is specific the default scripting language is used.">; } +let Command = "scripting template list" in { + def scripting_template_list_language : Option<"language", "l">, + EnumArg<"ScriptLang">, Desc<"Specify the scripting " + " language. If none is specified the default scripting language is used.">; +} + let Command = "source info" in { def source_info_count : Option<"count", "c">, Arg<"Count">, Desc<"The number of line entries to display.">; diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp index 759ef3a8afe02..01bee8680b7ba 100644 --- a/lldb/source/Core/PluginManager.cpp +++ b/lldb/source/Core/PluginManager.cpp @@ -1505,6 +1505,70 @@ LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForExpressions() { return all; } +#pragma mark ScriptedInterfaces + +struct ScriptedInterfaceInstance + : public PluginInstance<ScriptedInterfaceCreateInstance> { + ScriptedInterfaceInstance(llvm::StringRef name, llvm::StringRef description, + ScriptedInterfaceCreateInstance create_callback, + lldb::ScriptLanguage language, + ScriptedInterfaceUsages usages) + : PluginInstance<ScriptedInterfaceCreateInstance>(name, description, + create_callback), + language(language), usages(usages) {} + + lldb::ScriptLanguage language; + ScriptedInterfaceUsages usages; +}; + +typedef PluginInstances<ScriptedInterfaceInstance> ScriptedInterfaceInstances; + +static ScriptedInterfaceInstances &GetScriptedInterfaceInstances() { + static ScriptedInterfaceInstances g_instances; + return g_instances; +} + +bool PluginManager::RegisterPlugin( + llvm::StringRef name, llvm::StringRef description, + ScriptedInterfaceCreateInstance create_callback, + lldb::ScriptLanguage language, ScriptedInterfaceUsages usages) { + return GetScriptedInterfaceInstances().RegisterPlugin( + name, description, create_callback, language, usages); +} + +bool PluginManager::UnregisterPlugin( + ScriptedInterfaceCreateInstance create_callback) { + return GetScriptedInterfaceInstances().UnregisterPlugin(create_callback); +} + +uint32_t PluginManager::GetNumScriptedInterfaces() { + return GetScriptedInterfaceInstances().GetInstances().size(); +} + +llvm::StringRef PluginManager::GetScriptedInterfaceNameAtIndex(uint32_t index) { + return GetScriptedInterfaceInstances().GetNameAtIndex(index); +} + +llvm::StringRef +PluginManager::GetScriptedInterfaceDescriptionAtIndex(uint32_t index) { + return GetScriptedInterfaceInstances().GetDescriptionAtIndex(index); +} + +lldb::ScriptLanguage +PluginManager::GetScriptedInterfaceLanguageAtIndex(uint32_t idx) { + const auto &instances = GetScriptedInterfaceInstances().GetInstances(); + return idx < instances.size() ? instances[idx].language + : ScriptLanguage::eScriptLanguageNone; +} + +ScriptedInterfaceUsages +PluginManager::GetScriptedInterfaceUsagesAtIndex(uint32_t idx) { + const auto &instances = GetScriptedInterfaceInstances().GetInstances(); + if (idx >= instances.size()) + return {}; + return instances[idx].usages; +} + #pragma mark REPL struct REPLInstance : public PluginInstance<REPLCreateInstance> { @@ -1565,6 +1629,7 @@ void PluginManager::DebuggerInitialize(Debugger &debugger) { GetOperatingSystemInstances().PerformDebuggerCallback(debugger); GetStructuredDataPluginInstances().PerformDebuggerCallback(debugger); GetTracePluginInstances().PerformDebuggerCallback(debugger); + GetScriptedInterfaceInstances().PerformDebuggerCallback(debugger); } // This is the preferred new way to register plugin specific settings. e.g. diff --git a/lldb/source/Interpreter/CMakeLists.txt b/lldb/source/Interpreter/CMakeLists.txt index ae79b82d7c3e2..642263a8bda7f 100644 --- a/lldb/source/Interpreter/CMakeLists.txt +++ b/lldb/source/Interpreter/CMakeLists.txt @@ -6,6 +6,8 @@ lldb_tablegen(InterpreterPropertiesEnum.inc -gen-lldb-property-enum-defs SOURCE InterpreterProperties.td TARGET LLDBInterpreterPropertiesEnumGen) +add_subdirectory(Interfaces) + add_lldb_library(lldbInterpreter NO_PLUGIN_DEPENDENCIES CommandAlias.cpp CommandHistory.cpp @@ -54,6 +56,7 @@ add_lldb_library(lldbInterpreter NO_PLUGIN_DEPENDENCIES ScriptInterpreter.cpp LINK_LIBS + lldbInterpreterInterfaces lldbCommands lldbCore lldbDataFormatters @@ -66,6 +69,7 @@ add_lldb_library(lldbInterpreter NO_PLUGIN_DEPENDENCIES ) add_dependencies(lldbInterpreter + lldbInterpreterInterfaces LLDBInterpreterPropertiesGen LLDBInterpreterPropertiesEnumGen) diff --git a/lldb/source/Interpreter/Interfaces/CMakeLists.txt b/lldb/source/Interpreter/Interfaces/CMakeLists.txt new file mode 100644 index 0000000000000..f44672aa50b75 --- /dev/null +++ b/lldb/source/Interpreter/Interfaces/CMakeLists.txt @@ -0,0 +1,10 @@ +add_lldb_library(lldbInterpreterInterfaces NO_PLUGIN_DEPENDENCIES + ScriptedInterfaceUsages.cpp + + LINK_LIBS + lldbUtility + + LINK_COMPONENTS + Support + ) + diff --git a/lldb/source/Interpreter/Interfaces/ScriptedInterfaceUsages.cpp b/lldb/source/Interpreter/Interfaces/ScriptedInterfaceUsages.cpp new file mode 100644 index 0000000000000..05d7a5d852f8c --- /dev/null +++ b/lldb/source/Interpreter/Interfaces/ScriptedInterfaceUsages.cpp @@ -0,0 +1,37 @@ +//===-- ScriptedInterfaceUsages.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 "lldb/Interpreter/Interfaces/ScriptedInterfaceUsages.h" + +using namespace lldb; +using namespace lldb_private; + +void ScriptedInterfaceUsages::Dump(Stream &s, UsageKind kind) const { + s.IndentMore(); + s.Indent(); + llvm::StringRef usage_kind = + (kind == UsageKind::CommandInterpreter) ? "Command Interpreter" : "API"; + s << usage_kind << " Usages:"; + const std::vector<llvm::StringRef> &usages = + (kind == UsageKind::CommandInterpreter) ? GetCommandInterpreterUsages() + : GetSBAPIUsages(); + if (usages.empty()) + s << " None\n"; + else if (usages.size() == 1) + s << " " << usages.front() << '\n'; + else { + s << '\n'; + for (llvm::StringRef usage : usages) { + s.IndentMore(); + s.Indent(); + s << usage << '\n'; + s.IndentLess(); + } + } + s.IndentLess(); +} diff --git a/lldb/source/Plugins/CMakeLists.txt b/lldb/source/Plugins/CMakeLists.txt index 854f589f45ae0..34dd8c1eb22f6 100644 --- a/lldb/source/Plugins/CMakeLists.txt +++ b/lldb/source/Plugins/CMakeLists.txt @@ -29,6 +29,9 @@ add_subdirectory(UnwindAssembly) set(LLDB_STRIPPED_PLUGINS) get_property(LLDB_ALL_PLUGINS GLOBAL PROPERTY LLDB_PLUGINS) +get_property(LLDB_EXTRA_PLUGINS GLOBAL PROPERTY LLDB_EXTRA_SCRIPT_PLUGINS) +list(APPEND LLDB_ALL_PLUGINS ${LLDB_EXTRA_PLUGINS}) + set(LLDB_ENUM_PLUGINS "") diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/CMakeLists.txt b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/CMakeLists.txt index c60e4bb503a37..04fd90398bbda 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/CMakeLists.txt +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/CMakeLists.txt @@ -19,13 +19,14 @@ if (LLDB_ENABLE_LIBEDIT) list(APPEND LLDB_LIBEDIT_LIBS LibEdit::LibEdit) endif() +add_subdirectory(ScriptedProcessPythonInterface) +add_subdirectory(ScriptedThreadPlanPythonInterface) +add_subdirectory(ScriptedPlatformPythonInterface) +add_subdirectory(OperatingSystemPythonInterface) + add_lldb_library(lldbPluginScriptInterpreterPythonInterfaces - OperatingSystemPythonInterface.cpp ScriptedPythonInterface.cpp - ScriptedProcessPythonInterface.cpp ScriptedThreadPythonInterface.cpp - ScriptedThreadPlanPythonInterface.cpp - ScriptedPlatformPythonInterface.cpp LINK_LIBS lldbCore diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface/CMakeLists.txt b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface/CMakeLists.txt new file mode 100644 index 0000000000000..a0264962ec0bb --- /dev/null +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface/CMakeLists.txt @@ -0,0 +1,15 @@ +add_lldb_library(lldbPluginOperatingSystemPythonInterface PLUGIN + + OperatingSystemPythonInterface.cpp + + LINK_LIBS + lldbCore + lldbHost + lldbInterpreter + lldbTarget + ${Python3_LIBRARIES} + ${LLDB_LIBEDIT_LIBS} + + LINK_COMPONENTS + Support + ) diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface/OperatingSystemPythonInterface.cpp similarity index 77% rename from lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.cpp rename to lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface/OperatingSystemPythonInterface.cpp index c162c7367c654..0784bbd815dd2 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface/OperatingSystemPythonInterface.cpp @@ -6,6 +6,7 @@ // //===----------------------------------------------------------------------===// +#include "lldb/Core/PluginManager.h" #include "lldb/Host/Config.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Utility/Log.h" @@ -14,10 +15,9 @@ #if LLDB_ENABLE_PYTHON // LLDB Python header must be included first -#include "../lldb-python.h" - -#include "../SWIGPythonBridge.h" -#include "../ScriptInterpreterPythonImpl.h" +#include "../../lldb-python.h" +#include "../../SWIGPythonBridge.h" +#include "../../ScriptInterpreterPythonImpl.h" #include "OperatingSystemPythonInterface.h" using namespace lldb; @@ -25,6 +25,8 @@ using namespace lldb_private; using namespace lldb_private::python; using Locker = ScriptInterpreterPythonImpl::Locker; +LLDB_PLUGIN_DEFINE(OperatingSystemPythonInterface) + OperatingSystemPythonInterface::OperatingSystemPythonInterface( ScriptInterpreterPythonImpl &interpreter) : OperatingSystemInterface(), ScriptedThreadPythonInterface(interpreter) {} @@ -79,4 +81,18 @@ OperatingSystemPythonInterface::GetRegisterContextForTID(lldb::tid_t tid) { return obj->GetAsString()->GetValue().str(); } +void OperatingSystemPythonInterface::Initialize() { + const std::vector<llvm::StringRef> ci_usages = { + "settings set target.process.python-os-plugin-path <script-path>", + "settings set process.experimental.os-plugin-reports-all-threads [0/1]"}; + const std::vector<llvm::StringRef> api_usages = {}; + PluginManager::RegisterPlugin( + GetPluginNameStatic(), llvm::StringRef("Mock thread state"), + CreateInstance, eScriptLanguagePython, {ci_usages, api_usages}); +} + +void OperatingSystemPythonInterface::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); +} + #endif diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface/OperatingSystemPythonInterface.h similarity index 83% rename from lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h rename to lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface/OperatingSystemPythonInterface.h index da7bbf13b1d55..6d60f8b437d1c 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface/OperatingSystemPythonInterface.h @@ -10,17 +10,19 @@ #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_OPERATINGSYSTEMPYTHONINTERFACE_H #include "lldb/Host/Config.h" +#include "lldb/Interpreter/Interfaces/OperatingSystemInterface.h" #if LLDB_ENABLE_PYTHON -#include "ScriptedThreadPythonInterface.h" -#include "lldb/Interpreter/Interfaces/OperatingSystemInterface.h" +#include "../ScriptedThreadPythonInterface.h" + #include <optional> namespace lldb_private { class OperatingSystemPythonInterface : virtual public OperatingSystemInterface, - virtual public ScriptedThreadPythonInterface { + virtual public ScriptedThreadPythonInterface, + public PluginInterface { public: OperatingSystemPythonInterface(ScriptInterpreterPythonImpl &interpreter); @@ -41,6 +43,16 @@ class OperatingSystemPythonInterface StructuredData::DictionarySP GetRegisterInfo() override; std::optional<std::string> GetRegisterContextForTID(lldb::tid_t tid) override; + + static void Initialize(); + + static void Terminate(); + + static llvm::StringRef GetPluginNameStatic() { + return "OperatingSystemPythonInterface"; + } + + llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } }; } // namespace lldb_private diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface/CMakeLists.txt b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface/CMakeLists.txt new file mode 100644 index 0000000000000..7027a82c6fbc3 --- /dev/null +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface/CMakeLists.txt @@ -0,0 +1,15 @@ +add_lldb_library(lldbPluginScriptedPlatformPythonInterface PLUGIN + + ScriptedPlatformPythonInterface.cpp + + LINK_LIBS + lldbCore + lldbHost + lldbInterpreter + lldbTarget + ${Python3_LIBRARIES} + ${LLDB_LIBEDIT_LIBS} + + LINK_COMPONENTS + Support + ) diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface/ScriptedPlatformPythonInterface.cpp similarity index 85% rename from lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface.cpp rename to lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface/ScriptedPlatformPythonInterface.cpp index 6e93bec80056e..ec3e77d2f1f16 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface/ScriptedPlatformPythonInterface.cpp @@ -6,7 +6,9 @@ // //===----------------------------------------------------------------------===// +#include "lldb/Core/PluginManager.h" #include "lldb/Host/Config.h" +#include "lldb/Target/ExecutionContext.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/Status.h" #include "lldb/lldb-enumerations.h" @@ -14,19 +16,18 @@ #if LLDB_ENABLE_PYTHON // LLDB Python header must be included first -#include "../lldb-python.h" - -#include "../SWIGPythonBridge.h" -#include "../ScriptInterpreterPythonImpl.h" +#include "../../lldb-python.h" +#include "../../SWIGPythonBridge.h" +#include "../../ScriptInterpreterPythonImpl.h" #include "ScriptedPlatformPythonInterface.h" -#include "lldb/Target/ExecutionContext.h" - using namespace lldb; using namespace lldb_private; using namespace lldb_private::python; using Locker = ScriptInterpreterPythonImpl::Locker; +LLDB_PLUGIN_DEFINE(ScriptedPlatformPythonInterface) + ScriptedPlatformPythonInterface::ScriptedPlatformPythonInterface( ScriptInterpreterPythonImpl &interpreter) : ScriptedPlatformInterface(), ScriptedPythonInterface(interpreter) {} @@ -93,4 +94,14 @@ Status ScriptedPlatformPythonInterface::KillProcess(lldb::pid_t pid) { return GetStatusFromMethod("kill_process", pid); } +void ScriptedPlatformPythonInterface::Initialize() { + PluginManager::RegisterPlugin( + GetPluginNameStatic(), "Mock platform and interact with its processes.", + CreateInstance, eScriptLanguagePython, {}); +} + +void ScriptedPlatformPythonInterface::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); +} + #endif // LLDB_ENABLE_PYTHON diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface/ScriptedPlatformPythonInterface.h similarity index 84% rename from lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface.h rename to lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface/ScriptedPlatformPythonInterface.h index 0842d3a003429..01ee40a5a197c 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface/ScriptedPlatformPythonInterface.h @@ -10,15 +10,16 @@ #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDPLATFORMPYTHONINTERFACE_H #include "lldb/Host/Config.h" +#include "lldb/Interpreter/Interfaces/ScriptedPlatformInterface.h" #if LLDB_ENABLE_PYTHON -#include "ScriptedPythonInterface.h" -#include "lldb/Interpreter/Interfaces/ScriptedPlatformInterface.h" +#include "../ScriptedPythonInterface.h" namespace lldb_private { class ScriptedPlatformPythonInterface : public ScriptedPlatformInterface, - public ScriptedPythonInterface { + public ScriptedPythonInterface, + public PluginInterface { public: ScriptedPlatformPythonInterface(ScriptInterpreterPythonImpl &interpreter); @@ -43,6 +44,16 @@ class ScriptedPlatformPythonInterface : public ScriptedPlatformInterface, Status LaunchProcess(lldb::ProcessLaunchInfoSP launch_info) override; Status KillProcess(lldb::pid_t pid) override; + + static void Initialize(); + + static void Terminate(); + + static llvm::StringRef GetPluginNameStatic() { + return "ScriptedPlatformPythonInterface"; + } + + llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } }; } // namespace lldb_private diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface/CMakeLists.txt b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface/CMakeLists.txt new file mode 100644 index 0000000000000..07affb08eb7e2 --- /dev/null +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface/CMakeLists.txt @@ -0,0 +1,15 @@ +add_lldb_library(lldbPluginScriptedProcessPythonInterface PLUGIN + + ScriptedProcessPythonInterface.cpp + + LINK_LIBS + lldbCore + lldbHost + lldbInterpreter + lldbTarget + ${Python3_LIBRARIES} + ${LLDB_LIBEDIT_LIBS} + + LINK_COMPONENTS + Support + ) diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface/ScriptedProcessPythonInterface.cpp similarity index 86% rename from lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.cpp rename to lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface/ScriptedProcessPythonInterface.cpp index 313c597ce48f3..b48df5cbd4fcb 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface/ScriptedProcessPythonInterface.cpp @@ -6,11 +6,8 @@ // //===----------------------------------------------------------------------===// +#include "lldb/Core/PluginManager.h" #include "lldb/Host/Config.h" -#if LLDB_ENABLE_PYTHON -// LLDB Python header must be included first -#include "../lldb-python.h" -#endif #include "lldb/Target/Process.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/Status.h" @@ -18,10 +15,13 @@ #if LLDB_ENABLE_PYTHON -#include "../SWIGPythonBridge.h" -#include "../ScriptInterpreterPythonImpl.h" +// LLDB Python header must be included first +#include "../../lldb-python.h" +#include "../../SWIGPythonBridge.h" +#include "../../ScriptInterpreterPythonImpl.h" +#include "../ScriptedThreadPythonInterface.h" #include "ScriptedProcessPythonInterface.h" -#include "ScriptedThreadPythonInterface.h" + #include <optional> using namespace lldb; @@ -29,6 +29,8 @@ using namespace lldb_private; using namespace lldb_private::python; using Locker = ScriptInterpreterPythonImpl::Locker; +LLDB_PLUGIN_DEFINE(ScriptedProcessPythonInterface) + ScriptedProcessPythonInterface::ScriptedProcessPythonInterface( ScriptInterpreterPythonImpl &interpreter) : ScriptedProcessInterface(), ScriptedPythonInterface(interpreter) {} @@ -208,4 +210,24 @@ StructuredData::DictionarySP ScriptedProcessPythonInterface::GetMetadata() { return dict; } +void ScriptedProcessPythonInterface::Initialize() { + const std::vector<llvm::StringRef> ci_usages = { + "process attach -C <script-name> [-k key -v value ...]", + "process launch -C <script-name> [-k key -v value ...]"}; + const std::vector<llvm::StringRef> api_usages = { + "SBAttachInfo.SetScriptedProcessClassName", + "SBAttachInfo.SetScriptedProcessDictionary", + "SBTarget.Attach", + "SBLaunchInfo.SetScriptedProcessClassName", + "SBLaunchInfo.SetScriptedProcessDictionary", + "SBTarget.Launch"}; + PluginManager::RegisterPlugin( + GetPluginNameStatic(), llvm::StringRef("Mock process state"), + CreateInstance, eScriptLanguagePython, {ci_usages, api_usages}); +} + +void ScriptedProcessPythonInterface::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); +} + #endif diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface/ScriptedProcessPythonInterface.h similarity index 88% rename from lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.h rename to lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface/ScriptedProcessPythonInterface.h index c75caa9340f25..bb27734739f43 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface/ScriptedProcessPythonInterface.h @@ -10,16 +10,18 @@ #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDPROCESSPYTHONINTERFACE_H #include "lldb/Host/Config.h" +#include "lldb/Interpreter/Interfaces/ScriptedProcessInterface.h" #if LLDB_ENABLE_PYTHON -#include "ScriptedPythonInterface.h" -#include "lldb/Interpreter/Interfaces/ScriptedProcessInterface.h" +#include "../ScriptedPythonInterface.h" + #include <optional> namespace lldb_private { class ScriptedProcessPythonInterface : public ScriptedProcessInterface, - public ScriptedPythonInterface { + public ScriptedPythonInterface, + public PluginInterface { public: ScriptedProcessPythonInterface(ScriptInterpreterPythonImpl &interpreter); @@ -67,6 +69,16 @@ class ScriptedProcessPythonInterface : public ScriptedProcessInterface, StructuredData::DictionarySP GetMetadata() override; + static void Initialize(); + + static void Terminate(); + + static llvm::StringRef GetPluginNameStatic() { + return "ScriptedProcessPythonInterface"; + } + + llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } + private: lldb::ScriptedThreadInterfaceSP CreateScriptedThreadInterface() override; }; diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface/CMakeLists.txt b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface/CMakeLists.txt new file mode 100644 index 0000000000000..5c8cc97386a29 --- /dev/null +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface/CMakeLists.txt @@ -0,0 +1,15 @@ +add_lldb_library(lldbPluginScriptedThreadPlanPythonInterface PLUGIN + + ScriptedThreadPlanPythonInterface.cpp + + LINK_LIBS + lldbCore + lldbHost + lldbInterpreter + lldbTarget + ${Python3_LIBRARIES} + ${LLDB_LIBEDIT_LIBS} + + LINK_COMPONENTS + Support + ) diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface/ScriptedThreadPlanPythonInterface.cpp similarity index 79% rename from lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface.cpp rename to lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface/ScriptedThreadPlanPythonInterface.cpp index f23858c01277c..c2610506b364f 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface/ScriptedThreadPlanPythonInterface.cpp @@ -6,6 +6,7 @@ // //===----------------------------------------------------------------------===// +#include "lldb/Core/PluginManager.h" #include "lldb/Host/Config.h" #include "lldb/Utility/Log.h" #include "lldb/lldb-enumerations.h" @@ -13,16 +14,17 @@ #if LLDB_ENABLE_PYTHON // LLDB Python header must be included first -#include "../lldb-python.h" - -#include "../SWIGPythonBridge.h" -#include "../ScriptInterpreterPythonImpl.h" +#include "../../lldb-python.h" +#include "../../SWIGPythonBridge.h" +#include "../../ScriptInterpreterPythonImpl.h" #include "ScriptedThreadPlanPythonInterface.h" using namespace lldb; using namespace lldb_private; using namespace lldb_private::python; +LLDB_PLUGIN_DEFINE(ScriptedThreadPlanPythonInterface) + ScriptedThreadPlanPythonInterface::ScriptedThreadPlanPythonInterface( ScriptInterpreterPythonImpl &interpreter) : ScriptedThreadPlanInterface(), ScriptedPythonInterface(interpreter) {} @@ -102,4 +104,19 @@ ScriptedThreadPlanPythonInterface::GetStopDescription(lldb::StreamSP &stream) { return llvm::Error::success(); } +void ScriptedThreadPlanPythonInterface::Initialize() { + const std::vector<llvm::StringRef> ci_usages = { + "thread step-scripted -C <script-name> [-k key -v value ...]"}; + const std::vector<llvm::StringRef> api_usages = { + "SBThread.StepUsingScriptedThreadPlan"}; + PluginManager::RegisterPlugin( + GetPluginNameStatic(), + llvm::StringRef("Alter thread stepping logic and stop reason"), + CreateInstance, eScriptLanguagePython, {ci_usages, api_usages}); +} + +void ScriptedThreadPlanPythonInterface::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); +} + #endif diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface/ScriptedThreadPlanPythonInterface.h similarity index 82% rename from lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface.h rename to lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface/ScriptedThreadPlanPythonInterface.h index 6ec89b9f59253..c0a82f4cbf46a 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface/ScriptedThreadPlanPythonInterface.h @@ -10,16 +10,18 @@ #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDTHREADPLANPYTHONINTERFACE_H #include "lldb/Host/Config.h" +#include "lldb/Interpreter/Interfaces/ScriptedThreadPlanInterface.h" #if LLDB_ENABLE_PYTHON -#include "ScriptedPythonInterface.h" -#include "lldb/Interpreter/Interfaces/ScriptedThreadPlanInterface.h" +#include "../ScriptedPythonInterface.h" + #include <optional> namespace lldb_private { class ScriptedThreadPlanPythonInterface : public ScriptedThreadPlanInterface, - public ScriptedPythonInterface { + public ScriptedPythonInterface, + public PluginInterface { public: ScriptedThreadPlanPythonInterface(ScriptInterpreterPythonImpl &interpreter); @@ -41,6 +43,16 @@ class ScriptedThreadPlanPythonInterface : public ScriptedThreadPlanInterface, lldb::StateType GetRunState() override; llvm::Error GetStopDescription(lldb::StreamSP &stream) override; + + static void Initialize(); + + static void Terminate(); + + static llvm::StringRef GetPluginNameStatic() { + return "ScriptedThreadPlanPythonInterface"; + } + + llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } }; } // namespace lldb_private diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp index 70fa6d83e306f..b1a69c9207649 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp @@ -14,10 +14,10 @@ // LLDB Python header must be included first #include "lldb-python.h" -#include "Interfaces/OperatingSystemPythonInterface.h" -#include "Interfaces/ScriptedPlatformPythonInterface.h" -#include "Interfaces/ScriptedProcessPythonInterface.h" -#include "Interfaces/ScriptedThreadPlanPythonInterface.h" +#include "Interfaces/OperatingSystemPythonInterface/OperatingSystemPythonInterface.h" +#include "Interfaces/ScriptedPlatformPythonInterface/ScriptedPlatformPythonInterface.h" +#include "Interfaces/ScriptedProcessPythonInterface/ScriptedProcessPythonInterface.h" +#include "Interfaces/ScriptedThreadPlanPythonInterface/ScriptedThreadPlanPythonInterface.h" #include "Interfaces/ScriptedThreadPythonInterface.h" #include "PythonDataObjects.h" #include "PythonReadline.h" _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits