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 {
121*bfb75e9bSEnrico Granata     if (cstr)
12230fdc8d8SChris Lattner         m_cmd_help_short = cstr;
123*bfb75e9bSEnrico Granata     else
124*bfb75e9bSEnrico Granata         m_cmd_help_short.assign("");
1256f79bb2dSEnrico Granata }
1266f79bb2dSEnrico Granata 
1276f79bb2dSEnrico Granata void
12830fdc8d8SChris Lattner CommandObject::SetHelpLong (const char *cstr)
12930fdc8d8SChris Lattner {
130*bfb75e9bSEnrico Granata     if (cstr)
13130fdc8d8SChris Lattner         m_cmd_help_long = cstr;
132*bfb75e9bSEnrico Granata     else
133*bfb75e9bSEnrico 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;
162f6b8b581SGreg Clayton         options->NotifyOptionParsingStarting();
16330fdc8d8SChris Lattner 
164b7ad58a0SGreg Clayton         // ParseOptions calls getopt_long_only, which always skips the zero'th item in the array and starts at position 1,
16530fdc8d8SChris Lattner         // so we need to push a dummy value into position zero.
16630fdc8d8SChris Lattner         args.Unshift("dummy_string");
16730fdc8d8SChris Lattner         error = args.ParseOptions (*options);
16830fdc8d8SChris Lattner 
16930fdc8d8SChris Lattner         // The "dummy_string" will have already been removed by ParseOptions,
17030fdc8d8SChris Lattner         // so no need to remove it.
17130fdc8d8SChris Lattner 
172f6b8b581SGreg Clayton         if (error.Success())
173f6b8b581SGreg Clayton             error = options->NotifyOptionParsingFinished();
174f6b8b581SGreg Clayton 
175f6b8b581SGreg Clayton         if (error.Success())
176f6b8b581SGreg Clayton         {
177f6b8b581SGreg Clayton             if (options->VerifyOptions (result))
178f6b8b581SGreg Clayton                 return true;
179f6b8b581SGreg Clayton         }
180f6b8b581SGreg Clayton         else
18130fdc8d8SChris Lattner         {
18230fdc8d8SChris Lattner             const char *error_cstr = error.AsCString();
18330fdc8d8SChris Lattner             if (error_cstr)
18430fdc8d8SChris Lattner             {
18530fdc8d8SChris Lattner                 // We got an error string, lets use that
18686edbf41SGreg Clayton                 result.AppendError(error_cstr);
18730fdc8d8SChris Lattner             }
18830fdc8d8SChris Lattner             else
18930fdc8d8SChris Lattner             {
19030fdc8d8SChris Lattner                 // No error string, output the usage information into result
191eb0103f2SGreg Clayton                 options->GenerateOptionUsage (result.GetErrorStream(), this);
19230fdc8d8SChris Lattner             }
193f6b8b581SGreg Clayton         }
19430fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
19530fdc8d8SChris Lattner         return false;
19630fdc8d8SChris Lattner     }
19730fdc8d8SChris Lattner     return true;
19830fdc8d8SChris Lattner }
19930fdc8d8SChris Lattner 
2005a988416SJim Ingham 
2015a988416SJim Ingham 
2025a988416SJim Ingham bool
203f9fc609fSGreg Clayton CommandObject::CheckRequirements (CommandReturnObject &result)
2045a988416SJim Ingham {
205f9fc609fSGreg Clayton #ifdef LLDB_CONFIGURATION_DEBUG
206f9fc609fSGreg Clayton     // Nothing should be stored in m_exe_ctx between running commands as m_exe_ctx
207f9fc609fSGreg Clayton     // has shared pointers to the target, process, thread and frame and we don't
208f9fc609fSGreg Clayton     // want any CommandObject instances to keep any of these objects around
209f9fc609fSGreg Clayton     // longer than for a single command. Every command should call
210f9fc609fSGreg Clayton     // CommandObject::Cleanup() after it has completed
211f9fc609fSGreg Clayton     assert (m_exe_ctx.GetTargetPtr() == NULL);
212f9fc609fSGreg Clayton     assert (m_exe_ctx.GetProcessPtr() == NULL);
213f9fc609fSGreg Clayton     assert (m_exe_ctx.GetThreadPtr() == NULL);
214f9fc609fSGreg Clayton     assert (m_exe_ctx.GetFramePtr() == NULL);
215f9fc609fSGreg Clayton #endif
216f9fc609fSGreg Clayton 
217f9fc609fSGreg Clayton     // Lock down the interpreter's execution context prior to running the
218f9fc609fSGreg Clayton     // command so we guarantee the selected target, process, thread and frame
219f9fc609fSGreg Clayton     // can't go away during the execution
220f9fc609fSGreg Clayton     m_exe_ctx = m_interpreter.GetExecutionContext();
221f9fc609fSGreg Clayton 
222f9fc609fSGreg Clayton     const uint32_t flags = GetFlags().Get();
223e87764f2SEnrico Granata     if (flags & (eCommandRequiresTarget   |
224e87764f2SEnrico Granata                  eCommandRequiresProcess  |
225e87764f2SEnrico Granata                  eCommandRequiresThread   |
226e87764f2SEnrico Granata                  eCommandRequiresFrame    |
227e87764f2SEnrico Granata                  eCommandTryTargetAPILock ))
228f9fc609fSGreg Clayton     {
229f9fc609fSGreg Clayton 
230e87764f2SEnrico Granata         if ((flags & eCommandRequiresTarget) && !m_exe_ctx.HasTargetScope())
231f9fc609fSGreg Clayton         {
232f9fc609fSGreg Clayton             result.AppendError (GetInvalidTargetDescription());
233f9fc609fSGreg Clayton             return false;
234f9fc609fSGreg Clayton         }
235f9fc609fSGreg Clayton 
236e87764f2SEnrico Granata         if ((flags & eCommandRequiresProcess) && !m_exe_ctx.HasProcessScope())
237f9fc609fSGreg Clayton         {
238e59b0d2cSJason Molenda             if (!m_exe_ctx.HasTargetScope())
239e59b0d2cSJason Molenda                 result.AppendError (GetInvalidTargetDescription());
240e59b0d2cSJason Molenda             else
241f9fc609fSGreg Clayton                 result.AppendError (GetInvalidProcessDescription());
242f9fc609fSGreg Clayton             return false;
243f9fc609fSGreg Clayton         }
244f9fc609fSGreg Clayton 
245e87764f2SEnrico Granata         if ((flags & eCommandRequiresThread) && !m_exe_ctx.HasThreadScope())
246f9fc609fSGreg Clayton         {
247e59b0d2cSJason Molenda             if (!m_exe_ctx.HasTargetScope())
248e59b0d2cSJason Molenda                 result.AppendError (GetInvalidTargetDescription());
249e59b0d2cSJason Molenda             else if (!m_exe_ctx.HasProcessScope())
250e59b0d2cSJason Molenda                 result.AppendError (GetInvalidProcessDescription());
251e59b0d2cSJason Molenda             else
252f9fc609fSGreg Clayton                 result.AppendError (GetInvalidThreadDescription());
253f9fc609fSGreg Clayton             return false;
254f9fc609fSGreg Clayton         }
255f9fc609fSGreg Clayton 
256e87764f2SEnrico Granata         if ((flags & eCommandRequiresFrame) && !m_exe_ctx.HasFrameScope())
257f9fc609fSGreg Clayton         {
258e59b0d2cSJason Molenda             if (!m_exe_ctx.HasTargetScope())
259e59b0d2cSJason Molenda                 result.AppendError (GetInvalidTargetDescription());
260e59b0d2cSJason Molenda             else if (!m_exe_ctx.HasProcessScope())
261e59b0d2cSJason Molenda                 result.AppendError (GetInvalidProcessDescription());
262e59b0d2cSJason Molenda             else if (!m_exe_ctx.HasThreadScope())
263e59b0d2cSJason Molenda                 result.AppendError (GetInvalidThreadDescription());
264e59b0d2cSJason Molenda             else
265f9fc609fSGreg Clayton                 result.AppendError (GetInvalidFrameDescription());
266f9fc609fSGreg Clayton             return false;
267f9fc609fSGreg Clayton         }
268f9fc609fSGreg Clayton 
269e87764f2SEnrico Granata         if ((flags & eCommandRequiresRegContext) && (m_exe_ctx.GetRegisterContext() == nullptr))
270f9fc609fSGreg Clayton         {
271f9fc609fSGreg Clayton             result.AppendError (GetInvalidRegContextDescription());
272f9fc609fSGreg Clayton             return false;
273f9fc609fSGreg Clayton         }
274f9fc609fSGreg Clayton 
275e87764f2SEnrico Granata         if (flags & eCommandTryTargetAPILock)
276f9fc609fSGreg Clayton         {
277f9fc609fSGreg Clayton             Target *target = m_exe_ctx.GetTargetPtr();
278f9fc609fSGreg Clayton             if (target)
2799b5442aeSGreg Clayton                 m_api_locker.Lock (target->GetAPIMutex());
280f9fc609fSGreg Clayton         }
281f9fc609fSGreg Clayton     }
282f9fc609fSGreg Clayton 
283e87764f2SEnrico Granata     if (GetFlags().AnySet (eCommandProcessMustBeLaunched | eCommandProcessMustBePaused))
284b766a73dSGreg Clayton     {
285c14ee32dSGreg Clayton         Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
286d78c9576SEd Maste         if (process == nullptr)
28730fdc8d8SChris Lattner         {
288b8e8a5f3SJim Ingham             // A process that is not running is considered paused.
289e87764f2SEnrico Granata             if (GetFlags().Test(eCommandProcessMustBeLaunched))
290b8e8a5f3SJim Ingham             {
29130fdc8d8SChris Lattner                 result.AppendError ("Process must exist.");
29230fdc8d8SChris Lattner                 result.SetStatus (eReturnStatusFailed);
29330fdc8d8SChris Lattner                 return false;
29430fdc8d8SChris Lattner             }
295b8e8a5f3SJim Ingham         }
29630fdc8d8SChris Lattner         else
29730fdc8d8SChris Lattner         {
29830fdc8d8SChris Lattner             StateType state = process->GetState();
29930fdc8d8SChris Lattner             switch (state)
30030fdc8d8SChris Lattner             {
3017a5388bfSGreg Clayton             case eStateInvalid:
30230fdc8d8SChris Lattner             case eStateSuspended:
30330fdc8d8SChris Lattner             case eStateCrashed:
30430fdc8d8SChris Lattner             case eStateStopped:
30530fdc8d8SChris Lattner                 break;
30630fdc8d8SChris Lattner 
307b766a73dSGreg Clayton             case eStateConnected:
308b766a73dSGreg Clayton             case eStateAttaching:
309b766a73dSGreg Clayton             case eStateLaunching:
31030fdc8d8SChris Lattner             case eStateDetached:
31130fdc8d8SChris Lattner             case eStateExited:
31230fdc8d8SChris Lattner             case eStateUnloaded:
313e87764f2SEnrico Granata                 if (GetFlags().Test(eCommandProcessMustBeLaunched))
31430fdc8d8SChris Lattner                 {
31530fdc8d8SChris Lattner                     result.AppendError ("Process must be launched.");
31630fdc8d8SChris Lattner                     result.SetStatus (eReturnStatusFailed);
31730fdc8d8SChris Lattner                     return false;
31830fdc8d8SChris Lattner                 }
31930fdc8d8SChris Lattner                 break;
32030fdc8d8SChris Lattner 
32130fdc8d8SChris Lattner             case eStateRunning:
32230fdc8d8SChris Lattner             case eStateStepping:
323e87764f2SEnrico Granata                 if (GetFlags().Test(eCommandProcessMustBePaused))
32430fdc8d8SChris Lattner                 {
32530fdc8d8SChris Lattner                     result.AppendError ("Process is running.  Use 'process interrupt' to pause execution.");
32630fdc8d8SChris Lattner                     result.SetStatus (eReturnStatusFailed);
32730fdc8d8SChris Lattner                     return false;
32830fdc8d8SChris Lattner                 }
32930fdc8d8SChris Lattner             }
33030fdc8d8SChris Lattner         }
331b766a73dSGreg Clayton     }
3325a988416SJim Ingham     return true;
33330fdc8d8SChris Lattner }
33430fdc8d8SChris Lattner 
335f9fc609fSGreg Clayton void
336f9fc609fSGreg Clayton CommandObject::Cleanup ()
337f9fc609fSGreg Clayton {
338f9fc609fSGreg Clayton     m_exe_ctx.Clear();
339f9fc609fSGreg Clayton     m_api_locker.Unlock();
340f9fc609fSGreg Clayton }
341f9fc609fSGreg Clayton 
34230fdc8d8SChris Lattner int
34330fdc8d8SChris Lattner CommandObject::HandleCompletion
34430fdc8d8SChris Lattner (
34530fdc8d8SChris Lattner     Args &input,
34630fdc8d8SChris Lattner     int &cursor_index,
34730fdc8d8SChris Lattner     int &cursor_char_position,
34830fdc8d8SChris Lattner     int match_start_point,
34930fdc8d8SChris Lattner     int max_return_elements,
350558ce124SJim Ingham     bool &word_complete,
35130fdc8d8SChris Lattner     StringList &matches
35230fdc8d8SChris Lattner )
35330fdc8d8SChris Lattner {
354e171da5cSBruce Mitchener     // Default implementation of WantsCompletion() is !WantsRawCommandString().
3556561d15dSJohnny Chen     // Subclasses who want raw command string but desire, for example,
3566561d15dSJohnny Chen     // argument completion should override WantsCompletion() to return true,
3576561d15dSJohnny Chen     // instead.
3586f99b637SJohnny Chen     if (WantsRawCommandString() && !WantsCompletion())
35930fdc8d8SChris Lattner     {
36030fdc8d8SChris Lattner         // FIXME: Abstract telling the completion to insert the completion character.
36130fdc8d8SChris Lattner         matches.Clear();
36230fdc8d8SChris Lattner         return -1;
36330fdc8d8SChris Lattner     }
36430fdc8d8SChris Lattner     else
36530fdc8d8SChris Lattner     {
36630fdc8d8SChris Lattner         // Can we do anything generic with the options?
36730fdc8d8SChris Lattner         Options *cur_options = GetOptions();
36830fdc8d8SChris Lattner         CommandReturnObject result;
36930fdc8d8SChris Lattner         OptionElementVector opt_element_vector;
37030fdc8d8SChris Lattner 
371d78c9576SEd Maste         if (cur_options != nullptr)
37230fdc8d8SChris Lattner         {
37330fdc8d8SChris Lattner             // Re-insert the dummy command name string which will have been
37430fdc8d8SChris Lattner             // stripped off:
37530fdc8d8SChris Lattner             input.Unshift ("dummy-string");
37630fdc8d8SChris Lattner             cursor_index++;
37730fdc8d8SChris Lattner 
37830fdc8d8SChris Lattner 
37930fdc8d8SChris Lattner             // I stick an element on the end of the input, because if the last element is
380b7ad58a0SGreg Clayton             // option that requires an argument, getopt_long_only will freak out.
38130fdc8d8SChris Lattner 
38230fdc8d8SChris Lattner             input.AppendArgument ("<FAKE-VALUE>");
38330fdc8d8SChris Lattner 
384d43e0094SJim Ingham             input.ParseArgsForCompletion (*cur_options, opt_element_vector, cursor_index);
38530fdc8d8SChris Lattner 
38630fdc8d8SChris Lattner             input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1);
38730fdc8d8SChris Lattner 
38830fdc8d8SChris Lattner             bool handled_by_options;
389eb0103f2SGreg Clayton             handled_by_options = cur_options->HandleOptionCompletion (input,
39030fdc8d8SChris Lattner                                                                       opt_element_vector,
39130fdc8d8SChris Lattner                                                                       cursor_index,
39230fdc8d8SChris Lattner                                                                       cursor_char_position,
39330fdc8d8SChris Lattner                                                                       match_start_point,
39430fdc8d8SChris Lattner                                                                       max_return_elements,
395558ce124SJim Ingham                                                                       word_complete,
39630fdc8d8SChris Lattner                                                                       matches);
39730fdc8d8SChris Lattner             if (handled_by_options)
39830fdc8d8SChris Lattner                 return matches.GetSize();
39930fdc8d8SChris Lattner         }
40030fdc8d8SChris Lattner 
40130fdc8d8SChris Lattner         // If we got here, the last word is not an option or an option argument.
402a7015092SGreg Clayton         return HandleArgumentCompletion (input,
40330fdc8d8SChris Lattner                                          cursor_index,
40430fdc8d8SChris Lattner                                          cursor_char_position,
40530fdc8d8SChris Lattner                                          opt_element_vector,
40630fdc8d8SChris Lattner                                          match_start_point,
40730fdc8d8SChris Lattner                                          max_return_elements,
408558ce124SJim Ingham                                          word_complete,
40930fdc8d8SChris Lattner                                          matches);
41030fdc8d8SChris Lattner     }
41130fdc8d8SChris Lattner }
41230fdc8d8SChris Lattner 
41330fdc8d8SChris Lattner bool
414a7015092SGreg Clayton CommandObject::HelpTextContainsWord (const char *search_word)
41530fdc8d8SChris Lattner {
41630fdc8d8SChris Lattner     std::string options_usage_help;
41730fdc8d8SChris Lattner 
41830fdc8d8SChris Lattner     bool found_word = false;
41930fdc8d8SChris Lattner 
420998255bfSGreg Clayton     const char *short_help = GetHelp();
421998255bfSGreg Clayton     const char *long_help = GetHelpLong();
422998255bfSGreg Clayton     const char *syntax_help = GetSyntax();
42330fdc8d8SChris Lattner 
424998255bfSGreg Clayton     if (short_help && strcasestr (short_help, search_word))
42530fdc8d8SChris Lattner         found_word = true;
426998255bfSGreg Clayton     else if (long_help && strcasestr (long_help, search_word))
42730fdc8d8SChris Lattner         found_word = true;
428998255bfSGreg Clayton     else if (syntax_help && strcasestr (syntax_help, search_word))
42930fdc8d8SChris Lattner         found_word = true;
43030fdc8d8SChris Lattner 
43130fdc8d8SChris Lattner     if (!found_word
432d78c9576SEd Maste         && GetOptions() != nullptr)
43330fdc8d8SChris Lattner     {
43430fdc8d8SChris Lattner         StreamString usage_help;
435eb0103f2SGreg Clayton         GetOptions()->GenerateOptionUsage (usage_help, this);
43630fdc8d8SChris Lattner         if (usage_help.GetSize() > 0)
43730fdc8d8SChris Lattner         {
43830fdc8d8SChris Lattner             const char *usage_text = usage_help.GetData();
4394b6fbf37SCaroline Tice             if (strcasestr (usage_text, search_word))
44030fdc8d8SChris Lattner               found_word = true;
44130fdc8d8SChris Lattner         }
44230fdc8d8SChris Lattner     }
44330fdc8d8SChris Lattner 
44430fdc8d8SChris Lattner     return found_word;
44530fdc8d8SChris Lattner }
446e139cf23SCaroline Tice 
447e139cf23SCaroline Tice int
448e139cf23SCaroline Tice CommandObject::GetNumArgumentEntries  ()
449e139cf23SCaroline Tice {
450e139cf23SCaroline Tice     return m_arguments.size();
451e139cf23SCaroline Tice }
452e139cf23SCaroline Tice 
453e139cf23SCaroline Tice CommandObject::CommandArgumentEntry *
454e139cf23SCaroline Tice CommandObject::GetArgumentEntryAtIndex (int idx)
455e139cf23SCaroline Tice {
4563985c8c6SSaleem Abdulrasool     if (static_cast<size_t>(idx) < m_arguments.size())
457e139cf23SCaroline Tice         return &(m_arguments[idx]);
458e139cf23SCaroline Tice 
459d78c9576SEd Maste     return nullptr;
460e139cf23SCaroline Tice }
461e139cf23SCaroline Tice 
462d7e6a4f2SVince Harron const CommandObject::ArgumentTableEntry *
463e139cf23SCaroline Tice CommandObject::FindArgumentDataByType (CommandArgumentType arg_type)
464e139cf23SCaroline Tice {
465e139cf23SCaroline Tice     const ArgumentTableEntry *table = CommandObject::GetArgumentTable();
466e139cf23SCaroline Tice 
467e139cf23SCaroline Tice     for (int i = 0; i < eArgTypeLastArg; ++i)
468e139cf23SCaroline Tice         if (table[i].arg_type == arg_type)
469d7e6a4f2SVince Harron             return &(table[i]);
470e139cf23SCaroline Tice 
471d78c9576SEd Maste     return nullptr;
472e139cf23SCaroline Tice }
473e139cf23SCaroline Tice 
474e139cf23SCaroline Tice void
475e139cf23SCaroline Tice CommandObject::GetArgumentHelp (Stream &str, CommandArgumentType arg_type, CommandInterpreter &interpreter)
476e139cf23SCaroline Tice {
477e139cf23SCaroline Tice     const ArgumentTableEntry* table = CommandObject::GetArgumentTable();
478d7e6a4f2SVince Harron     const ArgumentTableEntry *entry = &(table[arg_type]);
479e139cf23SCaroline Tice 
480e139cf23SCaroline Tice     // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up...
481e139cf23SCaroline Tice 
482e139cf23SCaroline Tice     if (entry->arg_type != arg_type)
483e139cf23SCaroline Tice         entry = CommandObject::FindArgumentDataByType (arg_type);
484e139cf23SCaroline Tice 
485e139cf23SCaroline Tice     if (!entry)
486e139cf23SCaroline Tice         return;
487e139cf23SCaroline Tice 
488e139cf23SCaroline Tice     StreamString name_str;
489e139cf23SCaroline Tice     name_str.Printf ("<%s>", entry->arg_name);
490e139cf23SCaroline Tice 
491fc7a7f3bSEnrico Granata     if (entry->help_function)
49282a7d983SEnrico Granata     {
493fc7a7f3bSEnrico Granata         const char* help_text = entry->help_function();
49482a7d983SEnrico Granata         if (!entry->help_function.self_formatting)
49582a7d983SEnrico Granata         {
49682a7d983SEnrico Granata             interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", help_text,
497e139cf23SCaroline Tice                                                  name_str.GetSize());
49882a7d983SEnrico Granata         }
49982a7d983SEnrico Granata         else
50082a7d983SEnrico Granata         {
50182a7d983SEnrico Granata             interpreter.OutputHelpText(str, name_str.GetData(), "--", help_text,
50282a7d983SEnrico Granata                                        name_str.GetSize());
50382a7d983SEnrico Granata         }
50482a7d983SEnrico Granata     }
505e139cf23SCaroline Tice     else
506e139cf23SCaroline Tice         interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", entry->help_text, name_str.GetSize());
507e139cf23SCaroline Tice }
508e139cf23SCaroline Tice 
509e139cf23SCaroline Tice const char *
510e139cf23SCaroline Tice CommandObject::GetArgumentName (CommandArgumentType arg_type)
511e139cf23SCaroline Tice {
512d7e6a4f2SVince Harron     const ArgumentTableEntry *entry = &(CommandObject::GetArgumentTable()[arg_type]);
513deaab222SCaroline Tice 
514deaab222SCaroline Tice     // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up...
515deaab222SCaroline Tice 
516deaab222SCaroline Tice     if (entry->arg_type != arg_type)
517deaab222SCaroline Tice         entry = CommandObject::FindArgumentDataByType (arg_type);
518deaab222SCaroline Tice 
519e6acf355SJohnny Chen     if (entry)
520deaab222SCaroline Tice         return entry->arg_name;
521e6acf355SJohnny Chen 
522e6acf355SJohnny Chen     StreamString str;
523e6acf355SJohnny Chen     str << "Arg name for type (" << arg_type << ") not in arg table!";
524e6acf355SJohnny Chen     return str.GetData();
525e139cf23SCaroline Tice }
526e139cf23SCaroline Tice 
527405fe67fSCaroline Tice bool
528e0d378b3SGreg Clayton CommandObject::IsPairType (ArgumentRepetitionType arg_repeat_type)
529405fe67fSCaroline Tice {
530405fe67fSCaroline Tice     if ((arg_repeat_type == eArgRepeatPairPlain)
531405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairOptional)
532405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairPlus)
533405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairStar)
534405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairRange)
535405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairRangeOptional))
536405fe67fSCaroline Tice         return true;
537405fe67fSCaroline Tice 
538405fe67fSCaroline Tice     return false;
539405fe67fSCaroline Tice }
540405fe67fSCaroline Tice 
54134ddc8dbSJohnny Chen static CommandObject::CommandArgumentEntry
54234ddc8dbSJohnny Chen OptSetFiltered(uint32_t opt_set_mask, CommandObject::CommandArgumentEntry &cmd_arg_entry)
54334ddc8dbSJohnny Chen {
54434ddc8dbSJohnny Chen     CommandObject::CommandArgumentEntry ret_val;
54534ddc8dbSJohnny Chen     for (unsigned i = 0; i < cmd_arg_entry.size(); ++i)
54634ddc8dbSJohnny Chen         if (opt_set_mask & cmd_arg_entry[i].arg_opt_set_association)
54734ddc8dbSJohnny Chen             ret_val.push_back(cmd_arg_entry[i]);
54834ddc8dbSJohnny Chen     return ret_val;
54934ddc8dbSJohnny Chen }
55034ddc8dbSJohnny Chen 
55134ddc8dbSJohnny Chen // Default parameter value of opt_set_mask is LLDB_OPT_SET_ALL, which means take
55234ddc8dbSJohnny Chen // all the argument data into account.  On rare cases where some argument sticks
55334ddc8dbSJohnny Chen // with certain option sets, this function returns the option set filtered args.
554e139cf23SCaroline Tice void
55534ddc8dbSJohnny Chen CommandObject::GetFormattedCommandArguments (Stream &str, uint32_t opt_set_mask)
556e139cf23SCaroline Tice {
557e139cf23SCaroline Tice     int num_args = m_arguments.size();
558e139cf23SCaroline Tice     for (int i = 0; i < num_args; ++i)
559e139cf23SCaroline Tice     {
560e139cf23SCaroline Tice         if (i > 0)
561e139cf23SCaroline Tice             str.Printf (" ");
56234ddc8dbSJohnny Chen         CommandArgumentEntry arg_entry =
56334ddc8dbSJohnny Chen             opt_set_mask == LLDB_OPT_SET_ALL ? m_arguments[i]
56434ddc8dbSJohnny Chen                                              : OptSetFiltered(opt_set_mask, m_arguments[i]);
565e139cf23SCaroline Tice         int num_alternatives = arg_entry.size();
566405fe67fSCaroline Tice 
567405fe67fSCaroline Tice         if ((num_alternatives == 2)
568405fe67fSCaroline Tice             && IsPairType (arg_entry[0].arg_repetition))
569405fe67fSCaroline Tice         {
570405fe67fSCaroline Tice             const char *first_name = GetArgumentName (arg_entry[0].arg_type);
571405fe67fSCaroline Tice             const char *second_name = GetArgumentName (arg_entry[1].arg_type);
572405fe67fSCaroline Tice             switch (arg_entry[0].arg_repetition)
573405fe67fSCaroline Tice             {
574405fe67fSCaroline Tice                 case eArgRepeatPairPlain:
575405fe67fSCaroline Tice                     str.Printf ("<%s> <%s>", first_name, second_name);
576405fe67fSCaroline Tice                     break;
577405fe67fSCaroline Tice                 case eArgRepeatPairOptional:
578405fe67fSCaroline Tice                     str.Printf ("[<%s> <%s>]", first_name, second_name);
579405fe67fSCaroline Tice                     break;
580405fe67fSCaroline Tice                 case eArgRepeatPairPlus:
581405fe67fSCaroline Tice                     str.Printf ("<%s> <%s> [<%s> <%s> [...]]", first_name, second_name, first_name, second_name);
582405fe67fSCaroline Tice                     break;
583405fe67fSCaroline Tice                 case eArgRepeatPairStar:
584405fe67fSCaroline Tice                     str.Printf ("[<%s> <%s> [<%s> <%s> [...]]]", first_name, second_name, first_name, second_name);
585405fe67fSCaroline Tice                     break;
586405fe67fSCaroline Tice                 case eArgRepeatPairRange:
587405fe67fSCaroline Tice                     str.Printf ("<%s_1> <%s_1> ... <%s_n> <%s_n>", first_name, second_name, first_name, second_name);
588405fe67fSCaroline Tice                     break;
589405fe67fSCaroline Tice                 case eArgRepeatPairRangeOptional:
590405fe67fSCaroline Tice                     str.Printf ("[<%s_1> <%s_1> ... <%s_n> <%s_n>]", first_name, second_name, first_name, second_name);
591405fe67fSCaroline Tice                     break;
592ca1176aaSCaroline Tice                 // Explicitly test for all the rest of the cases, so if new types get added we will notice the
593ca1176aaSCaroline Tice                 // missing case statement(s).
594ca1176aaSCaroline Tice                 case eArgRepeatPlain:
595ca1176aaSCaroline Tice                 case eArgRepeatOptional:
596ca1176aaSCaroline Tice                 case eArgRepeatPlus:
597ca1176aaSCaroline Tice                 case eArgRepeatStar:
598ca1176aaSCaroline Tice                 case eArgRepeatRange:
599ca1176aaSCaroline Tice                     // These should not be reached, as they should fail the IsPairType test above.
600ca1176aaSCaroline Tice                     break;
601405fe67fSCaroline Tice             }
602405fe67fSCaroline Tice         }
603405fe67fSCaroline Tice         else
604405fe67fSCaroline Tice         {
605e139cf23SCaroline Tice             StreamString names;
606e139cf23SCaroline Tice             for (int j = 0; j < num_alternatives; ++j)
607e139cf23SCaroline Tice             {
608e139cf23SCaroline Tice                 if (j > 0)
609e139cf23SCaroline Tice                     names.Printf (" | ");
610e139cf23SCaroline Tice                 names.Printf ("%s", GetArgumentName (arg_entry[j].arg_type));
611e139cf23SCaroline Tice             }
612e139cf23SCaroline Tice             switch (arg_entry[0].arg_repetition)
613e139cf23SCaroline Tice             {
614e139cf23SCaroline Tice                 case eArgRepeatPlain:
615e139cf23SCaroline Tice                     str.Printf ("<%s>", names.GetData());
616e139cf23SCaroline Tice                     break;
617e139cf23SCaroline Tice                 case eArgRepeatPlus:
618e139cf23SCaroline Tice                     str.Printf ("<%s> [<%s> [...]]", names.GetData(), names.GetData());
619e139cf23SCaroline Tice                     break;
620e139cf23SCaroline Tice                 case eArgRepeatStar:
621e139cf23SCaroline Tice                     str.Printf ("[<%s> [<%s> [...]]]", names.GetData(), names.GetData());
622e139cf23SCaroline Tice                     break;
623e139cf23SCaroline Tice                 case eArgRepeatOptional:
624e139cf23SCaroline Tice                     str.Printf ("[<%s>]", names.GetData());
625e139cf23SCaroline Tice                     break;
626405fe67fSCaroline Tice                 case eArgRepeatRange:
627fd54b368SJason Molenda                     str.Printf ("<%s_1> .. <%s_n>", names.GetData(), names.GetData());
628ca1176aaSCaroline Tice                     break;
629ca1176aaSCaroline Tice                 // Explicitly test for all the rest of the cases, so if new types get added we will notice the
630ca1176aaSCaroline Tice                 // missing case statement(s).
631ca1176aaSCaroline Tice                 case eArgRepeatPairPlain:
632ca1176aaSCaroline Tice                 case eArgRepeatPairOptional:
633ca1176aaSCaroline Tice                 case eArgRepeatPairPlus:
634ca1176aaSCaroline Tice                 case eArgRepeatPairStar:
635ca1176aaSCaroline Tice                 case eArgRepeatPairRange:
636ca1176aaSCaroline Tice                 case eArgRepeatPairRangeOptional:
637ca1176aaSCaroline Tice                     // These should not be hit, as they should pass the IsPairType test above, and control should
638ca1176aaSCaroline Tice                     // have gone into the other branch of the if statement.
639ca1176aaSCaroline Tice                     break;
640405fe67fSCaroline Tice             }
641e139cf23SCaroline Tice         }
642e139cf23SCaroline Tice     }
643e139cf23SCaroline Tice }
644e139cf23SCaroline Tice 
6450c16aa6dSStephen Wilson CommandArgumentType
646e139cf23SCaroline Tice CommandObject::LookupArgumentName (const char *arg_name)
647e139cf23SCaroline Tice {
648e139cf23SCaroline Tice     CommandArgumentType return_type = eArgTypeLastArg;
649e139cf23SCaroline Tice 
650e139cf23SCaroline Tice     std::string arg_name_str (arg_name);
651e139cf23SCaroline Tice     size_t len = arg_name_str.length();
652e139cf23SCaroline Tice     if (arg_name[0] == '<'
653e139cf23SCaroline Tice         && arg_name[len-1] == '>')
654e139cf23SCaroline Tice         arg_name_str = arg_name_str.substr (1, len-2);
655e139cf23SCaroline Tice 
656331eff39SJohnny Chen     const ArgumentTableEntry *table = GetArgumentTable();
657e139cf23SCaroline Tice     for (int i = 0; i < eArgTypeLastArg; ++i)
658331eff39SJohnny Chen         if (arg_name_str.compare (table[i].arg_name) == 0)
659e139cf23SCaroline Tice             return_type = g_arguments_data[i].arg_type;
660e139cf23SCaroline Tice 
661e139cf23SCaroline Tice     return return_type;
662e139cf23SCaroline Tice }
663e139cf23SCaroline Tice 
664e139cf23SCaroline Tice static const char *
665931e674aSJim Ingham RegisterNameHelpTextCallback ()
666931e674aSJim Ingham {
667931e674aSJim Ingham     return "Register names can be specified using the architecture specific names.  "
66884c7bd74SJim Ingham     "They can also be specified using generic names.  Not all generic entities have "
66984c7bd74SJim Ingham     "registers backing them on all architectures.  When they don't the generic name "
67084c7bd74SJim Ingham     "will return an error.\n"
671931e674aSJim Ingham     "The generic names defined in lldb are:\n"
672931e674aSJim Ingham     "\n"
673931e674aSJim Ingham     "pc       - program counter register\n"
674931e674aSJim Ingham     "ra       - return address register\n"
675931e674aSJim Ingham     "fp       - frame pointer register\n"
676931e674aSJim Ingham     "sp       - stack pointer register\n"
67784c7bd74SJim Ingham     "flags    - the flags register\n"
678931e674aSJim Ingham     "arg{1-6} - integer argument passing registers.\n";
679931e674aSJim Ingham }
680931e674aSJim Ingham 
681931e674aSJim Ingham static const char *
682e139cf23SCaroline Tice BreakpointIDHelpTextCallback ()
683e139cf23SCaroline Tice {
68486edbf41SGreg Clayton     return "Breakpoint ID's consist major and minor numbers;  the major number "
68586edbf41SGreg Clayton     "corresponds to the single entity that was created with a 'breakpoint set' "
68686edbf41SGreg Clayton     "command; the minor numbers correspond to all the locations that were actually "
68786edbf41SGreg Clayton     "found/set based on the major breakpoint.  A full breakpoint ID might look like "
68886edbf41SGreg Clayton     "3.14, meaning the 14th location set for the 3rd breakpoint.  You can specify "
68986edbf41SGreg Clayton     "all the locations of a breakpoint by just indicating the major breakpoint "
69086edbf41SGreg Clayton     "number. A valid breakpoint id consists either of just the major id number, "
69186edbf41SGreg Clayton     "or the major number, a dot, and the location number (e.g. 3 or 3.2 could "
69286edbf41SGreg Clayton     "both be valid breakpoint ids).";
693e139cf23SCaroline Tice }
694e139cf23SCaroline Tice 
695e139cf23SCaroline Tice static const char *
696e139cf23SCaroline Tice BreakpointIDRangeHelpTextCallback ()
697e139cf23SCaroline Tice {
69886edbf41SGreg Clayton     return "A 'breakpoint id list' is a manner of specifying multiple breakpoints. "
69986edbf41SGreg Clayton     "This can be done  through several mechanisms.  The easiest way is to just "
70086edbf41SGreg Clayton     "enter a space-separated list of breakpoint ids.  To specify all the "
70186edbf41SGreg Clayton     "breakpoint locations under a major breakpoint, you can use the major "
70286edbf41SGreg Clayton     "breakpoint number followed by '.*', eg. '5.*' means all the locations under "
70386edbf41SGreg Clayton     "breakpoint 5.  You can also indicate a range of breakpoints by using "
70486edbf41SGreg Clayton     "<start-bp-id> - <end-bp-id>.  The start-bp-id and end-bp-id for a range can "
70586edbf41SGreg Clayton     "be any valid breakpoint ids.  It is not legal, however, to specify a range "
70686edbf41SGreg Clayton     "using specific locations that cross major breakpoint numbers.  I.e. 3.2 - 3.7"
70786edbf41SGreg Clayton     " is legal; 2 - 5 is legal; but 3.2 - 4.4 is not legal.";
70886edbf41SGreg Clayton }
70986edbf41SGreg Clayton 
71086edbf41SGreg Clayton static const char *
7115e09c8c3SJim Ingham BreakpointNameHelpTextCallback ()
7125e09c8c3SJim Ingham {
7135e09c8c3SJim Ingham     return "A name that can be added to a breakpoint when it is created, or later "
7145e09c8c3SJim Ingham     "on with the \"breakpoint name add\" command.  "
7155e09c8c3SJim Ingham     "Breakpoint names can be used to specify breakpoints in all the places breakpoint ID's "
7165e09c8c3SJim Ingham     "and breakpoint ID ranges can be used.  As such they provide a convenient way to group breakpoints, "
7175e09c8c3SJim Ingham     "and to operate on breakpoints you create without having to track the breakpoint number.  "
7185e09c8c3SJim Ingham     "Note, the attributes you set when using a breakpoint name in a breakpoint command don't "
7195e09c8c3SJim Ingham     "adhere to the name, but instead are set individually on all the breakpoints currently tagged with that name.  Future breakpoints "
7205e09c8c3SJim Ingham     "tagged with that name will not pick up the attributes previously given using that name.  "
7215e09c8c3SJim Ingham     "In order to distinguish breakpoint names from breakpoint ID's and ranges, "
7225e09c8c3SJim Ingham     "names must start with a letter from a-z or A-Z and cannot contain spaces, \".\" or \"-\".  "
7235e09c8c3SJim Ingham     "Also, breakpoint names can only be applied to breakpoints, not to breakpoint locations.";
7245e09c8c3SJim Ingham }
7255e09c8c3SJim Ingham 
7265e09c8c3SJim Ingham static const char *
72786edbf41SGreg Clayton GDBFormatHelpTextCallback ()
72886edbf41SGreg Clayton {
729f91381e8SGreg Clayton     return "A GDB format consists of a repeat count, a format letter and a size letter. "
730f91381e8SGreg Clayton     "The repeat count is optional and defaults to 1. The format letter is optional "
731f91381e8SGreg Clayton     "and defaults to the previous format that was used. The size letter is optional "
732f91381e8SGreg Clayton     "and defaults to the previous size that was used.\n"
733f91381e8SGreg Clayton     "\n"
734f91381e8SGreg Clayton     "Format letters include:\n"
735f91381e8SGreg Clayton     "o - octal\n"
736f91381e8SGreg Clayton     "x - hexadecimal\n"
737f91381e8SGreg Clayton     "d - decimal\n"
738f91381e8SGreg Clayton     "u - unsigned decimal\n"
739f91381e8SGreg Clayton     "t - binary\n"
740f91381e8SGreg Clayton     "f - float\n"
741f91381e8SGreg Clayton     "a - address\n"
742f91381e8SGreg Clayton     "i - instruction\n"
743f91381e8SGreg Clayton     "c - char\n"
744f91381e8SGreg Clayton     "s - string\n"
745f91381e8SGreg Clayton     "T - OSType\n"
746f91381e8SGreg Clayton     "A - float as hex\n"
747f91381e8SGreg Clayton     "\n"
748f91381e8SGreg Clayton     "Size letters include:\n"
749f91381e8SGreg Clayton     "b - 1 byte  (byte)\n"
750f91381e8SGreg Clayton     "h - 2 bytes (halfword)\n"
751f91381e8SGreg Clayton     "w - 4 bytes (word)\n"
752f91381e8SGreg Clayton     "g - 8 bytes (giant)\n"
753f91381e8SGreg Clayton     "\n"
754f91381e8SGreg Clayton     "Example formats:\n"
755f91381e8SGreg Clayton     "32xb - show 32 1 byte hexadecimal integer values\n"
756f91381e8SGreg Clayton     "16xh - show 16 2 byte hexadecimal integer values\n"
757f91381e8SGreg Clayton     "64   - show 64 2 byte hexadecimal integer values (format and size from the last format)\n"
758f91381e8SGreg Clayton     "dw   - show 1 4 byte decimal integer value\n"
759f91381e8SGreg Clayton     ;
760e139cf23SCaroline Tice }
761e139cf23SCaroline Tice 
7620a3958e0SEnrico Granata static const char *
7630a3958e0SEnrico Granata FormatHelpTextCallback ()
7640a3958e0SEnrico Granata {
76582a7d983SEnrico Granata 
766d78c9576SEd Maste     static char* help_text_ptr = nullptr;
76782a7d983SEnrico Granata 
76882a7d983SEnrico Granata     if (help_text_ptr)
76982a7d983SEnrico Granata         return help_text_ptr;
77082a7d983SEnrico Granata 
7710a3958e0SEnrico Granata     StreamString sstr;
7720a3958e0SEnrico Granata     sstr << "One of the format names (or one-character names) that can be used to show a variable's value:\n";
7730a3958e0SEnrico Granata     for (Format f = eFormatDefault; f < kNumFormats; f = Format(f+1))
7740a3958e0SEnrico Granata     {
77582a7d983SEnrico Granata         if (f != eFormatDefault)
77682a7d983SEnrico Granata             sstr.PutChar('\n');
77782a7d983SEnrico Granata 
7780a3958e0SEnrico Granata         char format_char = FormatManager::GetFormatAsFormatChar(f);
7790a3958e0SEnrico Granata         if (format_char)
7800a3958e0SEnrico Granata             sstr.Printf("'%c' or ", format_char);
7810a3958e0SEnrico Granata 
78282a7d983SEnrico Granata         sstr.Printf ("\"%s\"", FormatManager::GetFormatAsCString(f));
7830a3958e0SEnrico Granata     }
7840a3958e0SEnrico Granata 
7850a3958e0SEnrico Granata     sstr.Flush();
7860a3958e0SEnrico Granata 
7870a3958e0SEnrico Granata     std::string data = sstr.GetString();
7880a3958e0SEnrico Granata 
78982a7d983SEnrico Granata     help_text_ptr = new char[data.length()+1];
7900a3958e0SEnrico Granata 
79182a7d983SEnrico Granata     data.copy(help_text_ptr, data.length());
7920a3958e0SEnrico Granata 
79382a7d983SEnrico Granata     return help_text_ptr;
7940a3958e0SEnrico Granata }
7950a3958e0SEnrico Granata 
7960a3958e0SEnrico Granata static const char *
797d9477397SSean Callanan LanguageTypeHelpTextCallback ()
798d9477397SSean Callanan {
799d78c9576SEd Maste     static char* help_text_ptr = nullptr;
800d9477397SSean Callanan 
801d9477397SSean Callanan     if (help_text_ptr)
802d9477397SSean Callanan         return help_text_ptr;
803d9477397SSean Callanan 
804d9477397SSean Callanan     StreamString sstr;
805d9477397SSean Callanan     sstr << "One of the following languages:\n";
806d9477397SSean Callanan 
8070e0984eeSJim Ingham     Language::PrintAllLanguages(sstr, "  ", "\n");
808d9477397SSean Callanan 
809d9477397SSean Callanan     sstr.Flush();
810d9477397SSean Callanan 
811d9477397SSean Callanan     std::string data = sstr.GetString();
812d9477397SSean Callanan 
813d9477397SSean Callanan     help_text_ptr = new char[data.length()+1];
814d9477397SSean Callanan 
815d9477397SSean Callanan     data.copy(help_text_ptr, data.length());
816d9477397SSean Callanan 
817d9477397SSean Callanan     return help_text_ptr;
818d9477397SSean Callanan }
819d9477397SSean Callanan 
820d9477397SSean Callanan static const char *
82182a7d983SEnrico Granata SummaryStringHelpTextCallback()
8220a3958e0SEnrico Granata {
82382a7d983SEnrico Granata     return
82482a7d983SEnrico Granata         "A summary string is a way to extract information from variables in order to present them using a summary.\n"
82582a7d983SEnrico Granata         "Summary strings contain static text, variables, scopes and control sequences:\n"
82682a7d983SEnrico Granata         "  - Static text can be any sequence of non-special characters, i.e. anything but '{', '}', '$', or '\\'.\n"
82782a7d983SEnrico Granata         "  - Variables are sequences of characters beginning with ${, ending with } and that contain symbols in the format described below.\n"
82882a7d983SEnrico 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"
82982a7d983SEnrico Granata         "  - Control sequences are the usual C/C++ '\\a', '\\n', ..., plus '\\$', '\\{' and '\\}'.\n"
83082a7d983SEnrico 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"
83182a7d983SEnrico 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"
83282a7d983SEnrico 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"
83382a7d983SEnrico 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"
8349128ee2fSEnrico 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."
8359128ee2fSEnrico 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"
83682a7d983SEnrico 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."
83782a7d983SEnrico 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"
83882a7d983SEnrico Granata         " path refers to:\n"
83982a7d983SEnrico 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"
84082a7d983SEnrico Granata         " and displayed as an individual variable\n"
84182a7d983SEnrico 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"
84282a7d983SEnrico 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"
8439128ee2fSEnrico 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"
8449128ee2fSEnrico 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"
8459128ee2fSEnrico Granata         " special symbols only allowed as part of a variable:\n"
8469128ee2fSEnrico Granata         "    %V: show the value of the object by default\n"
8479128ee2fSEnrico Granata         "    %S: show the summary of the object by default\n"
8489128ee2fSEnrico Granata         "    %@: show the runtime-provided object description (for Objective-C, it calls NSPrintForDebugger; for C/C++ it does nothing)\n"
8499128ee2fSEnrico Granata         "    %L: show the location of the object (memory address or a register name)\n"
8509128ee2fSEnrico Granata         "    %#: show the number of children of the object\n"
8519128ee2fSEnrico Granata         "    %T: show the type of the object\n"
8529128ee2fSEnrico 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"
8539128ee2fSEnrico 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"
8549128ee2fSEnrico Granata         " count the number of actual elements stored in an std::list:\n"
8559128ee2fSEnrico Granata         "type summary add -s \"${svar%#}\" -x \"std::list<\"";
8569128ee2fSEnrico Granata }
8579128ee2fSEnrico Granata 
8589128ee2fSEnrico Granata static const char *
8599128ee2fSEnrico Granata ExprPathHelpTextCallback()
8609128ee2fSEnrico Granata {
8619128ee2fSEnrico Granata     return
8629128ee2fSEnrico 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"
8639128ee2fSEnrico Granata     "For instance, given a class:\n"
8649128ee2fSEnrico Granata     "  class foo {\n"
8659128ee2fSEnrico Granata     "      int a;\n"
8669128ee2fSEnrico Granata     "      int b; .\n"
8679128ee2fSEnrico Granata     "      foo* next;\n"
8689128ee2fSEnrico Granata     "  };\n"
8699128ee2fSEnrico Granata     "the expression to read item b in the item pointed to by next for foo aFoo would be aFoo.next->b.\n"
8709128ee2fSEnrico 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"
8719128ee2fSEnrico 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"
8729128ee2fSEnrico Granata     "The meaning of these operators is the same as the usual one given to them by the C/C++ standards.\n"
8739128ee2fSEnrico 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"
8749128ee2fSEnrico 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"
8759128ee2fSEnrico 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"
8769128ee2fSEnrico 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"
8779128ee2fSEnrico Granata     " meaning of array slicing (taking elements n thru m inside the array or pointed-to memory).";
8780a3958e0SEnrico Granata }
8790a3958e0SEnrico Granata 
880184d7a72SJohnny Chen void
881ea671fbdSKate Stone CommandObject::FormatLongHelpText (Stream &output_strm, const char *long_help)
882ea671fbdSKate Stone {
883ea671fbdSKate Stone     CommandInterpreter& interpreter = GetCommandInterpreter();
884ea671fbdSKate Stone     std::stringstream lineStream (long_help);
885ea671fbdSKate Stone     std::string line;
886ea671fbdSKate Stone     while (std::getline (lineStream, line)) {
887ea671fbdSKate Stone         if (line.empty()) {
888ea671fbdSKate Stone             output_strm << "\n";
889ea671fbdSKate Stone             continue;
890ea671fbdSKate Stone         }
891ea671fbdSKate Stone         size_t result = line.find_first_not_of (" \t");
892ea671fbdSKate Stone         if (result == std::string::npos) {
893ea671fbdSKate Stone             result = 0;
894ea671fbdSKate Stone         }
895ea671fbdSKate Stone         std::string whitespace_prefix = line.substr (0, result);
896ea671fbdSKate Stone         std::string remainder = line.substr (result);
897ea671fbdSKate Stone         interpreter.OutputFormattedHelpText(output_strm, whitespace_prefix.c_str(), remainder.c_str());
898ea671fbdSKate Stone     }
899ea671fbdSKate Stone }
900ea671fbdSKate Stone 
901ea671fbdSKate Stone void
9029b62d1d5SEnrico Granata CommandObject::GenerateHelpText (CommandReturnObject &result)
9039b62d1d5SEnrico Granata {
9049b62d1d5SEnrico Granata     GenerateHelpText(result.GetOutputStream());
9059b62d1d5SEnrico Granata 
9069b62d1d5SEnrico Granata     result.SetStatus (eReturnStatusSuccessFinishNoResult);
9079b62d1d5SEnrico Granata }
9089b62d1d5SEnrico Granata 
9099b62d1d5SEnrico Granata void
9109b62d1d5SEnrico Granata CommandObject::GenerateHelpText (Stream &output_strm)
9119b62d1d5SEnrico Granata {
9129b62d1d5SEnrico Granata     CommandInterpreter& interpreter = GetCommandInterpreter();
913d78c9576SEd Maste     if (GetOptions() != nullptr)
9149b62d1d5SEnrico Granata     {
9159b62d1d5SEnrico Granata         if (WantsRawCommandString())
9169b62d1d5SEnrico Granata         {
9179b62d1d5SEnrico Granata             std::string help_text (GetHelp());
9189b62d1d5SEnrico Granata             help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
9199b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
9209b62d1d5SEnrico Granata         }
9219b62d1d5SEnrico Granata         else
9229b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
9239b62d1d5SEnrico Granata         output_strm.Printf ("\nSyntax: %s\n", GetSyntax());
9249b62d1d5SEnrico Granata         GetOptions()->GenerateOptionUsage (output_strm, this);
9259b62d1d5SEnrico Granata         const char *long_help = GetHelpLong();
926d78c9576SEd Maste         if ((long_help != nullptr)
9279b62d1d5SEnrico Granata             && (strlen (long_help) > 0))
928ea671fbdSKate Stone             FormatLongHelpText (output_strm, long_help);
929*bfb75e9bSEnrico Granata         if (!IsDashDashCommand())
930*bfb75e9bSEnrico Granata         {
9319b62d1d5SEnrico Granata             if (WantsRawCommandString() && !WantsCompletion())
9329b62d1d5SEnrico Granata             {
9339b62d1d5SEnrico Granata                 // Emit the message about using ' -- ' between the end of the command options and the raw input
9349b62d1d5SEnrico Granata                 // conditionally, i.e., only if the command object does not want completion.
9359b62d1d5SEnrico Granata                 interpreter.OutputFormattedHelpText (output_strm, "", "",
9369b62d1d5SEnrico Granata                                                      "\nIMPORTANT NOTE:  Because this command takes 'raw' input, if you use any command options"
9379b62d1d5SEnrico Granata                                                      " you must use ' -- ' between the end of the command options and the beginning of the raw input.", 1);
9389b62d1d5SEnrico Granata             }
9399b62d1d5SEnrico Granata             else if (GetNumArgumentEntries() > 0
9409b62d1d5SEnrico Granata                      && GetOptions()
9419b62d1d5SEnrico Granata                      && GetOptions()->NumCommandOptions() > 0)
9429b62d1d5SEnrico Granata             {
9439b62d1d5SEnrico Granata                 // Also emit a warning about using "--" in case you are using a command that takes options and arguments.
9449b62d1d5SEnrico Granata                 interpreter.OutputFormattedHelpText (output_strm, "", "",
9459b62d1d5SEnrico Granata                                                      "\nThis command takes options and free-form arguments.  If your arguments resemble"
9469b62d1d5SEnrico Granata                                                      " option specifiers (i.e., they start with a - or --), you must use ' -- ' between"
9479b62d1d5SEnrico Granata                                                      " the end of the command options and the beginning of the arguments.", 1);
9489b62d1d5SEnrico Granata             }
9499b62d1d5SEnrico Granata         }
950*bfb75e9bSEnrico Granata     }
9519b62d1d5SEnrico Granata     else if (IsMultiwordObject())
9529b62d1d5SEnrico Granata     {
9539b62d1d5SEnrico Granata         if (WantsRawCommandString())
9549b62d1d5SEnrico Granata         {
9559b62d1d5SEnrico Granata             std::string help_text (GetHelp());
9569b62d1d5SEnrico Granata             help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
9579b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
9589b62d1d5SEnrico Granata         }
9599b62d1d5SEnrico Granata         else
9609b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
9619b62d1d5SEnrico Granata         GenerateHelpText (output_strm);
9629b62d1d5SEnrico Granata     }
9639b62d1d5SEnrico Granata     else
9649b62d1d5SEnrico Granata     {
9659b62d1d5SEnrico Granata         const char *long_help = GetHelpLong();
966d78c9576SEd Maste         if ((long_help != nullptr)
9679b62d1d5SEnrico Granata             && (strlen (long_help) > 0))
968ea671fbdSKate Stone             FormatLongHelpText (output_strm, long_help);
9699b62d1d5SEnrico Granata         else if (WantsRawCommandString())
9709b62d1d5SEnrico Granata         {
9719b62d1d5SEnrico Granata             std::string help_text (GetHelp());
9729b62d1d5SEnrico Granata             help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
9739b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
9749b62d1d5SEnrico Granata         }
9759b62d1d5SEnrico Granata         else
9769b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
9779b62d1d5SEnrico Granata         output_strm.Printf ("\nSyntax: %s\n", GetSyntax());
9789b62d1d5SEnrico Granata     }
9799b62d1d5SEnrico Granata }
9809b62d1d5SEnrico Granata 
9819b62d1d5SEnrico Granata void
982de753464SJohnny Chen CommandObject::AddIDsArgumentData(CommandArgumentEntry &arg, CommandArgumentType ID, CommandArgumentType IDRange)
983184d7a72SJohnny Chen {
984184d7a72SJohnny Chen     CommandArgumentData id_arg;
985184d7a72SJohnny Chen     CommandArgumentData id_range_arg;
986184d7a72SJohnny Chen 
987184d7a72SJohnny Chen     // Create the first variant for the first (and only) argument for this command.
988de753464SJohnny Chen     id_arg.arg_type = ID;
989184d7a72SJohnny Chen     id_arg.arg_repetition = eArgRepeatOptional;
990184d7a72SJohnny Chen 
991184d7a72SJohnny Chen     // Create the second variant for the first (and only) argument for this command.
992de753464SJohnny Chen     id_range_arg.arg_type = IDRange;
993184d7a72SJohnny Chen     id_range_arg.arg_repetition = eArgRepeatOptional;
994184d7a72SJohnny Chen 
995a3234732SJohnny Chen     // The first (and only) argument for this command could be either an id or an id_range.
996184d7a72SJohnny Chen     // Push both variants into the entry for the first argument for this command.
997184d7a72SJohnny Chen     arg.push_back(id_arg);
998184d7a72SJohnny Chen     arg.push_back(id_range_arg);
999184d7a72SJohnny Chen }
1000184d7a72SJohnny Chen 
10019d0402b1SGreg Clayton const char *
10029d0402b1SGreg Clayton CommandObject::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type)
10039d0402b1SGreg Clayton {
100448b475cbSZachary Turner     assert(arg_type < eArgTypeLastArg && "Invalid argument type passed to GetArgumentTypeAsCString");
10059d0402b1SGreg Clayton     return g_arguments_data[arg_type].arg_name;
10069d0402b1SGreg Clayton }
10079d0402b1SGreg Clayton 
10089d0402b1SGreg Clayton const char *
10099d0402b1SGreg Clayton CommandObject::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type)
10109d0402b1SGreg Clayton {
101148b475cbSZachary Turner     assert(arg_type < eArgTypeLastArg && "Invalid argument type passed to GetArgumentDescriptionAsCString");
10129d0402b1SGreg Clayton     return g_arguments_data[arg_type].help_text;
10139d0402b1SGreg Clayton }
10149d0402b1SGreg Clayton 
1015893c932aSJim Ingham Target *
1016893c932aSJim Ingham CommandObject::GetDummyTarget()
1017893c932aSJim Ingham {
1018893c932aSJim Ingham     return m_interpreter.GetDebugger().GetDummyTarget();
1019893c932aSJim Ingham }
1020893c932aSJim Ingham 
1021893c932aSJim Ingham Target *
102233df7cd3SJim Ingham CommandObject::GetSelectedOrDummyTarget(bool prefer_dummy)
1023893c932aSJim Ingham {
102433df7cd3SJim Ingham     return m_interpreter.GetDebugger().GetSelectedOrDummyTarget(prefer_dummy);
1025893c932aSJim Ingham }
1026893c932aSJim Ingham 
10278d94ba0fSJim Ingham Thread *
10288d94ba0fSJim Ingham CommandObject::GetDefaultThread()
10298d94ba0fSJim Ingham {
10308d94ba0fSJim Ingham     Thread *thread_to_use = m_exe_ctx.GetThreadPtr();
10318d94ba0fSJim Ingham     if (thread_to_use)
10328d94ba0fSJim Ingham         return thread_to_use;
10338d94ba0fSJim Ingham 
10348d94ba0fSJim Ingham     Process *process = m_exe_ctx.GetProcessPtr();
10358d94ba0fSJim Ingham     if (!process)
10368d94ba0fSJim Ingham     {
10378d94ba0fSJim Ingham         Target *target = m_exe_ctx.GetTargetPtr();
10388d94ba0fSJim Ingham         if (!target)
10398d94ba0fSJim Ingham         {
10408d94ba0fSJim Ingham             target = m_interpreter.GetDebugger().GetSelectedTarget().get();
10418d94ba0fSJim Ingham         }
10428d94ba0fSJim Ingham         if (target)
10438d94ba0fSJim Ingham             process = target->GetProcessSP().get();
10448d94ba0fSJim Ingham     }
10458d94ba0fSJim Ingham 
10468d94ba0fSJim Ingham     if (process)
10478d94ba0fSJim Ingham         return process->GetThreadList().GetSelectedThread().get();
10488d94ba0fSJim Ingham     else
10498d94ba0fSJim Ingham         return nullptr;
10508d94ba0fSJim Ingham }
10518d94ba0fSJim Ingham 
10525a988416SJim Ingham bool
10535a988416SJim Ingham CommandObjectParsed::Execute (const char *args_string, CommandReturnObject &result)
10545a988416SJim Ingham {
10555a988416SJim Ingham     bool handled = false;
10565a988416SJim Ingham     Args cmd_args (args_string);
10573b652621SJim Ingham     if (HasOverrideCallback())
10585a988416SJim Ingham     {
10595a988416SJim Ingham         Args full_args (GetCommandName ());
10605a988416SJim Ingham         full_args.AppendArguments(cmd_args);
10613b652621SJim Ingham         handled = InvokeOverrideCallback (full_args.GetConstArgumentVector(), result);
10625a988416SJim Ingham     }
10635a988416SJim Ingham     if (!handled)
10645a988416SJim Ingham     {
10655a988416SJim Ingham         for (size_t i = 0; i < cmd_args.GetArgumentCount();  ++i)
10665a988416SJim Ingham         {
10675a988416SJim Ingham             const char *tmp_str = cmd_args.GetArgumentAtIndex (i);
10685a988416SJim Ingham             if (tmp_str[0] == '`')  // back-quote
10695a988416SJim Ingham                 cmd_args.ReplaceArgumentAtIndex (i, m_interpreter.ProcessEmbeddedScriptCommands (tmp_str));
10705a988416SJim Ingham         }
10715a988416SJim Ingham 
1072f9fc609fSGreg Clayton         if (CheckRequirements(result))
1073f9fc609fSGreg Clayton         {
1074f9fc609fSGreg Clayton             if (ParseOptions (cmd_args, result))
1075f9fc609fSGreg Clayton             {
10765a988416SJim Ingham                 // Call the command-specific version of 'Execute', passing it the already processed arguments.
10775a988416SJim Ingham                 handled = DoExecute (cmd_args, result);
10785a988416SJim Ingham             }
1079f9fc609fSGreg Clayton         }
1080f9fc609fSGreg Clayton 
1081f9fc609fSGreg Clayton         Cleanup();
1082f9fc609fSGreg Clayton     }
10835a988416SJim Ingham     return handled;
10845a988416SJim Ingham }
10855a988416SJim Ingham 
10865a988416SJim Ingham bool
10875a988416SJim Ingham CommandObjectRaw::Execute (const char *args_string, CommandReturnObject &result)
10885a988416SJim Ingham {
10895a988416SJim Ingham     bool handled = false;
10903b652621SJim Ingham     if (HasOverrideCallback())
10915a988416SJim Ingham     {
10925a988416SJim Ingham         std::string full_command (GetCommandName ());
10935a988416SJim Ingham         full_command += ' ';
10945a988416SJim Ingham         full_command += args_string;
1095d78c9576SEd Maste         const char *argv[2] = { nullptr, nullptr };
10965a988416SJim Ingham         argv[0] = full_command.c_str();
10973b652621SJim Ingham         handled = InvokeOverrideCallback (argv, result);
10985a988416SJim Ingham     }
10995a988416SJim Ingham     if (!handled)
11005a988416SJim Ingham     {
1101f9fc609fSGreg Clayton         if (CheckRequirements(result))
11025a988416SJim Ingham             handled = DoExecute (args_string, result);
1103f9fc609fSGreg Clayton 
1104f9fc609fSGreg Clayton         Cleanup();
11055a988416SJim Ingham     }
11065a988416SJim Ingham     return handled;
11075a988416SJim Ingham }
11085a988416SJim Ingham 
1109ca7835c6SJohnny Chen static
1110ca7835c6SJohnny Chen const char *arch_helper()
1111ca7835c6SJohnny Chen {
1112d70b14eaSGreg Clayton     static StreamString g_archs_help;
1113797a1b37SJohnny Chen     if (g_archs_help.Empty())
1114d70b14eaSGreg Clayton     {
1115ca7835c6SJohnny Chen         StringList archs;
1116d78c9576SEd Maste         ArchSpec::AutoComplete(nullptr, archs);
1117d70b14eaSGreg Clayton         g_archs_help.Printf("These are the supported architecture names:\n");
1118797a1b37SJohnny Chen         archs.Join("\n", g_archs_help);
1119d70b14eaSGreg Clayton     }
1120d70b14eaSGreg Clayton     return g_archs_help.GetData();
1121ca7835c6SJohnny Chen }
1122ca7835c6SJohnny Chen 
1123e139cf23SCaroline Tice CommandObject::ArgumentTableEntry
1124e139cf23SCaroline Tice CommandObject::g_arguments_data[] =
1125e139cf23SCaroline Tice {
1126d78c9576SEd Maste     { eArgTypeAddress, "address", CommandCompletions::eNoCompletion, { nullptr, false }, "A valid address in the target program's execution space." },
1127d78c9576SEd Maste     { eArgTypeAddressOrExpression, "address-expression", CommandCompletions::eNoCompletion, { nullptr, false }, "An expression that resolves to an address." },
1128d78c9576SEd Maste     { eArgTypeAliasName, "alias-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of an abbreviation (alias) for a debugger command." },
1129d78c9576SEd 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.)" },
1130ca7835c6SJohnny Chen     { eArgTypeArchitecture, "arch", CommandCompletions::eArchitectureCompletion, { arch_helper, true }, "The architecture name, e.g. i386 or x86_64." },
1131d78c9576SEd Maste     { eArgTypeBoolean, "boolean", CommandCompletions::eNoCompletion, { nullptr, false }, "A Boolean value: 'true' or 'false'" },
1132d78c9576SEd Maste     { eArgTypeBreakpointID, "breakpt-id", CommandCompletions::eNoCompletion, { BreakpointIDHelpTextCallback, false }, nullptr },
1133d78c9576SEd Maste     { eArgTypeBreakpointIDRange, "breakpt-id-list", CommandCompletions::eNoCompletion, { BreakpointIDRangeHelpTextCallback, false }, nullptr },
11345e09c8c3SJim Ingham     { eArgTypeBreakpointName, "breakpoint-name", CommandCompletions::eNoCompletion, { BreakpointNameHelpTextCallback, false }, nullptr },
1135d78c9576SEd Maste     { eArgTypeByteSize, "byte-size", CommandCompletions::eNoCompletion, { nullptr, false }, "Number of bytes to use." },
1136d78c9576SEd Maste     { eArgTypeClassName, "class-name", CommandCompletions::eNoCompletion, { nullptr, false }, "Then name of a class from the debug information in the program." },
1137d78c9576SEd Maste     { eArgTypeCommandName, "cmd-name", CommandCompletions::eNoCompletion, { nullptr, false }, "A debugger command (may be multiple words), without any options or arguments." },
1138d78c9576SEd Maste     { eArgTypeCount, "count", CommandCompletions::eNoCompletion, { nullptr, false }, "An unsigned integer." },
1139d78c9576SEd Maste     { eArgTypeDirectoryName, "directory", CommandCompletions::eDiskDirectoryCompletion, { nullptr, false }, "A directory name." },
1140d78c9576SEd 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" },
1141d78c9576SEd Maste     { eArgTypeDescriptionVerbosity, "description-verbosity", CommandCompletions::eNoCompletion, { nullptr, false }, "How verbose the output of 'po' should be." },
1142d78c9576SEd Maste     { eArgTypeEndAddress, "end-address", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1143d78c9576SEd Maste     { eArgTypeExpression, "expr", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1144d78c9576SEd Maste     { eArgTypeExpressionPath, "expr-path", CommandCompletions::eNoCompletion, { ExprPathHelpTextCallback, true }, nullptr },
1145d78c9576SEd 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] ]" },
1146d78c9576SEd Maste     { eArgTypeFilename, "filename", CommandCompletions::eDiskFileCompletion, { nullptr, false }, "The name of a file (can include path)." },
1147d78c9576SEd Maste     { eArgTypeFormat, "format", CommandCompletions::eNoCompletion, { FormatHelpTextCallback, true }, nullptr },
1148d78c9576SEd Maste     { eArgTypeFrameIndex, "frame-index", CommandCompletions::eNoCompletion, { nullptr, false }, "Index into a thread's list of frames." },
1149d78c9576SEd Maste     { eArgTypeFullName, "fullname", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1150d78c9576SEd Maste     { eArgTypeFunctionName, "function-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a function." },
1151d78c9576SEd Maste     { eArgTypeFunctionOrSymbol, "function-or-symbol", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a function or symbol." },
1152d78c9576SEd Maste     { eArgTypeGDBFormat, "gdb-format", CommandCompletions::eNoCompletion, { GDBFormatHelpTextCallback, true }, nullptr },
1153735152e3SEnrico Granata     { eArgTypeHelpText, "help-text", CommandCompletions::eNoCompletion, { nullptr, false }, "Text to be used as help for some other entity in LLDB" },
1154d78c9576SEd Maste     { eArgTypeIndex, "index", CommandCompletions::eNoCompletion, { nullptr, false }, "An index into a list." },
11557a67ee26SEnrico Granata     { eArgTypeLanguage, "source-language", CommandCompletions::eNoCompletion, { LanguageTypeHelpTextCallback, true }, nullptr },
1156d78c9576SEd Maste     { eArgTypeLineNum, "linenum", CommandCompletions::eNoCompletion, { nullptr, false }, "Line number in a source file." },
1157d78c9576SEd 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." },
1158d78c9576SEd 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)." },
1159d78c9576SEd Maste     { eArgTypeMethod, "method", CommandCompletions::eNoCompletion, { nullptr, false }, "A C++ method name." },
1160d78c9576SEd Maste     { eArgTypeName, "name", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1161d78c9576SEd Maste     { eArgTypeNewPathPrefix, "new-path-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1162d78c9576SEd Maste     { eArgTypeNumLines, "num-lines", CommandCompletions::eNoCompletion, { nullptr, false }, "The number of lines to use." },
1163d78c9576SEd Maste     { eArgTypeNumberPerLine, "number-per-line", CommandCompletions::eNoCompletion, { nullptr, false }, "The number of items per line to display." },
1164d78c9576SEd Maste     { eArgTypeOffset, "offset", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1165d78c9576SEd Maste     { eArgTypeOldPathPrefix, "old-path-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1166d78c9576SEd Maste     { eArgTypeOneLiner, "one-line-command", CommandCompletions::eNoCompletion, { nullptr, false }, "A command that is entered as a single line of text." },
1167d78c9576SEd Maste     { eArgTypePath, "path", CommandCompletions::eDiskFileCompletion, { nullptr, false }, "Path." },
1168d78c9576SEd Maste     { eArgTypePermissionsNumber, "perms-numeric", CommandCompletions::eNoCompletion, { nullptr, false }, "Permissions given as an octal number (e.g. 755)." },
1169d78c9576SEd Maste     { eArgTypePermissionsString, "perms=string", CommandCompletions::eNoCompletion, { nullptr, false }, "Permissions given as a string value (e.g. rw-r-xr--)." },
1170d78c9576SEd Maste     { eArgTypePid, "pid", CommandCompletions::eNoCompletion, { nullptr, false }, "The process ID number." },
1171d78c9576SEd Maste     { eArgTypePlugin, "plugin", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1172d78c9576SEd Maste     { eArgTypeProcessName, "process-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of the process." },
1173d78c9576SEd Maste     { eArgTypePythonClass, "python-class", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a Python class." },
1174d78c9576SEd Maste     { eArgTypePythonFunction, "python-function", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a Python function." },
1175d78c9576SEd Maste     { eArgTypePythonScript, "python-script", CommandCompletions::eNoCompletion, { nullptr, false }, "Source code written in Python." },
1176d78c9576SEd Maste     { eArgTypeQueueName, "queue-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of the thread queue." },
1177d78c9576SEd Maste     { eArgTypeRegisterName, "register-name", CommandCompletions::eNoCompletion, { RegisterNameHelpTextCallback, true }, nullptr },
1178d78c9576SEd Maste     { eArgTypeRegularExpression, "regular-expression", CommandCompletions::eNoCompletion, { nullptr, false }, "A regular expression." },
1179d78c9576SEd Maste     { eArgTypeRunArgs, "run-args", CommandCompletions::eNoCompletion, { nullptr, false }, "Arguments to be passed to the target program when it starts executing." },
1180d78c9576SEd Maste     { eArgTypeRunMode, "run-mode", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1181d78c9576SEd Maste     { eArgTypeScriptedCommandSynchronicity, "script-cmd-synchronicity", CommandCompletions::eNoCompletion, { nullptr, false }, "The synchronicity to use to run scripted commands with regard to LLDB event system." },
1182d78c9576SEd Maste     { eArgTypeScriptLang, "script-language", CommandCompletions::eNoCompletion, { nullptr, false }, "The scripting language to be used for script-based commands.  Currently only Python is valid." },
1183d78c9576SEd Maste     { eArgTypeSearchWord, "search-word", CommandCompletions::eNoCompletion, { nullptr, false }, "The word for which you wish to search for information about." },
1184d78c9576SEd Maste     { eArgTypeSelector, "selector", CommandCompletions::eNoCompletion, { nullptr, false }, "An Objective-C selector name." },
1185d78c9576SEd 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)." },
1186d78c9576SEd 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)." },
1187d78c9576SEd Maste     { eArgTypeSettingPrefix, "setting-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a settable internal debugger variable up to a dot ('.'), e.g. 'target.process.'" },
1188d78c9576SEd 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." },
1189d78c9576SEd Maste     { eArgTypeShlibName, "shlib-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a shared library." },
1190d78c9576SEd Maste     { eArgTypeSourceFile, "source-file", CommandCompletions::eSourceFileCompletion, { nullptr, false }, "The name of a source file.." },
1191d78c9576SEd Maste     { eArgTypeSortOrder, "sort-order", CommandCompletions::eNoCompletion, { nullptr, false }, "Specify a sort order when dumping lists." },
1192d78c9576SEd Maste     { eArgTypeStartAddress, "start-address", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1193d78c9576SEd Maste     { eArgTypeSummaryString, "summary-string", CommandCompletions::eNoCompletion, { SummaryStringHelpTextCallback, true }, nullptr },
1194d78c9576SEd Maste     { eArgTypeSymbol, "symbol", CommandCompletions::eSymbolCompletion, { nullptr, false }, "Any symbol name (function name, variable, argument, etc.)" },
1195d78c9576SEd Maste     { eArgTypeThreadID, "thread-id", CommandCompletions::eNoCompletion, { nullptr, false }, "Thread ID number." },
1196d78c9576SEd Maste     { eArgTypeThreadIndex, "thread-index", CommandCompletions::eNoCompletion, { nullptr, false }, "Index into the process' list of threads." },
1197d78c9576SEd Maste     { eArgTypeThreadName, "thread-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The thread's name." },
1198a72b31c7SJim Ingham     { eArgTypeTypeName, "type-name", CommandCompletions::eNoCompletion, { nullptr, false }, "A type name." },
1199d78c9576SEd Maste     { eArgTypeUnsignedInteger, "unsigned-integer", CommandCompletions::eNoCompletion, { nullptr, false }, "An unsigned integer." },
1200d78c9576SEd Maste     { eArgTypeUnixSignal, "unix-signal", CommandCompletions::eNoCompletion, { nullptr, false }, "A valid Unix signal name or number (e.g. SIGKILL, KILL or 9)." },
1201d78c9576SEd Maste     { eArgTypeVarName, "variable-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a variable in your program." },
1202d78c9576SEd Maste     { eArgTypeValue, "value", CommandCompletions::eNoCompletion, { nullptr, false }, "A value could be anything, depending on where and how it is used." },
1203d78c9576SEd Maste     { eArgTypeWidth, "width", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1204d78c9576SEd Maste     { eArgTypeNone, "none", CommandCompletions::eNoCompletion, { nullptr, false }, "No help available for this." },
1205d78c9576SEd 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." },
1206d78c9576SEd Maste     { eArgTypeWatchpointID, "watchpt-id", CommandCompletions::eNoCompletion, { nullptr, false }, "Watchpoint IDs are positive integers." },
1207d78c9576SEd Maste     { eArgTypeWatchpointIDRange, "watchpt-id-list", CommandCompletions::eNoCompletion, { nullptr, false }, "For example, '1-3' or '1 to 3'." },
1208d78c9576SEd Maste     { eArgTypeWatchType, "watch-type", CommandCompletions::eNoCompletion, { nullptr, false }, "Specify the type for a watchpoint." }
1209e139cf23SCaroline Tice };
1210e139cf23SCaroline Tice 
1211e139cf23SCaroline Tice const CommandObject::ArgumentTableEntry*
1212e139cf23SCaroline Tice CommandObject::GetArgumentTable ()
1213e139cf23SCaroline Tice {
12149d0402b1SGreg Clayton     // If this assertion fires, then the table above is out of date with the CommandArgumentType enumeration
12159d0402b1SGreg Clayton     assert ((sizeof (CommandObject::g_arguments_data) / sizeof (CommandObject::ArgumentTableEntry)) == eArgTypeLastArg);
1216e139cf23SCaroline Tice     return CommandObject::g_arguments_data;
1217e139cf23SCaroline Tice }
1218e139cf23SCaroline Tice 
1219e139cf23SCaroline Tice 
1220