[Lldb-commits] [lldb] [LLDB][Accelerators][1/M] Scaffold a basic Mock plugin for testing accelerator flows (PR #186535)
Walter Erquinigo via lldb-commits
lldb-commits at lists.llvm.org
Fri Mar 13 17:07:30 PDT 2026
https://github.com/walter-erquinigo updated https://github.com/llvm/llvm-project/pull/186535
>From 09f1b6e83b0bd82a66b2c4cfae4ed52db747d10f Mon Sep 17 00:00:00 2001
From: Walter Erquinigo <werquinigo at nvidia.com>
Date: Fri, 13 Mar 2026 08:16:56 -0700
Subject: [PATCH] wip
---
lldb/source/Plugins/Process/scripted/Python | 0
lldb/test/API/accelerator/mock/Makefile | 4 ++
.../mock/TestMockAcceleratorPlugin.py | 69 +++++++++++++++++++
lldb/test/API/accelerator/mock/lit.local.cfg | 3 +
lldb/test/API/accelerator/mock/main.c | 1 +
lldb/tools/lldb-server/CMakeLists.txt | 7 ++
.../lldb-server/LLDBServerPluginRegistry.cpp | 50 ++++++++++++++
.../lldb-server/LLDBServerPluginRegistry.h | 53 ++++++++++++++
.../Plugins/Accelerator/CMakeLists.txt | 1 +
.../LLDBServerPluginAccelerator.cpp | 15 ++++
.../Accelerator/LLDBServerPluginAccelerator.h | 54 +++++++++++++++
.../Plugins/Accelerator/Mock/CMakeLists.txt | 11 +++
.../Mock/LLDBServerPluginMockAccelerator.cpp | 36 ++++++++++
.../Mock/LLDBServerPluginMockAccelerator.h | 38 ++++++++++
lldb/tools/lldb-server/Plugins/CMakeLists.txt | 1 +
lldb/tools/lldb-server/lldb-gdbserver.cpp | 12 ++++
16 files changed, 355 insertions(+)
create mode 100644 lldb/source/Plugins/Process/scripted/Python
create mode 100644 lldb/test/API/accelerator/mock/Makefile
create mode 100644 lldb/test/API/accelerator/mock/TestMockAcceleratorPlugin.py
create mode 100644 lldb/test/API/accelerator/mock/lit.local.cfg
create mode 100644 lldb/test/API/accelerator/mock/main.c
create mode 100644 lldb/tools/lldb-server/LLDBServerPluginRegistry.cpp
create mode 100644 lldb/tools/lldb-server/LLDBServerPluginRegistry.h
create mode 100644 lldb/tools/lldb-server/Plugins/Accelerator/CMakeLists.txt
create mode 100644 lldb/tools/lldb-server/Plugins/Accelerator/LLDBServerPluginAccelerator.cpp
create mode 100644 lldb/tools/lldb-server/Plugins/Accelerator/LLDBServerPluginAccelerator.h
create mode 100644 lldb/tools/lldb-server/Plugins/Accelerator/Mock/CMakeLists.txt
create mode 100644 lldb/tools/lldb-server/Plugins/Accelerator/Mock/LLDBServerPluginMockAccelerator.cpp
create mode 100644 lldb/tools/lldb-server/Plugins/Accelerator/Mock/LLDBServerPluginMockAccelerator.h
create mode 100644 lldb/tools/lldb-server/Plugins/CMakeLists.txt
diff --git a/lldb/source/Plugins/Process/scripted/Python b/lldb/source/Plugins/Process/scripted/Python
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/lldb/test/API/accelerator/mock/Makefile b/lldb/test/API/accelerator/mock/Makefile
new file mode 100644
index 0000000000000..692ba17322859
--- /dev/null
+++ b/lldb/test/API/accelerator/mock/Makefile
@@ -0,0 +1,4 @@
+C_SOURCES := main.c
+
+include Makefile.rules
+
diff --git a/lldb/test/API/accelerator/mock/TestMockAcceleratorPlugin.py b/lldb/test/API/accelerator/mock/TestMockAcceleratorPlugin.py
new file mode 100644
index 0000000000000..24ddec119c483
--- /dev/null
+++ b/lldb/test/API/accelerator/mock/TestMockAcceleratorPlugin.py
@@ -0,0 +1,69 @@
+"""
+Tests for the lldb-server Mock Accelerator Plugin.
+"""
+
+import os
+
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+"""This will go away once the mock plugin starts creating a target."""
+_PLUGIN_OUTPUT_PATH = "/tmp/accelerator_plugin_test.txt"
+
+
+class MockAcceleratorPluginTestCase(TestBase):
+ NO_DEBUG_INFO_TESTCASE = True
+
+ def clean_expected_output_file(self):
+ try:
+ os.remove(_PLUGIN_OUTPUT_PATH)
+ except OSError:
+ pass
+
+ def tearDown(self):
+ super().tearDown()
+ self.clean_expected_output_file()
+
+ @add_test_categories(["llgs"])
+ def test_mock_accelerator_plugin_writes_pid(self):
+ """
+ When LLDB_SERVER_ENABLE_MOCK_ACCELERATOR_PLUGIN is set, the mock accelerator
+ plugin must create /tmp/accelerator_plugin_test.txt containing a valid PID.
+ """
+ self.build()
+
+ # Remove any stale file left by a previous run.
+ self.clean_expected_output_file()
+
+ # Launch the target and let it run to completion.
+ exe = self.getBuildArtifact("a.out")
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target.IsValid())
+
+ process = target.LaunchSimple(None, None, self.get_process_working_directory())
+ self.assertEqual(
+ process.GetState(),
+ lldb.eStateExited,
+ "Process should have exited cleanly",
+ )
+
+ # After the process exits, verify the plugin output file.
+ self.assertTrue(
+ os.path.exists(_PLUGIN_OUTPUT_PATH),
+ "Mock accelerator plugin did not create %s" % _PLUGIN_OUTPUT_PATH,
+ )
+ with open(_PLUGIN_OUTPUT_PATH) as f:
+ content = f.read().strip()
+ self.assertTrue(
+ content.isdigit(),
+ "Plugin output file should contain an integer PID, got: %r" % content,
+ )
+
+ pid = int(content)
+ self.assertGreater(
+ pid,
+ 0,
+ "PID in plugin output file should be a valid positive integer",
+ )
diff --git a/lldb/test/API/accelerator/mock/lit.local.cfg b/lldb/test/API/accelerator/mock/lit.local.cfg
new file mode 100644
index 0000000000000..c7668b99327ea
--- /dev/null
+++ b/lldb/test/API/accelerator/mock/lit.local.cfg
@@ -0,0 +1,3 @@
+# Enable the mock accelerator plugin in lldb-server for all tests in this
+# directory. The plugin activates when this variable is present and non-empty.
+config.environment["LLDB_SERVER_ENABLE_MOCK_ACCELERATOR_PLUGIN"] = "1"
diff --git a/lldb/test/API/accelerator/mock/main.c b/lldb/test/API/accelerator/mock/main.c
new file mode 100644
index 0000000000000..78f2de106c92b
--- /dev/null
+++ b/lldb/test/API/accelerator/mock/main.c
@@ -0,0 +1 @@
+int main(void) { return 0; }
diff --git a/lldb/tools/lldb-server/CMakeLists.txt b/lldb/tools/lldb-server/CMakeLists.txt
index fb55c64936121..6d22efca75b3c 100644
--- a/lldb/tools/lldb-server/CMakeLists.txt
+++ b/lldb/tools/lldb-server/CMakeLists.txt
@@ -46,12 +46,17 @@ if(APPLE_EMBEDDED)
endif()
endif()
+add_subdirectory(Plugins)
+
+set(LLDB_SERVER_PLUGINS lldbServerPluginMockAccelerator)
+
add_lldb_tool(lldb-server
lldb-gdbserver.cpp
lldb-platform.cpp
lldb-server.cpp
LLDBServerUtilities.cpp
SystemInitializerLLGS.cpp
+ LLDBServerPluginRegistry.cpp
LINK_COMPONENTS
Option
@@ -61,6 +66,7 @@ add_lldb_tool(lldb-server
lldbInitialization
lldbVersion
${LLDB_PLUGINS}
+ ${LLDB_SERVER_PLUGINS}
lldbPluginInstructionARM
lldbPluginInstructionLoongArch
lldbPluginInstructionMIPS
@@ -75,4 +81,5 @@ add_dependencies(lldb-server
${tablegen_deps}
)
target_include_directories(lldb-server PRIVATE "${LLDB_SOURCE_DIR}/source")
+target_include_directories(lldb-server PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
target_link_libraries(lldb-server PRIVATE ${LLDB_SYSTEM_LIBS})
diff --git a/lldb/tools/lldb-server/LLDBServerPluginRegistry.cpp b/lldb/tools/lldb-server/LLDBServerPluginRegistry.cpp
new file mode 100644
index 0000000000000..abcabe0a35517
--- /dev/null
+++ b/lldb/tools/lldb-server/LLDBServerPluginRegistry.cpp
@@ -0,0 +1,50 @@
+//===----------------------------------------------------------------------===//
+//
+// 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 "LLDBServerPluginRegistry.h"
+#include "Plugins/Accelerator/Mock/LLDBServerPluginMockAccelerator.h"
+#include "llvm/Support/Threading.h"
+
+using namespace lldb_private::lldb_server;
+
+LLDBServerPluginRegistry &LLDBServerPluginRegistry::Instance() {
+ static LLDBServerPluginRegistry registry;
+ static llvm::once_flag once;
+
+ llvm::call_once(once, []() { registry.Initialize(); });
+
+ return registry;
+}
+
+void LLDBServerPluginRegistry::Initialize() {
+ // Register all known accelerator plugins
+ Register(PluginKind::Accelerator,
+ [](LLDBServerPluginAccelerator::GDBServer &gdb_server,
+ lldb_private::MainLoop &main_loop)
+ -> std::unique_ptr<LLDBServerPluginAccelerator> {
+ return std::make_unique<LLDBServerPluginMockAccelerator>(gdb_server,
+ main_loop);
+ });
+}
+
+void LLDBServerPluginRegistry::Register(PluginKind kind,
+ AcceleratorFactory factory) {
+ m_accelerator_factories.push_back(std::move(factory));
+}
+
+std::vector<std::unique_ptr<LLDBServerPluginAccelerator>>
+LLDBServerPluginRegistry::TryInstantiateAllAcceleratorPlugins(
+ LLDBServerPluginAccelerator::GDBServer &gdb_server, MainLoop &main_loop) {
+ std::vector<std::unique_ptr<LLDBServerPluginAccelerator>> activated;
+ for (const AcceleratorFactory &factory : m_accelerator_factories) {
+ std::unique_ptr<LLDBServerPluginAccelerator> plugin = factory(gdb_server, main_loop);
+ if (plugin && plugin->TryActivate())
+ activated.push_back(std::move(plugin));
+ }
+ return activated;
+}
diff --git a/lldb/tools/lldb-server/LLDBServerPluginRegistry.h b/lldb/tools/lldb-server/LLDBServerPluginRegistry.h
new file mode 100644
index 0000000000000..7541322347d53
--- /dev/null
+++ b/lldb/tools/lldb-server/LLDBServerPluginRegistry.h
@@ -0,0 +1,53 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_TOOLS_LLDB_SERVER_LLDBSERVERPLUGINREGISTRY_H
+#define LLDB_TOOLS_LLDB_SERVER_LLDBSERVERPLUGINREGISTRY_H
+
+#include "Plugins/Accelerator/LLDBServerPluginAccelerator.h"
+
+namespace lldb_private {
+
+namespace lldb_server {
+
+class LLDBServerPluginRegistry {
+public:
+ /// Identifies the category of a plugin.
+ enum class PluginKind {
+ Accelerator,
+ };
+
+ using AcceleratorFactory =
+ std::function<std::unique_ptr<LLDBServerPluginAccelerator>(
+ LLDBServerPluginAccelerator::GDBServer &, MainLoop &)>;
+
+ /// Return a singleton instance of the registry that is initialized on first
+ /// use and that knows of all available plugins.
+ static LLDBServerPluginRegistry &Instance();
+
+ /// Instantiate all registered accelerator plugins and return those that
+ /// successfully activated (TryActivate() returned true).
+ std::vector<std::unique_ptr<LLDBServerPluginAccelerator>>
+ TryInstantiateAllAcceleratorPlugins(
+ LLDBServerPluginAccelerator::GDBServer &gdb_server, MainLoop &main_loop);
+
+private:
+ /// Initialize and register all known plugins.
+ void Initialize();
+
+ /// Register an accelerator plugin factory.
+ void Register(PluginKind kind, AcceleratorFactory factory);
+
+ LLDBServerPluginRegistry() = default;
+ std::vector<AcceleratorFactory> m_accelerator_factories;
+};
+
+} // namespace lldb_server
+} // namespace lldb_private
+
+#endif // LLDB_TOOLS_LLDB_SERVER_LLDBSERVERPLUGINREGISTRY_H
diff --git a/lldb/tools/lldb-server/Plugins/Accelerator/CMakeLists.txt b/lldb/tools/lldb-server/Plugins/Accelerator/CMakeLists.txt
new file mode 100644
index 0000000000000..853788384e141
--- /dev/null
+++ b/lldb/tools/lldb-server/Plugins/Accelerator/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(Mock)
diff --git a/lldb/tools/lldb-server/Plugins/Accelerator/LLDBServerPluginAccelerator.cpp b/lldb/tools/lldb-server/Plugins/Accelerator/LLDBServerPluginAccelerator.cpp
new file mode 100644
index 0000000000000..6c6e7a17d7f5b
--- /dev/null
+++ b/lldb/tools/lldb-server/Plugins/Accelerator/LLDBServerPluginAccelerator.cpp
@@ -0,0 +1,15 @@
+//===-- LLDBServerPluginAccelerator.cpp -------------------------*- 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "LLDBServerPluginAccelerator.h"
+
+using namespace lldb_private::lldb_server;
+
+LLDBServerPluginAccelerator::LLDBServerPluginAccelerator(GDBServer &gdb_server,
+ MainLoop &main_loop)
+ : m_gdb_server(gdb_server), m_main_loop(main_loop) {}
diff --git a/lldb/tools/lldb-server/Plugins/Accelerator/LLDBServerPluginAccelerator.h b/lldb/tools/lldb-server/Plugins/Accelerator/LLDBServerPluginAccelerator.h
new file mode 100644
index 0000000000000..8087a040dcdda
--- /dev/null
+++ b/lldb/tools/lldb-server/Plugins/Accelerator/LLDBServerPluginAccelerator.h
@@ -0,0 +1,54 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_TOOLS_LLDB_SERVER_PLUGINS_ACCELERATOR_LLDBSERVERPLUGINACCELERATOR_H
+#define LLDB_TOOLS_LLDB_SERVER_PLUGINS_ACCELERATOR_LLDBSERVERPLUGINACCELERATOR_H
+
+#include "llvm/ADT/StringRef.h"
+#include "lldb/Host/MainLoop.h"
+
+namespace lldb_private {
+
+namespace process_gdb_remote {
+class GDBRemoteCommunicationServerLLGS;
+} // namespace process_gdb_remote
+
+namespace lldb_server {
+
+/// Abstract base class for lldb-server accelerator plugins.
+///
+/// An accelerator plugin allows lldb-server to support debugging of hardware
+/// accelerators (e.g. GPUs, FPGAs) alongside the native host process.
+class LLDBServerPluginAccelerator {
+public:
+ using GDBServer = process_gdb_remote::GDBRemoteCommunicationServerLLGS;
+
+ LLDBServerPluginAccelerator(GDBServer &gdb_server, MainLoop &main_loop);
+ virtual ~LLDBServerPluginAccelerator() = default;
+
+ /// Returns a short, unique name identifying this plugin (e.g. "mock-accel").
+ virtual llvm::StringRef GetPluginName() = 0;
+
+ /// Attempts to activate the plugin if it should be enabled in the current
+ /// environment (e.g. required hardware is present, an enabling environment
+ /// variable is set, etc.). Returns true if the plugin was activated.
+ virtual bool TryActivate() = 0;
+
+ /// Called before lldb-server exits to allow the plugin to perform cleanup.
+ /// This is called for all plugins that successfully activated.
+ virtual void Teardown() = 0;
+
+protected:
+ GDBServer &m_gdb_server;
+ MainLoop &m_main_loop;
+};
+
+} // namespace lldb_server
+} // namespace lldb_private
+
+#endif // LLDB_TOOLS_LLDB_SERVER_PLUGINS_ACCELERATOR_LLDBSERVERPLUGINACCELERATOR_H
diff --git a/lldb/tools/lldb-server/Plugins/Accelerator/Mock/CMakeLists.txt b/lldb/tools/lldb-server/Plugins/Accelerator/Mock/CMakeLists.txt
new file mode 100644
index 0000000000000..1b360d8a6d5c3
--- /dev/null
+++ b/lldb/tools/lldb-server/Plugins/Accelerator/Mock/CMakeLists.txt
@@ -0,0 +1,11 @@
+add_lldb_library(lldbServerPluginMockAccelerator
+ LLDBServerPluginMockAccelerator.cpp
+ ../LLDBServerPluginAccelerator.cpp
+)
+
+target_include_directories(lldbServerPluginMockAccelerator
+ PRIVATE
+ "${LLDB_SOURCE_DIR}/source"
+ "${CMAKE_CURRENT_SOURCE_DIR}/../../.."
+ "${CMAKE_CURRENT_SOURCE_DIR}/.."
+)
diff --git a/lldb/tools/lldb-server/Plugins/Accelerator/Mock/LLDBServerPluginMockAccelerator.cpp b/lldb/tools/lldb-server/Plugins/Accelerator/Mock/LLDBServerPluginMockAccelerator.cpp
new file mode 100644
index 0000000000000..824820e265907
--- /dev/null
+++ b/lldb/tools/lldb-server/Plugins/Accelerator/Mock/LLDBServerPluginMockAccelerator.cpp
@@ -0,0 +1,36 @@
+//===----------------------------------------------------------------------===//
+//
+// 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 "LLDBServerPluginMockAccelerator.h"
+
+#include "llvm/Support/Process.h"
+
+using namespace lldb_private::lldb_server;
+
+LLDBServerPluginMockAccelerator::LLDBServerPluginMockAccelerator(
+ GDBServer &gdb_server, MainLoop &main_loop)
+ : LLDBServerPluginAccelerator(gdb_server, main_loop) {}
+
+llvm::StringRef LLDBServerPluginMockAccelerator::GetPluginName() {
+ return "mock-accelerator";
+}
+
+bool LLDBServerPluginMockAccelerator::TryActivate() {
+ // Check if the plugin should be enabled
+ std::optional<std::string> val = llvm::sys::Process::GetEnv(kEnableEnvVar);
+ if (!val || val->empty())
+ return false;
+
+ // Activate the plugin by writing the parent PID to the test file
+ std::error_code ec;
+ llvm::raw_fd_ostream out("/tmp/accelerator_plugin_test.txt", ec,
+ llvm::sys::fs::OF_Text);
+ out << llvm::sys::Process::getProcessId() << '\n';
+
+ return true;
+}
diff --git a/lldb/tools/lldb-server/Plugins/Accelerator/Mock/LLDBServerPluginMockAccelerator.h b/lldb/tools/lldb-server/Plugins/Accelerator/Mock/LLDBServerPluginMockAccelerator.h
new file mode 100644
index 0000000000000..e7643550f2c17
--- /dev/null
+++ b/lldb/tools/lldb-server/Plugins/Accelerator/Mock/LLDBServerPluginMockAccelerator.h
@@ -0,0 +1,38 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_TOOLS_LLDB_SERVER_PLUGINS_ACCELERATOR_LLDBSERVERPLUGINMOCKACCELERATOR_H
+#define LLDB_TOOLS_LLDB_SERVER_PLUGINS_ACCELERATOR_LLDBSERVERPLUGINMOCKACCELERATOR_H
+
+#include "../LLDBServerPluginAccelerator.h"
+
+namespace lldb_private {
+namespace lldb_server {
+
+/// A mock accelerator plugin used for testing the accelerator plugin
+/// infrastructure.
+///
+/// This plugin is enabled when the environment variable
+/// LLDB_SERVER_ENABLE_MOCK_ACCELERATOR_PLUGIN is set to any non-empty value.
+class LLDBServerPluginMockAccelerator : public LLDBServerPluginAccelerator {
+public:
+ /// Environment variable that enables this plugin.
+ static constexpr const char *kEnableEnvVar =
+ "LLDB_SERVER_ENABLE_MOCK_ACCELERATOR_PLUGIN";
+
+ LLDBServerPluginMockAccelerator(GDBServer &gdb_server, MainLoop &main_loop);
+
+ llvm::StringRef GetPluginName() override;
+ bool TryActivate() override;
+ void Teardown() override {}
+};
+
+} // namespace lldb_server
+} // namespace lldb_private
+
+#endif // LLDB_TOOLS_LLDB_SERVER_PLUGINS_ACCELERATOR_LLDBSERVERPLUGINMOCKACCELERATOR_H
diff --git a/lldb/tools/lldb-server/Plugins/CMakeLists.txt b/lldb/tools/lldb-server/Plugins/CMakeLists.txt
new file mode 100644
index 0000000000000..c9f43933b3b55
--- /dev/null
+++ b/lldb/tools/lldb-server/Plugins/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(Accelerator)
diff --git a/lldb/tools/lldb-server/lldb-gdbserver.cpp b/lldb/tools/lldb-server/lldb-gdbserver.cpp
index e1dc15d83069f..5aeb139e75859 100644
--- a/lldb/tools/lldb-server/lldb-gdbserver.cpp
+++ b/lldb/tools/lldb-server/lldb-gdbserver.cpp
@@ -17,6 +17,7 @@
#include <unistd.h>
#endif
+#include "LLDBServerPluginRegistry.h"
#include "LLDBServerUtilities.h"
#include "Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h"
#include "Plugins/Process/gdb-remote/ProcessGDBRemoteLog.h"
@@ -453,6 +454,17 @@ int main_gdbserver(int argc, char *argv[]) {
NativeProcessManager manager(mainloop);
GDBRemoteCommunicationServerLLGS gdb_server(mainloop, manager);
+ // Create and activate all accelerator plugins.
+ auto accelerator_plugins =
+ LLDBServerPluginRegistry::Instance().TryInstantiateAllAcceleratorPlugins(
+ gdb_server, mainloop);
+
+ // Ensure plugins are torn down on all exit paths.
+ llvm::scope_exit teardown_plugins([&]() {
+ for (auto &plugin : accelerator_plugins)
+ plugin->Teardown();
+ });
+
llvm::StringRef host_and_port;
if (!Inputs.empty() && connection_fd == SharedSocket::kInvalidFD) {
host_and_port = Inputs.front();
More information about the lldb-commits
mailing list