121dfcd9dSEnrico Granata //===-- 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 
1021dfcd9dSEnrico Granata #include "CommandObjectPlugin.h"
1121dfcd9dSEnrico Granata 
1221dfcd9dSEnrico Granata #include "lldb/Host/Host.h"
1321dfcd9dSEnrico Granata 
1421dfcd9dSEnrico Granata #include "lldb/Interpreter/CommandInterpreter.h"
1521dfcd9dSEnrico Granata #include "lldb/Interpreter/CommandReturnObject.h"
1621dfcd9dSEnrico Granata 
1721dfcd9dSEnrico Granata using namespace lldb;
1821dfcd9dSEnrico Granata using namespace lldb_private;
1921dfcd9dSEnrico Granata 
2021dfcd9dSEnrico Granata class CommandObjectPluginLoad : public CommandObjectParsed
2121dfcd9dSEnrico Granata {
2221dfcd9dSEnrico Granata private:
2321dfcd9dSEnrico Granata public:
2421dfcd9dSEnrico Granata     CommandObjectPluginLoad (CommandInterpreter &interpreter) :
2521dfcd9dSEnrico Granata     CommandObjectParsed (interpreter,
2621dfcd9dSEnrico Granata                          "plugin load",
2721dfcd9dSEnrico Granata                          "Import a dylib that implements an LLDB plugin.",
2821dfcd9dSEnrico Granata                          NULL)
2921dfcd9dSEnrico Granata     {
3021dfcd9dSEnrico Granata         CommandArgumentEntry arg1;
3121dfcd9dSEnrico Granata         CommandArgumentData cmd_arg;
3221dfcd9dSEnrico Granata 
3321dfcd9dSEnrico Granata         // Define the first (and only) variant of this arg.
3421dfcd9dSEnrico Granata         cmd_arg.arg_type = eArgTypeFilename;
3521dfcd9dSEnrico Granata         cmd_arg.arg_repetition = eArgRepeatPlain;
3621dfcd9dSEnrico Granata 
3721dfcd9dSEnrico Granata         // There is only one variant this argument could be; put it into the argument entry.
3821dfcd9dSEnrico Granata         arg1.push_back (cmd_arg);
3921dfcd9dSEnrico Granata 
4021dfcd9dSEnrico Granata         // Push the data for the first argument into the m_arguments vector.
4121dfcd9dSEnrico Granata         m_arguments.push_back (arg1);
4221dfcd9dSEnrico Granata     }
4321dfcd9dSEnrico Granata 
44*13d21e9aSBruce Mitchener     ~CommandObjectPluginLoad () override
4521dfcd9dSEnrico Granata     {
4621dfcd9dSEnrico Granata     }
4721dfcd9dSEnrico Granata 
4821dfcd9dSEnrico Granata     int
4921dfcd9dSEnrico Granata     HandleArgumentCompletion (Args &input,
5021dfcd9dSEnrico Granata                               int &cursor_index,
5121dfcd9dSEnrico Granata                               int &cursor_char_position,
5221dfcd9dSEnrico Granata                               OptionElementVector &opt_element_vector,
5321dfcd9dSEnrico Granata                               int match_start_point,
5421dfcd9dSEnrico Granata                               int max_return_elements,
5521dfcd9dSEnrico Granata                               bool &word_complete,
56*13d21e9aSBruce Mitchener                               StringList &matches) override
5721dfcd9dSEnrico Granata     {
5821dfcd9dSEnrico Granata         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
5921dfcd9dSEnrico Granata         completion_str.erase (cursor_char_position);
6021dfcd9dSEnrico Granata 
6121dfcd9dSEnrico Granata         CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
6221dfcd9dSEnrico Granata                                                              CommandCompletions::eDiskFileCompletion,
6321dfcd9dSEnrico Granata                                                              completion_str.c_str(),
6421dfcd9dSEnrico Granata                                                              match_start_point,
6521dfcd9dSEnrico Granata                                                              max_return_elements,
6621dfcd9dSEnrico Granata                                                              NULL,
6721dfcd9dSEnrico Granata                                                              word_complete,
6821dfcd9dSEnrico Granata                                                              matches);
6921dfcd9dSEnrico Granata         return matches.GetSize();
7021dfcd9dSEnrico Granata     }
7121dfcd9dSEnrico Granata 
7221dfcd9dSEnrico Granata protected:
7321dfcd9dSEnrico Granata     bool
74*13d21e9aSBruce Mitchener     DoExecute (Args& command, CommandReturnObject &result) override
7521dfcd9dSEnrico Granata     {
7621dfcd9dSEnrico Granata         size_t argc = command.GetArgumentCount();
7721dfcd9dSEnrico Granata 
7821dfcd9dSEnrico Granata         if (argc != 1)
7921dfcd9dSEnrico Granata         {
8021dfcd9dSEnrico Granata             result.AppendError ("'plugin load' requires one argument");
8121dfcd9dSEnrico Granata             result.SetStatus (eReturnStatusFailed);
8221dfcd9dSEnrico Granata             return false;
8321dfcd9dSEnrico Granata         }
8421dfcd9dSEnrico Granata 
8521dfcd9dSEnrico Granata         const char* path = command.GetArgumentAtIndex(0);
8621dfcd9dSEnrico Granata 
8721dfcd9dSEnrico Granata         Error error;
8821dfcd9dSEnrico Granata 
8921dfcd9dSEnrico Granata         FileSpec dylib_fspec(path,true);
9021dfcd9dSEnrico Granata 
91e743c782SEnrico Granata         if (m_interpreter.GetDebugger().LoadPlugin(dylib_fspec, error))
9221dfcd9dSEnrico Granata             result.SetStatus(eReturnStatusSuccessFinishResult);
9321dfcd9dSEnrico Granata         else
94e743c782SEnrico Granata         {
95e743c782SEnrico Granata             result.AppendError(error.AsCString());
9621dfcd9dSEnrico Granata             result.SetStatus(eReturnStatusFailed);
97e743c782SEnrico Granata         }
9821dfcd9dSEnrico Granata 
9921dfcd9dSEnrico Granata         return result.Succeeded();
10021dfcd9dSEnrico Granata     }
10121dfcd9dSEnrico Granata };
10221dfcd9dSEnrico Granata 
10321dfcd9dSEnrico Granata CommandObjectPlugin::CommandObjectPlugin (CommandInterpreter &interpreter) :
10421dfcd9dSEnrico Granata CommandObjectMultiword (interpreter,
10521dfcd9dSEnrico Granata                         "plugin",
10621dfcd9dSEnrico Granata                         "A set of commands for managing or customizing plugin commands.",
10721dfcd9dSEnrico Granata                         "plugin <subcommand> [<subcommand-options>]")
10821dfcd9dSEnrico Granata {
10921dfcd9dSEnrico Granata     LoadSubCommand ("load",  CommandObjectSP (new CommandObjectPluginLoad (interpreter)));
11021dfcd9dSEnrico Granata }
11121dfcd9dSEnrico Granata 
11221dfcd9dSEnrico Granata CommandObjectPlugin::~CommandObjectPlugin ()
11321dfcd9dSEnrico Granata {
11421dfcd9dSEnrico Granata }
115