Author: Dmitry Vasilyev
Date: 2025-04-08T22:24:59+04:00
New Revision: 7e70d708a39470397a8df9aa5842d0875b471def

URL: 
https://github.com/llvm/llvm-project/commit/7e70d708a39470397a8df9aa5842d0875b471def
DIFF: 
https://github.com/llvm/llvm-project/commit/7e70d708a39470397a8df9aa5842d0875b471def.diff

LOG: [LLDB][NFC] Remove Debugger dependency in SystemLifetimeManager (#134383)

It reduces the memory usage in lldb-server.

Added: 
    

Modified: 
    lldb/include/lldb/API/SBDebugger.h
    lldb/include/lldb/Initialization/SystemLifetimeManager.h
    lldb/source/API/SBDebugger.cpp
    lldb/source/API/SystemInitializerFull.cpp
    lldb/source/Initialization/SystemLifetimeManager.cpp
    lldb/tools/lldb-server/lldb-server.cpp
    lldb/tools/lldb-test/SystemInitializerTest.cpp
    lldb/tools/lldb-test/lldb-test.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/include/lldb/API/SBDebugger.h 
b/lldb/include/lldb/API/SBDebugger.h
index e0819f1684f8b..3ece2a2e3a9f2 100644
--- a/lldb/include/lldb/API/SBDebugger.h
+++ b/lldb/include/lldb/API/SBDebugger.h
@@ -16,6 +16,7 @@
 
 namespace lldb_private {
 class CommandPluginInterfaceImplementation;
+class SystemInitializerFull;
 namespace python {
 class SWIGBridge;
 }
@@ -508,6 +509,7 @@ class LLDB_API SBDebugger {
 protected:
   friend class lldb_private::CommandPluginInterfaceImplementation;
   friend class lldb_private::python::SWIGBridge;
+  friend class lldb_private::SystemInitializerFull;
 
   SBDebugger(const lldb::DebuggerSP &debugger_sp);
 

diff  --git a/lldb/include/lldb/Initialization/SystemLifetimeManager.h 
b/lldb/include/lldb/Initialization/SystemLifetimeManager.h
index 06328e60133fe..1b891010f5d8d 100644
--- a/lldb/include/lldb/Initialization/SystemLifetimeManager.h
+++ b/lldb/include/lldb/Initialization/SystemLifetimeManager.h
@@ -23,8 +23,7 @@ class SystemLifetimeManager {
   SystemLifetimeManager();
   ~SystemLifetimeManager();
 
-  llvm::Error Initialize(std::unique_ptr<SystemInitializer> initializer,
-                         LoadPluginCallbackType plugin_callback);
+  llvm::Error Initialize(std::unique_ptr<SystemInitializer> initializer);
   void Terminate();
 
 private:

diff  --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp
index e646b09e05852..2cfcdc78c8111 100644
--- a/lldb/source/API/SBDebugger.cpp
+++ b/lldb/source/API/SBDebugger.cpp
@@ -179,48 +179,9 @@ void SBDebugger::Initialize() {
 lldb::SBError SBDebugger::InitializeWithErrorHandling() {
   LLDB_INSTRUMENT();
 
-  auto LoadPlugin = [](const lldb::DebuggerSP &debugger_sp,
-                       const FileSpec &spec,
-                       Status &error) -> llvm::sys::DynamicLibrary {
-    llvm::sys::DynamicLibrary dynlib =
-        llvm::sys::DynamicLibrary::getPermanentLibrary(spec.GetPath().c_str());
-    if (dynlib.isValid()) {
-      typedef bool (*LLDBCommandPluginInit)(lldb::SBDebugger debugger);
-
-      lldb::SBDebugger debugger_sb(debugger_sp);
-      // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger)
-      // function.
-      // TODO: mangle this 
diff erently for your system - on OSX, the first
-      // underscore needs to be removed and the second one stays
-      LLDBCommandPluginInit init_func =
-          (LLDBCommandPluginInit)(uintptr_t)dynlib.getAddressOfSymbol(
-              "_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
-      if (init_func) {
-        if (init_func(debugger_sb))
-          return dynlib;
-        else
-          error = Status::FromErrorString(
-              "plug-in refused to load "
-              "(lldb::PluginInitialize(lldb::SBDebugger) "
-              "returned false)");
-      } else {
-        error = Status::FromErrorString(
-            "plug-in is missing the required initialization: "
-            "lldb::PluginInitialize(lldb::SBDebugger)");
-      }
-    } else {
-      if (FileSystem::Instance().Exists(spec))
-        error = Status::FromErrorString(
-            "this file does not represent a loadable dylib");
-      else
-        error = Status::FromErrorString("no such file");
-    }
-    return llvm::sys::DynamicLibrary();
-  };
-
   SBError error;
   if (auto e = g_debugger_lifetime->Initialize(
-          std::make_unique<SystemInitializerFull>(), LoadPlugin)) {
+          std::make_unique<SystemInitializerFull>())) {
     error.SetError(Status::FromError(std::move(e)));
   }
   return error;

diff  --git a/lldb/source/API/SystemInitializerFull.cpp 
b/lldb/source/API/SystemInitializerFull.cpp
index 9cc3779d1895f..4cf7dd149e023 100644
--- a/lldb/source/API/SystemInitializerFull.cpp
+++ b/lldb/source/API/SystemInitializerFull.cpp
@@ -8,6 +8,7 @@
 
 #include "SystemInitializerFull.h"
 #include "lldb/API/SBCommandInterpreter.h"
+#include "lldb/API/SBDebugger.h"
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/Progress.h"
@@ -86,10 +87,53 @@ llvm::Error SystemInitializerFull::Initialize() {
 
   LLDB_LOG(GetLog(SystemLog::System), "{0}", GetVersion());
 
+  auto LoadPlugin = [](const lldb::DebuggerSP &debugger_sp,
+                       const FileSpec &spec,
+                       Status &error) -> llvm::sys::DynamicLibrary {
+    llvm::sys::DynamicLibrary dynlib =
+        llvm::sys::DynamicLibrary::getPermanentLibrary(spec.GetPath().c_str());
+    if (dynlib.isValid()) {
+      typedef bool (*LLDBCommandPluginInit)(lldb::SBDebugger debugger);
+
+      lldb::SBDebugger debugger_sb(debugger_sp);
+      // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger)
+      // function.
+      // TODO: mangle this 
diff erently for your system - on OSX, the first
+      // underscore needs to be removed and the second one stays
+      LLDBCommandPluginInit init_func =
+          (LLDBCommandPluginInit)(uintptr_t)dynlib.getAddressOfSymbol(
+              "_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
+      if (init_func) {
+        if (init_func(debugger_sb))
+          return dynlib;
+        else
+          error = Status::FromErrorString(
+              "plug-in refused to load "
+              "(lldb::PluginInitialize(lldb::SBDebugger) "
+              "returned false)");
+      } else {
+        error = Status::FromErrorString(
+            "plug-in is missing the required initialization: "
+            "lldb::PluginInitialize(lldb::SBDebugger)");
+      }
+    } else {
+      if (FileSystem::Instance().Exists(spec))
+        error = Status::FromErrorString(
+            "this file does not represent a loadable dylib");
+      else
+        error = Status::FromErrorString("no such file");
+    }
+    return llvm::sys::DynamicLibrary();
+  };
+
+  Debugger::Initialize(LoadPlugin);
+
   return llvm::Error::success();
 }
 
 void SystemInitializerFull::Terminate() {
+  Debugger::Terminate();
+
   Debugger::SettingsTerminate();
 
   // Terminate plug-ins in core LLDB.

diff  --git a/lldb/source/Initialization/SystemLifetimeManager.cpp 
b/lldb/source/Initialization/SystemLifetimeManager.cpp
index f9de41a675356..43ceecce0cdb5 100644
--- a/lldb/source/Initialization/SystemLifetimeManager.cpp
+++ b/lldb/source/Initialization/SystemLifetimeManager.cpp
@@ -8,7 +8,6 @@
 
 #include "lldb/Initialization/SystemLifetimeManager.h"
 
-#include "lldb/Core/Debugger.h"
 #include "lldb/Initialization/SystemInitializer.h"
 
 #include <utility>
@@ -23,8 +22,7 @@ SystemLifetimeManager::~SystemLifetimeManager() {
 }
 
 llvm::Error SystemLifetimeManager::Initialize(
-    std::unique_ptr<SystemInitializer> initializer,
-    LoadPluginCallbackType plugin_callback) {
+    std::unique_ptr<SystemInitializer> initializer) {
   std::lock_guard<std::recursive_mutex> guard(m_mutex);
   if (!m_initialized) {
     assert(!m_initializer && "Attempting to call "
@@ -35,8 +33,6 @@ llvm::Error SystemLifetimeManager::Initialize(
 
     if (auto e = m_initializer->Initialize())
       return e;
-
-    Debugger::Initialize(plugin_callback);
   }
 
   return llvm::Error::success();
@@ -46,7 +42,6 @@ void SystemLifetimeManager::Terminate() {
   std::lock_guard<std::recursive_mutex> guard(m_mutex);
 
   if (m_initialized) {
-    Debugger::Terminate();
     m_initializer->Terminate();
 
     m_initializer.reset();

diff  --git a/lldb/tools/lldb-server/lldb-server.cpp 
b/lldb/tools/lldb-server/lldb-server.cpp
index e2e6bfcd8645c..744f8ceb854fb 100644
--- a/lldb/tools/lldb-server/lldb-server.cpp
+++ b/lldb/tools/lldb-server/lldb-server.cpp
@@ -41,7 +41,7 @@ int main_platform(int argc, char *argv[]);
 namespace llgs {
 static void initialize() {
   if (auto e = g_debugger_lifetime->Initialize(
-          std::make_unique<SystemInitializerLLGS>(), nullptr))
+          std::make_unique<SystemInitializerLLGS>()))
     llvm::consumeError(std::move(e));
 }
 

diff  --git a/lldb/tools/lldb-test/SystemInitializerTest.cpp 
b/lldb/tools/lldb-test/SystemInitializerTest.cpp
index 2b6e0f26bb491..3478e5d8df994 100644
--- a/lldb/tools/lldb-test/SystemInitializerTest.cpp
+++ b/lldb/tools/lldb-test/SystemInitializerTest.cpp
@@ -51,10 +51,14 @@ llvm::Error SystemInitializerTest::Initialize() {
   // Settings must be initialized AFTER PluginManager::Initialize is called.
   Debugger::SettingsInitialize();
 
+  Debugger::Initialize(nullptr);
+
   return llvm::Error::success();
 }
 
 void SystemInitializerTest::Terminate() {
+  Debugger::Terminate();
+
   Debugger::SettingsTerminate();
 
   // Terminate and unload and loaded system or user LLDB plug-ins

diff  --git a/lldb/tools/lldb-test/lldb-test.cpp 
b/lldb/tools/lldb-test/lldb-test.cpp
index 1960240dc4151..6743ce543dc66 100644
--- a/lldb/tools/lldb-test/lldb-test.cpp
+++ b/lldb/tools/lldb-test/lldb-test.cpp
@@ -1247,7 +1247,7 @@ int main(int argc, const char *argv[]) {
 
   SystemLifetimeManager DebuggerLifetime;
   if (auto e = DebuggerLifetime.Initialize(
-          std::make_unique<SystemInitializerTest>(), nullptr)) {
+          std::make_unique<SystemInitializerTest>())) {
     WithColor::error() << "initialization failed: " << toString(std::move(e))
                        << '\n';
     return 1;


        
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to