95 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- CommandObjectPlugin.cpp ---------------------------------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| // C Includes
 | |
| // C++ Includes
 | |
| // Other libraries and framework includes
 | |
| // Project includes
 | |
| #include "CommandObjectPlugin.h"
 | |
| #include "lldb/Host/Host.h"
 | |
| #include "lldb/Interpreter/CommandInterpreter.h"
 | |
| #include "lldb/Interpreter/CommandReturnObject.h"
 | |
| 
 | |
| using namespace lldb;
 | |
| using namespace lldb_private;
 | |
| 
 | |
| class CommandObjectPluginLoad : public CommandObjectParsed {
 | |
| public:
 | |
|   CommandObjectPluginLoad(CommandInterpreter &interpreter)
 | |
|       : CommandObjectParsed(interpreter, "plugin load",
 | |
|                             "Import a dylib that implements an LLDB plugin.",
 | |
|                             nullptr) {
 | |
|     CommandArgumentEntry arg1;
 | |
|     CommandArgumentData cmd_arg;
 | |
| 
 | |
|     // Define the first (and only) variant of this arg.
 | |
|     cmd_arg.arg_type = eArgTypeFilename;
 | |
|     cmd_arg.arg_repetition = eArgRepeatPlain;
 | |
| 
 | |
|     // There is only one variant this argument could be; put it into the
 | |
|     // argument entry.
 | |
|     arg1.push_back(cmd_arg);
 | |
| 
 | |
|     // Push the data for the first argument into the m_arguments vector.
 | |
|     m_arguments.push_back(arg1);
 | |
|   }
 | |
| 
 | |
|   ~CommandObjectPluginLoad() override = default;
 | |
| 
 | |
|   int HandleArgumentCompletion(Args &input, int &cursor_index,
 | |
|                                int &cursor_char_position,
 | |
|                                OptionElementVector &opt_element_vector,
 | |
|                                int match_start_point, int max_return_elements,
 | |
|                                bool &word_complete,
 | |
|                                StringList &matches) override {
 | |
|     auto completion_str = input[cursor_index].ref;
 | |
|     completion_str = completion_str.take_front(cursor_char_position);
 | |
| 
 | |
|     CommandCompletions::InvokeCommonCompletionCallbacks(
 | |
|         GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion,
 | |
|         completion_str, match_start_point, max_return_elements, nullptr,
 | |
|         word_complete, matches);
 | |
|     return matches.GetSize();
 | |
|   }
 | |
| 
 | |
| protected:
 | |
|   bool DoExecute(Args &command, CommandReturnObject &result) override {
 | |
|     size_t argc = command.GetArgumentCount();
 | |
| 
 | |
|     if (argc != 1) {
 | |
|       result.AppendError("'plugin load' requires one argument");
 | |
|       result.SetStatus(eReturnStatusFailed);
 | |
|       return false;
 | |
|     }
 | |
| 
 | |
|     Status error;
 | |
| 
 | |
|     FileSpec dylib_fspec(command[0].ref, true);
 | |
| 
 | |
|     if (m_interpreter.GetDebugger().LoadPlugin(dylib_fspec, error))
 | |
|       result.SetStatus(eReturnStatusSuccessFinishResult);
 | |
|     else {
 | |
|       result.AppendError(error.AsCString());
 | |
|       result.SetStatus(eReturnStatusFailed);
 | |
|     }
 | |
| 
 | |
|     return result.Succeeded();
 | |
|   }
 | |
| };
 | |
| 
 | |
| CommandObjectPlugin::CommandObjectPlugin(CommandInterpreter &interpreter)
 | |
|     : CommandObjectMultiword(interpreter, "plugin",
 | |
|                              "Commands for managing LLDB plugins.",
 | |
|                              "plugin <subcommand> [<subcommand-options>]") {
 | |
|   LoadSubCommand("load",
 | |
|                  CommandObjectSP(new CommandObjectPluginLoad(interpreter)));
 | |
| }
 | |
| 
 | |
| CommandObjectPlugin::~CommandObjectPlugin() = default;
 |