1*26cac3afSEugene 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 10*26cac3afSEugene Zelenko // C Includes 11*26cac3afSEugene Zelenko // C++ Includes 12*26cac3afSEugene Zelenko // Other libraries and framework includes 13*26cac3afSEugene 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 2221dfcd9dSEnrico Granata class CommandObjectPluginLoad : public CommandObjectParsed 2321dfcd9dSEnrico Granata { 2421dfcd9dSEnrico Granata public: 2521dfcd9dSEnrico Granata CommandObjectPluginLoad (CommandInterpreter &interpreter) : 2621dfcd9dSEnrico Granata CommandObjectParsed(interpreter, 2721dfcd9dSEnrico Granata "plugin load", 2821dfcd9dSEnrico Granata "Import a dylib that implements an LLDB plugin.", 29*26cac3afSEugene Zelenko nullptr) 3021dfcd9dSEnrico Granata { 3121dfcd9dSEnrico Granata CommandArgumentEntry arg1; 3221dfcd9dSEnrico Granata CommandArgumentData cmd_arg; 3321dfcd9dSEnrico Granata 3421dfcd9dSEnrico Granata // Define the first (and only) variant of this arg. 3521dfcd9dSEnrico Granata cmd_arg.arg_type = eArgTypeFilename; 3621dfcd9dSEnrico Granata cmd_arg.arg_repetition = eArgRepeatPlain; 3721dfcd9dSEnrico Granata 3821dfcd9dSEnrico Granata // There is only one variant this argument could be; put it into the argument entry. 3921dfcd9dSEnrico Granata arg1.push_back (cmd_arg); 4021dfcd9dSEnrico Granata 4121dfcd9dSEnrico Granata // Push the data for the first argument into the m_arguments vector. 4221dfcd9dSEnrico Granata m_arguments.push_back (arg1); 4321dfcd9dSEnrico Granata } 4421dfcd9dSEnrico Granata 45*26cac3afSEugene Zelenko ~CommandObjectPluginLoad() override = default; 4621dfcd9dSEnrico Granata 4721dfcd9dSEnrico Granata int 4821dfcd9dSEnrico Granata HandleArgumentCompletion (Args &input, 4921dfcd9dSEnrico Granata int &cursor_index, 5021dfcd9dSEnrico Granata int &cursor_char_position, 5121dfcd9dSEnrico Granata OptionElementVector &opt_element_vector, 5221dfcd9dSEnrico Granata int match_start_point, 5321dfcd9dSEnrico Granata int max_return_elements, 5421dfcd9dSEnrico Granata bool &word_complete, 5513d21e9aSBruce Mitchener StringList &matches) override 5621dfcd9dSEnrico Granata { 5721dfcd9dSEnrico Granata std::string completion_str (input.GetArgumentAtIndex(cursor_index)); 5821dfcd9dSEnrico Granata completion_str.erase (cursor_char_position); 5921dfcd9dSEnrico Granata 6021dfcd9dSEnrico Granata CommandCompletions::InvokeCommonCompletionCallbacks(m_interpreter, 6121dfcd9dSEnrico Granata CommandCompletions::eDiskFileCompletion, 6221dfcd9dSEnrico Granata completion_str.c_str(), 6321dfcd9dSEnrico Granata match_start_point, 6421dfcd9dSEnrico Granata max_return_elements, 65*26cac3afSEugene Zelenko nullptr, 6621dfcd9dSEnrico Granata word_complete, 6721dfcd9dSEnrico Granata matches); 6821dfcd9dSEnrico Granata return matches.GetSize(); 6921dfcd9dSEnrico Granata } 7021dfcd9dSEnrico Granata 7121dfcd9dSEnrico Granata protected: 7221dfcd9dSEnrico Granata bool 7313d21e9aSBruce Mitchener DoExecute (Args& command, CommandReturnObject &result) override 7421dfcd9dSEnrico Granata { 7521dfcd9dSEnrico Granata size_t argc = command.GetArgumentCount(); 7621dfcd9dSEnrico Granata 7721dfcd9dSEnrico Granata if (argc != 1) 7821dfcd9dSEnrico Granata { 7921dfcd9dSEnrico Granata result.AppendError ("'plugin load' requires one argument"); 8021dfcd9dSEnrico Granata result.SetStatus (eReturnStatusFailed); 8121dfcd9dSEnrico Granata return false; 8221dfcd9dSEnrico Granata } 8321dfcd9dSEnrico Granata 8421dfcd9dSEnrico Granata const char* path = command.GetArgumentAtIndex(0); 8521dfcd9dSEnrico Granata 8621dfcd9dSEnrico Granata Error error; 8721dfcd9dSEnrico Granata 8821dfcd9dSEnrico Granata FileSpec dylib_fspec(path,true); 8921dfcd9dSEnrico Granata 90e743c782SEnrico Granata if (m_interpreter.GetDebugger().LoadPlugin(dylib_fspec, error)) 9121dfcd9dSEnrico Granata result.SetStatus(eReturnStatusSuccessFinishResult); 9221dfcd9dSEnrico Granata else 93e743c782SEnrico Granata { 94e743c782SEnrico Granata result.AppendError(error.AsCString()); 9521dfcd9dSEnrico Granata result.SetStatus(eReturnStatusFailed); 96e743c782SEnrico Granata } 9721dfcd9dSEnrico Granata 9821dfcd9dSEnrico Granata return result.Succeeded(); 9921dfcd9dSEnrico Granata } 10021dfcd9dSEnrico Granata }; 10121dfcd9dSEnrico Granata 10221dfcd9dSEnrico Granata CommandObjectPlugin::CommandObjectPlugin (CommandInterpreter &interpreter) : 10321dfcd9dSEnrico Granata CommandObjectMultiword (interpreter, 10421dfcd9dSEnrico Granata "plugin", 10521dfcd9dSEnrico Granata "A set of commands for managing or customizing plugin commands.", 10621dfcd9dSEnrico Granata "plugin <subcommand> [<subcommand-options>]") 10721dfcd9dSEnrico Granata { 10821dfcd9dSEnrico Granata LoadSubCommand ("load", CommandObjectSP (new CommandObjectPluginLoad (interpreter))); 10921dfcd9dSEnrico Granata } 11021dfcd9dSEnrico Granata 111*26cac3afSEugene Zelenko CommandObjectPlugin::~CommandObjectPlugin() = default; 112