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 result.SetStatus(eReturnStatusFailed); 54 return false; 55 } 56 57 Status error; 58 59 FileSpec dylib_fspec(command[0].ref()); 60 FileSystem::Instance().Resolve(dylib_fspec); 61 62 if (GetDebugger().LoadPlugin(dylib_fspec, error)) 63 result.SetStatus(eReturnStatusSuccessFinishResult); 64 else { 65 result.AppendError(error.AsCString()); 66 result.SetStatus(eReturnStatusFailed); 67 } 68 69 return result.Succeeded(); 70 } 71 }; 72 73 CommandObjectPlugin::CommandObjectPlugin(CommandInterpreter &interpreter) 74 : CommandObjectMultiword(interpreter, "plugin", 75 "Commands for managing LLDB plugins.", 76 "plugin <subcommand> [<subcommand-options>]") { 77 LoadSubCommand("load", 78 CommandObjectSP(new CommandObjectPluginLoad(interpreter))); 79 } 80 81 CommandObjectPlugin::~CommandObjectPlugin() = default; 82