130fdc8d8SChris Lattner //===-- CommandObject.cpp ---------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/Interpreter/CommandObject.h"
1130fdc8d8SChris Lattner 
1230fdc8d8SChris Lattner #include <string>
13ea671fbdSKate Stone #include <sstream>
1430fdc8d8SChris Lattner #include <map>
1530fdc8d8SChris Lattner 
1630fdc8d8SChris Lattner #include <stdlib.h>
1730fdc8d8SChris Lattner #include <ctype.h>
1830fdc8d8SChris Lattner 
1930fdc8d8SChris Lattner #include "lldb/Core/Address.h"
20ca7835c6SJohnny Chen #include "lldb/Core/ArchSpec.h"
2140af72e1SJim Ingham #include "lldb/Interpreter/Options.h"
2230fdc8d8SChris Lattner 
2330fdc8d8SChris Lattner // These are for the Sourcename completers.
2430fdc8d8SChris Lattner // FIXME: Make a separate file for the completers.
2553239f00SGreg Clayton #include "lldb/Host/FileSpec.h"
2630fdc8d8SChris Lattner #include "lldb/Core/FileSpecList.h"
27a78bd7ffSZachary Turner #include "lldb/DataFormatters/FormatManager.h"
2830fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2930fdc8d8SChris Lattner #include "lldb/Target/Target.h"
3030fdc8d8SChris Lattner 
310e0984eeSJim Ingham #include "lldb/Target/Language.h"
320e0984eeSJim Ingham 
3330fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h"
3430fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h"
3530fdc8d8SChris Lattner 
3630fdc8d8SChris Lattner using namespace lldb;
3730fdc8d8SChris Lattner using namespace lldb_private;
3830fdc8d8SChris Lattner 
3930fdc8d8SChris Lattner //-------------------------------------------------------------------------
4030fdc8d8SChris Lattner // CommandObject
4130fdc8d8SChris Lattner //-------------------------------------------------------------------------
4230fdc8d8SChris Lattner 
43a7015092SGreg Clayton CommandObject::CommandObject
44a7015092SGreg Clayton (
45a7015092SGreg Clayton     CommandInterpreter &interpreter,
46a7015092SGreg Clayton     const char *name,
47a7015092SGreg Clayton     const char *help,
48a7015092SGreg Clayton     const char *syntax,
49a7015092SGreg Clayton     uint32_t flags
50a7015092SGreg Clayton ) :
51a7015092SGreg Clayton     m_interpreter (interpreter),
522f02fe0bSEnrico Granata     m_cmd_name (name ? name : ""),
5330fdc8d8SChris Lattner     m_cmd_help_short (),
5430fdc8d8SChris Lattner     m_cmd_help_long (),
5530fdc8d8SChris Lattner     m_cmd_syntax (),
56e139cf23SCaroline Tice     m_flags (flags),
57a9f7b79dSGreg Clayton     m_arguments(),
586d8873f9SJim Ingham     m_deprecated_command_override_callback (nullptr),
59d78c9576SEd Maste     m_command_override_callback (nullptr),
60d78c9576SEd Maste     m_command_override_baton (nullptr)
6130fdc8d8SChris Lattner {
6230fdc8d8SChris Lattner     if (help && help[0])
6330fdc8d8SChris Lattner         m_cmd_help_short = help;
6430fdc8d8SChris Lattner     if (syntax && syntax[0])
6530fdc8d8SChris Lattner         m_cmd_syntax = syntax;
6630fdc8d8SChris Lattner }
6730fdc8d8SChris Lattner 
6830fdc8d8SChris Lattner CommandObject::~CommandObject ()
6930fdc8d8SChris Lattner {
7030fdc8d8SChris Lattner }
7130fdc8d8SChris Lattner 
7230fdc8d8SChris Lattner const char *
7330fdc8d8SChris Lattner CommandObject::GetHelp ()
7430fdc8d8SChris Lattner {
7530fdc8d8SChris Lattner     return m_cmd_help_short.c_str();
7630fdc8d8SChris Lattner }
7730fdc8d8SChris Lattner 
7830fdc8d8SChris Lattner const char *
7930fdc8d8SChris Lattner CommandObject::GetHelpLong ()
8030fdc8d8SChris Lattner {
8130fdc8d8SChris Lattner     return m_cmd_help_long.c_str();
8230fdc8d8SChris Lattner }
8330fdc8d8SChris Lattner 
8430fdc8d8SChris Lattner const char *
8530fdc8d8SChris Lattner CommandObject::GetSyntax ()
8630fdc8d8SChris Lattner {
87e139cf23SCaroline Tice     if (m_cmd_syntax.length() == 0)
88e139cf23SCaroline Tice     {
89e139cf23SCaroline Tice         StreamString syntax_str;
90e139cf23SCaroline Tice         syntax_str.Printf ("%s", GetCommandName());
91bef55ac8SEnrico Granata         if (!IsDashDashCommand() && GetOptions() != nullptr)
92e139cf23SCaroline Tice             syntax_str.Printf (" <cmd-options>");
93e139cf23SCaroline Tice         if (m_arguments.size() > 0)
94e139cf23SCaroline Tice         {
95e139cf23SCaroline Tice             syntax_str.Printf (" ");
96bef55ac8SEnrico Granata             if (!IsDashDashCommand() && WantsRawCommandString() && GetOptions() && GetOptions()->NumCommandOptions())
97a4c6ad19SSean Callanan                 syntax_str.Printf("-- ");
98e139cf23SCaroline Tice             GetFormattedCommandArguments (syntax_str);
99e139cf23SCaroline Tice         }
100e139cf23SCaroline Tice         m_cmd_syntax = syntax_str.GetData ();
101e139cf23SCaroline Tice     }
102e139cf23SCaroline Tice 
10330fdc8d8SChris Lattner     return m_cmd_syntax.c_str();
10430fdc8d8SChris Lattner }
10530fdc8d8SChris Lattner 
10630fdc8d8SChris Lattner const char *
10730fdc8d8SChris Lattner CommandObject::GetCommandName ()
10830fdc8d8SChris Lattner {
10930fdc8d8SChris Lattner     return m_cmd_name.c_str();
11030fdc8d8SChris Lattner }
11130fdc8d8SChris Lattner 
11230fdc8d8SChris Lattner void
11330fdc8d8SChris Lattner CommandObject::SetCommandName (const char *name)
11430fdc8d8SChris Lattner {
11530fdc8d8SChris Lattner     m_cmd_name = name;
11630fdc8d8SChris Lattner }
11730fdc8d8SChris Lattner 
11830fdc8d8SChris Lattner void
11930fdc8d8SChris Lattner CommandObject::SetHelp (const char *cstr)
12030fdc8d8SChris Lattner {
121bfb75e9bSEnrico Granata     if (cstr)
12230fdc8d8SChris Lattner         m_cmd_help_short = cstr;
123bfb75e9bSEnrico Granata     else
124bfb75e9bSEnrico Granata         m_cmd_help_short.assign("");
1256f79bb2dSEnrico Granata }
1266f79bb2dSEnrico Granata 
1276f79bb2dSEnrico Granata void
12830fdc8d8SChris Lattner CommandObject::SetHelpLong (const char *cstr)
12930fdc8d8SChris Lattner {
130bfb75e9bSEnrico Granata     if (cstr)
13130fdc8d8SChris Lattner         m_cmd_help_long = cstr;
132bfb75e9bSEnrico Granata     else
133bfb75e9bSEnrico Granata         m_cmd_help_long.assign("");
13499f0b8f9SEnrico Granata }
13599f0b8f9SEnrico Granata 
13699f0b8f9SEnrico Granata void
13730fdc8d8SChris Lattner CommandObject::SetSyntax (const char *cstr)
13830fdc8d8SChris Lattner {
13930fdc8d8SChris Lattner     m_cmd_syntax = cstr;
14030fdc8d8SChris Lattner }
14130fdc8d8SChris Lattner 
14230fdc8d8SChris Lattner Options *
14330fdc8d8SChris Lattner CommandObject::GetOptions ()
14430fdc8d8SChris Lattner {
14530fdc8d8SChris Lattner     // By default commands don't have options unless this virtual function
14630fdc8d8SChris Lattner     // is overridden by base classes.
147d78c9576SEd Maste     return nullptr;
14830fdc8d8SChris Lattner }
14930fdc8d8SChris Lattner 
15030fdc8d8SChris Lattner bool
15130fdc8d8SChris Lattner CommandObject::ParseOptions
15230fdc8d8SChris Lattner (
15330fdc8d8SChris Lattner     Args& args,
15430fdc8d8SChris Lattner     CommandReturnObject &result
15530fdc8d8SChris Lattner )
15630fdc8d8SChris Lattner {
15730fdc8d8SChris Lattner     // See if the subclass has options?
15830fdc8d8SChris Lattner     Options *options = GetOptions();
159d78c9576SEd Maste     if (options != nullptr)
16030fdc8d8SChris Lattner     {
16130fdc8d8SChris Lattner         Error error;
162*e1cfbc79STodd Fiala 
163*e1cfbc79STodd Fiala         auto exe_ctx = GetCommandInterpreter().GetExecutionContext();
164*e1cfbc79STodd Fiala         options->NotifyOptionParsingStarting(&exe_ctx);
16530fdc8d8SChris Lattner 
166b7ad58a0SGreg Clayton         // ParseOptions calls getopt_long_only, which always skips the zero'th item in the array and starts at position 1,
16730fdc8d8SChris Lattner         // so we need to push a dummy value into position zero.
16830fdc8d8SChris Lattner         args.Unshift("dummy_string");
169*e1cfbc79STodd Fiala         const bool require_validation = true;
170*e1cfbc79STodd Fiala         error = args.ParseOptions(*options, &exe_ctx,
171*e1cfbc79STodd Fiala                                   GetCommandInterpreter().GetPlatform(true),
172*e1cfbc79STodd Fiala                                   require_validation);
17330fdc8d8SChris Lattner 
17430fdc8d8SChris Lattner         // The "dummy_string" will have already been removed by ParseOptions,
17530fdc8d8SChris Lattner         // so no need to remove it.
17630fdc8d8SChris Lattner 
177f6b8b581SGreg Clayton         if (error.Success())
178*e1cfbc79STodd Fiala             error = options->NotifyOptionParsingFinished(&exe_ctx);
179f6b8b581SGreg Clayton 
180f6b8b581SGreg Clayton         if (error.Success())
181f6b8b581SGreg Clayton         {
182f6b8b581SGreg Clayton             if (options->VerifyOptions (result))
183f6b8b581SGreg Clayton                 return true;
184f6b8b581SGreg Clayton         }
185f6b8b581SGreg Clayton         else
18630fdc8d8SChris Lattner         {
18730fdc8d8SChris Lattner             const char *error_cstr = error.AsCString();
18830fdc8d8SChris Lattner             if (error_cstr)
18930fdc8d8SChris Lattner             {
19030fdc8d8SChris Lattner                 // We got an error string, lets use that
19186edbf41SGreg Clayton                 result.AppendError(error_cstr);
19230fdc8d8SChris Lattner             }
19330fdc8d8SChris Lattner             else
19430fdc8d8SChris Lattner             {
19530fdc8d8SChris Lattner                 // No error string, output the usage information into result
196*e1cfbc79STodd Fiala                 options->GenerateOptionUsage(result.GetErrorStream(), this,
197*e1cfbc79STodd Fiala                                              GetCommandInterpreter()
198*e1cfbc79STodd Fiala                                                 .GetDebugger()
199*e1cfbc79STodd Fiala                                                 .GetTerminalWidth());
20030fdc8d8SChris Lattner             }
201f6b8b581SGreg Clayton         }
20230fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
20330fdc8d8SChris Lattner         return false;
20430fdc8d8SChris Lattner     }
20530fdc8d8SChris Lattner     return true;
20630fdc8d8SChris Lattner }
20730fdc8d8SChris Lattner 
2085a988416SJim Ingham 
2095a988416SJim Ingham 
2105a988416SJim Ingham bool
211f9fc609fSGreg Clayton CommandObject::CheckRequirements (CommandReturnObject &result)
2125a988416SJim Ingham {
213f9fc609fSGreg Clayton #ifdef LLDB_CONFIGURATION_DEBUG
214f9fc609fSGreg Clayton     // Nothing should be stored in m_exe_ctx between running commands as m_exe_ctx
215f9fc609fSGreg Clayton     // has shared pointers to the target, process, thread and frame and we don't
216f9fc609fSGreg Clayton     // want any CommandObject instances to keep any of these objects around
217f9fc609fSGreg Clayton     // longer than for a single command. Every command should call
218f9fc609fSGreg Clayton     // CommandObject::Cleanup() after it has completed
219f9fc609fSGreg Clayton     assert (m_exe_ctx.GetTargetPtr() == NULL);
220f9fc609fSGreg Clayton     assert (m_exe_ctx.GetProcessPtr() == NULL);
221f9fc609fSGreg Clayton     assert (m_exe_ctx.GetThreadPtr() == NULL);
222f9fc609fSGreg Clayton     assert (m_exe_ctx.GetFramePtr() == NULL);
223f9fc609fSGreg Clayton #endif
224f9fc609fSGreg Clayton 
225f9fc609fSGreg Clayton     // Lock down the interpreter's execution context prior to running the
226f9fc609fSGreg Clayton     // command so we guarantee the selected target, process, thread and frame
227f9fc609fSGreg Clayton     // can't go away during the execution
228f9fc609fSGreg Clayton     m_exe_ctx = m_interpreter.GetExecutionContext();
229f9fc609fSGreg Clayton 
230f9fc609fSGreg Clayton     const uint32_t flags = GetFlags().Get();
231e87764f2SEnrico Granata     if (flags & (eCommandRequiresTarget   |
232e87764f2SEnrico Granata                  eCommandRequiresProcess  |
233e87764f2SEnrico Granata                  eCommandRequiresThread   |
234e87764f2SEnrico Granata                  eCommandRequiresFrame    |
235e87764f2SEnrico Granata                  eCommandTryTargetAPILock ))
236f9fc609fSGreg Clayton     {
237f9fc609fSGreg Clayton 
238e87764f2SEnrico Granata         if ((flags & eCommandRequiresTarget) && !m_exe_ctx.HasTargetScope())
239f9fc609fSGreg Clayton         {
240f9fc609fSGreg Clayton             result.AppendError (GetInvalidTargetDescription());
241f9fc609fSGreg Clayton             return false;
242f9fc609fSGreg Clayton         }
243f9fc609fSGreg Clayton 
244e87764f2SEnrico Granata         if ((flags & eCommandRequiresProcess) && !m_exe_ctx.HasProcessScope())
245f9fc609fSGreg Clayton         {
246e59b0d2cSJason Molenda             if (!m_exe_ctx.HasTargetScope())
247e59b0d2cSJason Molenda                 result.AppendError (GetInvalidTargetDescription());
248e59b0d2cSJason Molenda             else
249f9fc609fSGreg Clayton                 result.AppendError (GetInvalidProcessDescription());
250f9fc609fSGreg Clayton             return false;
251f9fc609fSGreg Clayton         }
252f9fc609fSGreg Clayton 
253e87764f2SEnrico Granata         if ((flags & eCommandRequiresThread) && !m_exe_ctx.HasThreadScope())
254f9fc609fSGreg Clayton         {
255e59b0d2cSJason Molenda             if (!m_exe_ctx.HasTargetScope())
256e59b0d2cSJason Molenda                 result.AppendError (GetInvalidTargetDescription());
257e59b0d2cSJason Molenda             else if (!m_exe_ctx.HasProcessScope())
258e59b0d2cSJason Molenda                 result.AppendError (GetInvalidProcessDescription());
259e59b0d2cSJason Molenda             else
260f9fc609fSGreg Clayton                 result.AppendError (GetInvalidThreadDescription());
261f9fc609fSGreg Clayton             return false;
262f9fc609fSGreg Clayton         }
263f9fc609fSGreg Clayton 
264e87764f2SEnrico Granata         if ((flags & eCommandRequiresFrame) && !m_exe_ctx.HasFrameScope())
265f9fc609fSGreg Clayton         {
266e59b0d2cSJason Molenda             if (!m_exe_ctx.HasTargetScope())
267e59b0d2cSJason Molenda                 result.AppendError (GetInvalidTargetDescription());
268e59b0d2cSJason Molenda             else if (!m_exe_ctx.HasProcessScope())
269e59b0d2cSJason Molenda                 result.AppendError (GetInvalidProcessDescription());
270e59b0d2cSJason Molenda             else if (!m_exe_ctx.HasThreadScope())
271e59b0d2cSJason Molenda                 result.AppendError (GetInvalidThreadDescription());
272e59b0d2cSJason Molenda             else
273f9fc609fSGreg Clayton                 result.AppendError (GetInvalidFrameDescription());
274f9fc609fSGreg Clayton             return false;
275f9fc609fSGreg Clayton         }
276f9fc609fSGreg Clayton 
277e87764f2SEnrico Granata         if ((flags & eCommandRequiresRegContext) && (m_exe_ctx.GetRegisterContext() == nullptr))
278f9fc609fSGreg Clayton         {
279f9fc609fSGreg Clayton             result.AppendError (GetInvalidRegContextDescription());
280f9fc609fSGreg Clayton             return false;
281f9fc609fSGreg Clayton         }
282f9fc609fSGreg Clayton 
283e87764f2SEnrico Granata         if (flags & eCommandTryTargetAPILock)
284f9fc609fSGreg Clayton         {
285f9fc609fSGreg Clayton             Target *target = m_exe_ctx.GetTargetPtr();
286f9fc609fSGreg Clayton             if (target)
287bb19a13cSSaleem Abdulrasool                 m_api_locker = std::unique_lock<std::recursive_mutex>(target->GetAPIMutex());
288f9fc609fSGreg Clayton         }
289f9fc609fSGreg Clayton     }
290f9fc609fSGreg Clayton 
291e87764f2SEnrico Granata     if (GetFlags().AnySet (eCommandProcessMustBeLaunched | eCommandProcessMustBePaused))
292b766a73dSGreg Clayton     {
293c14ee32dSGreg Clayton         Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
294d78c9576SEd Maste         if (process == nullptr)
29530fdc8d8SChris Lattner         {
296b8e8a5f3SJim Ingham             // A process that is not running is considered paused.
297e87764f2SEnrico Granata             if (GetFlags().Test(eCommandProcessMustBeLaunched))
298b8e8a5f3SJim Ingham             {
29930fdc8d8SChris Lattner                 result.AppendError ("Process must exist.");
30030fdc8d8SChris Lattner                 result.SetStatus (eReturnStatusFailed);
30130fdc8d8SChris Lattner                 return false;
30230fdc8d8SChris Lattner             }
303b8e8a5f3SJim Ingham         }
30430fdc8d8SChris Lattner         else
30530fdc8d8SChris Lattner         {
30630fdc8d8SChris Lattner             StateType state = process->GetState();
30730fdc8d8SChris Lattner             switch (state)
30830fdc8d8SChris Lattner             {
3097a5388bfSGreg Clayton             case eStateInvalid:
31030fdc8d8SChris Lattner             case eStateSuspended:
31130fdc8d8SChris Lattner             case eStateCrashed:
31230fdc8d8SChris Lattner             case eStateStopped:
31330fdc8d8SChris Lattner                 break;
31430fdc8d8SChris Lattner 
315b766a73dSGreg Clayton             case eStateConnected:
316b766a73dSGreg Clayton             case eStateAttaching:
317b766a73dSGreg Clayton             case eStateLaunching:
31830fdc8d8SChris Lattner             case eStateDetached:
31930fdc8d8SChris Lattner             case eStateExited:
32030fdc8d8SChris Lattner             case eStateUnloaded:
321e87764f2SEnrico Granata                 if (GetFlags().Test(eCommandProcessMustBeLaunched))
32230fdc8d8SChris Lattner                 {
32330fdc8d8SChris Lattner                     result.AppendError ("Process must be launched.");
32430fdc8d8SChris Lattner                     result.SetStatus (eReturnStatusFailed);
32530fdc8d8SChris Lattner                     return false;
32630fdc8d8SChris Lattner                 }
32730fdc8d8SChris Lattner                 break;
32830fdc8d8SChris Lattner 
32930fdc8d8SChris Lattner             case eStateRunning:
33030fdc8d8SChris Lattner             case eStateStepping:
331e87764f2SEnrico Granata                 if (GetFlags().Test(eCommandProcessMustBePaused))
33230fdc8d8SChris Lattner                 {
33330fdc8d8SChris Lattner                     result.AppendError ("Process is running.  Use 'process interrupt' to pause execution.");
33430fdc8d8SChris Lattner                     result.SetStatus (eReturnStatusFailed);
33530fdc8d8SChris Lattner                     return false;
33630fdc8d8SChris Lattner                 }
33730fdc8d8SChris Lattner             }
33830fdc8d8SChris Lattner         }
339b766a73dSGreg Clayton     }
3405a988416SJim Ingham     return true;
34130fdc8d8SChris Lattner }
34230fdc8d8SChris Lattner 
343f9fc609fSGreg Clayton void
344f9fc609fSGreg Clayton CommandObject::Cleanup ()
345f9fc609fSGreg Clayton {
346f9fc609fSGreg Clayton     m_exe_ctx.Clear();
347bb19a13cSSaleem Abdulrasool     if (m_api_locker.owns_lock())
348bb19a13cSSaleem Abdulrasool         m_api_locker.unlock();
349f9fc609fSGreg Clayton }
350f9fc609fSGreg Clayton 
35130fdc8d8SChris Lattner int
35230fdc8d8SChris Lattner CommandObject::HandleCompletion
35330fdc8d8SChris Lattner (
35430fdc8d8SChris Lattner     Args &input,
35530fdc8d8SChris Lattner     int &cursor_index,
35630fdc8d8SChris Lattner     int &cursor_char_position,
35730fdc8d8SChris Lattner     int match_start_point,
35830fdc8d8SChris Lattner     int max_return_elements,
359558ce124SJim Ingham     bool &word_complete,
36030fdc8d8SChris Lattner     StringList &matches
36130fdc8d8SChris Lattner )
36230fdc8d8SChris Lattner {
363e171da5cSBruce Mitchener     // Default implementation of WantsCompletion() is !WantsRawCommandString().
3646561d15dSJohnny Chen     // Subclasses who want raw command string but desire, for example,
3656561d15dSJohnny Chen     // argument completion should override WantsCompletion() to return true,
3666561d15dSJohnny Chen     // instead.
3676f99b637SJohnny Chen     if (WantsRawCommandString() && !WantsCompletion())
36830fdc8d8SChris Lattner     {
36930fdc8d8SChris Lattner         // FIXME: Abstract telling the completion to insert the completion character.
37030fdc8d8SChris Lattner         matches.Clear();
37130fdc8d8SChris Lattner         return -1;
37230fdc8d8SChris Lattner     }
37330fdc8d8SChris Lattner     else
37430fdc8d8SChris Lattner     {
37530fdc8d8SChris Lattner         // Can we do anything generic with the options?
37630fdc8d8SChris Lattner         Options *cur_options = GetOptions();
37730fdc8d8SChris Lattner         CommandReturnObject result;
37830fdc8d8SChris Lattner         OptionElementVector opt_element_vector;
37930fdc8d8SChris Lattner 
380d78c9576SEd Maste         if (cur_options != nullptr)
38130fdc8d8SChris Lattner         {
38230fdc8d8SChris Lattner             // Re-insert the dummy command name string which will have been
38330fdc8d8SChris Lattner             // stripped off:
38430fdc8d8SChris Lattner             input.Unshift ("dummy-string");
38530fdc8d8SChris Lattner             cursor_index++;
38630fdc8d8SChris Lattner 
38730fdc8d8SChris Lattner 
38830fdc8d8SChris Lattner             // I stick an element on the end of the input, because if the last element is
389b7ad58a0SGreg Clayton             // option that requires an argument, getopt_long_only will freak out.
39030fdc8d8SChris Lattner 
39130fdc8d8SChris Lattner             input.AppendArgument ("<FAKE-VALUE>");
39230fdc8d8SChris Lattner 
393d43e0094SJim Ingham             input.ParseArgsForCompletion (*cur_options, opt_element_vector, cursor_index);
39430fdc8d8SChris Lattner 
39530fdc8d8SChris Lattner             input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1);
39630fdc8d8SChris Lattner 
39730fdc8d8SChris Lattner             bool handled_by_options;
398eb0103f2SGreg Clayton             handled_by_options = cur_options->HandleOptionCompletion (input,
39930fdc8d8SChris Lattner                                                                       opt_element_vector,
40030fdc8d8SChris Lattner                                                                       cursor_index,
40130fdc8d8SChris Lattner                                                                       cursor_char_position,
40230fdc8d8SChris Lattner                                                                       match_start_point,
40330fdc8d8SChris Lattner                                                                       max_return_elements,
404*e1cfbc79STodd Fiala                                                                       GetCommandInterpreter(),
405558ce124SJim Ingham                                                                       word_complete,
40630fdc8d8SChris Lattner                                                                       matches);
40730fdc8d8SChris Lattner             if (handled_by_options)
40830fdc8d8SChris Lattner                 return matches.GetSize();
40930fdc8d8SChris Lattner         }
41030fdc8d8SChris Lattner 
41130fdc8d8SChris Lattner         // If we got here, the last word is not an option or an option argument.
412a7015092SGreg Clayton         return HandleArgumentCompletion (input,
41330fdc8d8SChris Lattner                                          cursor_index,
41430fdc8d8SChris Lattner                                          cursor_char_position,
41530fdc8d8SChris Lattner                                          opt_element_vector,
41630fdc8d8SChris Lattner                                          match_start_point,
41730fdc8d8SChris Lattner                                          max_return_elements,
418558ce124SJim Ingham                                          word_complete,
41930fdc8d8SChris Lattner                                          matches);
42030fdc8d8SChris Lattner     }
42130fdc8d8SChris Lattner }
42230fdc8d8SChris Lattner 
42330fdc8d8SChris Lattner bool
424d033e1ceSEnrico Granata CommandObject::HelpTextContainsWord (const char *search_word,
425d033e1ceSEnrico Granata                                      bool search_short_help,
426d033e1ceSEnrico Granata                                      bool search_long_help,
427d033e1ceSEnrico Granata                                      bool search_syntax,
428d033e1ceSEnrico Granata                                      bool search_options)
42930fdc8d8SChris Lattner {
43030fdc8d8SChris Lattner     std::string options_usage_help;
43130fdc8d8SChris Lattner 
43230fdc8d8SChris Lattner     bool found_word = false;
43330fdc8d8SChris Lattner 
434998255bfSGreg Clayton     const char *short_help = GetHelp();
435998255bfSGreg Clayton     const char *long_help = GetHelpLong();
436998255bfSGreg Clayton     const char *syntax_help = GetSyntax();
43730fdc8d8SChris Lattner 
438d033e1ceSEnrico Granata     if (search_short_help && short_help && strcasestr (short_help, search_word))
43930fdc8d8SChris Lattner         found_word = true;
440d033e1ceSEnrico Granata     else if (search_long_help && long_help && strcasestr (long_help, search_word))
44130fdc8d8SChris Lattner         found_word = true;
442d033e1ceSEnrico Granata     else if (search_syntax && syntax_help && strcasestr (syntax_help, search_word))
44330fdc8d8SChris Lattner         found_word = true;
44430fdc8d8SChris Lattner 
44530fdc8d8SChris Lattner     if (!found_word
446d033e1ceSEnrico Granata         && search_options
447d78c9576SEd Maste         && GetOptions() != nullptr)
44830fdc8d8SChris Lattner     {
44930fdc8d8SChris Lattner         StreamString usage_help;
450*e1cfbc79STodd Fiala         GetOptions()->GenerateOptionUsage(usage_help, this,
451*e1cfbc79STodd Fiala                                           GetCommandInterpreter()
452*e1cfbc79STodd Fiala                                             .GetDebugger().GetTerminalWidth());
45330fdc8d8SChris Lattner         if (usage_help.GetSize() > 0)
45430fdc8d8SChris Lattner         {
45530fdc8d8SChris Lattner             const char *usage_text = usage_help.GetData();
4564b6fbf37SCaroline Tice             if (strcasestr (usage_text, search_word))
45730fdc8d8SChris Lattner               found_word = true;
45830fdc8d8SChris Lattner         }
45930fdc8d8SChris Lattner     }
46030fdc8d8SChris Lattner 
46130fdc8d8SChris Lattner     return found_word;
46230fdc8d8SChris Lattner }
463e139cf23SCaroline Tice 
464e139cf23SCaroline Tice int
465e139cf23SCaroline Tice CommandObject::GetNumArgumentEntries  ()
466e139cf23SCaroline Tice {
467e139cf23SCaroline Tice     return m_arguments.size();
468e139cf23SCaroline Tice }
469e139cf23SCaroline Tice 
470e139cf23SCaroline Tice CommandObject::CommandArgumentEntry *
471e139cf23SCaroline Tice CommandObject::GetArgumentEntryAtIndex (int idx)
472e139cf23SCaroline Tice {
4733985c8c6SSaleem Abdulrasool     if (static_cast<size_t>(idx) < m_arguments.size())
474e139cf23SCaroline Tice         return &(m_arguments[idx]);
475e139cf23SCaroline Tice 
476d78c9576SEd Maste     return nullptr;
477e139cf23SCaroline Tice }
478e139cf23SCaroline Tice 
479d7e6a4f2SVince Harron const CommandObject::ArgumentTableEntry *
480e139cf23SCaroline Tice CommandObject::FindArgumentDataByType (CommandArgumentType arg_type)
481e139cf23SCaroline Tice {
482e139cf23SCaroline Tice     const ArgumentTableEntry *table = CommandObject::GetArgumentTable();
483e139cf23SCaroline Tice 
484e139cf23SCaroline Tice     for (int i = 0; i < eArgTypeLastArg; ++i)
485e139cf23SCaroline Tice         if (table[i].arg_type == arg_type)
486d7e6a4f2SVince Harron             return &(table[i]);
487e139cf23SCaroline Tice 
488d78c9576SEd Maste     return nullptr;
489e139cf23SCaroline Tice }
490e139cf23SCaroline Tice 
491e139cf23SCaroline Tice void
492e139cf23SCaroline Tice CommandObject::GetArgumentHelp (Stream &str, CommandArgumentType arg_type, CommandInterpreter &interpreter)
493e139cf23SCaroline Tice {
494e139cf23SCaroline Tice     const ArgumentTableEntry* table = CommandObject::GetArgumentTable();
495d7e6a4f2SVince Harron     const ArgumentTableEntry *entry = &(table[arg_type]);
496e139cf23SCaroline Tice 
497e139cf23SCaroline Tice     // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up...
498e139cf23SCaroline Tice 
499e139cf23SCaroline Tice     if (entry->arg_type != arg_type)
500e139cf23SCaroline Tice         entry = CommandObject::FindArgumentDataByType (arg_type);
501e139cf23SCaroline Tice 
502e139cf23SCaroline Tice     if (!entry)
503e139cf23SCaroline Tice         return;
504e139cf23SCaroline Tice 
505e139cf23SCaroline Tice     StreamString name_str;
506e139cf23SCaroline Tice     name_str.Printf ("<%s>", entry->arg_name);
507e139cf23SCaroline Tice 
508fc7a7f3bSEnrico Granata     if (entry->help_function)
50982a7d983SEnrico Granata     {
510fc7a7f3bSEnrico Granata         const char* help_text = entry->help_function();
51182a7d983SEnrico Granata         if (!entry->help_function.self_formatting)
51282a7d983SEnrico Granata         {
51382a7d983SEnrico Granata             interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", help_text,
514e139cf23SCaroline Tice                                                  name_str.GetSize());
51582a7d983SEnrico Granata         }
51682a7d983SEnrico Granata         else
51782a7d983SEnrico Granata         {
51882a7d983SEnrico Granata             interpreter.OutputHelpText(str, name_str.GetData(), "--", help_text,
51982a7d983SEnrico Granata                                        name_str.GetSize());
52082a7d983SEnrico Granata         }
52182a7d983SEnrico Granata     }
522e139cf23SCaroline Tice     else
523e139cf23SCaroline Tice         interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", entry->help_text, name_str.GetSize());
524e139cf23SCaroline Tice }
525e139cf23SCaroline Tice 
526e139cf23SCaroline Tice const char *
527e139cf23SCaroline Tice CommandObject::GetArgumentName (CommandArgumentType arg_type)
528e139cf23SCaroline Tice {
529d7e6a4f2SVince Harron     const ArgumentTableEntry *entry = &(CommandObject::GetArgumentTable()[arg_type]);
530deaab222SCaroline Tice 
531deaab222SCaroline Tice     // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up...
532deaab222SCaroline Tice 
533deaab222SCaroline Tice     if (entry->arg_type != arg_type)
534deaab222SCaroline Tice         entry = CommandObject::FindArgumentDataByType (arg_type);
535deaab222SCaroline Tice 
536e6acf355SJohnny Chen     if (entry)
537deaab222SCaroline Tice         return entry->arg_name;
538e6acf355SJohnny Chen 
539e6acf355SJohnny Chen     StreamString str;
540e6acf355SJohnny Chen     str << "Arg name for type (" << arg_type << ") not in arg table!";
541e6acf355SJohnny Chen     return str.GetData();
542e139cf23SCaroline Tice }
543e139cf23SCaroline Tice 
544405fe67fSCaroline Tice bool
545e0d378b3SGreg Clayton CommandObject::IsPairType (ArgumentRepetitionType arg_repeat_type)
546405fe67fSCaroline Tice {
547405fe67fSCaroline Tice     if ((arg_repeat_type == eArgRepeatPairPlain)
548405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairOptional)
549405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairPlus)
550405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairStar)
551405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairRange)
552405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairRangeOptional))
553405fe67fSCaroline Tice         return true;
554405fe67fSCaroline Tice 
555405fe67fSCaroline Tice     return false;
556405fe67fSCaroline Tice }
557405fe67fSCaroline Tice 
55834ddc8dbSJohnny Chen static CommandObject::CommandArgumentEntry
55934ddc8dbSJohnny Chen OptSetFiltered(uint32_t opt_set_mask, CommandObject::CommandArgumentEntry &cmd_arg_entry)
56034ddc8dbSJohnny Chen {
56134ddc8dbSJohnny Chen     CommandObject::CommandArgumentEntry ret_val;
56234ddc8dbSJohnny Chen     for (unsigned i = 0; i < cmd_arg_entry.size(); ++i)
56334ddc8dbSJohnny Chen         if (opt_set_mask & cmd_arg_entry[i].arg_opt_set_association)
56434ddc8dbSJohnny Chen             ret_val.push_back(cmd_arg_entry[i]);
56534ddc8dbSJohnny Chen     return ret_val;
56634ddc8dbSJohnny Chen }
56734ddc8dbSJohnny Chen 
56834ddc8dbSJohnny Chen // Default parameter value of opt_set_mask is LLDB_OPT_SET_ALL, which means take
56934ddc8dbSJohnny Chen // all the argument data into account.  On rare cases where some argument sticks
57034ddc8dbSJohnny Chen // with certain option sets, this function returns the option set filtered args.
571e139cf23SCaroline Tice void
57234ddc8dbSJohnny Chen CommandObject::GetFormattedCommandArguments (Stream &str, uint32_t opt_set_mask)
573e139cf23SCaroline Tice {
574e139cf23SCaroline Tice     int num_args = m_arguments.size();
575e139cf23SCaroline Tice     for (int i = 0; i < num_args; ++i)
576e139cf23SCaroline Tice     {
577e139cf23SCaroline Tice         if (i > 0)
578e139cf23SCaroline Tice             str.Printf (" ");
57934ddc8dbSJohnny Chen         CommandArgumentEntry arg_entry =
58034ddc8dbSJohnny Chen             opt_set_mask == LLDB_OPT_SET_ALL ? m_arguments[i]
58134ddc8dbSJohnny Chen                                              : OptSetFiltered(opt_set_mask, m_arguments[i]);
582e139cf23SCaroline Tice         int num_alternatives = arg_entry.size();
583405fe67fSCaroline Tice 
584405fe67fSCaroline Tice         if ((num_alternatives == 2)
585405fe67fSCaroline Tice             && IsPairType (arg_entry[0].arg_repetition))
586405fe67fSCaroline Tice         {
587405fe67fSCaroline Tice             const char *first_name = GetArgumentName (arg_entry[0].arg_type);
588405fe67fSCaroline Tice             const char *second_name = GetArgumentName (arg_entry[1].arg_type);
589405fe67fSCaroline Tice             switch (arg_entry[0].arg_repetition)
590405fe67fSCaroline Tice             {
591405fe67fSCaroline Tice                 case eArgRepeatPairPlain:
592405fe67fSCaroline Tice                     str.Printf ("<%s> <%s>", first_name, second_name);
593405fe67fSCaroline Tice                     break;
594405fe67fSCaroline Tice                 case eArgRepeatPairOptional:
595405fe67fSCaroline Tice                     str.Printf ("[<%s> <%s>]", first_name, second_name);
596405fe67fSCaroline Tice                     break;
597405fe67fSCaroline Tice                 case eArgRepeatPairPlus:
598405fe67fSCaroline Tice                     str.Printf ("<%s> <%s> [<%s> <%s> [...]]", first_name, second_name, first_name, second_name);
599405fe67fSCaroline Tice                     break;
600405fe67fSCaroline Tice                 case eArgRepeatPairStar:
601405fe67fSCaroline Tice                     str.Printf ("[<%s> <%s> [<%s> <%s> [...]]]", first_name, second_name, first_name, second_name);
602405fe67fSCaroline Tice                     break;
603405fe67fSCaroline Tice                 case eArgRepeatPairRange:
604405fe67fSCaroline Tice                     str.Printf ("<%s_1> <%s_1> ... <%s_n> <%s_n>", first_name, second_name, first_name, second_name);
605405fe67fSCaroline Tice                     break;
606405fe67fSCaroline Tice                 case eArgRepeatPairRangeOptional:
607405fe67fSCaroline Tice                     str.Printf ("[<%s_1> <%s_1> ... <%s_n> <%s_n>]", first_name, second_name, first_name, second_name);
608405fe67fSCaroline Tice                     break;
609ca1176aaSCaroline Tice                 // Explicitly test for all the rest of the cases, so if new types get added we will notice the
610ca1176aaSCaroline Tice                 // missing case statement(s).
611ca1176aaSCaroline Tice                 case eArgRepeatPlain:
612ca1176aaSCaroline Tice                 case eArgRepeatOptional:
613ca1176aaSCaroline Tice                 case eArgRepeatPlus:
614ca1176aaSCaroline Tice                 case eArgRepeatStar:
615ca1176aaSCaroline Tice                 case eArgRepeatRange:
616ca1176aaSCaroline Tice                     // These should not be reached, as they should fail the IsPairType test above.
617ca1176aaSCaroline Tice                     break;
618405fe67fSCaroline Tice             }
619405fe67fSCaroline Tice         }
620405fe67fSCaroline Tice         else
621405fe67fSCaroline Tice         {
622e139cf23SCaroline Tice             StreamString names;
623e139cf23SCaroline Tice             for (int j = 0; j < num_alternatives; ++j)
624e139cf23SCaroline Tice             {
625e139cf23SCaroline Tice                 if (j > 0)
626e139cf23SCaroline Tice                     names.Printf (" | ");
627e139cf23SCaroline Tice                 names.Printf ("%s", GetArgumentName (arg_entry[j].arg_type));
628e139cf23SCaroline Tice             }
629e139cf23SCaroline Tice             switch (arg_entry[0].arg_repetition)
630e139cf23SCaroline Tice             {
631e139cf23SCaroline Tice                 case eArgRepeatPlain:
632e139cf23SCaroline Tice                     str.Printf ("<%s>", names.GetData());
633e139cf23SCaroline Tice                     break;
634e139cf23SCaroline Tice                 case eArgRepeatPlus:
635e139cf23SCaroline Tice                     str.Printf ("<%s> [<%s> [...]]", names.GetData(), names.GetData());
636e139cf23SCaroline Tice                     break;
637e139cf23SCaroline Tice                 case eArgRepeatStar:
638e139cf23SCaroline Tice                     str.Printf ("[<%s> [<%s> [...]]]", names.GetData(), names.GetData());
639e139cf23SCaroline Tice                     break;
640e139cf23SCaroline Tice                 case eArgRepeatOptional:
641e139cf23SCaroline Tice                     str.Printf ("[<%s>]", names.GetData());
642e139cf23SCaroline Tice                     break;
643405fe67fSCaroline Tice                 case eArgRepeatRange:
644fd54b368SJason Molenda                     str.Printf ("<%s_1> .. <%s_n>", names.GetData(), names.GetData());
645ca1176aaSCaroline Tice                     break;
646ca1176aaSCaroline Tice                 // Explicitly test for all the rest of the cases, so if new types get added we will notice the
647ca1176aaSCaroline Tice                 // missing case statement(s).
648ca1176aaSCaroline Tice                 case eArgRepeatPairPlain:
649ca1176aaSCaroline Tice                 case eArgRepeatPairOptional:
650ca1176aaSCaroline Tice                 case eArgRepeatPairPlus:
651ca1176aaSCaroline Tice                 case eArgRepeatPairStar:
652ca1176aaSCaroline Tice                 case eArgRepeatPairRange:
653ca1176aaSCaroline Tice                 case eArgRepeatPairRangeOptional:
654ca1176aaSCaroline Tice                     // These should not be hit, as they should pass the IsPairType test above, and control should
655ca1176aaSCaroline Tice                     // have gone into the other branch of the if statement.
656ca1176aaSCaroline Tice                     break;
657405fe67fSCaroline Tice             }
658e139cf23SCaroline Tice         }
659e139cf23SCaroline Tice     }
660e139cf23SCaroline Tice }
661e139cf23SCaroline Tice 
6620c16aa6dSStephen Wilson CommandArgumentType
663e139cf23SCaroline Tice CommandObject::LookupArgumentName (const char *arg_name)
664e139cf23SCaroline Tice {
665e139cf23SCaroline Tice     CommandArgumentType return_type = eArgTypeLastArg;
666e139cf23SCaroline Tice 
667e139cf23SCaroline Tice     std::string arg_name_str (arg_name);
668e139cf23SCaroline Tice     size_t len = arg_name_str.length();
669e139cf23SCaroline Tice     if (arg_name[0] == '<'
670e139cf23SCaroline Tice         && arg_name[len-1] == '>')
671e139cf23SCaroline Tice         arg_name_str = arg_name_str.substr (1, len-2);
672e139cf23SCaroline Tice 
673331eff39SJohnny Chen     const ArgumentTableEntry *table = GetArgumentTable();
674e139cf23SCaroline Tice     for (int i = 0; i < eArgTypeLastArg; ++i)
675331eff39SJohnny Chen         if (arg_name_str.compare (table[i].arg_name) == 0)
676e139cf23SCaroline Tice             return_type = g_arguments_data[i].arg_type;
677e139cf23SCaroline Tice 
678e139cf23SCaroline Tice     return return_type;
679e139cf23SCaroline Tice }
680e139cf23SCaroline Tice 
681e139cf23SCaroline Tice static const char *
682931e674aSJim Ingham RegisterNameHelpTextCallback ()
683931e674aSJim Ingham {
684931e674aSJim Ingham     return "Register names can be specified using the architecture specific names.  "
68584c7bd74SJim Ingham     "They can also be specified using generic names.  Not all generic entities have "
68684c7bd74SJim Ingham     "registers backing them on all architectures.  When they don't the generic name "
68784c7bd74SJim Ingham     "will return an error.\n"
688931e674aSJim Ingham     "The generic names defined in lldb are:\n"
689931e674aSJim Ingham     "\n"
690931e674aSJim Ingham     "pc       - program counter register\n"
691931e674aSJim Ingham     "ra       - return address register\n"
692931e674aSJim Ingham     "fp       - frame pointer register\n"
693931e674aSJim Ingham     "sp       - stack pointer register\n"
69484c7bd74SJim Ingham     "flags    - the flags register\n"
695931e674aSJim Ingham     "arg{1-6} - integer argument passing registers.\n";
696931e674aSJim Ingham }
697931e674aSJim Ingham 
698931e674aSJim Ingham static const char *
699e139cf23SCaroline Tice BreakpointIDHelpTextCallback ()
700e139cf23SCaroline Tice {
7017428a18cSKate Stone     return "Breakpoints are identified using major and minor numbers; the major "
7027428a18cSKate Stone            "number corresponds to the single entity that was created with a 'breakpoint "
7037428a18cSKate Stone            "set' command; the minor numbers correspond to all the locations that were "
7047428a18cSKate Stone            "actually found/set based on the major breakpoint.  A full breakpoint ID might "
7057428a18cSKate Stone            "look like 3.14, meaning the 14th location set for the 3rd breakpoint.  You "
7067428a18cSKate Stone            "can specify all the locations of a breakpoint by just indicating the major "
7077428a18cSKate Stone            "breakpoint number. A valid breakpoint ID consists either of just the major "
7087428a18cSKate Stone            "number, or the major number followed by a dot and the location number (e.g. "
7097428a18cSKate Stone            "3 or 3.2 could both be valid breakpoint IDs.)";
710e139cf23SCaroline Tice }
711e139cf23SCaroline Tice 
712e139cf23SCaroline Tice static const char *
713e139cf23SCaroline Tice BreakpointIDRangeHelpTextCallback ()
714e139cf23SCaroline Tice {
7157428a18cSKate Stone     return "A 'breakpoint ID list' is a manner of specifying multiple breakpoints. "
71686edbf41SGreg Clayton            "This can be done through several mechanisms.  The easiest way is to just "
7177428a18cSKate Stone            "enter a space-separated list of breakpoint IDs.  To specify all the "
71886edbf41SGreg Clayton            "breakpoint locations under a major breakpoint, you can use the major "
71986edbf41SGreg Clayton            "breakpoint number followed by '.*', eg. '5.*' means all the locations under "
72086edbf41SGreg Clayton            "breakpoint 5.  You can also indicate a range of breakpoints by using "
72186edbf41SGreg Clayton            "<start-bp-id> - <end-bp-id>.  The start-bp-id and end-bp-id for a range can "
7227428a18cSKate Stone            "be any valid breakpoint IDs.  It is not legal, however, to specify a range "
72386edbf41SGreg Clayton            "using specific locations that cross major breakpoint numbers.  I.e. 3.2 - 3.7"
72486edbf41SGreg Clayton            " is legal; 2 - 5 is legal; but 3.2 - 4.4 is not legal.";
72586edbf41SGreg Clayton }
72686edbf41SGreg Clayton 
72786edbf41SGreg Clayton static const char *
7285e09c8c3SJim Ingham BreakpointNameHelpTextCallback ()
7295e09c8c3SJim Ingham {
7305e09c8c3SJim Ingham     return "A name that can be added to a breakpoint when it is created, or later "
7315e09c8c3SJim Ingham            "on with the \"breakpoint name add\" command.  "
7327428a18cSKate Stone            "Breakpoint names can be used to specify breakpoints in all the places breakpoint IDs "
7335e09c8c3SJim Ingham            "and breakpoint ID ranges can be used.  As such they provide a convenient way to group breakpoints, "
7345e09c8c3SJim Ingham            "and to operate on breakpoints you create without having to track the breakpoint number.  "
7355e09c8c3SJim Ingham            "Note, the attributes you set when using a breakpoint name in a breakpoint command don't "
7367428a18cSKate Stone            "adhere to the name, but instead are set individually on all the breakpoints currently tagged with that "
7377428a18cSKate Stone            "name.  Future breakpoints "
7385e09c8c3SJim Ingham            "tagged with that name will not pick up the attributes previously given using that name.  "
7397428a18cSKate Stone            "In order to distinguish breakpoint names from breakpoint IDs and ranges, "
7405e09c8c3SJim Ingham            "names must start with a letter from a-z or A-Z and cannot contain spaces, \".\" or \"-\".  "
7415e09c8c3SJim Ingham            "Also, breakpoint names can only be applied to breakpoints, not to breakpoint locations.";
7425e09c8c3SJim Ingham }
7435e09c8c3SJim Ingham 
7445e09c8c3SJim Ingham static const char *
74586edbf41SGreg Clayton GDBFormatHelpTextCallback ()
74686edbf41SGreg Clayton {
747f91381e8SGreg Clayton     return "A GDB format consists of a repeat count, a format letter and a size letter. "
748f91381e8SGreg Clayton     "The repeat count is optional and defaults to 1. The format letter is optional "
749f91381e8SGreg Clayton     "and defaults to the previous format that was used. The size letter is optional "
750f91381e8SGreg Clayton     "and defaults to the previous size that was used.\n"
751f91381e8SGreg Clayton     "\n"
752f91381e8SGreg Clayton     "Format letters include:\n"
753f91381e8SGreg Clayton     "o - octal\n"
754f91381e8SGreg Clayton     "x - hexadecimal\n"
755f91381e8SGreg Clayton     "d - decimal\n"
756f91381e8SGreg Clayton     "u - unsigned decimal\n"
757f91381e8SGreg Clayton     "t - binary\n"
758f91381e8SGreg Clayton     "f - float\n"
759f91381e8SGreg Clayton     "a - address\n"
760f91381e8SGreg Clayton     "i - instruction\n"
761f91381e8SGreg Clayton     "c - char\n"
762f91381e8SGreg Clayton     "s - string\n"
763f91381e8SGreg Clayton     "T - OSType\n"
764f91381e8SGreg Clayton     "A - float as hex\n"
765f91381e8SGreg Clayton     "\n"
766f91381e8SGreg Clayton     "Size letters include:\n"
767f91381e8SGreg Clayton     "b - 1 byte  (byte)\n"
768f91381e8SGreg Clayton     "h - 2 bytes (halfword)\n"
769f91381e8SGreg Clayton     "w - 4 bytes (word)\n"
770f91381e8SGreg Clayton     "g - 8 bytes (giant)\n"
771f91381e8SGreg Clayton     "\n"
772f91381e8SGreg Clayton     "Example formats:\n"
773f91381e8SGreg Clayton     "32xb - show 32 1 byte hexadecimal integer values\n"
774f91381e8SGreg Clayton     "16xh - show 16 2 byte hexadecimal integer values\n"
775f91381e8SGreg Clayton     "64   - show 64 2 byte hexadecimal integer values (format and size from the last format)\n"
776f91381e8SGreg Clayton     "dw   - show 1 4 byte decimal integer value\n"
777f91381e8SGreg Clayton     ;
778e139cf23SCaroline Tice }
779e139cf23SCaroline Tice 
7800a3958e0SEnrico Granata static const char *
7810a3958e0SEnrico Granata FormatHelpTextCallback ()
7820a3958e0SEnrico Granata {
78382a7d983SEnrico Granata 
784d78c9576SEd Maste     static char* help_text_ptr = nullptr;
78582a7d983SEnrico Granata 
78682a7d983SEnrico Granata     if (help_text_ptr)
78782a7d983SEnrico Granata         return help_text_ptr;
78882a7d983SEnrico Granata 
7890a3958e0SEnrico Granata     StreamString sstr;
7900a3958e0SEnrico Granata     sstr << "One of the format names (or one-character names) that can be used to show a variable's value:\n";
7910a3958e0SEnrico Granata     for (Format f = eFormatDefault; f < kNumFormats; f = Format(f+1))
7920a3958e0SEnrico Granata     {
79382a7d983SEnrico Granata         if (f != eFormatDefault)
79482a7d983SEnrico Granata             sstr.PutChar('\n');
79582a7d983SEnrico Granata 
7960a3958e0SEnrico Granata         char format_char = FormatManager::GetFormatAsFormatChar(f);
7970a3958e0SEnrico Granata         if (format_char)
7980a3958e0SEnrico Granata             sstr.Printf("'%c' or ", format_char);
7990a3958e0SEnrico Granata 
80082a7d983SEnrico Granata         sstr.Printf ("\"%s\"", FormatManager::GetFormatAsCString(f));
8010a3958e0SEnrico Granata     }
8020a3958e0SEnrico Granata 
8030a3958e0SEnrico Granata     sstr.Flush();
8040a3958e0SEnrico Granata 
8050a3958e0SEnrico Granata     std::string data = sstr.GetString();
8060a3958e0SEnrico Granata 
80782a7d983SEnrico Granata     help_text_ptr = new char[data.length()+1];
8080a3958e0SEnrico Granata 
80982a7d983SEnrico Granata     data.copy(help_text_ptr, data.length());
8100a3958e0SEnrico Granata 
81182a7d983SEnrico Granata     return help_text_ptr;
8120a3958e0SEnrico Granata }
8130a3958e0SEnrico Granata 
8140a3958e0SEnrico Granata static const char *
815d9477397SSean Callanan LanguageTypeHelpTextCallback ()
816d9477397SSean Callanan {
817d78c9576SEd Maste     static char* help_text_ptr = nullptr;
818d9477397SSean Callanan 
819d9477397SSean Callanan     if (help_text_ptr)
820d9477397SSean Callanan         return help_text_ptr;
821d9477397SSean Callanan 
822d9477397SSean Callanan     StreamString sstr;
823d9477397SSean Callanan     sstr << "One of the following languages:\n";
824d9477397SSean Callanan 
8250e0984eeSJim Ingham     Language::PrintAllLanguages(sstr, "  ", "\n");
826d9477397SSean Callanan 
827d9477397SSean Callanan     sstr.Flush();
828d9477397SSean Callanan 
829d9477397SSean Callanan     std::string data = sstr.GetString();
830d9477397SSean Callanan 
831d9477397SSean Callanan     help_text_ptr = new char[data.length()+1];
832d9477397SSean Callanan 
833d9477397SSean Callanan     data.copy(help_text_ptr, data.length());
834d9477397SSean Callanan 
835d9477397SSean Callanan     return help_text_ptr;
836d9477397SSean Callanan }
837d9477397SSean Callanan 
838d9477397SSean Callanan static const char *
83982a7d983SEnrico Granata SummaryStringHelpTextCallback()
8400a3958e0SEnrico Granata {
84182a7d983SEnrico Granata     return
84282a7d983SEnrico Granata         "A summary string is a way to extract information from variables in order to present them using a summary.\n"
84382a7d983SEnrico Granata         "Summary strings contain static text, variables, scopes and control sequences:\n"
84482a7d983SEnrico Granata         "  - Static text can be any sequence of non-special characters, i.e. anything but '{', '}', '$', or '\\'.\n"
84582a7d983SEnrico Granata         "  - Variables are sequences of characters beginning with ${, ending with } and that contain symbols in the format described below.\n"
84682a7d983SEnrico Granata         "  - Scopes are any sequence of text between { and }. Anything included in a scope will only appear in the output summary if there were no errors.\n"
84782a7d983SEnrico Granata         "  - Control sequences are the usual C/C++ '\\a', '\\n', ..., plus '\\$', '\\{' and '\\}'.\n"
84882a7d983SEnrico Granata         "A summary string works by copying static text verbatim, turning control sequences into their character counterpart, expanding variables and trying to expand scopes.\n"
84982a7d983SEnrico Granata         "A variable is expanded by giving it a value other than its textual representation, and the way this is done depends on what comes after the ${ marker.\n"
85082a7d983SEnrico Granata         "The most common sequence if ${var followed by an expression path, which is the text one would type to access a member of an aggregate types, given a variable of that type"
85182a7d983SEnrico Granata         " (e.g. if type T has a member named x, which has a member named y, and if t is of type T, the expression path would be .x.y and the way to fit that into a summary string would be"
8529128ee2fSEnrico Granata         " ${var.x.y}). You can also use ${*var followed by an expression path and in that case the object referred by the path will be dereferenced before being displayed."
8539128ee2fSEnrico Granata         " If the object is not a pointer, doing so will cause an error. For additional details on expression paths, you can type 'help expr-path'. \n"
85482a7d983SEnrico Granata         "By default, summary strings attempt to display the summary for any variable they reference, and if that fails the value. If neither can be shown, nothing is displayed."
85582a7d983SEnrico Granata         "In a summary string, you can also use an array index [n], or a slice-like range [n-m]. This can have two different meanings depending on what kind of object the expression"
85682a7d983SEnrico Granata         " path refers to:\n"
85782a7d983SEnrico Granata         "  - if it is a scalar type (any basic type like int, float, ...) the expression is a bitfield, i.e. the bits indicated by the indexing operator are extracted out of the number"
85882a7d983SEnrico Granata         " and displayed as an individual variable\n"
85982a7d983SEnrico Granata         "  - if it is an array or pointer the array items indicated by the indexing operator are shown as the result of the variable. if the expression is an array, real array items are"
86082a7d983SEnrico Granata         " printed; if it is a pointer, the pointer-as-array syntax is used to obtain the values (this means, the latter case can have no range checking)\n"
8619128ee2fSEnrico Granata         "If you are trying to display an array for which the size is known, you can also use [] instead of giving an exact range. This has the effect of showing items 0 thru size - 1.\n"
8629128ee2fSEnrico Granata         "Additionally, a variable can contain an (optional) format code, as in ${var.x.y%code}, where code can be any of the valid formats described in 'help format', or one of the"
8639128ee2fSEnrico Granata         " special symbols only allowed as part of a variable:\n"
8649128ee2fSEnrico Granata         "    %V: show the value of the object by default\n"
8659128ee2fSEnrico Granata         "    %S: show the summary of the object by default\n"
8669128ee2fSEnrico Granata         "    %@: show the runtime-provided object description (for Objective-C, it calls NSPrintForDebugger; for C/C++ it does nothing)\n"
8679128ee2fSEnrico Granata         "    %L: show the location of the object (memory address or a register name)\n"
8689128ee2fSEnrico Granata         "    %#: show the number of children of the object\n"
8699128ee2fSEnrico Granata         "    %T: show the type of the object\n"
8709128ee2fSEnrico Granata         "Another variable that you can use in summary strings is ${svar . This sequence works exactly like ${var, including the fact that ${*svar is an allowed sequence, but uses"
8719128ee2fSEnrico Granata         " the object's synthetic children provider instead of the actual objects. For instance, if you are using STL synthetic children providers, the following summary string would"
8729128ee2fSEnrico Granata         " count the number of actual elements stored in an std::list:\n"
8739128ee2fSEnrico Granata         "type summary add -s \"${svar%#}\" -x \"std::list<\"";
8749128ee2fSEnrico Granata }
8759128ee2fSEnrico Granata 
8769128ee2fSEnrico Granata static const char *
8779128ee2fSEnrico Granata ExprPathHelpTextCallback()
8789128ee2fSEnrico Granata {
8799128ee2fSEnrico Granata     return
8809128ee2fSEnrico Granata     "An expression path is the sequence of symbols that is used in C/C++ to access a member variable of an aggregate object (class).\n"
8819128ee2fSEnrico Granata     "For instance, given a class:\n"
8829128ee2fSEnrico Granata     "  class foo {\n"
8839128ee2fSEnrico Granata     "      int a;\n"
8849128ee2fSEnrico Granata     "      int b; .\n"
8859128ee2fSEnrico Granata     "      foo* next;\n"
8869128ee2fSEnrico Granata     "  };\n"
8879128ee2fSEnrico Granata     "the expression to read item b in the item pointed to by next for foo aFoo would be aFoo.next->b.\n"
8889128ee2fSEnrico Granata     "Given that aFoo could just be any object of type foo, the string '.next->b' is the expression path, because it can be attached to any foo instance to achieve the effect.\n"
8899128ee2fSEnrico Granata     "Expression paths in LLDB include dot (.) and arrow (->) operators, and most commands using expression paths have ways to also accept the star (*) operator.\n"
8909128ee2fSEnrico Granata     "The meaning of these operators is the same as the usual one given to them by the C/C++ standards.\n"
8919128ee2fSEnrico Granata     "LLDB also has support for indexing ([ ]) in expression paths, and extends the traditional meaning of the square brackets operator to allow bitfield extraction:\n"
8929128ee2fSEnrico Granata     "for objects of native types (int, float, char, ...) saying '[n-m]' as an expression path (where n and m are any positive integers, e.g. [3-5]) causes LLDB to extract"
8939128ee2fSEnrico Granata     " bits n thru m from the value of the variable. If n == m, [n] is also allowed as a shortcut syntax. For arrays and pointers, expression paths can only contain one index"
8949128ee2fSEnrico Granata     " and the meaning of the operation is the same as the one defined by C/C++ (item extraction). Some commands extend bitfield-like syntax for arrays and pointers with the"
8959128ee2fSEnrico Granata     " meaning of array slicing (taking elements n thru m inside the array or pointed-to memory).";
8960a3958e0SEnrico Granata }
8970a3958e0SEnrico Granata 
898184d7a72SJohnny Chen void
899ea671fbdSKate Stone CommandObject::FormatLongHelpText (Stream &output_strm, const char *long_help)
900ea671fbdSKate Stone {
901ea671fbdSKate Stone     CommandInterpreter& interpreter = GetCommandInterpreter();
902ea671fbdSKate Stone     std::stringstream lineStream (long_help);
903ea671fbdSKate Stone     std::string line;
904ea671fbdSKate Stone     while (std::getline (lineStream, line)) {
905ea671fbdSKate Stone         if (line.empty()) {
906ea671fbdSKate Stone             output_strm << "\n";
907ea671fbdSKate Stone             continue;
908ea671fbdSKate Stone         }
909ea671fbdSKate Stone         size_t result = line.find_first_not_of (" \t");
910ea671fbdSKate Stone         if (result == std::string::npos) {
911ea671fbdSKate Stone             result = 0;
912ea671fbdSKate Stone         }
913ea671fbdSKate Stone         std::string whitespace_prefix = line.substr (0, result);
914ea671fbdSKate Stone         std::string remainder = line.substr (result);
915ea671fbdSKate Stone         interpreter.OutputFormattedHelpText(output_strm, whitespace_prefix.c_str(), remainder.c_str());
916ea671fbdSKate Stone     }
917ea671fbdSKate Stone }
918ea671fbdSKate Stone 
919ea671fbdSKate Stone void
9209b62d1d5SEnrico Granata CommandObject::GenerateHelpText (CommandReturnObject &result)
9219b62d1d5SEnrico Granata {
9229b62d1d5SEnrico Granata     GenerateHelpText(result.GetOutputStream());
9239b62d1d5SEnrico Granata 
9249b62d1d5SEnrico Granata     result.SetStatus (eReturnStatusSuccessFinishNoResult);
9259b62d1d5SEnrico Granata }
9269b62d1d5SEnrico Granata 
9279b62d1d5SEnrico Granata void
9289b62d1d5SEnrico Granata CommandObject::GenerateHelpText (Stream &output_strm)
9299b62d1d5SEnrico Granata {
9309b62d1d5SEnrico Granata     CommandInterpreter& interpreter = GetCommandInterpreter();
9319b62d1d5SEnrico Granata     if (WantsRawCommandString())
9329b62d1d5SEnrico Granata     {
9339b62d1d5SEnrico Granata         std::string help_text(GetHelp());
9347428a18cSKate Stone         help_text.append("  Expects 'raw' input (see 'help raw-input'.)");
9359b62d1d5SEnrico Granata         interpreter.OutputFormattedHelpText(output_strm, "", "", help_text.c_str(), 1);
9369b62d1d5SEnrico Granata     }
9379b62d1d5SEnrico Granata     else
9389b62d1d5SEnrico Granata         interpreter.OutputFormattedHelpText(output_strm, "", "", GetHelp(), 1);
9399b62d1d5SEnrico Granata     output_strm.Printf("\nSyntax: %s\n", GetSyntax());
9407428a18cSKate Stone     Options *options = GetOptions();
9417428a18cSKate Stone     if (options != nullptr)
9427428a18cSKate Stone     {
943*e1cfbc79STodd Fiala         options->GenerateOptionUsage(output_strm, this,
944*e1cfbc79STodd Fiala                                      GetCommandInterpreter()
945*e1cfbc79STodd Fiala                                         .GetDebugger().GetTerminalWidth());
9467428a18cSKate Stone     }
9479b62d1d5SEnrico Granata     const char *long_help = GetHelpLong();
9487428a18cSKate Stone     if ((long_help != nullptr) && (strlen(long_help) > 0))
9497428a18cSKate Stone     {
950ea671fbdSKate Stone         FormatLongHelpText(output_strm, long_help);
9517428a18cSKate Stone     }
9527428a18cSKate Stone     if (!IsDashDashCommand() && options && options->NumCommandOptions() > 0)
953bfb75e9bSEnrico Granata     {
9549b62d1d5SEnrico Granata         if (WantsRawCommandString() && !WantsCompletion())
9559b62d1d5SEnrico Granata         {
9569b62d1d5SEnrico Granata             // Emit the message about using ' -- ' between the end of the command options and the raw input
9579b62d1d5SEnrico Granata             // conditionally, i.e., only if the command object does not want completion.
9587428a18cSKate Stone             interpreter.OutputFormattedHelpText(
9597428a18cSKate Stone                 output_strm, "", "",
9607428a18cSKate Stone                 "\nImportant Note: Because this command takes 'raw' input, if you use any command options"
9617428a18cSKate Stone                 " you must use ' -- ' between the end of the command options and the beginning of the raw input.",
9627428a18cSKate Stone                 1);
9639b62d1d5SEnrico Granata         }
9647428a18cSKate Stone         else if (GetNumArgumentEntries() > 0)
9659b62d1d5SEnrico Granata         {
9669b62d1d5SEnrico Granata             // Also emit a warning about using "--" in case you are using a command that takes options and arguments.
9677428a18cSKate Stone             interpreter.OutputFormattedHelpText(
9687428a18cSKate Stone                 output_strm, "", "", "\nThis command takes options and free-form arguments.  If your arguments resemble"
9699b62d1d5SEnrico Granata                                      " option specifiers (i.e., they start with a - or --), you must use ' -- ' between"
9707428a18cSKate Stone                                      " the end of the command options and the beginning of the arguments.",
9717428a18cSKate Stone                 1);
9729b62d1d5SEnrico Granata         }
9739b62d1d5SEnrico Granata     }
974bfb75e9bSEnrico Granata }
9759b62d1d5SEnrico Granata 
9769b62d1d5SEnrico Granata void
977de753464SJohnny Chen CommandObject::AddIDsArgumentData(CommandArgumentEntry &arg, CommandArgumentType ID, CommandArgumentType IDRange)
978184d7a72SJohnny Chen {
979184d7a72SJohnny Chen     CommandArgumentData id_arg;
980184d7a72SJohnny Chen     CommandArgumentData id_range_arg;
981184d7a72SJohnny Chen 
982184d7a72SJohnny Chen     // Create the first variant for the first (and only) argument for this command.
983de753464SJohnny Chen     id_arg.arg_type = ID;
984184d7a72SJohnny Chen     id_arg.arg_repetition = eArgRepeatOptional;
985184d7a72SJohnny Chen 
986184d7a72SJohnny Chen     // Create the second variant for the first (and only) argument for this command.
987de753464SJohnny Chen     id_range_arg.arg_type = IDRange;
988184d7a72SJohnny Chen     id_range_arg.arg_repetition = eArgRepeatOptional;
989184d7a72SJohnny Chen 
990a3234732SJohnny Chen     // The first (and only) argument for this command could be either an id or an id_range.
991184d7a72SJohnny Chen     // Push both variants into the entry for the first argument for this command.
992184d7a72SJohnny Chen     arg.push_back(id_arg);
993184d7a72SJohnny Chen     arg.push_back(id_range_arg);
994184d7a72SJohnny Chen }
995184d7a72SJohnny Chen 
9969d0402b1SGreg Clayton const char *
9979d0402b1SGreg Clayton CommandObject::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type)
9989d0402b1SGreg Clayton {
99948b475cbSZachary Turner     assert(arg_type < eArgTypeLastArg && "Invalid argument type passed to GetArgumentTypeAsCString");
10009d0402b1SGreg Clayton     return g_arguments_data[arg_type].arg_name;
10019d0402b1SGreg Clayton }
10029d0402b1SGreg Clayton 
10039d0402b1SGreg Clayton const char *
10049d0402b1SGreg Clayton CommandObject::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type)
10059d0402b1SGreg Clayton {
100648b475cbSZachary Turner     assert(arg_type < eArgTypeLastArg && "Invalid argument type passed to GetArgumentDescriptionAsCString");
10079d0402b1SGreg Clayton     return g_arguments_data[arg_type].help_text;
10089d0402b1SGreg Clayton }
10099d0402b1SGreg Clayton 
1010893c932aSJim Ingham Target *
1011893c932aSJim Ingham CommandObject::GetDummyTarget()
1012893c932aSJim Ingham {
1013893c932aSJim Ingham     return m_interpreter.GetDebugger().GetDummyTarget();
1014893c932aSJim Ingham }
1015893c932aSJim Ingham 
1016893c932aSJim Ingham Target *
101733df7cd3SJim Ingham CommandObject::GetSelectedOrDummyTarget(bool prefer_dummy)
1018893c932aSJim Ingham {
101933df7cd3SJim Ingham     return m_interpreter.GetDebugger().GetSelectedOrDummyTarget(prefer_dummy);
1020893c932aSJim Ingham }
1021893c932aSJim Ingham 
10228d94ba0fSJim Ingham Thread *
10238d94ba0fSJim Ingham CommandObject::GetDefaultThread()
10248d94ba0fSJim Ingham {
10258d94ba0fSJim Ingham     Thread *thread_to_use = m_exe_ctx.GetThreadPtr();
10268d94ba0fSJim Ingham     if (thread_to_use)
10278d94ba0fSJim Ingham         return thread_to_use;
10288d94ba0fSJim Ingham 
10298d94ba0fSJim Ingham     Process *process = m_exe_ctx.GetProcessPtr();
10308d94ba0fSJim Ingham     if (!process)
10318d94ba0fSJim Ingham     {
10328d94ba0fSJim Ingham         Target *target = m_exe_ctx.GetTargetPtr();
10338d94ba0fSJim Ingham         if (!target)
10348d94ba0fSJim Ingham         {
10358d94ba0fSJim Ingham             target = m_interpreter.GetDebugger().GetSelectedTarget().get();
10368d94ba0fSJim Ingham         }
10378d94ba0fSJim Ingham         if (target)
10388d94ba0fSJim Ingham             process = target->GetProcessSP().get();
10398d94ba0fSJim Ingham     }
10408d94ba0fSJim Ingham 
10418d94ba0fSJim Ingham     if (process)
10428d94ba0fSJim Ingham         return process->GetThreadList().GetSelectedThread().get();
10438d94ba0fSJim Ingham     else
10448d94ba0fSJim Ingham         return nullptr;
10458d94ba0fSJim Ingham }
10468d94ba0fSJim Ingham 
10475a988416SJim Ingham bool
10485a988416SJim Ingham CommandObjectParsed::Execute (const char *args_string, CommandReturnObject &result)
10495a988416SJim Ingham {
10505a988416SJim Ingham     bool handled = false;
10515a988416SJim Ingham     Args cmd_args (args_string);
10523b652621SJim Ingham     if (HasOverrideCallback())
10535a988416SJim Ingham     {
10545a988416SJim Ingham         Args full_args (GetCommandName ());
10555a988416SJim Ingham         full_args.AppendArguments(cmd_args);
10563b652621SJim Ingham         handled = InvokeOverrideCallback (full_args.GetConstArgumentVector(), result);
10575a988416SJim Ingham     }
10585a988416SJim Ingham     if (!handled)
10595a988416SJim Ingham     {
10605a988416SJim Ingham         for (size_t i = 0; i < cmd_args.GetArgumentCount();  ++i)
10615a988416SJim Ingham         {
10625a988416SJim Ingham             const char *tmp_str = cmd_args.GetArgumentAtIndex (i);
10635a988416SJim Ingham             if (tmp_str[0] == '`')  // back-quote
10645a988416SJim Ingham                 cmd_args.ReplaceArgumentAtIndex (i, m_interpreter.ProcessEmbeddedScriptCommands (tmp_str));
10655a988416SJim Ingham         }
10665a988416SJim Ingham 
1067f9fc609fSGreg Clayton         if (CheckRequirements(result))
1068f9fc609fSGreg Clayton         {
1069f9fc609fSGreg Clayton             if (ParseOptions (cmd_args, result))
1070f9fc609fSGreg Clayton             {
10715a988416SJim Ingham                 // Call the command-specific version of 'Execute', passing it the already processed arguments.
10725a988416SJim Ingham                 handled = DoExecute (cmd_args, result);
10735a988416SJim Ingham             }
1074f9fc609fSGreg Clayton         }
1075f9fc609fSGreg Clayton 
1076f9fc609fSGreg Clayton         Cleanup();
1077f9fc609fSGreg Clayton     }
10785a988416SJim Ingham     return handled;
10795a988416SJim Ingham }
10805a988416SJim Ingham 
10815a988416SJim Ingham bool
10825a988416SJim Ingham CommandObjectRaw::Execute (const char *args_string, CommandReturnObject &result)
10835a988416SJim Ingham {
10845a988416SJim Ingham     bool handled = false;
10853b652621SJim Ingham     if (HasOverrideCallback())
10865a988416SJim Ingham     {
10875a988416SJim Ingham         std::string full_command (GetCommandName ());
10885a988416SJim Ingham         full_command += ' ';
10895a988416SJim Ingham         full_command += args_string;
1090d78c9576SEd Maste         const char *argv[2] = { nullptr, nullptr };
10915a988416SJim Ingham         argv[0] = full_command.c_str();
10923b652621SJim Ingham         handled = InvokeOverrideCallback (argv, result);
10935a988416SJim Ingham     }
10945a988416SJim Ingham     if (!handled)
10955a988416SJim Ingham     {
1096f9fc609fSGreg Clayton         if (CheckRequirements(result))
10975a988416SJim Ingham             handled = DoExecute (args_string, result);
1098f9fc609fSGreg Clayton 
1099f9fc609fSGreg Clayton         Cleanup();
11005a988416SJim Ingham     }
11015a988416SJim Ingham     return handled;
11025a988416SJim Ingham }
11035a988416SJim Ingham 
1104ca7835c6SJohnny Chen static
1105ca7835c6SJohnny Chen const char *arch_helper()
1106ca7835c6SJohnny Chen {
1107d70b14eaSGreg Clayton     static StreamString g_archs_help;
1108797a1b37SJohnny Chen     if (g_archs_help.Empty())
1109d70b14eaSGreg Clayton     {
1110ca7835c6SJohnny Chen         StringList archs;
1111d78c9576SEd Maste         ArchSpec::AutoComplete(nullptr, archs);
1112d70b14eaSGreg Clayton         g_archs_help.Printf("These are the supported architecture names:\n");
1113797a1b37SJohnny Chen         archs.Join("\n", g_archs_help);
1114d70b14eaSGreg Clayton     }
1115d70b14eaSGreg Clayton     return g_archs_help.GetData();
1116ca7835c6SJohnny Chen }
1117ca7835c6SJohnny Chen 
11187428a18cSKate Stone CommandObject::ArgumentTableEntry CommandObject::g_arguments_data[] = {
11197428a18cSKate Stone     // clang-format off
1120d78c9576SEd Maste     { eArgTypeAddress, "address", CommandCompletions::eNoCompletion, { nullptr, false }, "A valid address in the target program's execution space." },
1121d78c9576SEd Maste     { eArgTypeAddressOrExpression, "address-expression", CommandCompletions::eNoCompletion, { nullptr, false }, "An expression that resolves to an address." },
1122d78c9576SEd Maste     { eArgTypeAliasName, "alias-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of an abbreviation (alias) for a debugger command." },
1123d78c9576SEd Maste     { eArgTypeAliasOptions, "options-for-aliased-command", CommandCompletions::eNoCompletion, { nullptr, false }, "Command options to be used as part of an alias (abbreviation) definition.  (See 'help commands alias' for more information.)" },
1124ca7835c6SJohnny Chen     { eArgTypeArchitecture, "arch", CommandCompletions::eArchitectureCompletion, { arch_helper, true }, "The architecture name, e.g. i386 or x86_64." },
1125d78c9576SEd Maste     { eArgTypeBoolean, "boolean", CommandCompletions::eNoCompletion, { nullptr, false }, "A Boolean value: 'true' or 'false'" },
1126d78c9576SEd Maste     { eArgTypeBreakpointID, "breakpt-id", CommandCompletions::eNoCompletion, { BreakpointIDHelpTextCallback, false }, nullptr },
1127d78c9576SEd Maste     { eArgTypeBreakpointIDRange, "breakpt-id-list", CommandCompletions::eNoCompletion, { BreakpointIDRangeHelpTextCallback, false }, nullptr },
11285e09c8c3SJim Ingham     { eArgTypeBreakpointName, "breakpoint-name", CommandCompletions::eNoCompletion, { BreakpointNameHelpTextCallback, false }, nullptr },
1129d78c9576SEd Maste     { eArgTypeByteSize, "byte-size", CommandCompletions::eNoCompletion, { nullptr, false }, "Number of bytes to use." },
1130d78c9576SEd Maste     { eArgTypeClassName, "class-name", CommandCompletions::eNoCompletion, { nullptr, false }, "Then name of a class from the debug information in the program." },
1131d78c9576SEd Maste     { eArgTypeCommandName, "cmd-name", CommandCompletions::eNoCompletion, { nullptr, false }, "A debugger command (may be multiple words), without any options or arguments." },
1132d78c9576SEd Maste     { eArgTypeCount, "count", CommandCompletions::eNoCompletion, { nullptr, false }, "An unsigned integer." },
1133d78c9576SEd Maste     { eArgTypeDirectoryName, "directory", CommandCompletions::eDiskDirectoryCompletion, { nullptr, false }, "A directory name." },
1134d78c9576SEd Maste     { eArgTypeDisassemblyFlavor, "disassembly-flavor", CommandCompletions::eNoCompletion, { nullptr, false }, "A disassembly flavor recognized by your disassembly plugin.  Currently the only valid options are \"att\" and \"intel\" for Intel targets" },
1135d78c9576SEd Maste     { eArgTypeDescriptionVerbosity, "description-verbosity", CommandCompletions::eNoCompletion, { nullptr, false }, "How verbose the output of 'po' should be." },
1136d78c9576SEd Maste     { eArgTypeEndAddress, "end-address", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1137d78c9576SEd Maste     { eArgTypeExpression, "expr", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1138d78c9576SEd Maste     { eArgTypeExpressionPath, "expr-path", CommandCompletions::eNoCompletion, { ExprPathHelpTextCallback, true }, nullptr },
1139d78c9576SEd Maste     { eArgTypeExprFormat, "expression-format", CommandCompletions::eNoCompletion, { nullptr, false }, "[ [bool|b] | [bin] | [char|c] | [oct|o] | [dec|i|d|u] | [hex|x] | [float|f] | [cstr|s] ]" },
1140d78c9576SEd Maste     { eArgTypeFilename, "filename", CommandCompletions::eDiskFileCompletion, { nullptr, false }, "The name of a file (can include path)." },
1141d78c9576SEd Maste     { eArgTypeFormat, "format", CommandCompletions::eNoCompletion, { FormatHelpTextCallback, true }, nullptr },
1142d78c9576SEd Maste     { eArgTypeFrameIndex, "frame-index", CommandCompletions::eNoCompletion, { nullptr, false }, "Index into a thread's list of frames." },
1143d78c9576SEd Maste     { eArgTypeFullName, "fullname", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1144d78c9576SEd Maste     { eArgTypeFunctionName, "function-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a function." },
1145d78c9576SEd Maste     { eArgTypeFunctionOrSymbol, "function-or-symbol", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a function or symbol." },
1146d78c9576SEd Maste     { eArgTypeGDBFormat, "gdb-format", CommandCompletions::eNoCompletion, { GDBFormatHelpTextCallback, true }, nullptr },
1147735152e3SEnrico Granata     { eArgTypeHelpText, "help-text", CommandCompletions::eNoCompletion, { nullptr, false }, "Text to be used as help for some other entity in LLDB" },
1148d78c9576SEd Maste     { eArgTypeIndex, "index", CommandCompletions::eNoCompletion, { nullptr, false }, "An index into a list." },
11497a67ee26SEnrico Granata     { eArgTypeLanguage, "source-language", CommandCompletions::eNoCompletion, { LanguageTypeHelpTextCallback, true }, nullptr },
1150d78c9576SEd Maste     { eArgTypeLineNum, "linenum", CommandCompletions::eNoCompletion, { nullptr, false }, "Line number in a source file." },
1151d78c9576SEd Maste     { eArgTypeLogCategory, "log-category", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a category within a log channel, e.g. all (try \"log list\" to see a list of all channels and their categories." },
1152d78c9576SEd Maste     { eArgTypeLogChannel, "log-channel", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a log channel, e.g. process.gdb-remote (try \"log list\" to see a list of all channels and their categories)." },
1153d78c9576SEd Maste     { eArgTypeMethod, "method", CommandCompletions::eNoCompletion, { nullptr, false }, "A C++ method name." },
1154d78c9576SEd Maste     { eArgTypeName, "name", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1155d78c9576SEd Maste     { eArgTypeNewPathPrefix, "new-path-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1156d78c9576SEd Maste     { eArgTypeNumLines, "num-lines", CommandCompletions::eNoCompletion, { nullptr, false }, "The number of lines to use." },
1157d78c9576SEd Maste     { eArgTypeNumberPerLine, "number-per-line", CommandCompletions::eNoCompletion, { nullptr, false }, "The number of items per line to display." },
1158d78c9576SEd Maste     { eArgTypeOffset, "offset", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1159d78c9576SEd Maste     { eArgTypeOldPathPrefix, "old-path-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1160d78c9576SEd Maste     { eArgTypeOneLiner, "one-line-command", CommandCompletions::eNoCompletion, { nullptr, false }, "A command that is entered as a single line of text." },
1161d78c9576SEd Maste     { eArgTypePath, "path", CommandCompletions::eDiskFileCompletion, { nullptr, false }, "Path." },
1162d78c9576SEd Maste     { eArgTypePermissionsNumber, "perms-numeric", CommandCompletions::eNoCompletion, { nullptr, false }, "Permissions given as an octal number (e.g. 755)." },
1163d78c9576SEd Maste     { eArgTypePermissionsString, "perms=string", CommandCompletions::eNoCompletion, { nullptr, false }, "Permissions given as a string value (e.g. rw-r-xr--)." },
1164d78c9576SEd Maste     { eArgTypePid, "pid", CommandCompletions::eNoCompletion, { nullptr, false }, "The process ID number." },
1165d78c9576SEd Maste     { eArgTypePlugin, "plugin", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1166d78c9576SEd Maste     { eArgTypeProcessName, "process-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of the process." },
1167d78c9576SEd Maste     { eArgTypePythonClass, "python-class", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a Python class." },
1168d78c9576SEd Maste     { eArgTypePythonFunction, "python-function", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a Python function." },
1169d78c9576SEd Maste     { eArgTypePythonScript, "python-script", CommandCompletions::eNoCompletion, { nullptr, false }, "Source code written in Python." },
1170d78c9576SEd Maste     { eArgTypeQueueName, "queue-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of the thread queue." },
1171d78c9576SEd Maste     { eArgTypeRegisterName, "register-name", CommandCompletions::eNoCompletion, { RegisterNameHelpTextCallback, true }, nullptr },
1172d78c9576SEd Maste     { eArgTypeRegularExpression, "regular-expression", CommandCompletions::eNoCompletion, { nullptr, false }, "A regular expression." },
1173d78c9576SEd Maste     { eArgTypeRunArgs, "run-args", CommandCompletions::eNoCompletion, { nullptr, false }, "Arguments to be passed to the target program when it starts executing." },
1174d78c9576SEd Maste     { eArgTypeRunMode, "run-mode", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1175d78c9576SEd Maste     { eArgTypeScriptedCommandSynchronicity, "script-cmd-synchronicity", CommandCompletions::eNoCompletion, { nullptr, false }, "The synchronicity to use to run scripted commands with regard to LLDB event system." },
1176d78c9576SEd Maste     { eArgTypeScriptLang, "script-language", CommandCompletions::eNoCompletion, { nullptr, false }, "The scripting language to be used for script-based commands.  Currently only Python is valid." },
11777428a18cSKate Stone     { eArgTypeSearchWord, "search-word", CommandCompletions::eNoCompletion, { nullptr, false }, "Any word of interest for search purposes." },
1178d78c9576SEd Maste     { eArgTypeSelector, "selector", CommandCompletions::eNoCompletion, { nullptr, false }, "An Objective-C selector name." },
1179d78c9576SEd Maste     { eArgTypeSettingIndex, "setting-index", CommandCompletions::eNoCompletion, { nullptr, false }, "An index into a settings variable that is an array (try 'settings list' to see all the possible settings variables and their types)." },
1180d78c9576SEd Maste     { eArgTypeSettingKey, "setting-key", CommandCompletions::eNoCompletion, { nullptr, false }, "A key into a settings variables that is a dictionary (try 'settings list' to see all the possible settings variables and their types)." },
1181d78c9576SEd Maste     { eArgTypeSettingPrefix, "setting-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a settable internal debugger variable up to a dot ('.'), e.g. 'target.process.'" },
1182d78c9576SEd Maste     { eArgTypeSettingVariableName, "setting-variable-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a settable internal debugger variable.  Type 'settings list' to see a complete list of such variables." },
1183d78c9576SEd Maste     { eArgTypeShlibName, "shlib-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a shared library." },
1184d78c9576SEd Maste     { eArgTypeSourceFile, "source-file", CommandCompletions::eSourceFileCompletion, { nullptr, false }, "The name of a source file.." },
1185d78c9576SEd Maste     { eArgTypeSortOrder, "sort-order", CommandCompletions::eNoCompletion, { nullptr, false }, "Specify a sort order when dumping lists." },
1186d78c9576SEd Maste     { eArgTypeStartAddress, "start-address", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1187d78c9576SEd Maste     { eArgTypeSummaryString, "summary-string", CommandCompletions::eNoCompletion, { SummaryStringHelpTextCallback, true }, nullptr },
1188d78c9576SEd Maste     { eArgTypeSymbol, "symbol", CommandCompletions::eSymbolCompletion, { nullptr, false }, "Any symbol name (function name, variable, argument, etc.)" },
1189d78c9576SEd Maste     { eArgTypeThreadID, "thread-id", CommandCompletions::eNoCompletion, { nullptr, false }, "Thread ID number." },
1190d78c9576SEd Maste     { eArgTypeThreadIndex, "thread-index", CommandCompletions::eNoCompletion, { nullptr, false }, "Index into the process' list of threads." },
1191d78c9576SEd Maste     { eArgTypeThreadName, "thread-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The thread's name." },
1192a72b31c7SJim Ingham     { eArgTypeTypeName, "type-name", CommandCompletions::eNoCompletion, { nullptr, false }, "A type name." },
1193d78c9576SEd Maste     { eArgTypeUnsignedInteger, "unsigned-integer", CommandCompletions::eNoCompletion, { nullptr, false }, "An unsigned integer." },
1194d78c9576SEd Maste     { eArgTypeUnixSignal, "unix-signal", CommandCompletions::eNoCompletion, { nullptr, false }, "A valid Unix signal name or number (e.g. SIGKILL, KILL or 9)." },
1195d78c9576SEd Maste     { eArgTypeVarName, "variable-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a variable in your program." },
1196d78c9576SEd Maste     { eArgTypeValue, "value", CommandCompletions::eNoCompletion, { nullptr, false }, "A value could be anything, depending on where and how it is used." },
1197d78c9576SEd Maste     { eArgTypeWidth, "width", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1198d78c9576SEd Maste     { eArgTypeNone, "none", CommandCompletions::eNoCompletion, { nullptr, false }, "No help available for this." },
1199d78c9576SEd Maste     { eArgTypePlatform, "platform-name", CommandCompletions::ePlatformPluginCompletion, { nullptr, false }, "The name of an installed platform plug-in . Type 'platform list' to see a complete list of installed platforms." },
1200d78c9576SEd Maste     { eArgTypeWatchpointID, "watchpt-id", CommandCompletions::eNoCompletion, { nullptr, false }, "Watchpoint IDs are positive integers." },
1201d78c9576SEd Maste     { eArgTypeWatchpointIDRange, "watchpt-id-list", CommandCompletions::eNoCompletion, { nullptr, false }, "For example, '1-3' or '1 to 3'." },
12027428a18cSKate Stone     { eArgTypeWatchType, "watch-type", CommandCompletions::eNoCompletion, { nullptr, false }, "Specify the type for a watchpoint." },
12037428a18cSKate Stone     { eArgRawInput, "raw-input", CommandCompletions::eNoCompletion, { nullptr, false }, "Free-form text passed to a command without prior interpretation, allowing spaces without requiring quotes.  To pass arguments and free form text put two dashes ' -- ' between the last argument and any raw input." }
12047428a18cSKate Stone     // clang-format on
1205e139cf23SCaroline Tice };
1206e139cf23SCaroline Tice 
1207e139cf23SCaroline Tice const CommandObject::ArgumentTableEntry*
1208e139cf23SCaroline Tice CommandObject::GetArgumentTable ()
1209e139cf23SCaroline Tice {
12109d0402b1SGreg Clayton     // If this assertion fires, then the table above is out of date with the CommandArgumentType enumeration
12119d0402b1SGreg Clayton     assert ((sizeof (CommandObject::g_arguments_data) / sizeof (CommandObject::ArgumentTableEntry)) == eArgTypeLastArg);
1212e139cf23SCaroline Tice     return CommandObject::g_arguments_data;
1213e139cf23SCaroline Tice }
1214e139cf23SCaroline Tice 
1215e139cf23SCaroline Tice 
1216