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