| //===-- CommandObjectPlugin.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 "CommandObjectPlugin.h" | |
| #include "lldb/Host/Host.h" | |
| #include "lldb/Interpreter/CommandInterpreter.h" | |
| #include "lldb/Interpreter/CommandReturnObject.h" | |
| using namespace lldb; | |
| using namespace lldb_private; | |
| class CommandObjectPluginLoad : public CommandObjectParsed { | |
| public: | |
| CommandObjectPluginLoad(CommandInterpreter &interpreter) | |
| : CommandObjectParsed(interpreter, "plugin load", | |
| "Import a dylib that implements an LLDB plugin.", | |
| nullptr) { | |
| CommandArgumentEntry arg1; | |
| CommandArgumentData cmd_arg; | |
| // Define the first (and only) variant of this arg. | |
| cmd_arg.arg_type = eArgTypeFilename; | |
| cmd_arg.arg_repetition = eArgRepeatPlain; | |
| // There is only one variant this argument could be; put it into the | |
| // argument entry. | |
| arg1.push_back(cmd_arg); | |
| // Push the data for the first argument into the m_arguments vector. | |
| m_arguments.push_back(arg1); | |
| } | |
| ~CommandObjectPluginLoad() override = default; | |
| void | |
| HandleArgumentCompletion(CompletionRequest &request, | |
| OptionElementVector &opt_element_vector) override { | |
| CommandCompletions::InvokeCommonCompletionCallbacks( | |
| GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, | |
| request, nullptr); | |
| } | |
| protected: | |
| bool DoExecute(Args &command, CommandReturnObject &result) override { | |
| size_t argc = command.GetArgumentCount(); | |
| if (argc != 1) { | |
| result.AppendError("'plugin load' requires one argument"); | |
| result.SetStatus(eReturnStatusFailed); | |
| return false; | |
| } | |
| Status error; | |
| FileSpec dylib_fspec(command[0].ref()); | |
| FileSystem::Instance().Resolve(dylib_fspec); | |
| if (GetDebugger().LoadPlugin(dylib_fspec, error)) | |
| result.SetStatus(eReturnStatusSuccessFinishResult); | |
| else { | |
| result.AppendError(error.AsCString()); | |
| result.SetStatus(eReturnStatusFailed); | |
| } | |
| return result.Succeeded(); | |
| } | |
| }; | |
| CommandObjectPlugin::CommandObjectPlugin(CommandInterpreter &interpreter) | |
| : CommandObjectMultiword(interpreter, "plugin", | |
| "Commands for managing LLDB plugins.", | |
| "plugin <subcommand> [<subcommand-options>]") { | |
| LoadSubCommand("load", | |
| CommandObjectSP(new CommandObjectPluginLoad(interpreter))); | |
| } | |
| CommandObjectPlugin::~CommandObjectPlugin() = default; |