1 //===-- CommandObjectPlugin.cpp -------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "CommandObjectPlugin.h" 10 #include "lldb/Interpreter/CommandInterpreter.h" 11 #include "lldb/Interpreter/CommandReturnObject.h" 12 13 using namespace lldb; 14 using namespace lldb_private; 15 16 class CommandObjectPluginLoad : public CommandObjectParsed { 17 public: 18 CommandObjectPluginLoad(CommandInterpreter &interpreter) 19 : CommandObjectParsed(interpreter, "plugin load", 20 "Import a dylib that implements an LLDB plugin.", 21 nullptr) { 22 CommandArgumentEntry arg1; 23 CommandArgumentData cmd_arg; 24 25 // Define the first (and only) variant of this arg. 26 cmd_arg.arg_type = eArgTypeFilename; 27 cmd_arg.arg_repetition = eArgRepeatPlain; 28 29 // There is only one variant this argument could be; put it into the 30 // argument entry. 31 arg1.push_back(cmd_arg); 32 33 // Push the data for the first argument into the m_arguments vector. 34 m_arguments.push_back(arg1); 35 } 36 37 ~CommandObjectPluginLoad() override = default; 38 39 void 40 HandleArgumentCompletion(CompletionRequest &request, 41 OptionElementVector &opt_element_vector) override { 42 CommandCompletions::InvokeCommonCompletionCallbacks( 43 GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, 44 request, nullptr); 45 } 46 47 protected: 48 bool DoExecute(Args &command, CommandReturnObject &result) override { 49 size_t argc = command.GetArgumentCount(); 50 51 if (argc != 1) { 52 result.AppendError("'plugin load' requires one argument"); 53 return false; 54 } 55 56 Status error; 57 58 FileSpec dylib_fspec(command[0].ref()); 59 FileSystem::Instance().Resolve(dylib_fspec); 60 61 if (GetDebugger().LoadPlugin(dylib_fspec, error)) 62 result.SetStatus(eReturnStatusSuccessFinishResult); 63 else { 64 result.AppendError(error.AsCString()); 65 } 66 67 return result.Succeeded(); 68 } 69 }; 70 71 CommandObjectPlugin::CommandObjectPlugin(CommandInterpreter &interpreter) 72 : CommandObjectMultiword(interpreter, "plugin", 73 "Commands for managing LLDB plugins.", 74 "plugin <subcommand> [<subcommand-options>]") { 75 LoadSubCommand("load", 76 CommandObjectSP(new CommandObjectPluginLoad(interpreter))); 77 } 78 79 CommandObjectPlugin::~CommandObjectPlugin() = default; 80