Author: Felipe de Azevedo Piovezan Date: 2025-01-16T15:05:46-08:00 New Revision: cb82771c96d7055d89ca67f383e6fb3c9aced178
URL: https://github.com/llvm/llvm-project/commit/cb82771c96d7055d89ca67f383e6fb3c9aced178 DIFF: https://github.com/llvm/llvm-project/commit/cb82771c96d7055d89ca67f383e6fb3c9aced178.diff LOG: [lldb] Add OS plugin property for reporting all threads (#123145) Currently, an LLDB target option controls whether plugins report all threads. However, it seems natural for this knowledge could come from the plugin itself. To support this, this commits adds a virtual method to the plugin base class, making the Python OS query the target option to preserve existing behavior. Added: Modified: lldb/include/lldb/Interpreter/Interfaces/OperatingSystemInterface.h lldb/include/lldb/Target/OperatingSystem.h lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.h lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h lldb/source/Target/Process.cpp lldb/source/Target/TargetProperties.td lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/TestOSPluginStepping.py lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/operating_system.py Removed: ################################################################################ diff --git a/lldb/include/lldb/Interpreter/Interfaces/OperatingSystemInterface.h b/lldb/include/lldb/Interpreter/Interfaces/OperatingSystemInterface.h index 3c46f99f3b356f..58aab7ec914dd3 100644 --- a/lldb/include/lldb/Interpreter/Interfaces/OperatingSystemInterface.h +++ b/lldb/include/lldb/Interpreter/Interfaces/OperatingSystemInterface.h @@ -27,6 +27,8 @@ class OperatingSystemInterface : virtual public ScriptedThreadInterface { virtual std::optional<std::string> GetRegisterContextForTID(lldb::tid_t tid) { return std::nullopt; } + + virtual std::optional<bool> DoesPluginReportAllThreads() { return {}; } }; } // namespace lldb_private diff --git a/lldb/include/lldb/Target/OperatingSystem.h b/lldb/include/lldb/Target/OperatingSystem.h index ceeddceb0f2c12..128239569790fc 100644 --- a/lldb/include/lldb/Target/OperatingSystem.h +++ b/lldb/include/lldb/Target/OperatingSystem.h @@ -61,6 +61,8 @@ class OperatingSystem : public PluginInterface { virtual bool IsOperatingSystemPluginThread(const lldb::ThreadSP &thread_sp); + virtual bool DoesPluginReportAllThreads() = 0; + protected: // Member variables. Process diff --git a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp index 3848a2b1deb97f..aff521890858c3 100644 --- a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp +++ b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp @@ -386,4 +386,12 @@ lldb::ThreadSP OperatingSystemPython::CreateThread(lldb::tid_t tid, return ThreadSP(); } +bool OperatingSystemPython::DoesPluginReportAllThreads() { + // If the python plugin has a "DoesPluginReportAllThreads" method, use it. + if (std::optional<bool> plugin_answer = + m_operating_system_interface_sp->DoesPluginReportAllThreads()) + return *plugin_answer; + return m_process->GetOSPluginReportsAllThreads(); +} + #endif // #if LLDB_ENABLE_PYTHON diff --git a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.h b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.h index 90973acde3ebfd..980a544241de4f 100644 --- a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.h +++ b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.h @@ -60,6 +60,8 @@ class OperatingSystemPython : public lldb_private::OperatingSystem { // Method for lazy creation of threads on demand lldb::ThreadSP CreateThread(lldb::tid_t tid, lldb::addr_t context) override; + bool DoesPluginReportAllThreads() override; + protected: bool IsValid() const { return m_script_object_sp && m_script_object_sp->IsValid(); diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.cpp index c3379e774a0b81..d8b2ea984fd88e 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.cpp @@ -82,6 +82,16 @@ OperatingSystemPythonInterface::GetRegisterContextForTID(lldb::tid_t tid) { return obj->GetAsString()->GetValue().str(); } +std::optional<bool> OperatingSystemPythonInterface::DoesPluginReportAllThreads() { + Status error; + StructuredData::ObjectSP obj = Dispatch("does_plugin_report_all_threads", error); + if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, + error)) + return {}; + + return obj->GetAsBoolean()->GetValue(); +} + void OperatingSystemPythonInterface::Initialize() { const std::vector<llvm::StringRef> ci_usages = { "settings set target.process.python-os-plugin-path <script-path>", diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h index 102c3c39537686..8df48f1b64cc91 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h @@ -45,6 +45,8 @@ class OperatingSystemPythonInterface std::optional<std::string> GetRegisterContextForTID(lldb::tid_t tid) override; + std::optional<bool> DoesPluginReportAllThreads() override; + static void Initialize(); static void Terminate(); diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 68485a40a3fcce..c47e728fdf716c 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -1182,7 +1182,7 @@ void Process::UpdateThreadListIfNeeded() { // See if the OS plugin reports all threads. If it does, then // it is safe to clear unseen thread's plans here. Otherwise we // should preserve them in case they show up again: - clear_unused_threads = GetOSPluginReportsAllThreads(); + clear_unused_threads = os->DoesPluginReportAllThreads(); // Turn off dynamic types to ensure we don't run any expressions. // Objective-C can run an expression to determine if a SBValue is a diff --git a/lldb/source/Target/TargetProperties.td b/lldb/source/Target/TargetProperties.td index bb3b500d5fdfbd..38a345dfd88495 100644 --- a/lldb/source/Target/TargetProperties.td +++ b/lldb/source/Target/TargetProperties.td @@ -223,7 +223,7 @@ let Definition = "process_experimental" in { def OSPluginReportsAllThreads: Property<"os-plugin-reports-all-threads", "Boolean">, Global, DefaultTrue, - Desc<"Set to False if your OS Plugins doesn't report all threads on each stop.">; + Desc<"Set to False if your Python OS Plugin doesn't report all threads on each stop.">; } let Definition = "process" in { diff --git a/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/TestOSPluginStepping.py b/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/TestOSPluginStepping.py index 47d6f5d68bbe69..0d06a9da6535c1 100644 --- a/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/TestOSPluginStepping.py +++ b/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/TestOSPluginStepping.py @@ -40,11 +40,6 @@ def is_os_thread(self, thread): def run_python_os_step_missing_thread(self, do_prune): """Test that the Python operating system plugin works correctly""" - # Our OS plugin does NOT report all threads: - result = self.dbg.HandleCommand( - "settings set process.experimental.os-plugin-reports-all-threads false" - ) - python_os_plugin_path = os.path.join(self.getSourceDir(), "operating_system.py") (target, self.process, thread, thread_bkpt) = lldbutil.run_to_source_breakpoint( self, "first stop in thread - do a step out", self.main_file diff --git a/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/operating_system.py b/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/operating_system.py index eb02ff534f210f..855cdbaf7cdc8a 100644 --- a/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/operating_system.py +++ b/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/operating_system.py @@ -34,6 +34,9 @@ def __init__(self, process): if not self.g_value.IsValid(): print("Could not find g_value") + def does_plugin_report_all_threads(self): + return False + def create_thread(self, tid, context): print("Called create thread with tid: ", tid) return None _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits