1*21dfcd9dSEnrico Granata //===-- CommandObjectPlugin.cpp ----------------------------------*- C++ -*-===// 2*21dfcd9dSEnrico Granata // 3*21dfcd9dSEnrico Granata // The LLVM Compiler Infrastructure 4*21dfcd9dSEnrico Granata // 5*21dfcd9dSEnrico Granata // This file is distributed under the University of Illinois Open Source 6*21dfcd9dSEnrico Granata // License. See LICENSE.TXT for details. 7*21dfcd9dSEnrico Granata // 8*21dfcd9dSEnrico Granata //===----------------------------------------------------------------------===// 9*21dfcd9dSEnrico Granata 10*21dfcd9dSEnrico Granata #include "CommandObjectPlugin.h" 11*21dfcd9dSEnrico Granata 12*21dfcd9dSEnrico Granata #include "lldb/API/SBDebugger.h" 13*21dfcd9dSEnrico Granata #include "lldb/API/SBCommandInterpreter.h" 14*21dfcd9dSEnrico Granata #include "lldb/API/SBCommandReturnObject.h" 15*21dfcd9dSEnrico Granata 16*21dfcd9dSEnrico Granata #include "lldb/Host/Host.h" 17*21dfcd9dSEnrico Granata 18*21dfcd9dSEnrico Granata #include "lldb/Interpreter/CommandInterpreter.h" 19*21dfcd9dSEnrico Granata #include "lldb/Interpreter/CommandReturnObject.h" 20*21dfcd9dSEnrico Granata 21*21dfcd9dSEnrico Granata using namespace lldb; 22*21dfcd9dSEnrico Granata using namespace lldb_private; 23*21dfcd9dSEnrico Granata 24*21dfcd9dSEnrico Granata class CommandObjectPluginLoad : public CommandObjectParsed 25*21dfcd9dSEnrico Granata { 26*21dfcd9dSEnrico Granata private: 27*21dfcd9dSEnrico Granata public: 28*21dfcd9dSEnrico Granata CommandObjectPluginLoad (CommandInterpreter &interpreter) : 29*21dfcd9dSEnrico Granata CommandObjectParsed (interpreter, 30*21dfcd9dSEnrico Granata "plugin load", 31*21dfcd9dSEnrico Granata "Import a dylib that implements an LLDB plugin.", 32*21dfcd9dSEnrico Granata NULL) 33*21dfcd9dSEnrico Granata { 34*21dfcd9dSEnrico Granata CommandArgumentEntry arg1; 35*21dfcd9dSEnrico Granata CommandArgumentData cmd_arg; 36*21dfcd9dSEnrico Granata 37*21dfcd9dSEnrico Granata // Define the first (and only) variant of this arg. 38*21dfcd9dSEnrico Granata cmd_arg.arg_type = eArgTypeFilename; 39*21dfcd9dSEnrico Granata cmd_arg.arg_repetition = eArgRepeatPlain; 40*21dfcd9dSEnrico Granata 41*21dfcd9dSEnrico Granata // There is only one variant this argument could be; put it into the argument entry. 42*21dfcd9dSEnrico Granata arg1.push_back (cmd_arg); 43*21dfcd9dSEnrico Granata 44*21dfcd9dSEnrico Granata // Push the data for the first argument into the m_arguments vector. 45*21dfcd9dSEnrico Granata m_arguments.push_back (arg1); 46*21dfcd9dSEnrico Granata } 47*21dfcd9dSEnrico Granata 48*21dfcd9dSEnrico Granata ~CommandObjectPluginLoad () 49*21dfcd9dSEnrico Granata { 50*21dfcd9dSEnrico Granata } 51*21dfcd9dSEnrico Granata 52*21dfcd9dSEnrico Granata int 53*21dfcd9dSEnrico Granata HandleArgumentCompletion (Args &input, 54*21dfcd9dSEnrico Granata int &cursor_index, 55*21dfcd9dSEnrico Granata int &cursor_char_position, 56*21dfcd9dSEnrico Granata OptionElementVector &opt_element_vector, 57*21dfcd9dSEnrico Granata int match_start_point, 58*21dfcd9dSEnrico Granata int max_return_elements, 59*21dfcd9dSEnrico Granata bool &word_complete, 60*21dfcd9dSEnrico Granata StringList &matches) 61*21dfcd9dSEnrico Granata { 62*21dfcd9dSEnrico Granata std::string completion_str (input.GetArgumentAtIndex(cursor_index)); 63*21dfcd9dSEnrico Granata completion_str.erase (cursor_char_position); 64*21dfcd9dSEnrico Granata 65*21dfcd9dSEnrico Granata CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, 66*21dfcd9dSEnrico Granata CommandCompletions::eDiskFileCompletion, 67*21dfcd9dSEnrico Granata completion_str.c_str(), 68*21dfcd9dSEnrico Granata match_start_point, 69*21dfcd9dSEnrico Granata max_return_elements, 70*21dfcd9dSEnrico Granata NULL, 71*21dfcd9dSEnrico Granata word_complete, 72*21dfcd9dSEnrico Granata matches); 73*21dfcd9dSEnrico Granata return matches.GetSize(); 74*21dfcd9dSEnrico Granata } 75*21dfcd9dSEnrico Granata 76*21dfcd9dSEnrico Granata protected: 77*21dfcd9dSEnrico Granata bool 78*21dfcd9dSEnrico Granata DoExecute (Args& command, CommandReturnObject &result) 79*21dfcd9dSEnrico Granata { 80*21dfcd9dSEnrico Granata typedef void (*LLDBCommandPluginInit) (lldb::SBDebugger debugger); 81*21dfcd9dSEnrico Granata 82*21dfcd9dSEnrico Granata size_t argc = command.GetArgumentCount(); 83*21dfcd9dSEnrico Granata 84*21dfcd9dSEnrico Granata if (argc != 1) 85*21dfcd9dSEnrico Granata { 86*21dfcd9dSEnrico Granata result.AppendError ("'plugin load' requires one argument"); 87*21dfcd9dSEnrico Granata result.SetStatus (eReturnStatusFailed); 88*21dfcd9dSEnrico Granata return false; 89*21dfcd9dSEnrico Granata } 90*21dfcd9dSEnrico Granata 91*21dfcd9dSEnrico Granata const char* path = command.GetArgumentAtIndex(0); 92*21dfcd9dSEnrico Granata 93*21dfcd9dSEnrico Granata Error error; 94*21dfcd9dSEnrico Granata 95*21dfcd9dSEnrico Granata FileSpec dylib_fspec(path,true); 96*21dfcd9dSEnrico Granata 97*21dfcd9dSEnrico Granata if (m_interpreter.GetDebugger().LoadPlugin(dylib_fspec)) 98*21dfcd9dSEnrico Granata result.SetStatus(eReturnStatusSuccessFinishResult); 99*21dfcd9dSEnrico Granata else 100*21dfcd9dSEnrico Granata result.SetStatus(eReturnStatusFailed); 101*21dfcd9dSEnrico Granata 102*21dfcd9dSEnrico Granata return result.Succeeded(); 103*21dfcd9dSEnrico Granata } 104*21dfcd9dSEnrico Granata }; 105*21dfcd9dSEnrico Granata 106*21dfcd9dSEnrico Granata CommandObjectPlugin::CommandObjectPlugin (CommandInterpreter &interpreter) : 107*21dfcd9dSEnrico Granata CommandObjectMultiword (interpreter, 108*21dfcd9dSEnrico Granata "plugin", 109*21dfcd9dSEnrico Granata "A set of commands for managing or customizing plugin commands.", 110*21dfcd9dSEnrico Granata "plugin <subcommand> [<subcommand-options>]") 111*21dfcd9dSEnrico Granata { 112*21dfcd9dSEnrico Granata LoadSubCommand ("load", CommandObjectSP (new CommandObjectPluginLoad (interpreter))); 113*21dfcd9dSEnrico Granata } 114*21dfcd9dSEnrico Granata 115*21dfcd9dSEnrico Granata CommandObjectPlugin::~CommandObjectPlugin () 116*21dfcd9dSEnrico Granata { 117*21dfcd9dSEnrico Granata } 118