llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-lldb Author: None (rchamala) <details> <summary>Changes</summary> ## Summary - Adds `target symbols scripted register -C <class> [-k <key> -v <value> ...]` command - Adds `target symbols scripted clear` command - Adds `target symbols scripted info` command - Adds `SBDebugger::RegisterScriptedSymbolLocator()` and `SBDebugger::ClearScriptedSymbolLocators()` API **PR Stack:** #<!-- -->183674 → #<!-- -->183675 → #<!-- -->183676 → **this** → #<!-- -->183678 ## Test plan - [x] `ninja check-lldb` — no regressions - [ ] Test commands manually: register, info, clear --- Patch is 58.57 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/183677.diff 37 Files Affected: - (modified) lldb/bindings/python/python-swigsafecast.swig (+5) - (modified) lldb/bindings/python/python-wrapper.swig (+36) - (modified) lldb/include/lldb/API/SBDebugger.h (+20) - (modified) lldb/include/lldb/API/SBFileSpec.h (+5) - (modified) lldb/include/lldb/API/SBModule.h (+1) - (modified) lldb/include/lldb/API/SBModuleSpec.h (+9) - (modified) lldb/include/lldb/Core/PluginManager.h (+25) - (added) lldb/include/lldb/Interpreter/Interfaces/ScriptedSymbolLocatorInterface.h (+52) - (modified) lldb/include/lldb/Interpreter/ScriptInterpreter.h (+13) - (modified) lldb/include/lldb/Symbol/LineEntry.h (+1-1) - (modified) lldb/include/lldb/lldb-forward.h (+3) - (modified) lldb/include/lldb/lldb-private-interfaces.h (+2) - (modified) lldb/source/API/SBDebugger.cpp (+29) - (modified) lldb/source/Commands/CommandObjectTarget.cpp (+131) - (modified) lldb/source/Core/Module.cpp (+1-1) - (modified) lldb/source/Core/PluginManager.cpp (+74-2) - (modified) lldb/source/Interpreter/ScriptInterpreter.cpp (+21) - (modified) lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/CMakeLists.txt (+1) - (modified) lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptInterpreterPythonInterfaces.cpp (+2) - (modified) lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptInterpreterPythonInterfaces.h (+1) - (modified) lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.cpp (+54) - (modified) lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h (+30) - (added) lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedSymbolLocatorPythonInterface.cpp (+109) - (added) lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedSymbolLocatorPythonInterface.h (+62) - (modified) lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h (+5) - (modified) lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp (+5) - (modified) lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h (+3) - (modified) lldb/source/Plugins/SymbolLocator/CMakeLists.txt (+1) - (modified) lldb/source/Plugins/SymbolLocator/Debuginfod/SymbolLocatorDebuginfod.cpp (+1-1) - (added) lldb/source/Plugins/SymbolLocator/Scripted/CMakeLists.txt (+13) - (added) lldb/source/Plugins/SymbolLocator/Scripted/SymbolLocatorScripted.cpp (+166) - (added) lldb/source/Plugins/SymbolLocator/Scripted/SymbolLocatorScripted.h (+51) - (modified) lldb/source/Symbol/LineEntry.cpp (+18-1) - (modified) lldb/source/Target/StackFrame.cpp (+1-1) - (modified) lldb/source/Target/StackFrameList.cpp (+2-1) - (modified) lldb/source/Target/ThreadPlanStepRange.cpp (+2-2) - (modified) lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp (+20) ``````````diff diff --git a/lldb/bindings/python/python-swigsafecast.swig b/lldb/bindings/python/python-swigsafecast.swig index a86dc44ce4106..fdf8de3d28aa2 100644 --- a/lldb/bindings/python/python-swigsafecast.swig +++ b/lldb/bindings/python/python-swigsafecast.swig @@ -147,6 +147,11 @@ PythonObject SWIGBridge::ToSWIGWrapper( return ToSWIGHelper(module_spec_sb.release(), SWIGTYPE_p_lldb__SBModuleSpec); } +PythonObject SWIGBridge::ToSWIGWrapper(const ModuleSpec &module_spec) { + return ToSWIGHelper(new lldb::SBModuleSpec(module_spec), + SWIGTYPE_p_lldb__SBModuleSpec); +} + PythonObject SWIGBridge::ToSWIGWrapper(lldb::DescriptionLevel level) { return PythonInteger((int64_t) level); } diff --git a/lldb/bindings/python/python-wrapper.swig b/lldb/bindings/python/python-wrapper.swig index bf59569920470..c881cf9a5286e 100644 --- a/lldb/bindings/python/python-wrapper.swig +++ b/lldb/bindings/python/python-wrapper.swig @@ -595,6 +595,42 @@ void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBFrameList(PyObject *d return sb_ptr; } +void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBFileSpec(PyObject *data) { + lldb::SBFileSpec *sb_ptr = NULL; + + int valid_cast = SWIG_ConvertPtr(data, (void **)&sb_ptr, + SWIGTYPE_p_lldb__SBFileSpec, 0); + + if (valid_cast == -1) + return NULL; + + return sb_ptr; +} + +void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBModule(PyObject *data) { + lldb::SBModule *sb_ptr = NULL; + + int valid_cast = SWIG_ConvertPtr(data, (void **)&sb_ptr, + SWIGTYPE_p_lldb__SBModule, 0); + + if (valid_cast == -1) + return NULL; + + return sb_ptr; +} + +void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBModuleSpec(PyObject *data) { + lldb::SBModuleSpec *sb_ptr = NULL; + + int valid_cast = SWIG_ConvertPtr(data, (void **)&sb_ptr, + SWIGTYPE_p_lldb__SBModuleSpec, 0); + + if (valid_cast == -1) + return NULL; + + return sb_ptr; +} + bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallCommand( const char *python_function_name, const char *session_dictionary_name, lldb::DebuggerSP debugger, const char *args, diff --git a/lldb/include/lldb/API/SBDebugger.h b/lldb/include/lldb/API/SBDebugger.h index 688fc9197965c..006d23ceb9490 100644 --- a/lldb/include/lldb/API/SBDebugger.h +++ b/lldb/include/lldb/API/SBDebugger.h @@ -667,6 +667,26 @@ class LLDB_API SBDebugger { SBTrace LoadTraceFromFile(SBError &error, const SBFileSpec &trace_description_file); + /// Register a scripted symbol locator globally. + /// + /// Scripted symbol locators are consulted for all symbol/source + /// resolution requests across all targets. Multiple locators can be + /// registered; each is called in order until one returns a result. + /// + /// \param[in] class_name + /// The Python class implementing the symbol locator. + /// + /// \param[in] args + /// Optional structured data arguments passed to the locator. + /// + /// \return + /// An SBError indicating success or failure. + lldb::SBError RegisterScriptedSymbolLocator(const char *class_name, + lldb::SBStructuredData &args); + + /// Clear all registered scripted symbol locators. + void ClearScriptedSymbolLocators(); + protected: friend class lldb_private::CommandPluginInterfaceImplementation; friend class lldb_private::python::SWIGBridge; diff --git a/lldb/include/lldb/API/SBFileSpec.h b/lldb/include/lldb/API/SBFileSpec.h index 36641843aabeb..4b0b640dd4dbc 100644 --- a/lldb/include/lldb/API/SBFileSpec.h +++ b/lldb/include/lldb/API/SBFileSpec.h @@ -11,6 +11,10 @@ #include "lldb/API/SBDefines.h" +namespace lldb_private { +class ScriptInterpreter; +} + namespace lldb { class LLDB_API SBFileSpec { @@ -79,6 +83,7 @@ class LLDB_API SBFileSpec { friend class SBThread; friend class SBTrace; friend class SBSaveCoreOptions; + friend class lldb_private::ScriptInterpreter; SBFileSpec(const lldb_private::FileSpec &fspec); diff --git a/lldb/include/lldb/API/SBModule.h b/lldb/include/lldb/API/SBModule.h index 4009ca1461e51..3e8e5b99f6404 100644 --- a/lldb/include/lldb/API/SBModule.h +++ b/lldb/include/lldb/API/SBModule.h @@ -311,6 +311,7 @@ class LLDB_API SBModule { friend class SBType; friend class lldb_private::python::SWIGBridge; + friend class lldb_private::ScriptInterpreter; explicit SBModule(const lldb::ModuleSP &module_sp); diff --git a/lldb/include/lldb/API/SBModuleSpec.h b/lldb/include/lldb/API/SBModuleSpec.h index 0e7f0f3489596..d1252cb8e9c8e 100644 --- a/lldb/include/lldb/API/SBModuleSpec.h +++ b/lldb/include/lldb/API/SBModuleSpec.h @@ -12,6 +12,13 @@ #include "lldb/API/SBDefines.h" #include "lldb/API/SBFileSpec.h" +namespace lldb_private { +class ScriptInterpreter; +namespace python { +class SWIGBridge; +} // namespace python +} // namespace lldb_private + namespace lldb { class LLDB_API SBModuleSpec { @@ -102,6 +109,8 @@ class LLDB_API SBModuleSpec { friend class SBModule; friend class SBPlatform; friend class SBTarget; + friend class lldb_private::ScriptInterpreter; + friend class lldb_private::python::SWIGBridge; SBModuleSpec(const lldb_private::ModuleSpec &module_spec); diff --git a/lldb/include/lldb/Core/PluginManager.h b/lldb/include/lldb/Core/PluginManager.h index 4d116f52460ff..2e3aeed8718d6 100644 --- a/lldb/include/lldb/Core/PluginManager.h +++ b/lldb/include/lldb/Core/PluginManager.h @@ -455,6 +455,7 @@ class PluginManager { SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file = nullptr, SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle = nullptr, + SymbolLocatorLocateSourceFile locate_source_file = nullptr, DebuggerInitializeCallback debugger_init_callback = nullptr); static bool UnregisterPlugin(SymbolLocatorCreateInstance create_callback); @@ -479,6 +480,30 @@ class PluginManager { const UUID *uuid, const ArchSpec *arch); + static FileSpec LocateSourceFile(const lldb::ModuleSP &module_sp, + const FileSpec &original_source_file); + + /// Scripted symbol locator instance management. + /// These manage globally-registered scripted locator instances that are + /// consulted by the SymbolLocatorScripted plugin for all symbol/source + /// resolution requests. + /// @{ + static Status + RegisterScriptedSymbolLocator(Debugger &debugger, llvm::StringRef class_name, + StructuredData::DictionarySP args_sp); + static void ClearScriptedSymbolLocators(); + static size_t GetNumScriptedSymbolLocators(); + static llvm::StringRef GetScriptedSymbolLocatorClassName(size_t index); + + struct ScriptedSymbolLocatorInstance { + lldb::ScriptedSymbolLocatorInterfaceSP interface_sp; + llvm::StringMap<std::optional<FileSpec>> source_file_cache; + std::string class_name; + }; + static std::vector<ScriptedSymbolLocatorInstance> & + GetScriptedSymbolLocatorInstances(); + /// @} + // Trace static bool RegisterPlugin( llvm::StringRef name, llvm::StringRef description, diff --git a/lldb/include/lldb/Interpreter/Interfaces/ScriptedSymbolLocatorInterface.h b/lldb/include/lldb/Interpreter/Interfaces/ScriptedSymbolLocatorInterface.h new file mode 100644 index 0000000000000..b81c73698d918 --- /dev/null +++ b/lldb/include/lldb/Interpreter/Interfaces/ScriptedSymbolLocatorInterface.h @@ -0,0 +1,52 @@ +//===----------------------------------------------------------------------===// +// +// 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_INTERFACES_SCRIPTEDSYMBOLLOCATORINTERFACE_H +#define LLDB_INTERPRETER_INTERFACES_SCRIPTEDSYMBOLLOCATORINTERFACE_H + +#include "lldb/Core/ModuleSpec.h" +#include "lldb/Interpreter/Interfaces/ScriptedInterface.h" +#include "lldb/Utility/Status.h" + +#include "lldb/lldb-private.h" + +#include <optional> +#include <string> + +namespace lldb_private { +class ScriptedSymbolLocatorInterface : virtual public ScriptedInterface { +public: + virtual llvm::Expected<StructuredData::GenericSP> + CreatePluginObject(llvm::StringRef class_name, ExecutionContext &exe_ctx, + StructuredData::DictionarySP args_sp, + StructuredData::Generic *script_obj = nullptr) = 0; + + virtual std::optional<FileSpec> + LocateSourceFile(const lldb::ModuleSP &module_sp, + const FileSpec &original_source_file, Status &error) { + return {}; + } + + virtual std::optional<ModuleSpec> + LocateExecutableObjectFile(const ModuleSpec &module_spec, Status &error) { + return {}; + } + + virtual std::optional<FileSpec> + LocateExecutableSymbolFile(const ModuleSpec &module_spec, Status &error) { + return {}; + } + + virtual bool DownloadObjectAndSymbolFile(ModuleSpec &module_spec, + Status &error) { + return false; + } +}; +} // namespace lldb_private + +#endif // LLDB_INTERPRETER_INTERFACES_SCRIPTEDSYMBOLLOCATORINTERFACE_H diff --git a/lldb/include/lldb/Interpreter/ScriptInterpreter.h b/lldb/include/lldb/Interpreter/ScriptInterpreter.h index 557d73a415452..581b6dcdfab1d 100644 --- a/lldb/include/lldb/Interpreter/ScriptInterpreter.h +++ b/lldb/include/lldb/Interpreter/ScriptInterpreter.h @@ -33,6 +33,7 @@ #include "lldb/Interpreter/Interfaces/ScriptedFrameProviderInterface.h" #include "lldb/Interpreter/Interfaces/ScriptedPlatformInterface.h" #include "lldb/Interpreter/Interfaces/ScriptedProcessInterface.h" +#include "lldb/Interpreter/Interfaces/ScriptedSymbolLocatorInterface.h" #include "lldb/Interpreter/Interfaces/ScriptedThreadInterface.h" #include "lldb/Interpreter/ScriptObject.h" #include "lldb/Symbol/SymbolContext.h" @@ -567,6 +568,11 @@ class ScriptInterpreter : public PluginInterface { return {}; } + virtual lldb::ScriptedSymbolLocatorInterfaceSP + CreateScriptedSymbolLocatorInterface() { + return {}; + } + virtual StructuredData::ObjectSP CreateStructuredDataFromScriptObject(ScriptObject obj) { return {}; @@ -612,6 +618,13 @@ class ScriptInterpreter : public PluginInterface { lldb::ValueObjectSP GetOpaqueTypeFromSBValue(const lldb::SBValue &value) const; + FileSpec GetOpaqueTypeFromSBFileSpec(const lldb::SBFileSpec &file_spec) const; + + lldb::ModuleSP GetOpaqueTypeFromSBModule(const lldb::SBModule &module) const; + + ModuleSpec + GetOpaqueTypeFromSBModuleSpec(const lldb::SBModuleSpec &module_spec) const; + protected: Debugger &m_debugger; lldb::ScriptLanguage m_script_lang; diff --git a/lldb/include/lldb/Symbol/LineEntry.h b/lldb/include/lldb/Symbol/LineEntry.h index adf2e989e3e34..e023eda6d89a4 100644 --- a/lldb/include/lldb/Symbol/LineEntry.h +++ b/lldb/include/lldb/Symbol/LineEntry.h @@ -128,7 +128,7 @@ struct LineEntry { /// /// \param[in] target_sp /// Shared pointer to the target this LineEntry belongs to. - void ApplyFileMappings(lldb::TargetSP target_sp); + void ApplyFileMappings(lldb::TargetSP target_sp, const Address &address); /// Helper to access the file. const FileSpec &GetFile() const { return file_sp->GetSpecOnly(); } diff --git a/lldb/include/lldb/lldb-forward.h b/lldb/include/lldb/lldb-forward.h index ccfe5efa19e1d..c0f65b09616a3 100644 --- a/lldb/include/lldb/lldb-forward.h +++ b/lldb/include/lldb/lldb-forward.h @@ -196,6 +196,7 @@ class ScriptedProcessInterface; class ScriptedStopHookInterface; class ScriptedThreadInterface; class ScriptedThreadPlanInterface; +class ScriptedSymbolLocatorInterface; class ScriptedSyntheticChildren; class SearchFilter; class Section; @@ -431,6 +432,8 @@ typedef std::shared_ptr<lldb_private::ScriptedThreadPlanInterface> ScriptedThreadPlanInterfaceSP; typedef std::shared_ptr<lldb_private::ScriptedBreakpointInterface> ScriptedBreakpointInterfaceSP; +typedef std::shared_ptr<lldb_private::ScriptedSymbolLocatorInterface> + ScriptedSymbolLocatorInterfaceSP; typedef std::shared_ptr<lldb_private::Section> SectionSP; typedef std::unique_ptr<lldb_private::SectionList> SectionListUP; typedef std::weak_ptr<lldb_private::Section> SectionWP; diff --git a/lldb/include/lldb/lldb-private-interfaces.h b/lldb/include/lldb/lldb-private-interfaces.h index a87e01769c555..6d71b8d671b71 100644 --- a/lldb/include/lldb/lldb-private-interfaces.h +++ b/lldb/include/lldb/lldb-private-interfaces.h @@ -110,6 +110,8 @@ typedef std::optional<FileSpec> (*SymbolLocatorLocateExecutableSymbolFile)( typedef bool (*SymbolLocatorDownloadObjectAndSymbolFile)( ModuleSpec &module_spec, Status &error, bool force_lookup, bool copy_executable); +typedef std::optional<FileSpec> (*SymbolLocatorLocateSourceFile)( + const lldb::ModuleSP &module_sp, const FileSpec &original_source_file); using BreakpointHitCallback = std::function<bool(void *baton, StoppointCallbackContext *context, lldb::user_id_t break_id, lldb::user_id_t break_loc_id)>; diff --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp index e97fdd0e352f2..6b86eefd4dbf5 100644 --- a/lldb/source/API/SBDebugger.cpp +++ b/lldb/source/API/SBDebugger.cpp @@ -1684,6 +1684,35 @@ SBDebugger::LoadTraceFromFile(SBError &error, return SBTrace::LoadTraceFromFile(error, *this, trace_description_file); } +lldb::SBError +SBDebugger::RegisterScriptedSymbolLocator(const char *class_name, + lldb::SBStructuredData &args) { + LLDB_INSTRUMENT_VA(this, class_name, args); + + lldb::SBError sb_error; + if (!m_opaque_sp) { + sb_error.SetErrorString("invalid debugger"); + return sb_error; + } + + StructuredData::DictionarySP args_sp; + StructuredData::ObjectSP obj_sp = args.m_impl_up->GetObjectSP(); + if (obj_sp && obj_sp->GetType() == lldb::eStructuredDataTypeDictionary) + args_sp = std::static_pointer_cast<StructuredData::Dictionary>(obj_sp); + + Status error = PluginManager::RegisterScriptedSymbolLocator( + *m_opaque_sp, class_name, args_sp); + if (error.Fail()) + sb_error.SetErrorString(error.AsCString()); + return sb_error; +} + +void SBDebugger::ClearScriptedSymbolLocators() { + LLDB_INSTRUMENT_VA(this); + + PluginManager::ClearScriptedSymbolLocators(); +} + void SBDebugger::RequestInterrupt() { LLDB_INSTRUMENT_VA(this); diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index 59ccf390dea31..8592b85e1025f 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -4691,6 +4691,134 @@ class CommandObjectTargetSymbolsAdd : public CommandObjectParsed { OptionGroupBoolean m_current_stack_option; }; +#pragma mark CommandObjectTargetSymbolsScriptedRegister + +class CommandObjectTargetSymbolsScriptedRegister : public CommandObjectParsed { +public: + CommandObjectTargetSymbolsScriptedRegister(CommandInterpreter &interpreter) + : CommandObjectParsed( + interpreter, "target symbols scripted register", + "Register a scripted symbol locator globally.", + "target symbols scripted register -C <script-class> " + "[-k <key> -v <value> ...]"), + m_python_class_options("scripted symbol locator", true, 'C', 'k', 'v', + OptionGroupPythonClassWithDict::eScriptClass) { + m_all_options.Append(&m_python_class_options, + LLDB_OPT_SET_1 | LLDB_OPT_SET_2, LLDB_OPT_SET_1); + m_all_options.Finalize(); + } + + ~CommandObjectTargetSymbolsScriptedRegister() override = default; + + Options *GetOptions() override { return &m_all_options; } + +protected: + void DoExecute(Args &command, CommandReturnObject &result) override { + llvm::StringRef class_name = m_python_class_options.GetName(); + if (class_name.empty()) { + result.AppendError("must specify a script class with -C"); + return; + } + + StructuredData::DictionarySP args_sp; + StructuredData::ObjectSP extra = m_python_class_options.GetStructuredData(); + if (extra && extra->GetType() == lldb::eStructuredDataTypeDictionary) + args_sp = std::static_pointer_cast<StructuredData::Dictionary>(extra); + + Debugger &debugger = GetDebugger(); + Status error = PluginManager::RegisterScriptedSymbolLocator( + debugger, class_name, args_sp); + if (error.Fail()) { + result.AppendErrorWithFormat( + "failed to register scripted symbol locator: %s\n", + error.AsCString()); + return; + } + + result.AppendMessageWithFormat("Registered scripted symbol locator '%s'.\n", + class_name.str().c_str()); + result.SetStatus(eReturnStatusSuccessFinishResult); + } + + OptionGroupPythonClassWithDict m_python_class_options; + OptionGroupOptions m_all_options; +}; + +#pragma mark CommandObjectTargetSymbolsScriptedClear + +class CommandObjectTargetSymbolsScriptedClear : public CommandObjectParsed { +public: + CommandObjectTargetSymbolsScriptedClear(CommandInterpreter &interpreter) + : CommandObjectParsed(interpreter, "target symbols scripted clear", + "Clear all scripted symbol locators.", + "target symbols scripted clear") {} + + ~CommandObjectTargetSymbolsScriptedClear() override = default; + +protected: + void DoExecute(Args &command, CommandReturnObject &result) override { + PluginManager::ClearScriptedSymbolLocators(); + result.AppendMessageWithFormat("Cleared all scripted symbol locators.\n"); + result.SetStatus(eReturnStatusSuccessFinishResult); + } +}; + +#pragma mark CommandObjectTargetSymbolsScriptedInfo + +class CommandObjectTargetSymbolsScriptedInfo : public CommandObjectParsed { +public: + CommandObjectTargetSymbolsScriptedInfo(CommandInterpreter &interpreter) + : CommandObjectParsed(interpreter, "target symbols scripted info", + "List all registered scripted symbol locators.", + "target symbols scripted info") {} + + ~CommandObjectTargetSymbolsScriptedInfo() override = default; + +protected: + void DoExecute(Args &command, CommandReturnObject &result) override { + size_t num = PluginManager::GetNumScriptedSymbolLocators(); + if (num == 0) { + result.AppendMessageWithFormat( + "No scripted symbol locators registered.\n"); + result.SetStatus(eReturnStatusSuccessFinishResult); + return; + } + + result.AppendMessageWithFormat( + "%zu scripted symbol locator(s) registered:\n", num); + for (size_t i = 0; i < num; i++) { + result.AppendMessageWithFormat( + " [%zu] %s\n", i, + PluginManager::GetScriptedSymbolLocatorClassName(i).str().c_str()); + } + result.SetStatus(eReturnStatusSuccessFinishResult); + } +}; + +#pragma mark CommandObjectTargetSymbolsScripted + +class CommandObjectTargetSymbolsScripted : public CommandObjectMultiword { +public: + CommandObjectTargetSymbolsScripted(CommandInterpreter &interpreter) + : CommandObjectMultiword( + interpreter, "target symbols scripted", + "Commands for managing scripted symbol locators.", + "target symbols scripted <sub-command> ...") { + LoadSubCommand( + "register", + CommandObjectSP( + new CommandObjectTargetSymbolsScriptedRegister(interpreter))); + LoadSubCommand( + "clear", CommandObjectSP( + new CommandObjectTargetSymbolsScriptedClear(interpreter))); + LoadSubCommand( + "info", CommandObjectSP( + new CommandObjectTargetSymbolsScriptedInfo(interpreter))); + } + + ~CommandObjectTargetSymbolsScripted() override = default; +}; + #pragma mark CommandObjectTargetSymbols // CommandObjectTargetSymbols @@ -4705,6 +4833,9 @@ class CommandObjectTargetSymbols : public CommandObjectMultiword { "target symbols <sub-command> ...") { LoadSubCommand( "add", CommandObjectSP(new... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/183677 _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
