[lldb] Add Model Context Protocol (MCP) support to LLDB by JDevlieghere · Pull Request #143628 · llvm/llvm-project (original) (raw)
@llvm/pr-subscribers-lldb
Author: Jonas Devlieghere (JDevlieghere)
Changes
This PR adds an MCP (Model Context Protocol ) server to LLDB. For motivation and background, please refer to the corresponding RFC: https://discourse.llvm.org/t/rfc-adding-mcp-support-to-lldb/86798
I implemented this as a new kind of plugin. The idea is that we could support multiple protocol servers (e.g. if we want to support DAP from within LLDB). This also introduces a corresponding top-level command (protocol-server
) with two subcommands to start
and stop
the server.
(lldb) protocol-server start MCP tcp://localhost:1234
MCP server started with connection listeners: connection://[::1]:1234, connection://[127.0.0.1]:1234
The MCP sever supports one tool (lldb_command
) which executes a command, but can easily be extended with more commands.
Patch is 71.14 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/143628.diff
32 Files Affected:
- (modified) lldb/include/lldb/Core/Debugger.h (+6)
- (modified) lldb/include/lldb/Core/PluginManager.h (+11)
- (added) lldb/include/lldb/Core/ProtocolServer.h (+39)
- (modified) lldb/include/lldb/Interpreter/CommandOptionArgumentTable.h (+1)
- (modified) lldb/include/lldb/lldb-enumerations.h (+1)
- (modified) lldb/include/lldb/lldb-forward.h (+2-1)
- (modified) lldb/include/lldb/lldb-private-interfaces.h (+2)
- (modified) lldb/source/Commands/CMakeLists.txt (+1)
- (added) lldb/source/Commands/CommandObjectProtocolServer.cpp (+184)
- (added) lldb/source/Commands/CommandObjectProtocolServer.h (+25)
- (modified) lldb/source/Core/CMakeLists.txt (+1)
- (modified) lldb/source/Core/Debugger.cpp (+24)
- (modified) lldb/source/Core/PluginManager.cpp (+32)
- (added) lldb/source/Core/ProtocolServer.cpp (+21)
- (modified) lldb/source/Interpreter/CommandInterpreter.cpp (+2)
- (modified) lldb/source/Plugins/CMakeLists.txt (+1)
- (added) lldb/source/Plugins/Protocol/CMakeLists.txt (+1)
- (added) lldb/source/Plugins/Protocol/MCP/CMakeLists.txt (+13)
- (added) lldb/source/Plugins/Protocol/MCP/MCPError.cpp (+31)
- (added) lldb/source/Plugins/Protocol/MCP/MCPError.h (+33)
- (added) lldb/source/Plugins/Protocol/MCP/Protocol.cpp (+183)
- (added) lldb/source/Plugins/Protocol/MCP/Protocol.h (+131)
- (added) lldb/source/Plugins/Protocol/MCP/ProtocolServerMCP.cpp (+280)
- (added) lldb/source/Plugins/Protocol/MCP/ProtocolServerMCP.h (+80)
- (added) lldb/source/Plugins/Protocol/MCP/Tool.cpp (+72)
- (added) lldb/source/Plugins/Protocol/MCP/Tool.h (+61)
- (modified) lldb/unittests/CMakeLists.txt (+1)
- (modified) lldb/unittests/DAP/ProtocolTypesTest.cpp (+14-20)
- (added) lldb/unittests/Protocol/CMakeLists.txt (+12)
- (added) lldb/unittests/Protocol/ProtocolMCPServerTest.cpp (+195)
- (added) lldb/unittests/Protocol/ProtocolMCPTest.cpp (+176)
- (modified) lldb/unittests/TestingSupport/TestUtilities.h (+9)
diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h index d73aba1e3ce58..0f6659d1a0bf7 100644 --- a/lldb/include/lldb/Core/Debugger.h +++ b/lldb/include/lldb/Core/Debugger.h @@ -598,6 +598,10 @@ class Debugger : public std::enable_shared_from_this, void FlushProcessOutput(Process &process, bool flush_stdout, bool flush_stderr);
void AddProtocolServer(lldb::ProtocolServerSP protocol_server_sp);
void RemoveProtocolServer(lldb::ProtocolServerSP protocol_server_sp);
lldb::ProtocolServerSP GetProtocolServer(llvm::StringRef protocol) const;
SourceManager::SourceFileCache &GetSourceFileCache() { return m_source_file_cache; } @@ -768,6 +772,8 @@ class Debugger : public std::enable_shared_from_this, mutable std::mutex m_progress_reports_mutex; /// @}
llvm::SmallVectorlldb::ProtocolServerSP m_protocol_servers;
std::mutex m_destroy_callback_mutex; lldb::callback_token_t m_destroy_callback_next_token = 0; struct DestroyCallbackInfo { diff --git a/lldb/include/lldb/Core/PluginManager.h b/lldb/include/lldb/Core/PluginManager.h index e7b1691031111..e50bf97189cfc 100644 --- a/lldb/include/lldb/Core/PluginManager.h +++ b/lldb/include/lldb/Core/PluginManager.h @@ -327,6 +327,17 @@ class PluginManager { static void AutoCompleteProcessName(llvm::StringRef partial_name, CompletionRequest &request);
// Protocol
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
ProtocolServerCreateInstance create_callback);
static bool UnregisterPlugin(ProtocolServerCreateInstance create_callback);
static llvm::StringRef GetProtocolServerPluginNameAtIndex(uint32_t idx);
static ProtocolServerCreateInstance
GetProtocolCreateCallbackForPluginName(llvm::StringRef name);
// Register Type Provider static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, RegisterTypeBuilderCreateInstance create_callback);
diff --git a/lldb/include/lldb/Core/ProtocolServer.h b/lldb/include/lldb/Core/ProtocolServer.h new file mode 100644 index 0000000000000..fafe460904323 --- /dev/null +++ b/lldb/include/lldb/Core/ProtocolServer.h @@ -0,0 +1,39 @@ +//===-- ProtocolServer.h --------------------------------------------------===// +// +// 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_CORE_PROTOCOLSERVER_H +#define LLDB_CORE_PROTOCOLSERVER_H + +#include "lldb/Core/PluginInterface.h" +#include "lldb/Host/Socket.h" +#include "lldb/lldb-private-interfaces.h" + +namespace lldb_private { + +class ProtocolServer : public PluginInterface { +public:
- ProtocolServer() = default;
- virtual ~ProtocolServer() = default;
- static lldb::ProtocolServerSP Create(llvm::StringRef name,
Debugger &debugger);
- struct Connection {
- Socket::SocketProtocol protocol;
- std::string name;
- };
- virtual llvm::Error Start(Connection connection) = 0;
- virtual llvm::Error Stop() = 0;
- virtual Socket *GetSocket() const = 0; +};
- +} // namespace lldb_private
- +#endif
diff --git a/lldb/include/lldb/Interpreter/CommandOptionArgumentTable.h b/lldb/include/lldb/Interpreter/CommandOptionArgumentTable.h index 8535dfcf46da5..4face717531b1 100644 --- a/lldb/include/lldb/Interpreter/CommandOptionArgumentTable.h +++ b/lldb/include/lldb/Interpreter/CommandOptionArgumentTable.h @@ -315,6 +315,7 @@ static constexpr CommandObject::ArgumentTableEntry g_argument_table[] = { { lldb::eArgTypeCPUName, "cpu-name", lldb::CompletionType::eNoCompletion, {}, { nullptr, false }, "The name of a CPU." }, { lldb::eArgTypeCPUFeatures, "cpu-features", lldb::CompletionType::eNoCompletion, {}, { nullptr, false }, "The CPU feature string." }, { lldb::eArgTypeManagedPlugin, "managed-plugin", lldb::CompletionType::eNoCompletion, {}, { nullptr, false }, "Plugins managed by the PluginManager" },
- { lldb::eArgTypeProtocol, "protocol", lldb::CompletionType::eNoCompletion, {}, { nullptr, false }, "The name of the protocol." }, // clang-format on };
diff --git a/lldb/include/lldb/lldb-enumerations.h b/lldb/include/lldb/lldb-enumerations.h index eeb7299a354e1..69e8671b6e21b 100644 --- a/lldb/include/lldb/lldb-enumerations.h +++ b/lldb/include/lldb/lldb-enumerations.h @@ -664,6 +664,7 @@ enum CommandArgumentType { eArgTypeCPUName, eArgTypeCPUFeatures, eArgTypeManagedPlugin,
- eArgTypeProtocol, eArgTypeLastArg // Always keep this entry as the last entry in this // enumeration!!
}; diff --git a/lldb/include/lldb/lldb-forward.h b/lldb/include/lldb/lldb-forward.h index c664d1398f74d..558818e8e2309 100644 --- a/lldb/include/lldb/lldb-forward.h +++ b/lldb/include/lldb/lldb-forward.h @@ -164,13 +164,13 @@ class PersistentExpressionState; class Platform; class Process; class ProcessAttachInfo; -class ProcessLaunchInfo; class ProcessInfo; class ProcessInstanceInfo; class ProcessInstanceInfoMatch; class ProcessLaunchInfo; class ProcessModID; class Property; +class ProtocolServer; class Queue; class QueueImpl; class QueueItem; @@ -391,6 +391,7 @@ typedef std::shared_ptr<lldb_private::Platform> PlatformSP; typedef std::shared_ptr<lldb_private::Process> ProcessSP; typedef std::shared_ptr<lldb_private::ProcessAttachInfo> ProcessAttachInfoSP; typedef std::shared_ptr<lldb_private::ProcessLaunchInfo> ProcessLaunchInfoSP; +typedef std::shared_ptr<lldb_private::ProtocolServer> ProtocolServerSP; typedef std::weak_ptr<lldb_private::Process> ProcessWP; typedef std::shared_ptr<lldb_private::RegisterCheckpoint> RegisterCheckpointSP; typedef std::shared_ptr<lldb_private::RegisterContext> RegisterContextSP; diff --git a/lldb/include/lldb/lldb-private-interfaces.h b/lldb/include/lldb/lldb-private-interfaces.h index d366dbd1d7832..34eaaa8e581e9 100644 --- a/lldb/include/lldb/lldb-private-interfaces.h +++ b/lldb/include/lldb/lldb-private-interfaces.h @@ -81,6 +81,8 @@ typedef lldb::PlatformSP (*PlatformCreateInstance)(bool force, typedef lldb::ProcessSP (*ProcessCreateInstance)( lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const FileSpec *crash_file_path, bool can_connect); +typedef lldb::ProtocolServerSP (*ProtocolServerCreateInstance)(
- Debugger &debugger);
typedef lldb::RegisterTypeBuilderSP (*RegisterTypeBuilderCreateInstance)( Target &target); typedef lldb::ScriptInterpreterSP (*ScriptInterpreterCreateInstance)( diff --git a/lldb/source/Commands/CMakeLists.txt b/lldb/source/Commands/CMakeLists.txt index 1ea51acec5f15..69e4c45f0b8e5 100644 --- a/lldb/source/Commands/CMakeLists.txt +++ b/lldb/source/Commands/CMakeLists.txt @@ -23,6 +23,7 @@ add_lldb_library(lldbCommands NO_PLUGIN_DEPENDENCIES CommandObjectPlatform.cpp CommandObjectPlugin.cpp CommandObjectProcess.cpp
- CommandObjectProtocolServer.cpp CommandObjectQuit.cpp CommandObjectRegexCommand.cpp CommandObjectRegister.cpp diff --git a/lldb/source/Commands/CommandObjectProtocolServer.cpp b/lldb/source/Commands/CommandObjectProtocolServer.cpp new file mode 100644 index 0000000000000..3ee1a0ccc4ffa --- /dev/null +++ b/lldb/source/Commands/CommandObjectProtocolServer.cpp @@ -0,0 +1,184 @@ +//===-- CommandObjectProtocolServer.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 "CommandObjectProtocolServer.h"
+#include "lldb/Core/PluginManager.h" +#include "lldb/Core/ProtocolServer.h" +#include "lldb/Host/Socket.h" +#include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Interpreter/CommandReturnObject.h" +#include "lldb/Utility/UriParser.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/Support/FormatAdapters.h" + +using namespace llvm; +using namespace lldb; +using namespace lldb_private; + +#define LLDB_OPTIONS_mcp +#include "CommandOptions.inc" + +static std::vectorllvm::StringRef GetSupportedProtocols() {
- std::vectorllvm::StringRef supported_protocols;
- size_t i = 0;
- for (llvm::StringRef protocol_name =
PluginManager::GetProtocolServerPluginNameAtIndex(i++);
!protocol_name.empty();
protocol_name = PluginManager::GetProtocolServerPluginNameAtIndex(i++)) {
- supported_protocols.push_back(protocol_name);
- }
- return supported_protocols; +}
- +static llvm::Expected<std::pair<Socket::SocketProtocol, std::string>> +validateConnection(llvm::StringRef conn) {
- auto uri = lldb_private::URI::Parse(conn);
- if (uri && (uri->scheme == "tcp" || uri->scheme == "connect" ||
!uri->hostname.empty() || uri->port)) {
- return std::make_pair(
Socket::ProtocolTcp,
formatv("[{0}]:{1}", uri->hostname.empty() ? "0.0.0.0" : uri->hostname,
uri->port.value_or(0)));
- }
- if (uri && (uri->scheme == "unix" || uri->scheme == "unix-connect" ||
uri->path != "/")) {
- return std::make_pair(Socket::ProtocolUnixDomain, uri->path.str());
- }
- return llvm::createStringError(
"Unsupported connection specifier, expected 'unix-connect:///path' or "
"'connect://[host]:port', got '%s'.",
conn.str().c_str());
+} + +class CommandObjectProtocolServerStart : public CommandObjectParsed { +public:
- CommandObjectProtocolServerStart(CommandInterpreter &interpreter)
: CommandObjectParsed(interpreter, "mcp start", "start MCP server",
"mcp start <connection>") {
- AddSimpleArgumentList(lldb::eArgTypeProtocol, eArgRepeatPlain);
- AddSimpleArgumentList(lldb::eArgTypeConnectURL, eArgRepeatPlain);
- }
- ~CommandObjectProtocolServerStart() override = default;
- +protected:
- void DoExecute(Args &args, CommandReturnObject &result) override {
- if (args.GetArgumentCount() < 1) {
result.AppendError("no protocol specified");
return;
- }
- llvm::StringRef protocol = args.GetArgumentAtIndex(0);
- std::vectorllvm::StringRef supported_protocols = GetSupportedProtocols();
- if (llvm::find(supported_protocols, protocol) ==
supported_protocols.end()) {
result.AppendErrorWithFormatv(
"unsupported protocol: {0}. Supported protocols are: {1}", protocol,
llvm::join(GetSupportedProtocols(), ", "));
return;
- }
- if (args.GetArgumentCount() < 2) {
result.AppendError("no connection specified");
return;
- }
- llvm::StringRef connection_uri = args.GetArgumentAtIndex(1);
- ProtocolServerSP server_sp = GetDebugger().GetProtocolServer(protocol);
- if (!server_sp)
server_sp = ProtocolServer::Create(protocol, GetDebugger());
- auto maybeProtoclAndName = validateConnection(connection_uri);
- if (auto error = maybeProtoclAndName.takeError()) {
result.AppendErrorWithFormatv("{0}", llvm::fmt_consume(std::move(error)));
return;
- }
- ProtocolServer::Connection connection;
- std::tie(connection.protocol, connection.name) = *maybeProtoclAndName;
- if (llvm::Error error = server_sp->Start(connection)) {
result.AppendErrorWithFormatv("{0}", llvm::fmt_consume(std::move(error)));
return;
- }
- GetDebugger().AddProtocolServer(server_sp);
- if (Socket *socket = server_sp->GetSocket()) {
std::string address =
llvm::join(socket->GetListeningConnectionURI(), ", ");
result.AppendMessageWithFormatv(
"{0} server started with connection listeners: {1}", protocol,
address);
- }
- } +};
- +class CommandObjectProtocolServerStop : public CommandObjectParsed { +public:
- CommandObjectProtocolServerStop(CommandInterpreter &interpreter)
: CommandObjectParsed(interpreter, "protocol-server stop",
"stop protocol server", "protocol-server stop") {
- AddSimpleArgumentList(lldb::eArgTypeProtocol, eArgRepeatPlain);
- }
- ~CommandObjectProtocolServerStop() override = default;
- +protected:
- void DoExecute(Args &args, CommandReturnObject &result) override {
- if (args.GetArgumentCount() < 1) {
result.AppendError("no protocol specified");
return;
- }
- llvm::StringRef protocol = args.GetArgumentAtIndex(0);
- std::vectorllvm::StringRef supported_protocols = GetSupportedProtocols();
- if (llvm::find(supported_protocols, protocol) ==
supported_protocols.end()) {
result.AppendErrorWithFormatv(
"unsupported protocol: {0}. Supported protocols are: {1}", protocol,
llvm::join(GetSupportedProtocols(), ", "));
return;
- }
- Debugger &debugger = GetDebugger();
- ProtocolServerSP server_sp = debugger.GetProtocolServer(protocol);
- if (!server_sp) {
result.AppendError(
llvm::formatv("no {0} protocol server running", protocol).str());
return;
- }
- if (llvm::Error error = server_sp->Stop()) {
result.AppendErrorWithFormatv("{0}", llvm::fmt_consume(std::move(error)));
return;
- }
- debugger.RemoveProtocolServer(server_sp);
- } +};
- +CommandObjectProtocolServer::CommandObjectProtocolServer(
- CommandInterpreter &interpreter)
- : CommandObjectMultiword(interpreter, "protocol-server",
"Start and stop a protocol server.",
"protocol-server") {
- LoadSubCommand("start", CommandObjectSP(new CommandObjectProtocolServerStart(
interpreter)));
- LoadSubCommand("stop", CommandObjectSP(
new CommandObjectProtocolServerStop(interpreter)));
+} + +CommandObjectProtocolServer::~CommandObjectProtocolServer() = default; diff --git a/lldb/source/Commands/CommandObjectProtocolServer.h b/lldb/source/Commands/CommandObjectProtocolServer.h new file mode 100644 index 0000000000000..3591216b014cb --- /dev/null +++ b/lldb/source/Commands/CommandObjectProtocolServer.h @@ -0,0 +1,25 @@ +//===-- CommandObjectProtocolServer.h +//------------------------------------------------===// +// +// 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_SOURCE_COMMANDS_COMMANDOBJECTPROTOCOLSERVER_H +#define LLDB_SOURCE_COMMANDS_COMMANDOBJECTPROTOCOLSERVER_H + +#include "lldb/Interpreter/CommandObjectMultiword.h" + +namespace lldb_private { + +class CommandObjectProtocolServer : public CommandObjectMultiword { +public:
- CommandObjectProtocolServer(CommandInterpreter &interpreter);
- ~CommandObjectProtocolServer() override; +};
- +} // namespace lldb_private
- +#endif // LLDB_SOURCE_COMMANDS_COMMANDOBJECTMCP_H
diff --git a/lldb/source/Core/CMakeLists.txt b/lldb/source/Core/CMakeLists.txt index d6b75bca7f2d6..df35bd5c025f3 100644 --- a/lldb/source/Core/CMakeLists.txt +++ b/lldb/source/Core/CMakeLists.txt @@ -46,6 +46,7 @@ add_lldb_library(lldbCore NO_PLUGIN_DEPENDENCIES Opcode.cpp PluginManager.cpp Progress.cpp
- ProtocolServer.cpp Statusline.cpp RichManglingContext.cpp SearchFilter.cpp diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index 81037d3def811..2bc9c7ead79d3 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -16,6 +16,7 @@
#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/Progress.h" +#include "lldb/Core/ProtocolServer.h" #include "lldb/Core/StreamAsynchronousIO.h" #include "lldb/Core/Telemetry.h" #include "lldb/DataFormatters/DataVisualization.h" @@ -2363,3 +2364,26 @@ llvm::ThreadPoolInterface &Debugger::GetThreadPool() { "Debugger::GetThreadPool called before Debugger::Initialize"); return *g_thread_pool; } + +void Debugger::AddProtocolServer(lldb::ProtocolServerSP protocol_server_sp) {
- assert(protocol_server_sp &&
GetProtocolServer(protocol_server_sp->GetPluginName()) == nullptr);
- m_protocol_servers.push_back(protocol_server_sp); +}
- +void Debugger::RemoveProtocolServer(lldb::ProtocolServerSP protocol_server_sp) {
- auto it = llvm::find(m_protocol_servers, protocol_server_sp);
- if (it != m_protocol_servers.end())
- m_protocol_servers.erase(it);
+} + +lldb::ProtocolServerSP +Debugger::GetProtocolServer(llvm::StringRef protocol) const {
- for (ProtocolServerSP protocol_server_sp : m_protocol_servers) {
- if (!protocol_server_sp)
continue;
- if (protocol_server_sp->GetPluginName() == protocol)
return protocol_server_sp;
- }
- return nullptr; +} diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp index 5d44434033c55..a59a390e40bb6 100644 --- a/lldb/source/Core/PluginManager.cpp +++ b/lldb/source/Core/PluginManager.cpp @@ -1006,6 +1006,38 @@ void PluginManager::AutoCompleteProcessName(llvm::StringRef name, } }
+#pragma mark ProtocolServer + +typedef PluginInstance ProtocolServerInstance; +typedef PluginInstances ProtocolServerInstances; + +static ProtocolServerInstances &GetProtocolServerInstances() {
- static ProtocolServerInstances g_instances;
- return g_instances; +}
- +bool PluginManager::RegisterPlugin(
- llvm::StringRef name, llvm::StringRef description,
- ProtocolServerCreateInstance create_callback) {
- return GetProtocolServerInstances().RegisterPlugin(name, description,
create_callback);
+} + +bool PluginManager::UnregisterPlugin(
ProtocolServerCreateInstance create_callback) {
return GetProtocolServerInstances().UnregisterPlugin(create_callback); +}
+llvm::StringRef +PluginManager::GetProtocolServerPluginNameAtIndex(uint32_t idx) {
return GetProtocolServerInstances().GetNameAtIndex(idx); +}
+ProtocolServerCreateInstance +PluginManager::GetProtocolCreateCallbackForPluginName(llvm::StringRef name) {
return GetProtocolServerInstances().GetCallbackForName(name); +}
#pragma mark RegisterTypeBuilder
struct RegisterTypeBuilderInstance
diff --git a/lldb/source/Core/ProtocolServer.cpp b/lldb/source/Core/ProtocolServer.cpp new file mode 100644 index 0000000000000..d57a047afa7b2 --- /dev/null +++ b/lldb/source/Core/ProtocolServer.cpp @@ -0,0 +1,21 @@ +//===-- ProtocolServer.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/Core/ProtocolServer.h" +#include "lldb/Core/PluginManager.h" + +using namespace lldb_private; +using namespace lldb; + +ProtocolServerSP ProtocolServer::Create(llvm::StringRef name,
Debugger &debugger) {
- if (ProtocolServerCreateInstance create_callback =
PluginManager::GetProtocolCreateCallbackForPluginName(name))
- return create_callback(debugger);
- return nullptr; +} diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp index 4f9ae104dedea..00c3472444d2e 100644 --- a/lldb/source/Interpreter/CommandInterpreter.cpp +++ b/lldb/source/Interpreter/CommandInterpreter.cpp @@ -30,6 +30,7 @@
#include "Commands/CommandObjectPlatform.h" #include "Commands/CommandObjectPlugin.h" #include "Commands/CommandObjectProcess.h" +#include "Commands/CommandObjectProtocolServer.h" #include "Commands/CommandObjectQuit.h" #include "Commands/CommandObjectRegexCommand.h" #include "Commands/CommandObjectRegister.h" @@ -574,6 +575,7 @@ void CommandInterpreter::LoadCommandDictionary() { REGISTER_COMMAND_OBJECT("... [truncated]