126cac3afSEugene Zelenko //===-- CommandObjectPlugin.cpp ---------------------------------*- C++ -*-===//
221dfcd9dSEnrico Granata //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
621dfcd9dSEnrico Granata //
721dfcd9dSEnrico Granata //===----------------------------------------------------------------------===//
821dfcd9dSEnrico Granata 
921dfcd9dSEnrico Granata #include "CommandObjectPlugin.h"
1021dfcd9dSEnrico Granata #include "lldb/Host/Host.h"
1121dfcd9dSEnrico Granata #include "lldb/Interpreter/CommandInterpreter.h"
1221dfcd9dSEnrico Granata #include "lldb/Interpreter/CommandReturnObject.h"
1321dfcd9dSEnrico Granata 
1421dfcd9dSEnrico Granata using namespace lldb;
1521dfcd9dSEnrico Granata using namespace lldb_private;
1621dfcd9dSEnrico Granata 
17b9c1b51eSKate Stone class CommandObjectPluginLoad : public CommandObjectParsed {
1821dfcd9dSEnrico Granata public:
19b9c1b51eSKate Stone   CommandObjectPluginLoad(CommandInterpreter &interpreter)
20b9c1b51eSKate Stone       : CommandObjectParsed(interpreter, "plugin load",
2121dfcd9dSEnrico Granata                             "Import a dylib that implements an LLDB plugin.",
22b9c1b51eSKate Stone                             nullptr) {
2321dfcd9dSEnrico Granata     CommandArgumentEntry arg1;
2421dfcd9dSEnrico Granata     CommandArgumentData cmd_arg;
2521dfcd9dSEnrico Granata 
2621dfcd9dSEnrico Granata     // Define the first (and only) variant of this arg.
2721dfcd9dSEnrico Granata     cmd_arg.arg_type = eArgTypeFilename;
2821dfcd9dSEnrico Granata     cmd_arg.arg_repetition = eArgRepeatPlain;
2921dfcd9dSEnrico Granata 
30b9c1b51eSKate Stone     // There is only one variant this argument could be; put it into the
31b9c1b51eSKate Stone     // argument entry.
3221dfcd9dSEnrico Granata     arg1.push_back(cmd_arg);
3321dfcd9dSEnrico Granata 
3421dfcd9dSEnrico Granata     // Push the data for the first argument into the m_arguments vector.
3521dfcd9dSEnrico Granata     m_arguments.push_back(arg1);
3621dfcd9dSEnrico Granata   }
3721dfcd9dSEnrico Granata 
3826cac3afSEugene Zelenko   ~CommandObjectPluginLoad() override = default;
3921dfcd9dSEnrico Granata 
40*ae34ed2cSRaphael Isemann   void
41*ae34ed2cSRaphael Isemann   HandleArgumentCompletion(CompletionRequest &request,
422443bbd4SRaphael Isemann                            OptionElementVector &opt_element_vector) override {
43b9c1b51eSKate Stone     CommandCompletions::InvokeCommonCompletionCallbacks(
44b9c1b51eSKate Stone         GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion,
45a2e76c0bSRaphael Isemann         request, nullptr);
4621dfcd9dSEnrico Granata   }
4721dfcd9dSEnrico Granata 
4821dfcd9dSEnrico Granata protected:
49b9c1b51eSKate Stone   bool DoExecute(Args &command, CommandReturnObject &result) override {
5021dfcd9dSEnrico Granata     size_t argc = command.GetArgumentCount();
5121dfcd9dSEnrico Granata 
52b9c1b51eSKate Stone     if (argc != 1) {
5321dfcd9dSEnrico Granata       result.AppendError("'plugin load' requires one argument");
5421dfcd9dSEnrico Granata       result.SetStatus(eReturnStatusFailed);
5521dfcd9dSEnrico Granata       return false;
5621dfcd9dSEnrico Granata     }
5721dfcd9dSEnrico Granata 
5897206d57SZachary Turner     Status error;
5921dfcd9dSEnrico Granata 
608f3be7a3SJonas Devlieghere     FileSpec dylib_fspec(command[0].ref);
618f3be7a3SJonas Devlieghere     FileSystem::Instance().Resolve(dylib_fspec);
6221dfcd9dSEnrico Granata 
6357179860SJonas Devlieghere     if (GetDebugger().LoadPlugin(dylib_fspec, error))
6421dfcd9dSEnrico Granata       result.SetStatus(eReturnStatusSuccessFinishResult);
65b9c1b51eSKate Stone     else {
66e743c782SEnrico Granata       result.AppendError(error.AsCString());
6721dfcd9dSEnrico Granata       result.SetStatus(eReturnStatusFailed);
68e743c782SEnrico Granata     }
6921dfcd9dSEnrico Granata 
7021dfcd9dSEnrico Granata     return result.Succeeded();
7121dfcd9dSEnrico Granata   }
7221dfcd9dSEnrico Granata };
7321dfcd9dSEnrico Granata 
747428a18cSKate Stone CommandObjectPlugin::CommandObjectPlugin(CommandInterpreter &interpreter)
75b9c1b51eSKate Stone     : CommandObjectMultiword(interpreter, "plugin",
76b9c1b51eSKate Stone                              "Commands for managing LLDB plugins.",
77b9c1b51eSKate Stone                              "plugin <subcommand> [<subcommand-options>]") {
78b9c1b51eSKate Stone   LoadSubCommand("load",
79b9c1b51eSKate Stone                  CommandObjectSP(new CommandObjectPluginLoad(interpreter)));
8021dfcd9dSEnrico Granata }
8121dfcd9dSEnrico Granata 
8226cac3afSEugene Zelenko CommandObjectPlugin::~CommandObjectPlugin() = default;
83