126cac3afSEugene Zelenko //===-- CommandObjectPlugin.cpp ---------------------------------*- C++ -*-===// 221dfcd9dSEnrico Granata // 321dfcd9dSEnrico Granata // The LLVM Compiler Infrastructure 421dfcd9dSEnrico Granata // 521dfcd9dSEnrico Granata // This file is distributed under the University of Illinois Open Source 621dfcd9dSEnrico Granata // License. See LICENSE.TXT for details. 721dfcd9dSEnrico Granata // 821dfcd9dSEnrico Granata //===----------------------------------------------------------------------===// 921dfcd9dSEnrico Granata 1026cac3afSEugene Zelenko // C Includes 1126cac3afSEugene Zelenko // C++ Includes 1226cac3afSEugene Zelenko // Other libraries and framework includes 1326cac3afSEugene Zelenko // Project includes 1421dfcd9dSEnrico Granata #include "CommandObjectPlugin.h" 1521dfcd9dSEnrico Granata #include "lldb/Host/Host.h" 1621dfcd9dSEnrico Granata #include "lldb/Interpreter/CommandInterpreter.h" 1721dfcd9dSEnrico Granata #include "lldb/Interpreter/CommandReturnObject.h" 1821dfcd9dSEnrico Granata 1921dfcd9dSEnrico Granata using namespace lldb; 2021dfcd9dSEnrico Granata using namespace lldb_private; 2121dfcd9dSEnrico Granata 22*b9c1b51eSKate Stone class CommandObjectPluginLoad : public CommandObjectParsed { 2321dfcd9dSEnrico Granata public: 24*b9c1b51eSKate Stone CommandObjectPluginLoad(CommandInterpreter &interpreter) 25*b9c1b51eSKate Stone : CommandObjectParsed(interpreter, "plugin load", 2621dfcd9dSEnrico Granata "Import a dylib that implements an LLDB plugin.", 27*b9c1b51eSKate Stone nullptr) { 2821dfcd9dSEnrico Granata CommandArgumentEntry arg1; 2921dfcd9dSEnrico Granata CommandArgumentData cmd_arg; 3021dfcd9dSEnrico Granata 3121dfcd9dSEnrico Granata // Define the first (and only) variant of this arg. 3221dfcd9dSEnrico Granata cmd_arg.arg_type = eArgTypeFilename; 3321dfcd9dSEnrico Granata cmd_arg.arg_repetition = eArgRepeatPlain; 3421dfcd9dSEnrico Granata 35*b9c1b51eSKate Stone // There is only one variant this argument could be; put it into the 36*b9c1b51eSKate Stone // argument entry. 3721dfcd9dSEnrico Granata arg1.push_back(cmd_arg); 3821dfcd9dSEnrico Granata 3921dfcd9dSEnrico Granata // Push the data for the first argument into the m_arguments vector. 4021dfcd9dSEnrico Granata m_arguments.push_back(arg1); 4121dfcd9dSEnrico Granata } 4221dfcd9dSEnrico Granata 4326cac3afSEugene Zelenko ~CommandObjectPluginLoad() override = default; 4421dfcd9dSEnrico Granata 45*b9c1b51eSKate Stone int HandleArgumentCompletion(Args &input, int &cursor_index, 4621dfcd9dSEnrico Granata int &cursor_char_position, 4721dfcd9dSEnrico Granata OptionElementVector &opt_element_vector, 48*b9c1b51eSKate Stone int match_start_point, int max_return_elements, 4921dfcd9dSEnrico Granata bool &word_complete, 50*b9c1b51eSKate Stone StringList &matches) override { 5121dfcd9dSEnrico Granata std::string completion_str(input.GetArgumentAtIndex(cursor_index)); 5221dfcd9dSEnrico Granata completion_str.erase(cursor_char_position); 5321dfcd9dSEnrico Granata 54*b9c1b51eSKate Stone CommandCompletions::InvokeCommonCompletionCallbacks( 55*b9c1b51eSKate Stone GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, 56*b9c1b51eSKate Stone completion_str.c_str(), match_start_point, max_return_elements, nullptr, 57*b9c1b51eSKate Stone word_complete, matches); 5821dfcd9dSEnrico Granata return matches.GetSize(); 5921dfcd9dSEnrico Granata } 6021dfcd9dSEnrico Granata 6121dfcd9dSEnrico Granata protected: 62*b9c1b51eSKate Stone bool DoExecute(Args &command, CommandReturnObject &result) override { 6321dfcd9dSEnrico Granata size_t argc = command.GetArgumentCount(); 6421dfcd9dSEnrico Granata 65*b9c1b51eSKate Stone if (argc != 1) { 6621dfcd9dSEnrico Granata result.AppendError("'plugin load' requires one argument"); 6721dfcd9dSEnrico Granata result.SetStatus(eReturnStatusFailed); 6821dfcd9dSEnrico Granata return false; 6921dfcd9dSEnrico Granata } 7021dfcd9dSEnrico Granata 7121dfcd9dSEnrico Granata const char *path = command.GetArgumentAtIndex(0); 7221dfcd9dSEnrico Granata 7321dfcd9dSEnrico Granata Error error; 7421dfcd9dSEnrico Granata 7521dfcd9dSEnrico Granata FileSpec dylib_fspec(path, true); 7621dfcd9dSEnrico Granata 77e743c782SEnrico Granata if (m_interpreter.GetDebugger().LoadPlugin(dylib_fspec, error)) 7821dfcd9dSEnrico Granata result.SetStatus(eReturnStatusSuccessFinishResult); 79*b9c1b51eSKate Stone else { 80e743c782SEnrico Granata result.AppendError(error.AsCString()); 8121dfcd9dSEnrico Granata result.SetStatus(eReturnStatusFailed); 82e743c782SEnrico Granata } 8321dfcd9dSEnrico Granata 8421dfcd9dSEnrico Granata return result.Succeeded(); 8521dfcd9dSEnrico Granata } 8621dfcd9dSEnrico Granata }; 8721dfcd9dSEnrico Granata 887428a18cSKate Stone CommandObjectPlugin::CommandObjectPlugin(CommandInterpreter &interpreter) 89*b9c1b51eSKate Stone : CommandObjectMultiword(interpreter, "plugin", 90*b9c1b51eSKate Stone "Commands for managing LLDB plugins.", 91*b9c1b51eSKate Stone "plugin <subcommand> [<subcommand-options>]") { 92*b9c1b51eSKate Stone LoadSubCommand("load", 93*b9c1b51eSKate Stone CommandObjectSP(new CommandObjectPluginLoad(interpreter))); 9421dfcd9dSEnrico Granata } 9521dfcd9dSEnrico Granata 9626cac3afSEugene Zelenko CommandObjectPlugin::~CommandObjectPlugin() = default; 97