16d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata//===-- CommandObjectPlugin.cpp ----------------------------------*- C++ -*-===// 26d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata// 36d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata// The LLVM Compiler Infrastructure 46d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata// 56d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata// This file is distributed under the University of Illinois Open Source 66d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata// License. See LICENSE.TXT for details. 76d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata// 86d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata//===----------------------------------------------------------------------===// 96d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 126d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "CommandObjectPlugin.h" 136d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 146d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "lldb/API/SBDebugger.h" 156d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "lldb/API/SBCommandInterpreter.h" 166d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "lldb/API/SBCommandReturnObject.h" 176d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 186d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "lldb/Host/Host.h" 196d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 206d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "lldb/Interpreter/CommandInterpreter.h" 216d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "lldb/Interpreter/CommandReturnObject.h" 226d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 236d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatausing namespace lldb; 246d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatausing namespace lldb_private; 256d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 266d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granataclass CommandObjectPluginLoad : public CommandObjectParsed 276d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 286d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granataprivate: 296d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatapublic: 306d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata CommandObjectPluginLoad (CommandInterpreter &interpreter) : 316d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata CommandObjectParsed (interpreter, 326d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata "plugin load", 336d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata "Import a dylib that implements an LLDB plugin.", 346d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata NULL) 356d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 366d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata CommandArgumentEntry arg1; 376d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata CommandArgumentData cmd_arg; 386d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 396d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // Define the first (and only) variant of this arg. 406d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata cmd_arg.arg_type = eArgTypeFilename; 416d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata cmd_arg.arg_repetition = eArgRepeatPlain; 426d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 436d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // There is only one variant this argument could be; put it into the argument entry. 446d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata arg1.push_back (cmd_arg); 456d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 466d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // Push the data for the first argument into the m_arguments vector. 476d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata m_arguments.push_back (arg1); 486d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 496d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 506d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata ~CommandObjectPluginLoad () 516d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 526d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 536d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 546d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata int 556d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata HandleArgumentCompletion (Args &input, 566d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata int &cursor_index, 576d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata int &cursor_char_position, 586d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata OptionElementVector &opt_element_vector, 596d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata int match_start_point, 606d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata int max_return_elements, 616d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata bool &word_complete, 626d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata StringList &matches) 636d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 646d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata std::string completion_str (input.GetArgumentAtIndex(cursor_index)); 656d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata completion_str.erase (cursor_char_position); 666d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 676d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, 686d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata CommandCompletions::eDiskFileCompletion, 696d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata completion_str.c_str(), 706d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata match_start_point, 716d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata max_return_elements, 726d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata NULL, 736d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata word_complete, 746d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata matches); 756d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return matches.GetSize(); 766d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 776d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 786d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granataprotected: 796d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata bool 806d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata DoExecute (Args& command, CommandReturnObject &result) 816d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 826d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata typedef void (*LLDBCommandPluginInit) (lldb::SBDebugger debugger); 836d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 846d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata size_t argc = command.GetArgumentCount(); 856d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 866d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (argc != 1) 876d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 886d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata result.AppendError ("'plugin load' requires one argument"); 896d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata result.SetStatus (eReturnStatusFailed); 906d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return false; 916d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 926d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 936d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const char* path = command.GetArgumentAtIndex(0); 946d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 956d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata Error error; 966d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 976d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec dylib_fspec(path,true); 986d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 99323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata if (m_interpreter.GetDebugger().LoadPlugin(dylib_fspec, error)) 1006d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata result.SetStatus(eReturnStatusSuccessFinishResult); 1016d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata else 102323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata { 103323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata result.AppendError(error.AsCString()); 1046d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata result.SetStatus(eReturnStatusFailed); 105323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata } 1066d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 1076d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return result.Succeeded(); 1086d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 1096d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata}; 1106d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 1116d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico GranataCommandObjectPlugin::CommandObjectPlugin (CommandInterpreter &interpreter) : 1126d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico GranataCommandObjectMultiword (interpreter, 1136d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata "plugin", 1146d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata "A set of commands for managing or customizing plugin commands.", 1156d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata "plugin <subcommand> [<subcommand-options>]") 1166d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 1176d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata LoadSubCommand ("load", CommandObjectSP (new CommandObjectPluginLoad (interpreter))); 1186d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata} 1196d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 1206d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico GranataCommandObjectPlugin::~CommandObjectPlugin () 1216d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 1226d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata} 123