126cac3afSEugene Zelenko //===-- CommandObjectPlugin.cpp ---------------------------------*- C++ -*-===// 221dfcd9dSEnrico Granata // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler 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 402443bbd4SRaphael Isemann int HandleArgumentCompletion( 412443bbd4SRaphael Isemann CompletionRequest &request, 422443bbd4SRaphael Isemann OptionElementVector &opt_element_vector) override { 43b9c1b51eSKate Stone CommandCompletions::InvokeCommonCompletionCallbacks( 44b9c1b51eSKate Stone GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, 45a2e76c0bSRaphael Isemann request, nullptr); 461a6d7ab5SRaphael Isemann return request.GetNumberOfMatches(); 4721dfcd9dSEnrico Granata } 4821dfcd9dSEnrico Granata 4921dfcd9dSEnrico Granata protected: 50b9c1b51eSKate Stone bool DoExecute(Args &command, CommandReturnObject &result) override { 5121dfcd9dSEnrico Granata size_t argc = command.GetArgumentCount(); 5221dfcd9dSEnrico Granata 53b9c1b51eSKate Stone if (argc != 1) { 5421dfcd9dSEnrico Granata result.AppendError("'plugin load' requires one argument"); 5521dfcd9dSEnrico Granata result.SetStatus(eReturnStatusFailed); 5621dfcd9dSEnrico Granata return false; 5721dfcd9dSEnrico Granata } 5821dfcd9dSEnrico Granata 5997206d57SZachary Turner Status error; 6021dfcd9dSEnrico Granata 618f3be7a3SJonas Devlieghere FileSpec dylib_fspec(command[0].ref); 628f3be7a3SJonas Devlieghere FileSystem::Instance().Resolve(dylib_fspec); 6321dfcd9dSEnrico Granata 64e743c782SEnrico Granata if (m_interpreter.GetDebugger().LoadPlugin(dylib_fspec, error)) 6521dfcd9dSEnrico Granata result.SetStatus(eReturnStatusSuccessFinishResult); 66b9c1b51eSKate Stone else { 67e743c782SEnrico Granata result.AppendError(error.AsCString()); 6821dfcd9dSEnrico Granata result.SetStatus(eReturnStatusFailed); 69e743c782SEnrico Granata } 7021dfcd9dSEnrico Granata 7121dfcd9dSEnrico Granata return result.Succeeded(); 7221dfcd9dSEnrico Granata } 7321dfcd9dSEnrico Granata }; 7421dfcd9dSEnrico Granata 757428a18cSKate Stone CommandObjectPlugin::CommandObjectPlugin(CommandInterpreter &interpreter) 76b9c1b51eSKate Stone : CommandObjectMultiword(interpreter, "plugin", 77b9c1b51eSKate Stone "Commands for managing LLDB plugins.", 78b9c1b51eSKate Stone "plugin <subcommand> [<subcommand-options>]") { 79b9c1b51eSKate Stone LoadSubCommand("load", 80b9c1b51eSKate Stone CommandObjectSP(new CommandObjectPluginLoad(interpreter))); 8121dfcd9dSEnrico Granata } 8221dfcd9dSEnrico Granata 8326cac3afSEugene Zelenko CommandObjectPlugin::~CommandObjectPlugin() = default; 84