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>
13*ea671fbdSKate 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 
3130fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h"
3230fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h"
3330fdc8d8SChris Lattner 
3430fdc8d8SChris Lattner using namespace lldb;
3530fdc8d8SChris Lattner using namespace lldb_private;
3630fdc8d8SChris Lattner 
3730fdc8d8SChris Lattner //-------------------------------------------------------------------------
3830fdc8d8SChris Lattner // CommandObject
3930fdc8d8SChris Lattner //-------------------------------------------------------------------------
4030fdc8d8SChris Lattner 
41a7015092SGreg Clayton CommandObject::CommandObject
42a7015092SGreg Clayton (
43a7015092SGreg Clayton     CommandInterpreter &interpreter,
44a7015092SGreg Clayton     const char *name,
45a7015092SGreg Clayton     const char *help,
46a7015092SGreg Clayton     const char *syntax,
47a7015092SGreg Clayton     uint32_t flags
48a7015092SGreg Clayton ) :
49a7015092SGreg Clayton     m_interpreter (interpreter),
502f02fe0bSEnrico Granata     m_cmd_name (name ? name : ""),
5130fdc8d8SChris Lattner     m_cmd_help_short (),
5230fdc8d8SChris Lattner     m_cmd_help_long (),
5330fdc8d8SChris Lattner     m_cmd_syntax (),
54279a6c26SJim Ingham     m_is_alias (false),
55e139cf23SCaroline Tice     m_flags (flags),
56a9f7b79dSGreg Clayton     m_arguments(),
576d8873f9SJim Ingham     m_deprecated_command_override_callback (nullptr),
58d78c9576SEd Maste     m_command_override_callback (nullptr),
59d78c9576SEd Maste     m_command_override_baton (nullptr)
6030fdc8d8SChris Lattner {
6130fdc8d8SChris Lattner     if (help && help[0])
6230fdc8d8SChris Lattner         m_cmd_help_short = help;
6330fdc8d8SChris Lattner     if (syntax && syntax[0])
6430fdc8d8SChris Lattner         m_cmd_syntax = syntax;
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner CommandObject::~CommandObject ()
6830fdc8d8SChris Lattner {
6930fdc8d8SChris Lattner }
7030fdc8d8SChris Lattner 
7130fdc8d8SChris Lattner const char *
7230fdc8d8SChris Lattner CommandObject::GetHelp ()
7330fdc8d8SChris Lattner {
7430fdc8d8SChris Lattner     return m_cmd_help_short.c_str();
7530fdc8d8SChris Lattner }
7630fdc8d8SChris Lattner 
7730fdc8d8SChris Lattner const char *
7830fdc8d8SChris Lattner CommandObject::GetHelpLong ()
7930fdc8d8SChris Lattner {
8030fdc8d8SChris Lattner     return m_cmd_help_long.c_str();
8130fdc8d8SChris Lattner }
8230fdc8d8SChris Lattner 
8330fdc8d8SChris Lattner const char *
8430fdc8d8SChris Lattner CommandObject::GetSyntax ()
8530fdc8d8SChris Lattner {
86e139cf23SCaroline Tice     if (m_cmd_syntax.length() == 0)
87e139cf23SCaroline Tice     {
88e139cf23SCaroline Tice         StreamString syntax_str;
89e139cf23SCaroline Tice         syntax_str.Printf ("%s", GetCommandName());
90d78c9576SEd Maste         if (GetOptions() != nullptr)
91e139cf23SCaroline Tice             syntax_str.Printf (" <cmd-options>");
92e139cf23SCaroline Tice         if (m_arguments.size() > 0)
93e139cf23SCaroline Tice         {
94e139cf23SCaroline Tice             syntax_str.Printf (" ");
95ca5acdbeSEnrico Granata             if (WantsRawCommandString() && GetOptions() && GetOptions()->NumCommandOptions())
96a4c6ad19SSean Callanan                 syntax_str.Printf("-- ");
97e139cf23SCaroline Tice             GetFormattedCommandArguments (syntax_str);
98e139cf23SCaroline Tice         }
99e139cf23SCaroline Tice         m_cmd_syntax = syntax_str.GetData ();
100e139cf23SCaroline Tice     }
101e139cf23SCaroline Tice 
10230fdc8d8SChris Lattner     return m_cmd_syntax.c_str();
10330fdc8d8SChris Lattner }
10430fdc8d8SChris Lattner 
10530fdc8d8SChris Lattner const char *
10630fdc8d8SChris Lattner CommandObject::GetCommandName ()
10730fdc8d8SChris Lattner {
10830fdc8d8SChris Lattner     return m_cmd_name.c_str();
10930fdc8d8SChris Lattner }
11030fdc8d8SChris Lattner 
11130fdc8d8SChris Lattner void
11230fdc8d8SChris Lattner CommandObject::SetCommandName (const char *name)
11330fdc8d8SChris Lattner {
11430fdc8d8SChris Lattner     m_cmd_name = name;
11530fdc8d8SChris Lattner }
11630fdc8d8SChris Lattner 
11730fdc8d8SChris Lattner void
11830fdc8d8SChris Lattner CommandObject::SetHelp (const char *cstr)
11930fdc8d8SChris Lattner {
12030fdc8d8SChris Lattner     m_cmd_help_short = cstr;
12130fdc8d8SChris Lattner }
12230fdc8d8SChris Lattner 
12330fdc8d8SChris Lattner void
1246f79bb2dSEnrico Granata CommandObject::SetHelp (std::string str)
1256f79bb2dSEnrico Granata {
1266f79bb2dSEnrico Granata     m_cmd_help_short = str;
1276f79bb2dSEnrico Granata }
1286f79bb2dSEnrico Granata 
1296f79bb2dSEnrico Granata void
13030fdc8d8SChris Lattner CommandObject::SetHelpLong (const char *cstr)
13130fdc8d8SChris Lattner {
13230fdc8d8SChris Lattner     m_cmd_help_long = cstr;
13330fdc8d8SChris Lattner }
13430fdc8d8SChris Lattner 
13530fdc8d8SChris Lattner void
13699f0b8f9SEnrico Granata CommandObject::SetHelpLong (std::string str)
13799f0b8f9SEnrico Granata {
13899f0b8f9SEnrico Granata     m_cmd_help_long = str;
13999f0b8f9SEnrico Granata }
14099f0b8f9SEnrico Granata 
14199f0b8f9SEnrico Granata void
14230fdc8d8SChris Lattner CommandObject::SetSyntax (const char *cstr)
14330fdc8d8SChris Lattner {
14430fdc8d8SChris Lattner     m_cmd_syntax = cstr;
14530fdc8d8SChris Lattner }
14630fdc8d8SChris Lattner 
14730fdc8d8SChris Lattner Options *
14830fdc8d8SChris Lattner CommandObject::GetOptions ()
14930fdc8d8SChris Lattner {
15030fdc8d8SChris Lattner     // By default commands don't have options unless this virtual function
15130fdc8d8SChris Lattner     // is overridden by base classes.
152d78c9576SEd Maste     return nullptr;
15330fdc8d8SChris Lattner }
15430fdc8d8SChris Lattner 
15530fdc8d8SChris Lattner bool
15630fdc8d8SChris Lattner CommandObject::ParseOptions
15730fdc8d8SChris Lattner (
15830fdc8d8SChris Lattner     Args& args,
15930fdc8d8SChris Lattner     CommandReturnObject &result
16030fdc8d8SChris Lattner )
16130fdc8d8SChris Lattner {
16230fdc8d8SChris Lattner     // See if the subclass has options?
16330fdc8d8SChris Lattner     Options *options = GetOptions();
164d78c9576SEd Maste     if (options != nullptr)
16530fdc8d8SChris Lattner     {
16630fdc8d8SChris Lattner         Error error;
167f6b8b581SGreg Clayton         options->NotifyOptionParsingStarting();
16830fdc8d8SChris Lattner 
169b7ad58a0SGreg Clayton         // ParseOptions calls getopt_long_only, which always skips the zero'th item in the array and starts at position 1,
17030fdc8d8SChris Lattner         // so we need to push a dummy value into position zero.
17130fdc8d8SChris Lattner         args.Unshift("dummy_string");
17230fdc8d8SChris Lattner         error = args.ParseOptions (*options);
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())
178f6b8b581SGreg Clayton             error = options->NotifyOptionParsingFinished();
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
196eb0103f2SGreg Clayton                 options->GenerateOptionUsage (result.GetErrorStream(), this);
19730fdc8d8SChris Lattner             }
198f6b8b581SGreg Clayton         }
19930fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
20030fdc8d8SChris Lattner         return false;
20130fdc8d8SChris Lattner     }
20230fdc8d8SChris Lattner     return true;
20330fdc8d8SChris Lattner }
20430fdc8d8SChris Lattner 
2055a988416SJim Ingham 
2065a988416SJim Ingham 
2075a988416SJim Ingham bool
208f9fc609fSGreg Clayton CommandObject::CheckRequirements (CommandReturnObject &result)
2095a988416SJim Ingham {
210f9fc609fSGreg Clayton #ifdef LLDB_CONFIGURATION_DEBUG
211f9fc609fSGreg Clayton     // Nothing should be stored in m_exe_ctx between running commands as m_exe_ctx
212f9fc609fSGreg Clayton     // has shared pointers to the target, process, thread and frame and we don't
213f9fc609fSGreg Clayton     // want any CommandObject instances to keep any of these objects around
214f9fc609fSGreg Clayton     // longer than for a single command. Every command should call
215f9fc609fSGreg Clayton     // CommandObject::Cleanup() after it has completed
216f9fc609fSGreg Clayton     assert (m_exe_ctx.GetTargetPtr() == NULL);
217f9fc609fSGreg Clayton     assert (m_exe_ctx.GetProcessPtr() == NULL);
218f9fc609fSGreg Clayton     assert (m_exe_ctx.GetThreadPtr() == NULL);
219f9fc609fSGreg Clayton     assert (m_exe_ctx.GetFramePtr() == NULL);
220f9fc609fSGreg Clayton #endif
221f9fc609fSGreg Clayton 
222f9fc609fSGreg Clayton     // Lock down the interpreter's execution context prior to running the
223f9fc609fSGreg Clayton     // command so we guarantee the selected target, process, thread and frame
224f9fc609fSGreg Clayton     // can't go away during the execution
225f9fc609fSGreg Clayton     m_exe_ctx = m_interpreter.GetExecutionContext();
226f9fc609fSGreg Clayton 
227f9fc609fSGreg Clayton     const uint32_t flags = GetFlags().Get();
228e87764f2SEnrico Granata     if (flags & (eCommandRequiresTarget   |
229e87764f2SEnrico Granata                  eCommandRequiresProcess  |
230e87764f2SEnrico Granata                  eCommandRequiresThread   |
231e87764f2SEnrico Granata                  eCommandRequiresFrame    |
232e87764f2SEnrico Granata                  eCommandTryTargetAPILock ))
233f9fc609fSGreg Clayton     {
234f9fc609fSGreg Clayton 
235e87764f2SEnrico Granata         if ((flags & eCommandRequiresTarget) && !m_exe_ctx.HasTargetScope())
236f9fc609fSGreg Clayton         {
237f9fc609fSGreg Clayton             result.AppendError (GetInvalidTargetDescription());
238f9fc609fSGreg Clayton             return false;
239f9fc609fSGreg Clayton         }
240f9fc609fSGreg Clayton 
241e87764f2SEnrico Granata         if ((flags & eCommandRequiresProcess) && !m_exe_ctx.HasProcessScope())
242f9fc609fSGreg Clayton         {
243e59b0d2cSJason Molenda             if (!m_exe_ctx.HasTargetScope())
244e59b0d2cSJason Molenda                 result.AppendError (GetInvalidTargetDescription());
245e59b0d2cSJason Molenda             else
246f9fc609fSGreg Clayton                 result.AppendError (GetInvalidProcessDescription());
247f9fc609fSGreg Clayton             return false;
248f9fc609fSGreg Clayton         }
249f9fc609fSGreg Clayton 
250e87764f2SEnrico Granata         if ((flags & eCommandRequiresThread) && !m_exe_ctx.HasThreadScope())
251f9fc609fSGreg Clayton         {
252e59b0d2cSJason Molenda             if (!m_exe_ctx.HasTargetScope())
253e59b0d2cSJason Molenda                 result.AppendError (GetInvalidTargetDescription());
254e59b0d2cSJason Molenda             else if (!m_exe_ctx.HasProcessScope())
255e59b0d2cSJason Molenda                 result.AppendError (GetInvalidProcessDescription());
256e59b0d2cSJason Molenda             else
257f9fc609fSGreg Clayton                 result.AppendError (GetInvalidThreadDescription());
258f9fc609fSGreg Clayton             return false;
259f9fc609fSGreg Clayton         }
260f9fc609fSGreg Clayton 
261e87764f2SEnrico Granata         if ((flags & eCommandRequiresFrame) && !m_exe_ctx.HasFrameScope())
262f9fc609fSGreg Clayton         {
263e59b0d2cSJason Molenda             if (!m_exe_ctx.HasTargetScope())
264e59b0d2cSJason Molenda                 result.AppendError (GetInvalidTargetDescription());
265e59b0d2cSJason Molenda             else if (!m_exe_ctx.HasProcessScope())
266e59b0d2cSJason Molenda                 result.AppendError (GetInvalidProcessDescription());
267e59b0d2cSJason Molenda             else if (!m_exe_ctx.HasThreadScope())
268e59b0d2cSJason Molenda                 result.AppendError (GetInvalidThreadDescription());
269e59b0d2cSJason Molenda             else
270f9fc609fSGreg Clayton                 result.AppendError (GetInvalidFrameDescription());
271f9fc609fSGreg Clayton             return false;
272f9fc609fSGreg Clayton         }
273f9fc609fSGreg Clayton 
274e87764f2SEnrico Granata         if ((flags & eCommandRequiresRegContext) && (m_exe_ctx.GetRegisterContext() == nullptr))
275f9fc609fSGreg Clayton         {
276f9fc609fSGreg Clayton             result.AppendError (GetInvalidRegContextDescription());
277f9fc609fSGreg Clayton             return false;
278f9fc609fSGreg Clayton         }
279f9fc609fSGreg Clayton 
280e87764f2SEnrico Granata         if (flags & eCommandTryTargetAPILock)
281f9fc609fSGreg Clayton         {
282f9fc609fSGreg Clayton             Target *target = m_exe_ctx.GetTargetPtr();
283f9fc609fSGreg Clayton             if (target)
2849b5442aeSGreg Clayton                 m_api_locker.Lock (target->GetAPIMutex());
285f9fc609fSGreg Clayton         }
286f9fc609fSGreg Clayton     }
287f9fc609fSGreg Clayton 
288e87764f2SEnrico Granata     if (GetFlags().AnySet (eCommandProcessMustBeLaunched | eCommandProcessMustBePaused))
289b766a73dSGreg Clayton     {
290c14ee32dSGreg Clayton         Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
291d78c9576SEd Maste         if (process == nullptr)
29230fdc8d8SChris Lattner         {
293b8e8a5f3SJim Ingham             // A process that is not running is considered paused.
294e87764f2SEnrico Granata             if (GetFlags().Test(eCommandProcessMustBeLaunched))
295b8e8a5f3SJim Ingham             {
29630fdc8d8SChris Lattner                 result.AppendError ("Process must exist.");
29730fdc8d8SChris Lattner                 result.SetStatus (eReturnStatusFailed);
29830fdc8d8SChris Lattner                 return false;
29930fdc8d8SChris Lattner             }
300b8e8a5f3SJim Ingham         }
30130fdc8d8SChris Lattner         else
30230fdc8d8SChris Lattner         {
30330fdc8d8SChris Lattner             StateType state = process->GetState();
30430fdc8d8SChris Lattner             switch (state)
30530fdc8d8SChris Lattner             {
3067a5388bfSGreg Clayton             case eStateInvalid:
30730fdc8d8SChris Lattner             case eStateSuspended:
30830fdc8d8SChris Lattner             case eStateCrashed:
30930fdc8d8SChris Lattner             case eStateStopped:
31030fdc8d8SChris Lattner                 break;
31130fdc8d8SChris Lattner 
312b766a73dSGreg Clayton             case eStateConnected:
313b766a73dSGreg Clayton             case eStateAttaching:
314b766a73dSGreg Clayton             case eStateLaunching:
31530fdc8d8SChris Lattner             case eStateDetached:
31630fdc8d8SChris Lattner             case eStateExited:
31730fdc8d8SChris Lattner             case eStateUnloaded:
318e87764f2SEnrico Granata                 if (GetFlags().Test(eCommandProcessMustBeLaunched))
31930fdc8d8SChris Lattner                 {
32030fdc8d8SChris Lattner                     result.AppendError ("Process must be launched.");
32130fdc8d8SChris Lattner                     result.SetStatus (eReturnStatusFailed);
32230fdc8d8SChris Lattner                     return false;
32330fdc8d8SChris Lattner                 }
32430fdc8d8SChris Lattner                 break;
32530fdc8d8SChris Lattner 
32630fdc8d8SChris Lattner             case eStateRunning:
32730fdc8d8SChris Lattner             case eStateStepping:
328e87764f2SEnrico Granata                 if (GetFlags().Test(eCommandProcessMustBePaused))
32930fdc8d8SChris Lattner                 {
33030fdc8d8SChris Lattner                     result.AppendError ("Process is running.  Use 'process interrupt' to pause execution.");
33130fdc8d8SChris Lattner                     result.SetStatus (eReturnStatusFailed);
33230fdc8d8SChris Lattner                     return false;
33330fdc8d8SChris Lattner                 }
33430fdc8d8SChris Lattner             }
33530fdc8d8SChris Lattner         }
336b766a73dSGreg Clayton     }
3375a988416SJim Ingham     return true;
33830fdc8d8SChris Lattner }
33930fdc8d8SChris Lattner 
340f9fc609fSGreg Clayton void
341f9fc609fSGreg Clayton CommandObject::Cleanup ()
342f9fc609fSGreg Clayton {
343f9fc609fSGreg Clayton     m_exe_ctx.Clear();
344f9fc609fSGreg Clayton     m_api_locker.Unlock();
345f9fc609fSGreg Clayton }
346f9fc609fSGreg Clayton 
347f9fc609fSGreg Clayton 
34830fdc8d8SChris Lattner class CommandDictCommandPartialMatch
34930fdc8d8SChris Lattner {
35030fdc8d8SChris Lattner     public:
35130fdc8d8SChris Lattner         CommandDictCommandPartialMatch (const char *match_str)
35230fdc8d8SChris Lattner         {
35330fdc8d8SChris Lattner             m_match_str = match_str;
35430fdc8d8SChris Lattner         }
35530fdc8d8SChris Lattner         bool operator() (const std::pair<std::string, lldb::CommandObjectSP> map_element) const
35630fdc8d8SChris Lattner         {
35730fdc8d8SChris Lattner             // A NULL or empty string matches everything.
358d78c9576SEd Maste             if (m_match_str == nullptr || *m_match_str == '\0')
359c7bece56SGreg Clayton                 return true;
36030fdc8d8SChris Lattner 
361c7bece56SGreg Clayton             return map_element.first.find (m_match_str, 0) == 0;
36230fdc8d8SChris Lattner         }
36330fdc8d8SChris Lattner 
36430fdc8d8SChris Lattner     private:
36530fdc8d8SChris Lattner         const char *m_match_str;
36630fdc8d8SChris Lattner };
36730fdc8d8SChris Lattner 
36830fdc8d8SChris Lattner int
36930fdc8d8SChris Lattner CommandObject::AddNamesMatchingPartialString (CommandObject::CommandMap &in_map, const char *cmd_str,
37030fdc8d8SChris Lattner                                               StringList &matches)
37130fdc8d8SChris Lattner {
37230fdc8d8SChris Lattner     int number_added = 0;
37330fdc8d8SChris Lattner     CommandDictCommandPartialMatch matcher(cmd_str);
37430fdc8d8SChris Lattner 
37530fdc8d8SChris Lattner     CommandObject::CommandMap::iterator matching_cmds = std::find_if (in_map.begin(), in_map.end(), matcher);
37630fdc8d8SChris Lattner 
37730fdc8d8SChris Lattner     while (matching_cmds != in_map.end())
37830fdc8d8SChris Lattner     {
37930fdc8d8SChris Lattner         ++number_added;
38030fdc8d8SChris Lattner         matches.AppendString((*matching_cmds).first.c_str());
38130fdc8d8SChris Lattner         matching_cmds = std::find_if (++matching_cmds, in_map.end(), matcher);;
38230fdc8d8SChris Lattner     }
38330fdc8d8SChris Lattner     return number_added;
38430fdc8d8SChris Lattner }
38530fdc8d8SChris Lattner 
38630fdc8d8SChris Lattner int
38730fdc8d8SChris Lattner CommandObject::HandleCompletion
38830fdc8d8SChris Lattner (
38930fdc8d8SChris Lattner     Args &input,
39030fdc8d8SChris Lattner     int &cursor_index,
39130fdc8d8SChris Lattner     int &cursor_char_position,
39230fdc8d8SChris Lattner     int match_start_point,
39330fdc8d8SChris Lattner     int max_return_elements,
394558ce124SJim Ingham     bool &word_complete,
39530fdc8d8SChris Lattner     StringList &matches
39630fdc8d8SChris Lattner )
39730fdc8d8SChris Lattner {
3986561d15dSJohnny Chen     // Default implmentation of WantsCompletion() is !WantsRawCommandString().
3996561d15dSJohnny Chen     // Subclasses who want raw command string but desire, for example,
4006561d15dSJohnny Chen     // argument completion should override WantsCompletion() to return true,
4016561d15dSJohnny Chen     // instead.
4026f99b637SJohnny Chen     if (WantsRawCommandString() && !WantsCompletion())
40330fdc8d8SChris Lattner     {
40430fdc8d8SChris Lattner         // FIXME: Abstract telling the completion to insert the completion character.
40530fdc8d8SChris Lattner         matches.Clear();
40630fdc8d8SChris Lattner         return -1;
40730fdc8d8SChris Lattner     }
40830fdc8d8SChris Lattner     else
40930fdc8d8SChris Lattner     {
41030fdc8d8SChris Lattner         // Can we do anything generic with the options?
41130fdc8d8SChris Lattner         Options *cur_options = GetOptions();
41230fdc8d8SChris Lattner         CommandReturnObject result;
41330fdc8d8SChris Lattner         OptionElementVector opt_element_vector;
41430fdc8d8SChris Lattner 
415d78c9576SEd Maste         if (cur_options != nullptr)
41630fdc8d8SChris Lattner         {
41730fdc8d8SChris Lattner             // Re-insert the dummy command name string which will have been
41830fdc8d8SChris Lattner             // stripped off:
41930fdc8d8SChris Lattner             input.Unshift ("dummy-string");
42030fdc8d8SChris Lattner             cursor_index++;
42130fdc8d8SChris Lattner 
42230fdc8d8SChris Lattner 
42330fdc8d8SChris Lattner             // I stick an element on the end of the input, because if the last element is
424b7ad58a0SGreg Clayton             // option that requires an argument, getopt_long_only will freak out.
42530fdc8d8SChris Lattner 
42630fdc8d8SChris Lattner             input.AppendArgument ("<FAKE-VALUE>");
42730fdc8d8SChris Lattner 
428d43e0094SJim Ingham             input.ParseArgsForCompletion (*cur_options, opt_element_vector, cursor_index);
42930fdc8d8SChris Lattner 
43030fdc8d8SChris Lattner             input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1);
43130fdc8d8SChris Lattner 
43230fdc8d8SChris Lattner             bool handled_by_options;
433eb0103f2SGreg Clayton             handled_by_options = cur_options->HandleOptionCompletion (input,
43430fdc8d8SChris Lattner                                                                       opt_element_vector,
43530fdc8d8SChris Lattner                                                                       cursor_index,
43630fdc8d8SChris Lattner                                                                       cursor_char_position,
43730fdc8d8SChris Lattner                                                                       match_start_point,
43830fdc8d8SChris Lattner                                                                       max_return_elements,
439558ce124SJim Ingham                                                                       word_complete,
44030fdc8d8SChris Lattner                                                                       matches);
44130fdc8d8SChris Lattner             if (handled_by_options)
44230fdc8d8SChris Lattner                 return matches.GetSize();
44330fdc8d8SChris Lattner         }
44430fdc8d8SChris Lattner 
44530fdc8d8SChris Lattner         // If we got here, the last word is not an option or an option argument.
446a7015092SGreg Clayton         return HandleArgumentCompletion (input,
44730fdc8d8SChris Lattner                                          cursor_index,
44830fdc8d8SChris Lattner                                          cursor_char_position,
44930fdc8d8SChris Lattner                                          opt_element_vector,
45030fdc8d8SChris Lattner                                          match_start_point,
45130fdc8d8SChris Lattner                                          max_return_elements,
452558ce124SJim Ingham                                          word_complete,
45330fdc8d8SChris Lattner                                          matches);
45430fdc8d8SChris Lattner     }
45530fdc8d8SChris Lattner }
45630fdc8d8SChris Lattner 
45730fdc8d8SChris Lattner bool
458a7015092SGreg Clayton CommandObject::HelpTextContainsWord (const char *search_word)
45930fdc8d8SChris Lattner {
46030fdc8d8SChris Lattner     std::string options_usage_help;
46130fdc8d8SChris Lattner 
46230fdc8d8SChris Lattner     bool found_word = false;
46330fdc8d8SChris Lattner 
464998255bfSGreg Clayton     const char *short_help = GetHelp();
465998255bfSGreg Clayton     const char *long_help = GetHelpLong();
466998255bfSGreg Clayton     const char *syntax_help = GetSyntax();
46730fdc8d8SChris Lattner 
468998255bfSGreg Clayton     if (short_help && strcasestr (short_help, search_word))
46930fdc8d8SChris Lattner         found_word = true;
470998255bfSGreg Clayton     else if (long_help && strcasestr (long_help, search_word))
47130fdc8d8SChris Lattner         found_word = true;
472998255bfSGreg Clayton     else if (syntax_help && strcasestr (syntax_help, search_word))
47330fdc8d8SChris Lattner         found_word = true;
47430fdc8d8SChris Lattner 
47530fdc8d8SChris Lattner     if (!found_word
476d78c9576SEd Maste         && GetOptions() != nullptr)
47730fdc8d8SChris Lattner     {
47830fdc8d8SChris Lattner         StreamString usage_help;
479eb0103f2SGreg Clayton         GetOptions()->GenerateOptionUsage (usage_help, this);
48030fdc8d8SChris Lattner         if (usage_help.GetSize() > 0)
48130fdc8d8SChris Lattner         {
48230fdc8d8SChris Lattner             const char *usage_text = usage_help.GetData();
4834b6fbf37SCaroline Tice             if (strcasestr (usage_text, search_word))
48430fdc8d8SChris Lattner               found_word = true;
48530fdc8d8SChris Lattner         }
48630fdc8d8SChris Lattner     }
48730fdc8d8SChris Lattner 
48830fdc8d8SChris Lattner     return found_word;
48930fdc8d8SChris Lattner }
490e139cf23SCaroline Tice 
491e139cf23SCaroline Tice int
492e139cf23SCaroline Tice CommandObject::GetNumArgumentEntries  ()
493e139cf23SCaroline Tice {
494e139cf23SCaroline Tice     return m_arguments.size();
495e139cf23SCaroline Tice }
496e139cf23SCaroline Tice 
497e139cf23SCaroline Tice CommandObject::CommandArgumentEntry *
498e139cf23SCaroline Tice CommandObject::GetArgumentEntryAtIndex (int idx)
499e139cf23SCaroline Tice {
5003985c8c6SSaleem Abdulrasool     if (static_cast<size_t>(idx) < m_arguments.size())
501e139cf23SCaroline Tice         return &(m_arguments[idx]);
502e139cf23SCaroline Tice 
503d78c9576SEd Maste     return nullptr;
504e139cf23SCaroline Tice }
505e139cf23SCaroline Tice 
506d7e6a4f2SVince Harron const CommandObject::ArgumentTableEntry *
507e139cf23SCaroline Tice CommandObject::FindArgumentDataByType (CommandArgumentType arg_type)
508e139cf23SCaroline Tice {
509e139cf23SCaroline Tice     const ArgumentTableEntry *table = CommandObject::GetArgumentTable();
510e139cf23SCaroline Tice 
511e139cf23SCaroline Tice     for (int i = 0; i < eArgTypeLastArg; ++i)
512e139cf23SCaroline Tice         if (table[i].arg_type == arg_type)
513d7e6a4f2SVince Harron             return &(table[i]);
514e139cf23SCaroline Tice 
515d78c9576SEd Maste     return nullptr;
516e139cf23SCaroline Tice }
517e139cf23SCaroline Tice 
518e139cf23SCaroline Tice void
519e139cf23SCaroline Tice CommandObject::GetArgumentHelp (Stream &str, CommandArgumentType arg_type, CommandInterpreter &interpreter)
520e139cf23SCaroline Tice {
521e139cf23SCaroline Tice     const ArgumentTableEntry* table = CommandObject::GetArgumentTable();
522d7e6a4f2SVince Harron     const ArgumentTableEntry *entry = &(table[arg_type]);
523e139cf23SCaroline Tice 
524e139cf23SCaroline Tice     // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up...
525e139cf23SCaroline Tice 
526e139cf23SCaroline Tice     if (entry->arg_type != arg_type)
527e139cf23SCaroline Tice         entry = CommandObject::FindArgumentDataByType (arg_type);
528e139cf23SCaroline Tice 
529e139cf23SCaroline Tice     if (!entry)
530e139cf23SCaroline Tice         return;
531e139cf23SCaroline Tice 
532e139cf23SCaroline Tice     StreamString name_str;
533e139cf23SCaroline Tice     name_str.Printf ("<%s>", entry->arg_name);
534e139cf23SCaroline Tice 
535fc7a7f3bSEnrico Granata     if (entry->help_function)
53682a7d983SEnrico Granata     {
537fc7a7f3bSEnrico Granata         const char* help_text = entry->help_function();
53882a7d983SEnrico Granata         if (!entry->help_function.self_formatting)
53982a7d983SEnrico Granata         {
54082a7d983SEnrico Granata             interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", help_text,
541e139cf23SCaroline Tice                                                  name_str.GetSize());
54282a7d983SEnrico Granata         }
54382a7d983SEnrico Granata         else
54482a7d983SEnrico Granata         {
54582a7d983SEnrico Granata             interpreter.OutputHelpText(str, name_str.GetData(), "--", help_text,
54682a7d983SEnrico Granata                                        name_str.GetSize());
54782a7d983SEnrico Granata         }
54882a7d983SEnrico Granata     }
549e139cf23SCaroline Tice     else
550e139cf23SCaroline Tice         interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", entry->help_text, name_str.GetSize());
551e139cf23SCaroline Tice }
552e139cf23SCaroline Tice 
553e139cf23SCaroline Tice const char *
554e139cf23SCaroline Tice CommandObject::GetArgumentName (CommandArgumentType arg_type)
555e139cf23SCaroline Tice {
556d7e6a4f2SVince Harron     const ArgumentTableEntry *entry = &(CommandObject::GetArgumentTable()[arg_type]);
557deaab222SCaroline Tice 
558deaab222SCaroline Tice     // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up...
559deaab222SCaroline Tice 
560deaab222SCaroline Tice     if (entry->arg_type != arg_type)
561deaab222SCaroline Tice         entry = CommandObject::FindArgumentDataByType (arg_type);
562deaab222SCaroline Tice 
563e6acf355SJohnny Chen     if (entry)
564deaab222SCaroline Tice         return entry->arg_name;
565e6acf355SJohnny Chen 
566e6acf355SJohnny Chen     StreamString str;
567e6acf355SJohnny Chen     str << "Arg name for type (" << arg_type << ") not in arg table!";
568e6acf355SJohnny Chen     return str.GetData();
569e139cf23SCaroline Tice }
570e139cf23SCaroline Tice 
571405fe67fSCaroline Tice bool
572e0d378b3SGreg Clayton CommandObject::IsPairType (ArgumentRepetitionType arg_repeat_type)
573405fe67fSCaroline Tice {
574405fe67fSCaroline Tice     if ((arg_repeat_type == eArgRepeatPairPlain)
575405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairOptional)
576405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairPlus)
577405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairStar)
578405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairRange)
579405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairRangeOptional))
580405fe67fSCaroline Tice         return true;
581405fe67fSCaroline Tice 
582405fe67fSCaroline Tice     return false;
583405fe67fSCaroline Tice }
584405fe67fSCaroline Tice 
58534ddc8dbSJohnny Chen static CommandObject::CommandArgumentEntry
58634ddc8dbSJohnny Chen OptSetFiltered(uint32_t opt_set_mask, CommandObject::CommandArgumentEntry &cmd_arg_entry)
58734ddc8dbSJohnny Chen {
58834ddc8dbSJohnny Chen     CommandObject::CommandArgumentEntry ret_val;
58934ddc8dbSJohnny Chen     for (unsigned i = 0; i < cmd_arg_entry.size(); ++i)
59034ddc8dbSJohnny Chen         if (opt_set_mask & cmd_arg_entry[i].arg_opt_set_association)
59134ddc8dbSJohnny Chen             ret_val.push_back(cmd_arg_entry[i]);
59234ddc8dbSJohnny Chen     return ret_val;
59334ddc8dbSJohnny Chen }
59434ddc8dbSJohnny Chen 
59534ddc8dbSJohnny Chen // Default parameter value of opt_set_mask is LLDB_OPT_SET_ALL, which means take
59634ddc8dbSJohnny Chen // all the argument data into account.  On rare cases where some argument sticks
59734ddc8dbSJohnny Chen // with certain option sets, this function returns the option set filtered args.
598e139cf23SCaroline Tice void
59934ddc8dbSJohnny Chen CommandObject::GetFormattedCommandArguments (Stream &str, uint32_t opt_set_mask)
600e139cf23SCaroline Tice {
601e139cf23SCaroline Tice     int num_args = m_arguments.size();
602e139cf23SCaroline Tice     for (int i = 0; i < num_args; ++i)
603e139cf23SCaroline Tice     {
604e139cf23SCaroline Tice         if (i > 0)
605e139cf23SCaroline Tice             str.Printf (" ");
60634ddc8dbSJohnny Chen         CommandArgumentEntry arg_entry =
60734ddc8dbSJohnny Chen             opt_set_mask == LLDB_OPT_SET_ALL ? m_arguments[i]
60834ddc8dbSJohnny Chen                                              : OptSetFiltered(opt_set_mask, m_arguments[i]);
609e139cf23SCaroline Tice         int num_alternatives = arg_entry.size();
610405fe67fSCaroline Tice 
611405fe67fSCaroline Tice         if ((num_alternatives == 2)
612405fe67fSCaroline Tice             && IsPairType (arg_entry[0].arg_repetition))
613405fe67fSCaroline Tice         {
614405fe67fSCaroline Tice             const char *first_name = GetArgumentName (arg_entry[0].arg_type);
615405fe67fSCaroline Tice             const char *second_name = GetArgumentName (arg_entry[1].arg_type);
616405fe67fSCaroline Tice             switch (arg_entry[0].arg_repetition)
617405fe67fSCaroline Tice             {
618405fe67fSCaroline Tice                 case eArgRepeatPairPlain:
619405fe67fSCaroline Tice                     str.Printf ("<%s> <%s>", first_name, second_name);
620405fe67fSCaroline Tice                     break;
621405fe67fSCaroline Tice                 case eArgRepeatPairOptional:
622405fe67fSCaroline Tice                     str.Printf ("[<%s> <%s>]", first_name, second_name);
623405fe67fSCaroline Tice                     break;
624405fe67fSCaroline Tice                 case eArgRepeatPairPlus:
625405fe67fSCaroline Tice                     str.Printf ("<%s> <%s> [<%s> <%s> [...]]", first_name, second_name, first_name, second_name);
626405fe67fSCaroline Tice                     break;
627405fe67fSCaroline Tice                 case eArgRepeatPairStar:
628405fe67fSCaroline Tice                     str.Printf ("[<%s> <%s> [<%s> <%s> [...]]]", first_name, second_name, first_name, second_name);
629405fe67fSCaroline Tice                     break;
630405fe67fSCaroline Tice                 case eArgRepeatPairRange:
631405fe67fSCaroline Tice                     str.Printf ("<%s_1> <%s_1> ... <%s_n> <%s_n>", first_name, second_name, first_name, second_name);
632405fe67fSCaroline Tice                     break;
633405fe67fSCaroline Tice                 case eArgRepeatPairRangeOptional:
634405fe67fSCaroline Tice                     str.Printf ("[<%s_1> <%s_1> ... <%s_n> <%s_n>]", first_name, second_name, first_name, second_name);
635405fe67fSCaroline Tice                     break;
636ca1176aaSCaroline Tice                 // Explicitly test for all the rest of the cases, so if new types get added we will notice the
637ca1176aaSCaroline Tice                 // missing case statement(s).
638ca1176aaSCaroline Tice                 case eArgRepeatPlain:
639ca1176aaSCaroline Tice                 case eArgRepeatOptional:
640ca1176aaSCaroline Tice                 case eArgRepeatPlus:
641ca1176aaSCaroline Tice                 case eArgRepeatStar:
642ca1176aaSCaroline Tice                 case eArgRepeatRange:
643ca1176aaSCaroline Tice                     // These should not be reached, as they should fail the IsPairType test above.
644ca1176aaSCaroline Tice                     break;
645405fe67fSCaroline Tice             }
646405fe67fSCaroline Tice         }
647405fe67fSCaroline Tice         else
648405fe67fSCaroline Tice         {
649e139cf23SCaroline Tice             StreamString names;
650e139cf23SCaroline Tice             for (int j = 0; j < num_alternatives; ++j)
651e139cf23SCaroline Tice             {
652e139cf23SCaroline Tice                 if (j > 0)
653e139cf23SCaroline Tice                     names.Printf (" | ");
654e139cf23SCaroline Tice                 names.Printf ("%s", GetArgumentName (arg_entry[j].arg_type));
655e139cf23SCaroline Tice             }
656e139cf23SCaroline Tice             switch (arg_entry[0].arg_repetition)
657e139cf23SCaroline Tice             {
658e139cf23SCaroline Tice                 case eArgRepeatPlain:
659e139cf23SCaroline Tice                     str.Printf ("<%s>", names.GetData());
660e139cf23SCaroline Tice                     break;
661e139cf23SCaroline Tice                 case eArgRepeatPlus:
662e139cf23SCaroline Tice                     str.Printf ("<%s> [<%s> [...]]", names.GetData(), names.GetData());
663e139cf23SCaroline Tice                     break;
664e139cf23SCaroline Tice                 case eArgRepeatStar:
665e139cf23SCaroline Tice                     str.Printf ("[<%s> [<%s> [...]]]", names.GetData(), names.GetData());
666e139cf23SCaroline Tice                     break;
667e139cf23SCaroline Tice                 case eArgRepeatOptional:
668e139cf23SCaroline Tice                     str.Printf ("[<%s>]", names.GetData());
669e139cf23SCaroline Tice                     break;
670405fe67fSCaroline Tice                 case eArgRepeatRange:
671fd54b368SJason Molenda                     str.Printf ("<%s_1> .. <%s_n>", names.GetData(), names.GetData());
672ca1176aaSCaroline Tice                     break;
673ca1176aaSCaroline Tice                 // Explicitly test for all the rest of the cases, so if new types get added we will notice the
674ca1176aaSCaroline Tice                 // missing case statement(s).
675ca1176aaSCaroline Tice                 case eArgRepeatPairPlain:
676ca1176aaSCaroline Tice                 case eArgRepeatPairOptional:
677ca1176aaSCaroline Tice                 case eArgRepeatPairPlus:
678ca1176aaSCaroline Tice                 case eArgRepeatPairStar:
679ca1176aaSCaroline Tice                 case eArgRepeatPairRange:
680ca1176aaSCaroline Tice                 case eArgRepeatPairRangeOptional:
681ca1176aaSCaroline Tice                     // These should not be hit, as they should pass the IsPairType test above, and control should
682ca1176aaSCaroline Tice                     // have gone into the other branch of the if statement.
683ca1176aaSCaroline Tice                     break;
684405fe67fSCaroline Tice             }
685e139cf23SCaroline Tice         }
686e139cf23SCaroline Tice     }
687e139cf23SCaroline Tice }
688e139cf23SCaroline Tice 
6890c16aa6dSStephen Wilson CommandArgumentType
690e139cf23SCaroline Tice CommandObject::LookupArgumentName (const char *arg_name)
691e139cf23SCaroline Tice {
692e139cf23SCaroline Tice     CommandArgumentType return_type = eArgTypeLastArg;
693e139cf23SCaroline Tice 
694e139cf23SCaroline Tice     std::string arg_name_str (arg_name);
695e139cf23SCaroline Tice     size_t len = arg_name_str.length();
696e139cf23SCaroline Tice     if (arg_name[0] == '<'
697e139cf23SCaroline Tice         && arg_name[len-1] == '>')
698e139cf23SCaroline Tice         arg_name_str = arg_name_str.substr (1, len-2);
699e139cf23SCaroline Tice 
700331eff39SJohnny Chen     const ArgumentTableEntry *table = GetArgumentTable();
701e139cf23SCaroline Tice     for (int i = 0; i < eArgTypeLastArg; ++i)
702331eff39SJohnny Chen         if (arg_name_str.compare (table[i].arg_name) == 0)
703e139cf23SCaroline Tice             return_type = g_arguments_data[i].arg_type;
704e139cf23SCaroline Tice 
705e139cf23SCaroline Tice     return return_type;
706e139cf23SCaroline Tice }
707e139cf23SCaroline Tice 
708e139cf23SCaroline Tice static const char *
709931e674aSJim Ingham RegisterNameHelpTextCallback ()
710931e674aSJim Ingham {
711931e674aSJim Ingham     return "Register names can be specified using the architecture specific names.  "
71284c7bd74SJim Ingham     "They can also be specified using generic names.  Not all generic entities have "
71384c7bd74SJim Ingham     "registers backing them on all architectures.  When they don't the generic name "
71484c7bd74SJim Ingham     "will return an error.\n"
715931e674aSJim Ingham     "The generic names defined in lldb are:\n"
716931e674aSJim Ingham     "\n"
717931e674aSJim Ingham     "pc       - program counter register\n"
718931e674aSJim Ingham     "ra       - return address register\n"
719931e674aSJim Ingham     "fp       - frame pointer register\n"
720931e674aSJim Ingham     "sp       - stack pointer register\n"
72184c7bd74SJim Ingham     "flags    - the flags register\n"
722931e674aSJim Ingham     "arg{1-6} - integer argument passing registers.\n";
723931e674aSJim Ingham }
724931e674aSJim Ingham 
725931e674aSJim Ingham static const char *
726e139cf23SCaroline Tice BreakpointIDHelpTextCallback ()
727e139cf23SCaroline Tice {
72886edbf41SGreg Clayton     return "Breakpoint ID's consist major and minor numbers;  the major number "
72986edbf41SGreg Clayton     "corresponds to the single entity that was created with a 'breakpoint set' "
73086edbf41SGreg Clayton     "command; the minor numbers correspond to all the locations that were actually "
73186edbf41SGreg Clayton     "found/set based on the major breakpoint.  A full breakpoint ID might look like "
73286edbf41SGreg Clayton     "3.14, meaning the 14th location set for the 3rd breakpoint.  You can specify "
73386edbf41SGreg Clayton     "all the locations of a breakpoint by just indicating the major breakpoint "
73486edbf41SGreg Clayton     "number. A valid breakpoint id consists either of just the major id number, "
73586edbf41SGreg Clayton     "or the major number, a dot, and the location number (e.g. 3 or 3.2 could "
73686edbf41SGreg Clayton     "both be valid breakpoint ids).";
737e139cf23SCaroline Tice }
738e139cf23SCaroline Tice 
739e139cf23SCaroline Tice static const char *
740e139cf23SCaroline Tice BreakpointIDRangeHelpTextCallback ()
741e139cf23SCaroline Tice {
74286edbf41SGreg Clayton     return "A 'breakpoint id list' is a manner of specifying multiple breakpoints. "
74386edbf41SGreg Clayton     "This can be done  through several mechanisms.  The easiest way is to just "
74486edbf41SGreg Clayton     "enter a space-separated list of breakpoint ids.  To specify all the "
74586edbf41SGreg Clayton     "breakpoint locations under a major breakpoint, you can use the major "
74686edbf41SGreg Clayton     "breakpoint number followed by '.*', eg. '5.*' means all the locations under "
74786edbf41SGreg Clayton     "breakpoint 5.  You can also indicate a range of breakpoints by using "
74886edbf41SGreg Clayton     "<start-bp-id> - <end-bp-id>.  The start-bp-id and end-bp-id for a range can "
74986edbf41SGreg Clayton     "be any valid breakpoint ids.  It is not legal, however, to specify a range "
75086edbf41SGreg Clayton     "using specific locations that cross major breakpoint numbers.  I.e. 3.2 - 3.7"
75186edbf41SGreg Clayton     " is legal; 2 - 5 is legal; but 3.2 - 4.4 is not legal.";
75286edbf41SGreg Clayton }
75386edbf41SGreg Clayton 
75486edbf41SGreg Clayton static const char *
7555e09c8c3SJim Ingham BreakpointNameHelpTextCallback ()
7565e09c8c3SJim Ingham {
7575e09c8c3SJim Ingham     return "A name that can be added to a breakpoint when it is created, or later "
7585e09c8c3SJim Ingham     "on with the \"breakpoint name add\" command.  "
7595e09c8c3SJim Ingham     "Breakpoint names can be used to specify breakpoints in all the places breakpoint ID's "
7605e09c8c3SJim Ingham     "and breakpoint ID ranges can be used.  As such they provide a convenient way to group breakpoints, "
7615e09c8c3SJim Ingham     "and to operate on breakpoints you create without having to track the breakpoint number.  "
7625e09c8c3SJim Ingham     "Note, the attributes you set when using a breakpoint name in a breakpoint command don't "
7635e09c8c3SJim Ingham     "adhere to the name, but instead are set individually on all the breakpoints currently tagged with that name.  Future breakpoints "
7645e09c8c3SJim Ingham     "tagged with that name will not pick up the attributes previously given using that name.  "
7655e09c8c3SJim Ingham     "In order to distinguish breakpoint names from breakpoint ID's and ranges, "
7665e09c8c3SJim Ingham     "names must start with a letter from a-z or A-Z and cannot contain spaces, \".\" or \"-\".  "
7675e09c8c3SJim Ingham     "Also, breakpoint names can only be applied to breakpoints, not to breakpoint locations.";
7685e09c8c3SJim Ingham }
7695e09c8c3SJim Ingham 
7705e09c8c3SJim Ingham static const char *
77186edbf41SGreg Clayton GDBFormatHelpTextCallback ()
77286edbf41SGreg Clayton {
773f91381e8SGreg Clayton     return "A GDB format consists of a repeat count, a format letter and a size letter. "
774f91381e8SGreg Clayton     "The repeat count is optional and defaults to 1. The format letter is optional "
775f91381e8SGreg Clayton     "and defaults to the previous format that was used. The size letter is optional "
776f91381e8SGreg Clayton     "and defaults to the previous size that was used.\n"
777f91381e8SGreg Clayton     "\n"
778f91381e8SGreg Clayton     "Format letters include:\n"
779f91381e8SGreg Clayton     "o - octal\n"
780f91381e8SGreg Clayton     "x - hexadecimal\n"
781f91381e8SGreg Clayton     "d - decimal\n"
782f91381e8SGreg Clayton     "u - unsigned decimal\n"
783f91381e8SGreg Clayton     "t - binary\n"
784f91381e8SGreg Clayton     "f - float\n"
785f91381e8SGreg Clayton     "a - address\n"
786f91381e8SGreg Clayton     "i - instruction\n"
787f91381e8SGreg Clayton     "c - char\n"
788f91381e8SGreg Clayton     "s - string\n"
789f91381e8SGreg Clayton     "T - OSType\n"
790f91381e8SGreg Clayton     "A - float as hex\n"
791f91381e8SGreg Clayton     "\n"
792f91381e8SGreg Clayton     "Size letters include:\n"
793f91381e8SGreg Clayton     "b - 1 byte  (byte)\n"
794f91381e8SGreg Clayton     "h - 2 bytes (halfword)\n"
795f91381e8SGreg Clayton     "w - 4 bytes (word)\n"
796f91381e8SGreg Clayton     "g - 8 bytes (giant)\n"
797f91381e8SGreg Clayton     "\n"
798f91381e8SGreg Clayton     "Example formats:\n"
799f91381e8SGreg Clayton     "32xb - show 32 1 byte hexadecimal integer values\n"
800f91381e8SGreg Clayton     "16xh - show 16 2 byte hexadecimal integer values\n"
801f91381e8SGreg Clayton     "64   - show 64 2 byte hexadecimal integer values (format and size from the last format)\n"
802f91381e8SGreg Clayton     "dw   - show 1 4 byte decimal integer value\n"
803f91381e8SGreg Clayton     ;
804e139cf23SCaroline Tice }
805e139cf23SCaroline Tice 
8060a3958e0SEnrico Granata static const char *
8070a3958e0SEnrico Granata FormatHelpTextCallback ()
8080a3958e0SEnrico Granata {
80982a7d983SEnrico Granata 
810d78c9576SEd Maste     static char* help_text_ptr = nullptr;
81182a7d983SEnrico Granata 
81282a7d983SEnrico Granata     if (help_text_ptr)
81382a7d983SEnrico Granata         return help_text_ptr;
81482a7d983SEnrico Granata 
8150a3958e0SEnrico Granata     StreamString sstr;
8160a3958e0SEnrico Granata     sstr << "One of the format names (or one-character names) that can be used to show a variable's value:\n";
8170a3958e0SEnrico Granata     for (Format f = eFormatDefault; f < kNumFormats; f = Format(f+1))
8180a3958e0SEnrico Granata     {
81982a7d983SEnrico Granata         if (f != eFormatDefault)
82082a7d983SEnrico Granata             sstr.PutChar('\n');
82182a7d983SEnrico Granata 
8220a3958e0SEnrico Granata         char format_char = FormatManager::GetFormatAsFormatChar(f);
8230a3958e0SEnrico Granata         if (format_char)
8240a3958e0SEnrico Granata             sstr.Printf("'%c' or ", format_char);
8250a3958e0SEnrico Granata 
82682a7d983SEnrico Granata         sstr.Printf ("\"%s\"", FormatManager::GetFormatAsCString(f));
8270a3958e0SEnrico Granata     }
8280a3958e0SEnrico Granata 
8290a3958e0SEnrico Granata     sstr.Flush();
8300a3958e0SEnrico Granata 
8310a3958e0SEnrico Granata     std::string data = sstr.GetString();
8320a3958e0SEnrico Granata 
83382a7d983SEnrico Granata     help_text_ptr = new char[data.length()+1];
8340a3958e0SEnrico Granata 
83582a7d983SEnrico Granata     data.copy(help_text_ptr, data.length());
8360a3958e0SEnrico Granata 
83782a7d983SEnrico Granata     return help_text_ptr;
8380a3958e0SEnrico Granata }
8390a3958e0SEnrico Granata 
8400a3958e0SEnrico Granata static const char *
841d9477397SSean Callanan LanguageTypeHelpTextCallback ()
842d9477397SSean Callanan {
843d78c9576SEd Maste     static char* help_text_ptr = nullptr;
844d9477397SSean Callanan 
845d9477397SSean Callanan     if (help_text_ptr)
846d9477397SSean Callanan         return help_text_ptr;
847d9477397SSean Callanan 
848d9477397SSean Callanan     StreamString sstr;
849d9477397SSean Callanan     sstr << "One of the following languages:\n";
850d9477397SSean Callanan 
851de50d36aSJim Ingham     LanguageRuntime::PrintAllLanguages(sstr, "  ", "\n");
852d9477397SSean Callanan 
853d9477397SSean Callanan     sstr.Flush();
854d9477397SSean Callanan 
855d9477397SSean Callanan     std::string data = sstr.GetString();
856d9477397SSean Callanan 
857d9477397SSean Callanan     help_text_ptr = new char[data.length()+1];
858d9477397SSean Callanan 
859d9477397SSean Callanan     data.copy(help_text_ptr, data.length());
860d9477397SSean Callanan 
861d9477397SSean Callanan     return help_text_ptr;
862d9477397SSean Callanan }
863d9477397SSean Callanan 
864d9477397SSean Callanan static const char *
86582a7d983SEnrico Granata SummaryStringHelpTextCallback()
8660a3958e0SEnrico Granata {
86782a7d983SEnrico Granata     return
86882a7d983SEnrico Granata         "A summary string is a way to extract information from variables in order to present them using a summary.\n"
86982a7d983SEnrico Granata         "Summary strings contain static text, variables, scopes and control sequences:\n"
87082a7d983SEnrico Granata         "  - Static text can be any sequence of non-special characters, i.e. anything but '{', '}', '$', or '\\'.\n"
87182a7d983SEnrico Granata         "  - Variables are sequences of characters beginning with ${, ending with } and that contain symbols in the format described below.\n"
87282a7d983SEnrico 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"
87382a7d983SEnrico Granata         "  - Control sequences are the usual C/C++ '\\a', '\\n', ..., plus '\\$', '\\{' and '\\}'.\n"
87482a7d983SEnrico 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"
87582a7d983SEnrico 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"
87682a7d983SEnrico 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"
87782a7d983SEnrico 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"
8789128ee2fSEnrico 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."
8799128ee2fSEnrico 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"
88082a7d983SEnrico 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."
88182a7d983SEnrico 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"
88282a7d983SEnrico Granata         " path refers to:\n"
88382a7d983SEnrico 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"
88482a7d983SEnrico Granata         " and displayed as an individual variable\n"
88582a7d983SEnrico 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"
88682a7d983SEnrico 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"
8879128ee2fSEnrico 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"
8889128ee2fSEnrico 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"
8899128ee2fSEnrico Granata         " special symbols only allowed as part of a variable:\n"
8909128ee2fSEnrico Granata         "    %V: show the value of the object by default\n"
8919128ee2fSEnrico Granata         "    %S: show the summary of the object by default\n"
8929128ee2fSEnrico Granata         "    %@: show the runtime-provided object description (for Objective-C, it calls NSPrintForDebugger; for C/C++ it does nothing)\n"
8939128ee2fSEnrico Granata         "    %L: show the location of the object (memory address or a register name)\n"
8949128ee2fSEnrico Granata         "    %#: show the number of children of the object\n"
8959128ee2fSEnrico Granata         "    %T: show the type of the object\n"
8969128ee2fSEnrico 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"
8979128ee2fSEnrico 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"
8989128ee2fSEnrico Granata         " count the number of actual elements stored in an std::list:\n"
8999128ee2fSEnrico Granata         "type summary add -s \"${svar%#}\" -x \"std::list<\"";
9009128ee2fSEnrico Granata }
9019128ee2fSEnrico Granata 
9029128ee2fSEnrico Granata static const char *
9039128ee2fSEnrico Granata ExprPathHelpTextCallback()
9049128ee2fSEnrico Granata {
9059128ee2fSEnrico Granata     return
9069128ee2fSEnrico 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"
9079128ee2fSEnrico Granata     "For instance, given a class:\n"
9089128ee2fSEnrico Granata     "  class foo {\n"
9099128ee2fSEnrico Granata     "      int a;\n"
9109128ee2fSEnrico Granata     "      int b; .\n"
9119128ee2fSEnrico Granata     "      foo* next;\n"
9129128ee2fSEnrico Granata     "  };\n"
9139128ee2fSEnrico Granata     "the expression to read item b in the item pointed to by next for foo aFoo would be aFoo.next->b.\n"
9149128ee2fSEnrico 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"
9159128ee2fSEnrico 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"
9169128ee2fSEnrico Granata     "The meaning of these operators is the same as the usual one given to them by the C/C++ standards.\n"
9179128ee2fSEnrico 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"
9189128ee2fSEnrico 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"
9199128ee2fSEnrico 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"
9209128ee2fSEnrico 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"
9219128ee2fSEnrico Granata     " meaning of array slicing (taking elements n thru m inside the array or pointed-to memory).";
9220a3958e0SEnrico Granata }
9230a3958e0SEnrico Granata 
924184d7a72SJohnny Chen void
925*ea671fbdSKate Stone CommandObject::FormatLongHelpText (Stream &output_strm, const char *long_help)
926*ea671fbdSKate Stone {
927*ea671fbdSKate Stone     CommandInterpreter& interpreter = GetCommandInterpreter();
928*ea671fbdSKate Stone     std::stringstream lineStream (long_help);
929*ea671fbdSKate Stone     std::string line;
930*ea671fbdSKate Stone     while (std::getline (lineStream, line)) {
931*ea671fbdSKate Stone         if (line.empty()) {
932*ea671fbdSKate Stone             output_strm << "\n";
933*ea671fbdSKate Stone             continue;
934*ea671fbdSKate Stone         }
935*ea671fbdSKate Stone         size_t result = line.find_first_not_of (" \t");
936*ea671fbdSKate Stone         if (result == std::string::npos) {
937*ea671fbdSKate Stone             result = 0;
938*ea671fbdSKate Stone         }
939*ea671fbdSKate Stone         std::string whitespace_prefix = line.substr (0, result);
940*ea671fbdSKate Stone         std::string remainder = line.substr (result);
941*ea671fbdSKate Stone         interpreter.OutputFormattedHelpText(output_strm, whitespace_prefix.c_str(), remainder.c_str());
942*ea671fbdSKate Stone     }
943*ea671fbdSKate Stone }
944*ea671fbdSKate Stone 
945*ea671fbdSKate Stone void
9469b62d1d5SEnrico Granata CommandObject::GenerateHelpText (CommandReturnObject &result)
9479b62d1d5SEnrico Granata {
9489b62d1d5SEnrico Granata     GenerateHelpText(result.GetOutputStream());
9499b62d1d5SEnrico Granata 
9509b62d1d5SEnrico Granata     result.SetStatus (eReturnStatusSuccessFinishNoResult);
9519b62d1d5SEnrico Granata }
9529b62d1d5SEnrico Granata 
9539b62d1d5SEnrico Granata void
9549b62d1d5SEnrico Granata CommandObject::GenerateHelpText (Stream &output_strm)
9559b62d1d5SEnrico Granata {
9569b62d1d5SEnrico Granata     CommandInterpreter& interpreter = GetCommandInterpreter();
957d78c9576SEd Maste     if (GetOptions() != nullptr)
9589b62d1d5SEnrico Granata     {
9599b62d1d5SEnrico Granata         if (WantsRawCommandString())
9609b62d1d5SEnrico Granata         {
9619b62d1d5SEnrico Granata             std::string help_text (GetHelp());
9629b62d1d5SEnrico Granata             help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
9639b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
9649b62d1d5SEnrico Granata         }
9659b62d1d5SEnrico Granata         else
9669b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
9679b62d1d5SEnrico Granata         output_strm.Printf ("\nSyntax: %s\n", GetSyntax());
9689b62d1d5SEnrico Granata         GetOptions()->GenerateOptionUsage (output_strm, this);
9699b62d1d5SEnrico Granata         const char *long_help = GetHelpLong();
970d78c9576SEd Maste         if ((long_help != nullptr)
9719b62d1d5SEnrico Granata             && (strlen (long_help) > 0))
972*ea671fbdSKate Stone             FormatLongHelpText (output_strm, long_help);
9739b62d1d5SEnrico Granata         if (WantsRawCommandString() && !WantsCompletion())
9749b62d1d5SEnrico Granata         {
9759b62d1d5SEnrico Granata             // Emit the message about using ' -- ' between the end of the command options and the raw input
9769b62d1d5SEnrico Granata             // conditionally, i.e., only if the command object does not want completion.
9779b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "",
9789b62d1d5SEnrico Granata                                                  "\nIMPORTANT NOTE:  Because this command takes 'raw' input, if you use any command options"
9799b62d1d5SEnrico Granata                                                  " you must use ' -- ' between the end of the command options and the beginning of the raw input.", 1);
9809b62d1d5SEnrico Granata         }
9819b62d1d5SEnrico Granata         else if (GetNumArgumentEntries() > 0
9829b62d1d5SEnrico Granata                  && GetOptions()
9839b62d1d5SEnrico Granata                  && GetOptions()->NumCommandOptions() > 0)
9849b62d1d5SEnrico Granata         {
9859b62d1d5SEnrico Granata             // Also emit a warning about using "--" in case you are using a command that takes options and arguments.
9869b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "",
9879b62d1d5SEnrico Granata                                                  "\nThis command takes options and free-form arguments.  If your arguments resemble"
9889b62d1d5SEnrico Granata                                                  " option specifiers (i.e., they start with a - or --), you must use ' -- ' between"
9899b62d1d5SEnrico Granata                                                  " the end of the command options and the beginning of the arguments.", 1);
9909b62d1d5SEnrico Granata         }
9919b62d1d5SEnrico Granata     }
9929b62d1d5SEnrico Granata     else if (IsMultiwordObject())
9939b62d1d5SEnrico Granata     {
9949b62d1d5SEnrico Granata         if (WantsRawCommandString())
9959b62d1d5SEnrico Granata         {
9969b62d1d5SEnrico Granata             std::string help_text (GetHelp());
9979b62d1d5SEnrico Granata             help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
9989b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
9999b62d1d5SEnrico Granata         }
10009b62d1d5SEnrico Granata         else
10019b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
10029b62d1d5SEnrico Granata         GenerateHelpText (output_strm);
10039b62d1d5SEnrico Granata     }
10049b62d1d5SEnrico Granata     else
10059b62d1d5SEnrico Granata     {
10069b62d1d5SEnrico Granata         const char *long_help = GetHelpLong();
1007d78c9576SEd Maste         if ((long_help != nullptr)
10089b62d1d5SEnrico Granata             && (strlen (long_help) > 0))
1009*ea671fbdSKate Stone             FormatLongHelpText (output_strm, long_help);
10109b62d1d5SEnrico Granata         else if (WantsRawCommandString())
10119b62d1d5SEnrico Granata         {
10129b62d1d5SEnrico Granata             std::string help_text (GetHelp());
10139b62d1d5SEnrico Granata             help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
10149b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
10159b62d1d5SEnrico Granata         }
10169b62d1d5SEnrico Granata         else
10179b62d1d5SEnrico Granata             interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
10189b62d1d5SEnrico Granata         output_strm.Printf ("\nSyntax: %s\n", GetSyntax());
10199b62d1d5SEnrico Granata     }
10209b62d1d5SEnrico Granata }
10219b62d1d5SEnrico Granata 
10229b62d1d5SEnrico Granata void
1023de753464SJohnny Chen CommandObject::AddIDsArgumentData(CommandArgumentEntry &arg, CommandArgumentType ID, CommandArgumentType IDRange)
1024184d7a72SJohnny Chen {
1025184d7a72SJohnny Chen     CommandArgumentData id_arg;
1026184d7a72SJohnny Chen     CommandArgumentData id_range_arg;
1027184d7a72SJohnny Chen 
1028184d7a72SJohnny Chen     // Create the first variant for the first (and only) argument for this command.
1029de753464SJohnny Chen     id_arg.arg_type = ID;
1030184d7a72SJohnny Chen     id_arg.arg_repetition = eArgRepeatOptional;
1031184d7a72SJohnny Chen 
1032184d7a72SJohnny Chen     // Create the second variant for the first (and only) argument for this command.
1033de753464SJohnny Chen     id_range_arg.arg_type = IDRange;
1034184d7a72SJohnny Chen     id_range_arg.arg_repetition = eArgRepeatOptional;
1035184d7a72SJohnny Chen 
1036a3234732SJohnny Chen     // The first (and only) argument for this command could be either an id or an id_range.
1037184d7a72SJohnny Chen     // Push both variants into the entry for the first argument for this command.
1038184d7a72SJohnny Chen     arg.push_back(id_arg);
1039184d7a72SJohnny Chen     arg.push_back(id_range_arg);
1040184d7a72SJohnny Chen }
1041184d7a72SJohnny Chen 
10429d0402b1SGreg Clayton const char *
10439d0402b1SGreg Clayton CommandObject::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type)
10449d0402b1SGreg Clayton {
104548b475cbSZachary Turner     assert(arg_type < eArgTypeLastArg && "Invalid argument type passed to GetArgumentTypeAsCString");
10469d0402b1SGreg Clayton     return g_arguments_data[arg_type].arg_name;
10479d0402b1SGreg Clayton }
10489d0402b1SGreg Clayton 
10499d0402b1SGreg Clayton const char *
10509d0402b1SGreg Clayton CommandObject::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type)
10519d0402b1SGreg Clayton {
105248b475cbSZachary Turner     assert(arg_type < eArgTypeLastArg && "Invalid argument type passed to GetArgumentDescriptionAsCString");
10539d0402b1SGreg Clayton     return g_arguments_data[arg_type].help_text;
10549d0402b1SGreg Clayton }
10559d0402b1SGreg Clayton 
1056893c932aSJim Ingham Target *
1057893c932aSJim Ingham CommandObject::GetDummyTarget()
1058893c932aSJim Ingham {
1059893c932aSJim Ingham     return m_interpreter.GetDebugger().GetDummyTarget();
1060893c932aSJim Ingham }
1061893c932aSJim Ingham 
1062893c932aSJim Ingham Target *
106333df7cd3SJim Ingham CommandObject::GetSelectedOrDummyTarget(bool prefer_dummy)
1064893c932aSJim Ingham {
106533df7cd3SJim Ingham     return m_interpreter.GetDebugger().GetSelectedOrDummyTarget(prefer_dummy);
1066893c932aSJim Ingham }
1067893c932aSJim Ingham 
10685a988416SJim Ingham bool
10695a988416SJim Ingham CommandObjectParsed::Execute (const char *args_string, CommandReturnObject &result)
10705a988416SJim Ingham {
10715a988416SJim Ingham     bool handled = false;
10725a988416SJim Ingham     Args cmd_args (args_string);
10733b652621SJim Ingham     if (HasOverrideCallback())
10745a988416SJim Ingham     {
10755a988416SJim Ingham         Args full_args (GetCommandName ());
10765a988416SJim Ingham         full_args.AppendArguments(cmd_args);
10773b652621SJim Ingham         handled = InvokeOverrideCallback (full_args.GetConstArgumentVector(), result);
10785a988416SJim Ingham     }
10795a988416SJim Ingham     if (!handled)
10805a988416SJim Ingham     {
10815a988416SJim Ingham         for (size_t i = 0; i < cmd_args.GetArgumentCount();  ++i)
10825a988416SJim Ingham         {
10835a988416SJim Ingham             const char *tmp_str = cmd_args.GetArgumentAtIndex (i);
10845a988416SJim Ingham             if (tmp_str[0] == '`')  // back-quote
10855a988416SJim Ingham                 cmd_args.ReplaceArgumentAtIndex (i, m_interpreter.ProcessEmbeddedScriptCommands (tmp_str));
10865a988416SJim Ingham         }
10875a988416SJim Ingham 
1088f9fc609fSGreg Clayton         if (CheckRequirements(result))
1089f9fc609fSGreg Clayton         {
1090f9fc609fSGreg Clayton             if (ParseOptions (cmd_args, result))
1091f9fc609fSGreg Clayton             {
10925a988416SJim Ingham                 // Call the command-specific version of 'Execute', passing it the already processed arguments.
10935a988416SJim Ingham                 handled = DoExecute (cmd_args, result);
10945a988416SJim Ingham             }
1095f9fc609fSGreg Clayton         }
1096f9fc609fSGreg Clayton 
1097f9fc609fSGreg Clayton         Cleanup();
1098f9fc609fSGreg Clayton     }
10995a988416SJim Ingham     return handled;
11005a988416SJim Ingham }
11015a988416SJim Ingham 
11025a988416SJim Ingham bool
11035a988416SJim Ingham CommandObjectRaw::Execute (const char *args_string, CommandReturnObject &result)
11045a988416SJim Ingham {
11055a988416SJim Ingham     bool handled = false;
11063b652621SJim Ingham     if (HasOverrideCallback())
11075a988416SJim Ingham     {
11085a988416SJim Ingham         std::string full_command (GetCommandName ());
11095a988416SJim Ingham         full_command += ' ';
11105a988416SJim Ingham         full_command += args_string;
1111d78c9576SEd Maste         const char *argv[2] = { nullptr, nullptr };
11125a988416SJim Ingham         argv[0] = full_command.c_str();
11133b652621SJim Ingham         handled = InvokeOverrideCallback (argv, result);
11145a988416SJim Ingham     }
11155a988416SJim Ingham     if (!handled)
11165a988416SJim Ingham     {
1117f9fc609fSGreg Clayton         if (CheckRequirements(result))
11185a988416SJim Ingham             handled = DoExecute (args_string, result);
1119f9fc609fSGreg Clayton 
1120f9fc609fSGreg Clayton         Cleanup();
11215a988416SJim Ingham     }
11225a988416SJim Ingham     return handled;
11235a988416SJim Ingham }
11245a988416SJim Ingham 
1125ca7835c6SJohnny Chen static
1126ca7835c6SJohnny Chen const char *arch_helper()
1127ca7835c6SJohnny Chen {
1128d70b14eaSGreg Clayton     static StreamString g_archs_help;
1129797a1b37SJohnny Chen     if (g_archs_help.Empty())
1130d70b14eaSGreg Clayton     {
1131ca7835c6SJohnny Chen         StringList archs;
1132d78c9576SEd Maste         ArchSpec::AutoComplete(nullptr, archs);
1133d70b14eaSGreg Clayton         g_archs_help.Printf("These are the supported architecture names:\n");
1134797a1b37SJohnny Chen         archs.Join("\n", g_archs_help);
1135d70b14eaSGreg Clayton     }
1136d70b14eaSGreg Clayton     return g_archs_help.GetData();
1137ca7835c6SJohnny Chen }
1138ca7835c6SJohnny Chen 
1139e139cf23SCaroline Tice CommandObject::ArgumentTableEntry
1140e139cf23SCaroline Tice CommandObject::g_arguments_data[] =
1141e139cf23SCaroline Tice {
1142d78c9576SEd Maste     { eArgTypeAddress, "address", CommandCompletions::eNoCompletion, { nullptr, false }, "A valid address in the target program's execution space." },
1143d78c9576SEd Maste     { eArgTypeAddressOrExpression, "address-expression", CommandCompletions::eNoCompletion, { nullptr, false }, "An expression that resolves to an address." },
1144d78c9576SEd Maste     { eArgTypeAliasName, "alias-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of an abbreviation (alias) for a debugger command." },
1145d78c9576SEd 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.)" },
1146ca7835c6SJohnny Chen     { eArgTypeArchitecture, "arch", CommandCompletions::eArchitectureCompletion, { arch_helper, true }, "The architecture name, e.g. i386 or x86_64." },
1147d78c9576SEd Maste     { eArgTypeBoolean, "boolean", CommandCompletions::eNoCompletion, { nullptr, false }, "A Boolean value: 'true' or 'false'" },
1148d78c9576SEd Maste     { eArgTypeBreakpointID, "breakpt-id", CommandCompletions::eNoCompletion, { BreakpointIDHelpTextCallback, false }, nullptr },
1149d78c9576SEd Maste     { eArgTypeBreakpointIDRange, "breakpt-id-list", CommandCompletions::eNoCompletion, { BreakpointIDRangeHelpTextCallback, false }, nullptr },
11505e09c8c3SJim Ingham     { eArgTypeBreakpointName, "breakpoint-name", CommandCompletions::eNoCompletion, { BreakpointNameHelpTextCallback, false }, nullptr },
1151d78c9576SEd Maste     { eArgTypeByteSize, "byte-size", CommandCompletions::eNoCompletion, { nullptr, false }, "Number of bytes to use." },
1152d78c9576SEd Maste     { eArgTypeClassName, "class-name", CommandCompletions::eNoCompletion, { nullptr, false }, "Then name of a class from the debug information in the program." },
1153d78c9576SEd Maste     { eArgTypeCommandName, "cmd-name", CommandCompletions::eNoCompletion, { nullptr, false }, "A debugger command (may be multiple words), without any options or arguments." },
1154d78c9576SEd Maste     { eArgTypeCount, "count", CommandCompletions::eNoCompletion, { nullptr, false }, "An unsigned integer." },
1155d78c9576SEd Maste     { eArgTypeDirectoryName, "directory", CommandCompletions::eDiskDirectoryCompletion, { nullptr, false }, "A directory name." },
1156d78c9576SEd 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" },
1157d78c9576SEd Maste     { eArgTypeDescriptionVerbosity, "description-verbosity", CommandCompletions::eNoCompletion, { nullptr, false }, "How verbose the output of 'po' should be." },
1158d78c9576SEd Maste     { eArgTypeEndAddress, "end-address", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1159d78c9576SEd Maste     { eArgTypeExpression, "expr", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1160d78c9576SEd Maste     { eArgTypeExpressionPath, "expr-path", CommandCompletions::eNoCompletion, { ExprPathHelpTextCallback, true }, nullptr },
1161d78c9576SEd 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] ]" },
1162d78c9576SEd Maste     { eArgTypeFilename, "filename", CommandCompletions::eDiskFileCompletion, { nullptr, false }, "The name of a file (can include path)." },
1163d78c9576SEd Maste     { eArgTypeFormat, "format", CommandCompletions::eNoCompletion, { FormatHelpTextCallback, true }, nullptr },
1164d78c9576SEd Maste     { eArgTypeFrameIndex, "frame-index", CommandCompletions::eNoCompletion, { nullptr, false }, "Index into a thread's list of frames." },
1165d78c9576SEd Maste     { eArgTypeFullName, "fullname", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1166d78c9576SEd Maste     { eArgTypeFunctionName, "function-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a function." },
1167d78c9576SEd Maste     { eArgTypeFunctionOrSymbol, "function-or-symbol", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a function or symbol." },
1168d78c9576SEd Maste     { eArgTypeGDBFormat, "gdb-format", CommandCompletions::eNoCompletion, { GDBFormatHelpTextCallback, true }, nullptr },
1169735152e3SEnrico Granata     { eArgTypeHelpText, "help-text", CommandCompletions::eNoCompletion, { nullptr, false }, "Text to be used as help for some other entity in LLDB" },
1170d78c9576SEd Maste     { eArgTypeIndex, "index", CommandCompletions::eNoCompletion, { nullptr, false }, "An index into a list." },
1171d78c9576SEd Maste     { eArgTypeLanguage, "language", CommandCompletions::eNoCompletion, { LanguageTypeHelpTextCallback, true }, nullptr },
1172d78c9576SEd Maste     { eArgTypeLineNum, "linenum", CommandCompletions::eNoCompletion, { nullptr, false }, "Line number in a source file." },
1173d78c9576SEd 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." },
1174d78c9576SEd 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)." },
1175d78c9576SEd Maste     { eArgTypeMethod, "method", CommandCompletions::eNoCompletion, { nullptr, false }, "A C++ method name." },
1176d78c9576SEd Maste     { eArgTypeName, "name", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1177d78c9576SEd Maste     { eArgTypeNewPathPrefix, "new-path-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1178d78c9576SEd Maste     { eArgTypeNumLines, "num-lines", CommandCompletions::eNoCompletion, { nullptr, false }, "The number of lines to use." },
1179d78c9576SEd Maste     { eArgTypeNumberPerLine, "number-per-line", CommandCompletions::eNoCompletion, { nullptr, false }, "The number of items per line to display." },
1180d78c9576SEd Maste     { eArgTypeOffset, "offset", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1181d78c9576SEd Maste     { eArgTypeOldPathPrefix, "old-path-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1182d78c9576SEd Maste     { eArgTypeOneLiner, "one-line-command", CommandCompletions::eNoCompletion, { nullptr, false }, "A command that is entered as a single line of text." },
1183d78c9576SEd Maste     { eArgTypePath, "path", CommandCompletions::eDiskFileCompletion, { nullptr, false }, "Path." },
1184d78c9576SEd Maste     { eArgTypePermissionsNumber, "perms-numeric", CommandCompletions::eNoCompletion, { nullptr, false }, "Permissions given as an octal number (e.g. 755)." },
1185d78c9576SEd Maste     { eArgTypePermissionsString, "perms=string", CommandCompletions::eNoCompletion, { nullptr, false }, "Permissions given as a string value (e.g. rw-r-xr--)." },
1186d78c9576SEd Maste     { eArgTypePid, "pid", CommandCompletions::eNoCompletion, { nullptr, false }, "The process ID number." },
1187d78c9576SEd Maste     { eArgTypePlugin, "plugin", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1188d78c9576SEd Maste     { eArgTypeProcessName, "process-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of the process." },
1189d78c9576SEd Maste     { eArgTypePythonClass, "python-class", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a Python class." },
1190d78c9576SEd Maste     { eArgTypePythonFunction, "python-function", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a Python function." },
1191d78c9576SEd Maste     { eArgTypePythonScript, "python-script", CommandCompletions::eNoCompletion, { nullptr, false }, "Source code written in Python." },
1192d78c9576SEd Maste     { eArgTypeQueueName, "queue-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of the thread queue." },
1193d78c9576SEd Maste     { eArgTypeRegisterName, "register-name", CommandCompletions::eNoCompletion, { RegisterNameHelpTextCallback, true }, nullptr },
1194d78c9576SEd Maste     { eArgTypeRegularExpression, "regular-expression", CommandCompletions::eNoCompletion, { nullptr, false }, "A regular expression." },
1195d78c9576SEd Maste     { eArgTypeRunArgs, "run-args", CommandCompletions::eNoCompletion, { nullptr, false }, "Arguments to be passed to the target program when it starts executing." },
1196d78c9576SEd Maste     { eArgTypeRunMode, "run-mode", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1197d78c9576SEd Maste     { eArgTypeScriptedCommandSynchronicity, "script-cmd-synchronicity", CommandCompletions::eNoCompletion, { nullptr, false }, "The synchronicity to use to run scripted commands with regard to LLDB event system." },
1198d78c9576SEd Maste     { eArgTypeScriptLang, "script-language", CommandCompletions::eNoCompletion, { nullptr, false }, "The scripting language to be used for script-based commands.  Currently only Python is valid." },
1199d78c9576SEd Maste     { eArgTypeSearchWord, "search-word", CommandCompletions::eNoCompletion, { nullptr, false }, "The word for which you wish to search for information about." },
1200d78c9576SEd Maste     { eArgTypeSelector, "selector", CommandCompletions::eNoCompletion, { nullptr, false }, "An Objective-C selector name." },
1201d78c9576SEd 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)." },
1202d78c9576SEd 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)." },
1203d78c9576SEd Maste     { eArgTypeSettingPrefix, "setting-prefix", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a settable internal debugger variable up to a dot ('.'), e.g. 'target.process.'" },
1204d78c9576SEd 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." },
1205d78c9576SEd Maste     { eArgTypeShlibName, "shlib-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a shared library." },
1206d78c9576SEd Maste     { eArgTypeSourceFile, "source-file", CommandCompletions::eSourceFileCompletion, { nullptr, false }, "The name of a source file.." },
1207d78c9576SEd Maste     { eArgTypeSortOrder, "sort-order", CommandCompletions::eNoCompletion, { nullptr, false }, "Specify a sort order when dumping lists." },
1208d78c9576SEd Maste     { eArgTypeStartAddress, "start-address", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1209d78c9576SEd Maste     { eArgTypeSummaryString, "summary-string", CommandCompletions::eNoCompletion, { SummaryStringHelpTextCallback, true }, nullptr },
1210d78c9576SEd Maste     { eArgTypeSymbol, "symbol", CommandCompletions::eSymbolCompletion, { nullptr, false }, "Any symbol name (function name, variable, argument, etc.)" },
1211d78c9576SEd Maste     { eArgTypeThreadID, "thread-id", CommandCompletions::eNoCompletion, { nullptr, false }, "Thread ID number." },
1212d78c9576SEd Maste     { eArgTypeThreadIndex, "thread-index", CommandCompletions::eNoCompletion, { nullptr, false }, "Index into the process' list of threads." },
1213d78c9576SEd Maste     { eArgTypeThreadName, "thread-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The thread's name." },
1214a72b31c7SJim Ingham     { eArgTypeTypeName, "type-name", CommandCompletions::eNoCompletion, { nullptr, false }, "A type name." },
1215d78c9576SEd Maste     { eArgTypeUnsignedInteger, "unsigned-integer", CommandCompletions::eNoCompletion, { nullptr, false }, "An unsigned integer." },
1216d78c9576SEd Maste     { eArgTypeUnixSignal, "unix-signal", CommandCompletions::eNoCompletion, { nullptr, false }, "A valid Unix signal name or number (e.g. SIGKILL, KILL or 9)." },
1217d78c9576SEd Maste     { eArgTypeVarName, "variable-name", CommandCompletions::eNoCompletion, { nullptr, false }, "The name of a variable in your program." },
1218d78c9576SEd Maste     { eArgTypeValue, "value", CommandCompletions::eNoCompletion, { nullptr, false }, "A value could be anything, depending on where and how it is used." },
1219d78c9576SEd Maste     { eArgTypeWidth, "width", CommandCompletions::eNoCompletion, { nullptr, false }, "Help text goes here." },
1220d78c9576SEd Maste     { eArgTypeNone, "none", CommandCompletions::eNoCompletion, { nullptr, false }, "No help available for this." },
1221d78c9576SEd 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." },
1222d78c9576SEd Maste     { eArgTypeWatchpointID, "watchpt-id", CommandCompletions::eNoCompletion, { nullptr, false }, "Watchpoint IDs are positive integers." },
1223d78c9576SEd Maste     { eArgTypeWatchpointIDRange, "watchpt-id-list", CommandCompletions::eNoCompletion, { nullptr, false }, "For example, '1-3' or '1 to 3'." },
1224d78c9576SEd Maste     { eArgTypeWatchType, "watch-type", CommandCompletions::eNoCompletion, { nullptr, false }, "Specify the type for a watchpoint." }
1225e139cf23SCaroline Tice };
1226e139cf23SCaroline Tice 
1227e139cf23SCaroline Tice const CommandObject::ArgumentTableEntry*
1228e139cf23SCaroline Tice CommandObject::GetArgumentTable ()
1229e139cf23SCaroline Tice {
12309d0402b1SGreg Clayton     // If this assertion fires, then the table above is out of date with the CommandArgumentType enumeration
12319d0402b1SGreg Clayton     assert ((sizeof (CommandObject::g_arguments_data) / sizeof (CommandObject::ArgumentTableEntry)) == eArgTypeLastArg);
1232e139cf23SCaroline Tice     return CommandObject::g_arguments_data;
1233e139cf23SCaroline Tice }
1234e139cf23SCaroline Tice 
1235e139cf23SCaroline Tice 
1236