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:
CommandObjectPluginLoad(CommandInterpreter & interpreter)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
HandleArgumentCompletion(CompletionRequest & request,OptionElementVector & opt_element_vector)40 HandleArgumentCompletion(CompletionRequest &request,
41 OptionElementVector &opt_element_vector) override {
42 CommandCompletions::InvokeCommonCompletionCallbacks(
43 GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion,
44 request, nullptr);
45 }
46
47 protected:
DoExecute(Args & command,CommandReturnObject & result)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
CommandObjectPlugin(CommandInterpreter & interpreter)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