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 lldb_private::CommandCompletions::InvokeCommonCompletionCallbacks( 43 GetCommandInterpreter(), lldb::eDiskFileCompletion, request, nullptr); 44 } 45 46 protected: 47 bool DoExecute(Args &command, CommandReturnObject &result) override { 48 size_t argc = command.GetArgumentCount(); 49 50 if (argc != 1) { 51 result.AppendError("'plugin load' requires one argument"); 52 return false; 53 } 54 55 Status error; 56 57 FileSpec dylib_fspec(command[0].ref()); 58 FileSystem::Instance().Resolve(dylib_fspec); 59 60 if (GetDebugger().LoadPlugin(dylib_fspec, error)) 61 result.SetStatus(eReturnStatusSuccessFinishResult); 62 else { 63 result.AppendError(error.AsCString()); 64 } 65 66 return result.Succeeded(); 67 } 68 }; 69 70 CommandObjectPlugin::CommandObjectPlugin(CommandInterpreter &interpreter) 71 : CommandObjectMultiword(interpreter, "plugin", 72 "Commands for managing LLDB plugins.", 73 "plugin <subcommand> [<subcommand-options>]") { 74 LoadSubCommand("load", 75 CommandObjectSP(new CommandObjectPluginLoad(interpreter))); 76 } 77 78 CommandObjectPlugin::~CommandObjectPlugin() = default; 79