130fdc8d8SChris Lattner //===-- CommandObjectBreakpoint.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 "CommandObjectBreakpoint.h"
1130fdc8d8SChris Lattner #include "CommandObjectBreakpointCommand.h"
1230fdc8d8SChris Lattner 
1330fdc8d8SChris Lattner // C Includes
1430fdc8d8SChris Lattner // C++ Includes
1530fdc8d8SChris Lattner // Other libraries and framework includes
1630fdc8d8SChris Lattner // Project includes
1730fdc8d8SChris Lattner #include "lldb/Breakpoint/Breakpoint.h"
1830fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointIDList.h"
1930fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h"
2040af72e1SJim Ingham #include "lldb/Interpreter/Options.h"
2130fdc8d8SChris Lattner #include "lldb/Core/RegularExpression.h"
2230fdc8d8SChris Lattner #include "lldb/Core/StreamString.h"
2330fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h"
2430fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h"
2530fdc8d8SChris Lattner #include "lldb/Target/Target.h"
2630fdc8d8SChris Lattner #include "lldb/Interpreter/CommandCompletions.h"
2730fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h"
281b54c88cSJim Ingham #include "lldb/Target/Thread.h"
291b54c88cSJim Ingham #include "lldb/Target/ThreadSpec.h"
3030fdc8d8SChris Lattner 
31b7234e40SJohnny Chen #include <vector>
32b7234e40SJohnny Chen 
3330fdc8d8SChris Lattner using namespace lldb;
3430fdc8d8SChris Lattner using namespace lldb_private;
3530fdc8d8SChris Lattner 
3630fdc8d8SChris Lattner static void
3785e8b814SJim Ingham AddBreakpointDescription (Stream *s, Breakpoint *bp, lldb::DescriptionLevel level)
3830fdc8d8SChris Lattner {
3930fdc8d8SChris Lattner     s->IndentMore();
4030fdc8d8SChris Lattner     bp->GetDescription (s, level, true);
4130fdc8d8SChris Lattner     s->IndentLess();
4230fdc8d8SChris Lattner     s->EOL();
4330fdc8d8SChris Lattner }
4430fdc8d8SChris Lattner 
4530fdc8d8SChris Lattner //-------------------------------------------------------------------------
4630fdc8d8SChris Lattner // CommandObjectBreakpointSet::CommandOptions
4730fdc8d8SChris Lattner //-------------------------------------------------------------------------
48ae1c4cf5SJim Ingham #pragma mark Set::CommandOptions
4930fdc8d8SChris Lattner 
50eb0103f2SGreg Clayton CommandObjectBreakpointSet::CommandOptions::CommandOptions(CommandInterpreter &interpreter) :
51eb0103f2SGreg Clayton     Options (interpreter),
5287df91b8SJim Ingham     m_filenames (),
5330fdc8d8SChris Lattner     m_line_num (0),
5430fdc8d8SChris Lattner     m_column (0),
552856d462SGreg Clayton     m_check_inlines (true),
56fab10e89SJim Ingham     m_func_names (),
57fab10e89SJim Ingham     m_func_name_type_mask (eFunctionNameTypeNone),
5830fdc8d8SChris Lattner     m_func_regexp (),
59969795f1SJim Ingham     m_source_text_regexp(),
6030fdc8d8SChris Lattner     m_modules (),
611b54c88cSJim Ingham     m_load_addr(),
62c982c768SGreg Clayton     m_ignore_count (0),
631b54c88cSJim Ingham     m_thread_id(LLDB_INVALID_THREAD_ID),
64c982c768SGreg Clayton     m_thread_index (UINT32_MAX),
651b54c88cSJim Ingham     m_thread_name(),
66fab10e89SJim Ingham     m_queue_name(),
67fab10e89SJim Ingham     m_catch_bp (false),
68fab10e89SJim Ingham     m_throw_bp (false),
69fab10e89SJim Ingham     m_language (eLanguageTypeUnknown)
7030fdc8d8SChris Lattner {
7130fdc8d8SChris Lattner }
7230fdc8d8SChris Lattner 
7330fdc8d8SChris Lattner CommandObjectBreakpointSet::CommandOptions::~CommandOptions ()
7430fdc8d8SChris Lattner {
7530fdc8d8SChris Lattner }
7630fdc8d8SChris Lattner 
774a6ae0f0SJim Ingham #define LLDB_OPT_FILE ( LLDB_OPT_SET_1 | LLDB_OPT_SET_3 | LLDB_OPT_SET_4 | LLDB_OPT_SET_5 | LLDB_OPT_SET_6 | LLDB_OPT_SET_7 | LLDB_OPT_SET_8 | LLDB_OPT_SET_9 )
78fab10e89SJim Ingham #define LLDB_OPT_NOT_10 ( LLDB_OPT_SET_ALL & ~LLDB_OPT_SET_10 )
7987df91b8SJim Ingham 
80e0d378b3SGreg Clayton OptionDefinition
8130fdc8d8SChris Lattner CommandObjectBreakpointSet::CommandOptions::g_option_table[] =
8230fdc8d8SChris Lattner {
83fab10e89SJim Ingham     { LLDB_OPT_NOT_10, false, "shlib", 's', required_argument, NULL, CommandCompletions::eModuleCompletion, eArgTypeShlibName,
848651121cSJim Ingham         "Set the breakpoint only in this shared library (can use this option multiple times for multiple shlibs)."},
858651121cSJim Ingham 
86deaab222SCaroline Tice     { LLDB_OPT_SET_ALL, false, "ignore-count", 'i', required_argument,   NULL, 0, eArgTypeCount,
87deaab222SCaroline Tice         "Set the number of times this breakpoint is skipped before stopping." },
881b54c88cSJim Ingham 
89*a0cd2bcaSBill Wendling     { LLDB_OPT_SET_ALL, false, "thread-index", 'x', required_argument, NULL, 0, eArgTypeThreadIndex,
90ed8a705cSGreg Clayton         "The breakpoint stops only for the thread whose index matches this argument."},
911b54c88cSJim Ingham 
92*a0cd2bcaSBill Wendling     { LLDB_OPT_SET_ALL, false, "thread-id", 't', required_argument, NULL, 0, eArgTypeThreadID,
931b54c88cSJim Ingham         "The breakpoint stops only for the thread whose TID matches this argument."},
941b54c88cSJim Ingham 
95*a0cd2bcaSBill Wendling     { LLDB_OPT_SET_ALL, false, "thread-name", 'T', required_argument, NULL, 0, eArgTypeThreadName,
961b54c88cSJim Ingham         "The breakpoint stops only for the thread whose thread name matches this argument."},
971b54c88cSJim Ingham 
98*a0cd2bcaSBill Wendling     { LLDB_OPT_SET_ALL, false, "queue-name", 'q', required_argument, NULL, 0, eArgTypeQueueName,
991b54c88cSJim Ingham         "The breakpoint stops only for threads in the queue whose name is given by this argument."},
1001b54c88cSJim Ingham 
10187df91b8SJim Ingham     { LLDB_OPT_FILE, false, "file", 'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename,
10287df91b8SJim Ingham         "Specifies the source file in which to set this breakpoint."},
10330fdc8d8SChris Lattner 
104deaab222SCaroline Tice     { LLDB_OPT_SET_1, true, "line", 'l', required_argument, NULL, 0, eArgTypeLineNum,
10587df91b8SJim Ingham         "Specifies the line number on which to set this breakpoint."},
10630fdc8d8SChris Lattner 
10730fdc8d8SChris Lattner     // Comment out this option for the moment, as we don't actually use it, but will in the future.
10830fdc8d8SChris Lattner     // This way users won't see it, but the infrastructure is left in place.
10930fdc8d8SChris Lattner     //    { 0, false, "column",     'c', required_argument, NULL, "<column>",
11030fdc8d8SChris Lattner     //    "Set the breakpoint by source location at this particular column."},
11130fdc8d8SChris Lattner 
112deaab222SCaroline Tice     { LLDB_OPT_SET_2, true, "address", 'a', required_argument, NULL, 0, eArgTypeAddress,
11330fdc8d8SChris Lattner         "Set the breakpoint by address, at the specified address."},
11430fdc8d8SChris Lattner 
115deaab222SCaroline Tice     { LLDB_OPT_SET_3, true, "name", 'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, eArgTypeFunctionName,
116e02b8504SGreg Clayton         "Set the breakpoint by function name." },
11730fdc8d8SChris Lattner 
118deaab222SCaroline Tice     { LLDB_OPT_SET_4, true, "fullname", 'F', required_argument, NULL, CommandCompletions::eSymbolCompletion, eArgTypeFullName,
1192561aa61SJim Ingham         "Set the breakpoint by fully qualified function names. For C++ this means namespaces and all arguemnts, and "
1202561aa61SJim Ingham         "for Objective C this means a full function prototype with class and selector." },
1210c5cd90dSGreg Clayton 
122deaab222SCaroline Tice     { LLDB_OPT_SET_5, true, "selector", 'S', required_argument, NULL, 0, eArgTypeSelector,
1232561aa61SJim Ingham         "Set the breakpoint by ObjC selector name." },
1240c5cd90dSGreg Clayton 
125deaab222SCaroline Tice     { LLDB_OPT_SET_6, true, "method", 'M', required_argument, NULL, 0, eArgTypeMethod,
1262561aa61SJim Ingham         "Set the breakpoint by C++ method names." },
1270c5cd90dSGreg Clayton 
128deaab222SCaroline Tice     { LLDB_OPT_SET_7, true, "func-regex", 'r', required_argument, NULL, 0, eArgTypeRegularExpression,
12930fdc8d8SChris Lattner         "Set the breakpoint by function name, evaluating a regular-expression to find the function name(s)." },
13030fdc8d8SChris Lattner 
131e02b8504SGreg Clayton     { LLDB_OPT_SET_8, true, "basename", 'b', required_argument, NULL, CommandCompletions::eSymbolCompletion, eArgTypeFunctionName,
132e02b8504SGreg Clayton         "Set the breakpoint by function basename (C++ namespaces and arguments will be ignored)." },
133e02b8504SGreg Clayton 
134969795f1SJim Ingham     { LLDB_OPT_SET_9, true, "source-pattern-regexp", 'p', required_argument, NULL, 0, eArgTypeRegularExpression,
135969795f1SJim Ingham         "Set the breakpoint specifying a regular expression to match a pattern in the source text in a given source file." },
136969795f1SJim Ingham 
137fab10e89SJim Ingham     { LLDB_OPT_SET_10, true, "language-exception", 'E', required_argument, NULL, 0, eArgTypeLanguage,
138fab10e89SJim Ingham         "Set the breakpoint on exceptions thrown by the specified language (without options, on throw but not catch.)" },
139fab10e89SJim Ingham 
140fab10e89SJim Ingham     { LLDB_OPT_SET_10, false, "on-throw", 'w', required_argument, NULL, 0, eArgTypeBoolean,
141fab10e89SJim Ingham         "Set the breakpoint on exception throW." },
142fab10e89SJim Ingham 
143fab10e89SJim Ingham     { LLDB_OPT_SET_10, false, "on-catch", 'h', required_argument, NULL, 0, eArgTypeBoolean,
144fab10e89SJim Ingham         "Set the breakpoint on exception catcH." },
145969795f1SJim Ingham 
146deaab222SCaroline Tice     { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
14730fdc8d8SChris Lattner };
14830fdc8d8SChris Lattner 
149e0d378b3SGreg Clayton const OptionDefinition*
15030fdc8d8SChris Lattner CommandObjectBreakpointSet::CommandOptions::GetDefinitions ()
15130fdc8d8SChris Lattner {
15230fdc8d8SChris Lattner     return g_option_table;
15330fdc8d8SChris Lattner }
15430fdc8d8SChris Lattner 
15530fdc8d8SChris Lattner Error
156f6b8b581SGreg Clayton CommandObjectBreakpointSet::CommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
15730fdc8d8SChris Lattner {
15830fdc8d8SChris Lattner     Error error;
15930fdc8d8SChris Lattner     char short_option = (char) m_getopt_table[option_idx].val;
16030fdc8d8SChris Lattner 
16130fdc8d8SChris Lattner     switch (short_option)
16230fdc8d8SChris Lattner     {
16330fdc8d8SChris Lattner         case 'a':
1640292f4a5SJim Ingham             m_load_addr = Args::StringToUInt64(option_arg, LLDB_INVALID_ADDRESS, 0);
16530fdc8d8SChris Lattner             if (m_load_addr == LLDB_INVALID_ADDRESS)
1660292f4a5SJim Ingham                 m_load_addr = Args::StringToUInt64(option_arg, LLDB_INVALID_ADDRESS, 16);
16730fdc8d8SChris Lattner 
16830fdc8d8SChris Lattner             if (m_load_addr == LLDB_INVALID_ADDRESS)
16986edbf41SGreg Clayton                 error.SetErrorStringWithFormat ("invalid address string '%s'", option_arg);
17030fdc8d8SChris Lattner             break;
17130fdc8d8SChris Lattner 
17230fdc8d8SChris Lattner         case 'c':
17330fdc8d8SChris Lattner             m_column = Args::StringToUInt32 (option_arg, 0);
17430fdc8d8SChris Lattner             break;
1750c5cd90dSGreg Clayton 
17630fdc8d8SChris Lattner         case 'f':
17787df91b8SJim Ingham             m_filenames.AppendIfUnique (FileSpec(option_arg, false));
17830fdc8d8SChris Lattner             break;
1790c5cd90dSGreg Clayton 
18030fdc8d8SChris Lattner         case 'l':
18130fdc8d8SChris Lattner             m_line_num = Args::StringToUInt32 (option_arg, 0);
18230fdc8d8SChris Lattner             break;
1830c5cd90dSGreg Clayton 
184e02b8504SGreg Clayton         case 'b':
185fab10e89SJim Ingham             m_func_names.push_back (option_arg);
1860c5cd90dSGreg Clayton             m_func_name_type_mask |= eFunctionNameTypeBase;
1870c5cd90dSGreg Clayton             break;
1880c5cd90dSGreg Clayton 
189e02b8504SGreg Clayton         case 'n':
190fab10e89SJim Ingham             m_func_names.push_back (option_arg);
191e02b8504SGreg Clayton             m_func_name_type_mask |= eFunctionNameTypeAuto;
192e02b8504SGreg Clayton             break;
193e02b8504SGreg Clayton 
1940c5cd90dSGreg Clayton         case 'F':
195fab10e89SJim Ingham             m_func_names.push_back (option_arg);
1960c5cd90dSGreg Clayton             m_func_name_type_mask |= eFunctionNameTypeFull;
1970c5cd90dSGreg Clayton             break;
1980c5cd90dSGreg Clayton 
1990c5cd90dSGreg Clayton         case 'S':
200fab10e89SJim Ingham             m_func_names.push_back (option_arg);
2010c5cd90dSGreg Clayton             m_func_name_type_mask |= eFunctionNameTypeSelector;
2020c5cd90dSGreg Clayton             break;
2030c5cd90dSGreg Clayton 
2042561aa61SJim Ingham         case 'M':
205fab10e89SJim Ingham             m_func_names.push_back (option_arg);
2060c5cd90dSGreg Clayton             m_func_name_type_mask |= eFunctionNameTypeMethod;
2070c5cd90dSGreg Clayton             break;
2080c5cd90dSGreg Clayton 
209969795f1SJim Ingham         case 'p':
210969795f1SJim Ingham             m_source_text_regexp.assign (option_arg);
211969795f1SJim Ingham             break;
212969795f1SJim Ingham 
21330fdc8d8SChris Lattner         case 'r':
214357132ebSGreg Clayton             m_func_regexp.assign (option_arg);
21530fdc8d8SChris Lattner             break;
2160c5cd90dSGreg Clayton 
21730fdc8d8SChris Lattner         case 's':
21830fdc8d8SChris Lattner             {
21987df91b8SJim Ingham                 m_modules.AppendIfUnique (FileSpec (option_arg, false));
22030fdc8d8SChris Lattner                 break;
22130fdc8d8SChris Lattner             }
222ed8a705cSGreg Clayton         case 'i':
2231b54c88cSJim Ingham         {
2240292f4a5SJim Ingham             m_ignore_count = Args::StringToUInt32(option_arg, UINT32_MAX, 0);
225c982c768SGreg Clayton             if (m_ignore_count == UINT32_MAX)
22686edbf41SGreg Clayton                error.SetErrorStringWithFormat ("invalid ignore count '%s'", option_arg);
2271b54c88cSJim Ingham         }
228ae1c4cf5SJim Ingham         break;
2291b54c88cSJim Ingham         case 't' :
2301b54c88cSJim Ingham         {
2310292f4a5SJim Ingham             m_thread_id = Args::StringToUInt64(option_arg, LLDB_INVALID_THREAD_ID, 0);
2321b54c88cSJim Ingham             if (m_thread_id == LLDB_INVALID_THREAD_ID)
23386edbf41SGreg Clayton                error.SetErrorStringWithFormat ("invalid thread id string '%s'", option_arg);
2341b54c88cSJim Ingham         }
2351b54c88cSJim Ingham         break;
2361b54c88cSJim Ingham         case 'T':
237357132ebSGreg Clayton             m_thread_name.assign (option_arg);
2381b54c88cSJim Ingham             break;
2391b54c88cSJim Ingham         case 'q':
240357132ebSGreg Clayton             m_queue_name.assign (option_arg);
2411b54c88cSJim Ingham             break;
2421b54c88cSJim Ingham         case 'x':
2431b54c88cSJim Ingham         {
2440292f4a5SJim Ingham             m_thread_index = Args::StringToUInt32(option_arg, UINT32_MAX, 0);
245c982c768SGreg Clayton             if (m_thread_id == UINT32_MAX)
24686edbf41SGreg Clayton                error.SetErrorStringWithFormat ("invalid thread index string '%s'", option_arg);
2471b54c88cSJim Ingham 
2481b54c88cSJim Ingham         }
2491b54c88cSJim Ingham         break;
250fab10e89SJim Ingham         case 'E':
251fab10e89SJim Ingham         {
252fab10e89SJim Ingham             LanguageType language = LanguageRuntime::GetLanguageTypeFromString (option_arg);
253fab10e89SJim Ingham 
254fab10e89SJim Ingham             switch (language)
255fab10e89SJim Ingham             {
256fab10e89SJim Ingham                 case eLanguageTypeC89:
257fab10e89SJim Ingham                 case eLanguageTypeC:
258fab10e89SJim Ingham                 case eLanguageTypeC99:
259fab10e89SJim Ingham                     m_language = eLanguageTypeC;
260fab10e89SJim Ingham                     break;
261fab10e89SJim Ingham                 case eLanguageTypeC_plus_plus:
262fab10e89SJim Ingham                     m_language = eLanguageTypeC_plus_plus;
263fab10e89SJim Ingham                     break;
264fab10e89SJim Ingham                 case eLanguageTypeObjC:
265fab10e89SJim Ingham                     m_language = eLanguageTypeObjC;
266fab10e89SJim Ingham                     break;
267fab10e89SJim Ingham                 case eLanguageTypeObjC_plus_plus:
268fab10e89SJim Ingham                     error.SetErrorStringWithFormat ("Set exception breakpoints separately for c++ and objective-c");
269fab10e89SJim Ingham                     break;
270fab10e89SJim Ingham                 case eLanguageTypeUnknown:
271fab10e89SJim Ingham                     error.SetErrorStringWithFormat ("Unknown language type: '%s' for exception breakpoint", option_arg);
272fab10e89SJim Ingham                     break;
273fab10e89SJim Ingham                 default:
274fab10e89SJim Ingham                     error.SetErrorStringWithFormat ("Unsupported language type: '%s' for exception breakpoint", option_arg);
275fab10e89SJim Ingham             }
276fab10e89SJim Ingham         }
277fab10e89SJim Ingham         break;
278fab10e89SJim Ingham         case 'w':
279fab10e89SJim Ingham         {
280fab10e89SJim Ingham             bool success;
281fab10e89SJim Ingham             m_throw_bp = Args::StringToBoolean (option_arg, true, &success);
282fab10e89SJim Ingham             if (!success)
283fab10e89SJim Ingham                 error.SetErrorStringWithFormat ("Invalid boolean value for on-throw option: '%s'", option_arg);
284fab10e89SJim Ingham         }
285fab10e89SJim Ingham         break;
286fab10e89SJim Ingham         case 'h':
287fab10e89SJim Ingham         {
288fab10e89SJim Ingham             bool success;
289fab10e89SJim Ingham             m_catch_bp = Args::StringToBoolean (option_arg, true, &success);
290fab10e89SJim Ingham             if (!success)
291fab10e89SJim Ingham                 error.SetErrorStringWithFormat ("Invalid boolean value for on-catch option: '%s'", option_arg);
292fab10e89SJim Ingham         }
293fab10e89SJim Ingham         break;
29430fdc8d8SChris Lattner         default:
29586edbf41SGreg Clayton             error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
29630fdc8d8SChris Lattner             break;
29730fdc8d8SChris Lattner     }
29830fdc8d8SChris Lattner 
29930fdc8d8SChris Lattner     return error;
30030fdc8d8SChris Lattner }
30130fdc8d8SChris Lattner 
30230fdc8d8SChris Lattner void
303f6b8b581SGreg Clayton CommandObjectBreakpointSet::CommandOptions::OptionParsingStarting ()
30430fdc8d8SChris Lattner {
30587df91b8SJim Ingham     m_filenames.Clear();
30630fdc8d8SChris Lattner     m_line_num = 0;
30730fdc8d8SChris Lattner     m_column = 0;
308fab10e89SJim Ingham     m_func_names.clear();
3090c5cd90dSGreg Clayton     m_func_name_type_mask = 0;
31030fdc8d8SChris Lattner     m_func_regexp.clear();
31130fdc8d8SChris Lattner     m_load_addr = LLDB_INVALID_ADDRESS;
31287df91b8SJim Ingham     m_modules.Clear();
313c982c768SGreg Clayton     m_ignore_count = 0;
3141b54c88cSJim Ingham     m_thread_id = LLDB_INVALID_THREAD_ID;
315c982c768SGreg Clayton     m_thread_index = UINT32_MAX;
3161b54c88cSJim Ingham     m_thread_name.clear();
3171b54c88cSJim Ingham     m_queue_name.clear();
318fab10e89SJim Ingham     m_language = eLanguageTypeUnknown;
319fab10e89SJim Ingham     m_catch_bp = false;
320fab10e89SJim Ingham     m_throw_bp = true;
32130fdc8d8SChris Lattner }
32230fdc8d8SChris Lattner 
32330fdc8d8SChris Lattner //-------------------------------------------------------------------------
32430fdc8d8SChris Lattner // CommandObjectBreakpointSet
32530fdc8d8SChris Lattner //-------------------------------------------------------------------------
326ae1c4cf5SJim Ingham #pragma mark Set
32730fdc8d8SChris Lattner 
328a7015092SGreg Clayton CommandObjectBreakpointSet::CommandObjectBreakpointSet (CommandInterpreter &interpreter) :
329a7015092SGreg Clayton     CommandObject (interpreter,
330a7015092SGreg Clayton                    "breakpoint set",
331a7015092SGreg Clayton                    "Sets a breakpoint or set of breakpoints in the executable.",
332eb0103f2SGreg Clayton                    "breakpoint set <cmd-options>"),
333eb0103f2SGreg Clayton     m_options (interpreter)
33430fdc8d8SChris Lattner {
33530fdc8d8SChris Lattner }
33630fdc8d8SChris Lattner 
33730fdc8d8SChris Lattner CommandObjectBreakpointSet::~CommandObjectBreakpointSet ()
33830fdc8d8SChris Lattner {
33930fdc8d8SChris Lattner }
34030fdc8d8SChris Lattner 
34130fdc8d8SChris Lattner Options *
34230fdc8d8SChris Lattner CommandObjectBreakpointSet::GetOptions ()
34330fdc8d8SChris Lattner {
34430fdc8d8SChris Lattner     return &m_options;
34530fdc8d8SChris Lattner }
34630fdc8d8SChris Lattner 
34730fdc8d8SChris Lattner bool
34887df91b8SJim Ingham CommandObjectBreakpointSet::GetDefaultFile (Target *target, FileSpec &file, CommandReturnObject &result)
349969795f1SJim Ingham {
350969795f1SJim Ingham     uint32_t default_line;
351969795f1SJim Ingham     // First use the Source Manager's default file.
352969795f1SJim Ingham     // Then use the current stack frame's file.
353969795f1SJim Ingham     if (!target->GetSourceManager().GetDefaultFileAndLine(file, default_line))
354969795f1SJim Ingham     {
355c14ee32dSGreg Clayton         StackFrame *cur_frame = m_interpreter.GetExecutionContext().GetFramePtr();
356969795f1SJim Ingham         if (cur_frame == NULL)
357969795f1SJim Ingham         {
35887df91b8SJim Ingham             result.AppendError ("No selected frame to use to find the default file.");
359969795f1SJim Ingham             result.SetStatus (eReturnStatusFailed);
360969795f1SJim Ingham             return false;
361969795f1SJim Ingham         }
362969795f1SJim Ingham         else if (!cur_frame->HasDebugInformation())
363969795f1SJim Ingham         {
36487df91b8SJim Ingham             result.AppendError ("Cannot use the selected frame to find the default file, it has no debug info.");
365969795f1SJim Ingham             result.SetStatus (eReturnStatusFailed);
366969795f1SJim Ingham             return false;
367969795f1SJim Ingham         }
368969795f1SJim Ingham         else
369969795f1SJim Ingham         {
370969795f1SJim Ingham             const SymbolContext &sc = cur_frame->GetSymbolContext (eSymbolContextLineEntry);
371969795f1SJim Ingham             if (sc.line_entry.file)
372969795f1SJim Ingham             {
373969795f1SJim Ingham                 file = sc.line_entry.file;
374969795f1SJim Ingham             }
375969795f1SJim Ingham             else
376969795f1SJim Ingham             {
37787df91b8SJim Ingham                 result.AppendError ("Can't find the file for the selected frame to use as the default file.");
378969795f1SJim Ingham                 result.SetStatus (eReturnStatusFailed);
379969795f1SJim Ingham                 return false;
380969795f1SJim Ingham             }
381969795f1SJim Ingham         }
382969795f1SJim Ingham     }
383969795f1SJim Ingham     return true;
384969795f1SJim Ingham }
385969795f1SJim Ingham 
386969795f1SJim Ingham bool
38730fdc8d8SChris Lattner CommandObjectBreakpointSet::Execute
38830fdc8d8SChris Lattner (
38930fdc8d8SChris Lattner     Args& command,
39030fdc8d8SChris Lattner     CommandReturnObject &result
39130fdc8d8SChris Lattner )
39230fdc8d8SChris Lattner {
393a7015092SGreg Clayton     Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
39430fdc8d8SChris Lattner     if (target == NULL)
39530fdc8d8SChris Lattner     {
396effe5c95SGreg Clayton         result.AppendError ("Invalid target.  Must set target before setting breakpoints (see 'target create' command).");
39730fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
39830fdc8d8SChris Lattner         return false;
39930fdc8d8SChris Lattner     }
40030fdc8d8SChris Lattner 
40130fdc8d8SChris Lattner     // The following are the various types of breakpoints that could be set:
40230fdc8d8SChris Lattner     //   1).  -f -l -p  [-s -g]   (setting breakpoint by source location)
40330fdc8d8SChris Lattner     //   2).  -a  [-s -g]         (setting breakpoint by address)
40430fdc8d8SChris Lattner     //   3).  -n  [-s -g]         (setting breakpoint by function name)
40530fdc8d8SChris Lattner     //   4).  -r  [-s -g]         (setting breakpoint by function name regular expression)
406969795f1SJim Ingham     //   5).  -p -f               (setting a breakpoint by comparing a reg-exp to source text)
407fab10e89SJim Ingham     //   6).  -E [-w -h]          (setting a breakpoint for exceptions for a given language.)
40830fdc8d8SChris Lattner 
40930fdc8d8SChris Lattner     BreakpointSetType break_type = eSetTypeInvalid;
41030fdc8d8SChris Lattner 
41130fdc8d8SChris Lattner     if (m_options.m_line_num != 0)
41230fdc8d8SChris Lattner         break_type = eSetTypeFileAndLine;
41330fdc8d8SChris Lattner     else if (m_options.m_load_addr != LLDB_INVALID_ADDRESS)
41430fdc8d8SChris Lattner         break_type = eSetTypeAddress;
415fab10e89SJim Ingham     else if (!m_options.m_func_names.empty())
41630fdc8d8SChris Lattner         break_type = eSetTypeFunctionName;
41730fdc8d8SChris Lattner     else if  (!m_options.m_func_regexp.empty())
41830fdc8d8SChris Lattner         break_type = eSetTypeFunctionRegexp;
419969795f1SJim Ingham     else if (!m_options.m_source_text_regexp.empty())
420969795f1SJim Ingham         break_type = eSetTypeSourceRegexp;
421fab10e89SJim Ingham     else if (m_options.m_language != eLanguageTypeUnknown)
422fab10e89SJim Ingham         break_type = eSetTypeException;
42330fdc8d8SChris Lattner 
42430fdc8d8SChris Lattner     Breakpoint *bp = NULL;
425274060b6SGreg Clayton     FileSpec module_spec;
42630fdc8d8SChris Lattner     bool use_module = false;
42787df91b8SJim Ingham     int num_modules = m_options.m_modules.GetSize();
428969795f1SJim Ingham 
42930fdc8d8SChris Lattner     if ((num_modules > 0) && (break_type != eSetTypeAddress))
43030fdc8d8SChris Lattner         use_module = true;
43130fdc8d8SChris Lattner 
43230fdc8d8SChris Lattner     switch (break_type)
43330fdc8d8SChris Lattner     {
43430fdc8d8SChris Lattner         case eSetTypeFileAndLine: // Breakpoint by source position
43530fdc8d8SChris Lattner             {
43630fdc8d8SChris Lattner                 FileSpec file;
43787df91b8SJim Ingham                 uint32_t num_files = m_options.m_filenames.GetSize();
43887df91b8SJim Ingham                 if (num_files == 0)
43987df91b8SJim Ingham                 {
44087df91b8SJim Ingham                     if (!GetDefaultFile (target, file, result))
44187df91b8SJim Ingham                     {
44287df91b8SJim Ingham                         result.AppendError("No file supplied and no default file available.");
44387df91b8SJim Ingham                         result.SetStatus (eReturnStatusFailed);
44487df91b8SJim Ingham                         return false;
44587df91b8SJim Ingham                     }
44687df91b8SJim Ingham                 }
44787df91b8SJim Ingham                 else if (num_files > 1)
44887df91b8SJim Ingham                 {
44987df91b8SJim Ingham                     result.AppendError("Only one file at a time is allowed for file and line breakpoints.");
45087df91b8SJim Ingham                     result.SetStatus (eReturnStatusFailed);
45187df91b8SJim Ingham                     return false;
45287df91b8SJim Ingham                 }
45387df91b8SJim Ingham                 else
45487df91b8SJim Ingham                     file = m_options.m_filenames.GetFileSpecAtIndex(0);
45530fdc8d8SChris Lattner 
45687df91b8SJim Ingham                 bp = target->CreateBreakpoint (&(m_options.m_modules),
45730fdc8d8SChris Lattner                                                file,
45830fdc8d8SChris Lattner                                                m_options.m_line_num,
4592856d462SGreg Clayton                                                m_options.m_check_inlines).get();
46030fdc8d8SChris Lattner             }
46130fdc8d8SChris Lattner             break;
4626eee5aa0SGreg Clayton 
46330fdc8d8SChris Lattner         case eSetTypeAddress: // Breakpoint by address
46430fdc8d8SChris Lattner             bp = target->CreateBreakpoint (m_options.m_load_addr, false).get();
46530fdc8d8SChris Lattner             break;
4660c5cd90dSGreg Clayton 
46730fdc8d8SChris Lattner         case eSetTypeFunctionName: // Breakpoint by function name
4680c5cd90dSGreg Clayton             {
4690c5cd90dSGreg Clayton                 uint32_t name_type_mask = m_options.m_func_name_type_mask;
4700c5cd90dSGreg Clayton 
4710c5cd90dSGreg Clayton                 if (name_type_mask == 0)
472e02b8504SGreg Clayton                     name_type_mask = eFunctionNameTypeAuto;
4730c5cd90dSGreg Clayton 
47487df91b8SJim Ingham                 bp = target->CreateBreakpoint (&(m_options.m_modules),
47587df91b8SJim Ingham                                                &(m_options.m_filenames),
476fab10e89SJim Ingham                                                m_options.m_func_names,
477274060b6SGreg Clayton                                                name_type_mask,
478274060b6SGreg Clayton                                                Breakpoint::Exact).get();
4790c5cd90dSGreg Clayton             }
48030fdc8d8SChris Lattner             break;
4810c5cd90dSGreg Clayton 
48230fdc8d8SChris Lattner         case eSetTypeFunctionRegexp: // Breakpoint by regular expression function name
48330fdc8d8SChris Lattner             {
48430fdc8d8SChris Lattner                 RegularExpression regexp(m_options.m_func_regexp.c_str());
485969795f1SJim Ingham                 if (!regexp.IsValid())
48630fdc8d8SChris Lattner                 {
487969795f1SJim Ingham                     char err_str[1024];
488969795f1SJim Ingham                     regexp.GetErrorAsCString(err_str, sizeof(err_str));
489969795f1SJim Ingham                     result.AppendErrorWithFormat("Function name regular expression could not be compiled: \"%s\"",
490969795f1SJim Ingham                                                  err_str);
49130fdc8d8SChris Lattner                     result.SetStatus (eReturnStatusFailed);
492969795f1SJim Ingham                     return false;
49330fdc8d8SChris Lattner                 }
49487df91b8SJim Ingham 
49587df91b8SJim Ingham                 bp = target->CreateFuncRegexBreakpoint (&(m_options.m_modules), &(m_options.m_filenames), regexp).get();
49630fdc8d8SChris Lattner             }
49730fdc8d8SChris Lattner             break;
498969795f1SJim Ingham         case eSetTypeSourceRegexp: // Breakpoint by regexp on source text.
499969795f1SJim Ingham             {
50087df91b8SJim Ingham                 int num_files = m_options.m_filenames.GetSize();
50187df91b8SJim Ingham 
50287df91b8SJim Ingham                 if (num_files == 0)
50387df91b8SJim Ingham                 {
504969795f1SJim Ingham                     FileSpec file;
50587df91b8SJim Ingham                     if (!GetDefaultFile (target, file, result))
50687df91b8SJim Ingham                     {
50787df91b8SJim Ingham                         result.AppendError ("No files provided and could not find default file.");
50887df91b8SJim Ingham                         result.SetStatus (eReturnStatusFailed);
50987df91b8SJim Ingham                         return false;
51087df91b8SJim Ingham                     }
51187df91b8SJim Ingham                     else
51287df91b8SJim Ingham                     {
51387df91b8SJim Ingham                         m_options.m_filenames.Append (file);
51487df91b8SJim Ingham                     }
51587df91b8SJim Ingham                 }
5160c5cd90dSGreg Clayton 
517969795f1SJim Ingham                 RegularExpression regexp(m_options.m_source_text_regexp.c_str());
518969795f1SJim Ingham                 if (!regexp.IsValid())
519969795f1SJim Ingham                 {
520969795f1SJim Ingham                     char err_str[1024];
521969795f1SJim Ingham                     regexp.GetErrorAsCString(err_str, sizeof(err_str));
522969795f1SJim Ingham                     result.AppendErrorWithFormat("Source text regular expression could not be compiled: \"%s\"",
523969795f1SJim Ingham                                                  err_str);
524969795f1SJim Ingham                     result.SetStatus (eReturnStatusFailed);
525969795f1SJim Ingham                     return false;
526969795f1SJim Ingham                 }
52787df91b8SJim Ingham                 bp = target->CreateSourceRegexBreakpoint (&(m_options.m_modules), &(m_options.m_filenames), regexp).get();
528969795f1SJim Ingham             }
529969795f1SJim Ingham             break;
530fab10e89SJim Ingham         case eSetTypeException:
531fab10e89SJim Ingham             {
532fab10e89SJim Ingham                 bp = target->CreateExceptionBreakpoint (m_options.m_language, m_options.m_catch_bp, m_options.m_throw_bp).get();
533fab10e89SJim Ingham             }
534fab10e89SJim Ingham             break;
53530fdc8d8SChris Lattner         default:
53630fdc8d8SChris Lattner             break;
53730fdc8d8SChris Lattner     }
53830fdc8d8SChris Lattner 
5391b54c88cSJim Ingham     // Now set the various options that were passed in:
5401b54c88cSJim Ingham     if (bp)
5411b54c88cSJim Ingham     {
5421b54c88cSJim Ingham         if (m_options.m_thread_id != LLDB_INVALID_THREAD_ID)
5431b54c88cSJim Ingham             bp->SetThreadID (m_options.m_thread_id);
5441b54c88cSJim Ingham 
545c982c768SGreg Clayton         if (m_options.m_thread_index != UINT32_MAX)
5461b54c88cSJim Ingham             bp->GetOptions()->GetThreadSpec()->SetIndex(m_options.m_thread_index);
5471b54c88cSJim Ingham 
5481b54c88cSJim Ingham         if (!m_options.m_thread_name.empty())
5491b54c88cSJim Ingham             bp->GetOptions()->GetThreadSpec()->SetName(m_options.m_thread_name.c_str());
5501b54c88cSJim Ingham 
5511b54c88cSJim Ingham         if (!m_options.m_queue_name.empty())
5521b54c88cSJim Ingham             bp->GetOptions()->GetThreadSpec()->SetQueueName(m_options.m_queue_name.c_str());
5531b54c88cSJim Ingham 
554c982c768SGreg Clayton         if (m_options.m_ignore_count != 0)
5551b54c88cSJim Ingham             bp->GetOptions()->SetIgnoreCount(m_options.m_ignore_count);
5561b54c88cSJim Ingham     }
5571b54c88cSJim Ingham 
558969795f1SJim Ingham     if (bp)
55930fdc8d8SChris Lattner     {
56085e8b814SJim Ingham         Stream &output_stream = result.GetOutputStream();
56130fdc8d8SChris Lattner         output_stream.Printf ("Breakpoint created: ");
56230fdc8d8SChris Lattner         bp->GetDescription(&output_stream, lldb::eDescriptionLevelBrief);
56330fdc8d8SChris Lattner         output_stream.EOL();
564fab10e89SJim Ingham         // Don't print out this warning for exception breakpoints.  They can get set before the target
565fab10e89SJim Ingham         // is set, but we won't know how to actually set the breakpoint till we run.
566fab10e89SJim Ingham         if (bp->GetNumLocations() == 0 && break_type != eSetTypeException)
567be484f41SCaroline Tice             output_stream.Printf ("WARNING:  Unable to resolve breakpoint to any actual locations.\n");
56830fdc8d8SChris Lattner         result.SetStatus (eReturnStatusSuccessFinishResult);
56930fdc8d8SChris Lattner     }
57030fdc8d8SChris Lattner     else if (!bp)
57130fdc8d8SChris Lattner     {
57230fdc8d8SChris Lattner         result.AppendError ("Breakpoint creation failed: No breakpoint created.");
57330fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
57430fdc8d8SChris Lattner     }
57530fdc8d8SChris Lattner 
57630fdc8d8SChris Lattner     return result.Succeeded();
57730fdc8d8SChris Lattner }
57830fdc8d8SChris Lattner 
57930fdc8d8SChris Lattner //-------------------------------------------------------------------------
58030fdc8d8SChris Lattner // CommandObjectMultiwordBreakpoint
58130fdc8d8SChris Lattner //-------------------------------------------------------------------------
582ae1c4cf5SJim Ingham #pragma mark MultiwordBreakpoint
58330fdc8d8SChris Lattner 
5846611103cSGreg Clayton CommandObjectMultiwordBreakpoint::CommandObjectMultiwordBreakpoint (CommandInterpreter &interpreter) :
585a7015092SGreg Clayton     CommandObjectMultiword (interpreter,
586a7015092SGreg Clayton                             "breakpoint",
58746fbc60fSJim Ingham                             "A set of commands for operating on breakpoints. Also see _regexp-break.",
58830fdc8d8SChris Lattner                             "breakpoint <command> [<command-options>]")
58930fdc8d8SChris Lattner {
59030fdc8d8SChris Lattner     bool status;
59130fdc8d8SChris Lattner 
592a7015092SGreg Clayton     CommandObjectSP list_command_object (new CommandObjectBreakpointList (interpreter));
593a7015092SGreg Clayton     CommandObjectSP enable_command_object (new CommandObjectBreakpointEnable (interpreter));
594a7015092SGreg Clayton     CommandObjectSP disable_command_object (new CommandObjectBreakpointDisable (interpreter));
595b7234e40SJohnny Chen     CommandObjectSP clear_command_object (new CommandObjectBreakpointClear (interpreter));
596b7234e40SJohnny Chen     CommandObjectSP delete_command_object (new CommandObjectBreakpointDelete (interpreter));
597a7015092SGreg Clayton     CommandObjectSP set_command_object (new CommandObjectBreakpointSet (interpreter));
59830fdc8d8SChris Lattner     CommandObjectSP command_command_object (new CommandObjectBreakpointCommand (interpreter));
599a7015092SGreg Clayton     CommandObjectSP modify_command_object (new CommandObjectBreakpointModify(interpreter));
60030fdc8d8SChris Lattner 
601b7234e40SJohnny Chen     list_command_object->SetCommandName ("breakpoint list");
60230fdc8d8SChris Lattner     enable_command_object->SetCommandName("breakpoint enable");
60330fdc8d8SChris Lattner     disable_command_object->SetCommandName("breakpoint disable");
604b7234e40SJohnny Chen     clear_command_object->SetCommandName("breakpoint clear");
605b7234e40SJohnny Chen     delete_command_object->SetCommandName("breakpoint delete");
606ae1c4cf5SJim Ingham     set_command_object->SetCommandName("breakpoint set");
607b7234e40SJohnny Chen     command_command_object->SetCommandName ("breakpoint command");
608b7234e40SJohnny Chen     modify_command_object->SetCommandName ("breakpoint modify");
60930fdc8d8SChris Lattner 
610a7015092SGreg Clayton     status = LoadSubCommand ("list",       list_command_object);
611a7015092SGreg Clayton     status = LoadSubCommand ("enable",     enable_command_object);
612a7015092SGreg Clayton     status = LoadSubCommand ("disable",    disable_command_object);
613b7234e40SJohnny Chen     status = LoadSubCommand ("clear",      clear_command_object);
614a7015092SGreg Clayton     status = LoadSubCommand ("delete",     delete_command_object);
615a7015092SGreg Clayton     status = LoadSubCommand ("set",        set_command_object);
616a7015092SGreg Clayton     status = LoadSubCommand ("command",    command_command_object);
617a7015092SGreg Clayton     status = LoadSubCommand ("modify",     modify_command_object);
61830fdc8d8SChris Lattner }
61930fdc8d8SChris Lattner 
62030fdc8d8SChris Lattner CommandObjectMultiwordBreakpoint::~CommandObjectMultiwordBreakpoint ()
62130fdc8d8SChris Lattner {
62230fdc8d8SChris Lattner }
62330fdc8d8SChris Lattner 
62430fdc8d8SChris Lattner void
62530fdc8d8SChris Lattner CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (Args &args, Target *target, CommandReturnObject &result,
62630fdc8d8SChris Lattner                                                          BreakpointIDList *valid_ids)
62730fdc8d8SChris Lattner {
62830fdc8d8SChris Lattner     // args can be strings representing 1). integers (for breakpoint ids)
62930fdc8d8SChris Lattner     //                                  2). the full breakpoint & location canonical representation
63030fdc8d8SChris Lattner     //                                  3). the word "to" or a hyphen, representing a range (in which case there
63130fdc8d8SChris Lattner     //                                      had *better* be an entry both before & after of one of the first two types.
63236f3b369SJim Ingham     // If args is empty, we will use the last created breakpoint (if there is one.)
63330fdc8d8SChris Lattner 
63430fdc8d8SChris Lattner     Args temp_args;
63530fdc8d8SChris Lattner 
63636f3b369SJim Ingham     if (args.GetArgumentCount() == 0)
63736f3b369SJim Ingham     {
6384d122c40SGreg Clayton         if (target->GetLastCreatedBreakpoint())
63936f3b369SJim Ingham         {
64036f3b369SJim Ingham             valid_ids->AddBreakpointID (BreakpointID(target->GetLastCreatedBreakpoint()->GetID(), LLDB_INVALID_BREAK_ID));
64136f3b369SJim Ingham             result.SetStatus (eReturnStatusSuccessFinishNoResult);
64236f3b369SJim Ingham         }
64336f3b369SJim Ingham         else
64436f3b369SJim Ingham         {
64536f3b369SJim Ingham             result.AppendError("No breakpoint specified and no last created breakpoint.");
64636f3b369SJim Ingham             result.SetStatus (eReturnStatusFailed);
64736f3b369SJim Ingham         }
64836f3b369SJim Ingham         return;
64936f3b369SJim Ingham     }
65036f3b369SJim Ingham 
65130fdc8d8SChris Lattner     // Create a new Args variable to use; copy any non-breakpoint-id-ranges stuff directly from the old ARGS to
65230fdc8d8SChris Lattner     // the new TEMP_ARGS.  Do not copy breakpoint id range strings over; instead generate a list of strings for
65330fdc8d8SChris Lattner     // all the breakpoint ids in the range, and shove all of those breakpoint id strings into TEMP_ARGS.
65430fdc8d8SChris Lattner 
65530fdc8d8SChris Lattner     BreakpointIDList::FindAndReplaceIDRanges (args, target, result, temp_args);
65630fdc8d8SChris Lattner 
65730fdc8d8SChris Lattner     // NOW, convert the list of breakpoint id strings in TEMP_ARGS into an actual BreakpointIDList:
65830fdc8d8SChris Lattner 
659c982c768SGreg Clayton     valid_ids->InsertStringArray (temp_args.GetConstArgumentVector(), temp_args.GetArgumentCount(), result);
66030fdc8d8SChris Lattner 
66130fdc8d8SChris Lattner     // At this point,  all of the breakpoint ids that the user passed in have been converted to breakpoint IDs
66230fdc8d8SChris Lattner     // and put into valid_ids.
66330fdc8d8SChris Lattner 
66430fdc8d8SChris Lattner     if (result.Succeeded())
66530fdc8d8SChris Lattner     {
66630fdc8d8SChris Lattner         // Now that we've converted everything from args into a list of breakpoint ids, go through our tentative list
66730fdc8d8SChris Lattner         // of breakpoint id's and verify that they correspond to valid/currently set breakpoints.
66830fdc8d8SChris Lattner 
669c982c768SGreg Clayton         const size_t count = valid_ids->GetSize();
670c982c768SGreg Clayton         for (size_t i = 0; i < count; ++i)
67130fdc8d8SChris Lattner         {
67230fdc8d8SChris Lattner             BreakpointID cur_bp_id = valid_ids->GetBreakpointIDAtIndex (i);
67330fdc8d8SChris Lattner             Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
67430fdc8d8SChris Lattner             if (breakpoint != NULL)
67530fdc8d8SChris Lattner             {
67630fdc8d8SChris Lattner                 int num_locations = breakpoint->GetNumLocations();
67730fdc8d8SChris Lattner                 if (cur_bp_id.GetLocationID() > num_locations)
67830fdc8d8SChris Lattner                 {
67930fdc8d8SChris Lattner                     StreamString id_str;
680c982c768SGreg Clayton                     BreakpointID::GetCanonicalReference (&id_str,
681c982c768SGreg Clayton                                                          cur_bp_id.GetBreakpointID(),
68230fdc8d8SChris Lattner                                                          cur_bp_id.GetLocationID());
683c982c768SGreg Clayton                     i = valid_ids->GetSize() + 1;
68430fdc8d8SChris Lattner                     result.AppendErrorWithFormat ("'%s' is not a currently valid breakpoint/location id.\n",
68530fdc8d8SChris Lattner                                                  id_str.GetData());
68630fdc8d8SChris Lattner                     result.SetStatus (eReturnStatusFailed);
68730fdc8d8SChris Lattner                 }
68830fdc8d8SChris Lattner             }
68930fdc8d8SChris Lattner             else
69030fdc8d8SChris Lattner             {
691c982c768SGreg Clayton                 i = valid_ids->GetSize() + 1;
69230fdc8d8SChris Lattner                 result.AppendErrorWithFormat ("'%d' is not a currently valid breakpoint id.\n", cur_bp_id.GetBreakpointID());
69330fdc8d8SChris Lattner                 result.SetStatus (eReturnStatusFailed);
69430fdc8d8SChris Lattner             }
69530fdc8d8SChris Lattner         }
69630fdc8d8SChris Lattner     }
69730fdc8d8SChris Lattner }
69830fdc8d8SChris Lattner 
69930fdc8d8SChris Lattner //-------------------------------------------------------------------------
70030fdc8d8SChris Lattner // CommandObjectBreakpointList::Options
70130fdc8d8SChris Lattner //-------------------------------------------------------------------------
702ae1c4cf5SJim Ingham #pragma mark List::CommandOptions
70330fdc8d8SChris Lattner 
704eb0103f2SGreg Clayton CommandObjectBreakpointList::CommandOptions::CommandOptions(CommandInterpreter &interpreter) :
705eb0103f2SGreg Clayton     Options (interpreter),
70679042b3eSCaroline Tice     m_level (lldb::eDescriptionLevelBrief)  // Breakpoint List defaults to brief descriptions
70730fdc8d8SChris Lattner {
70830fdc8d8SChris Lattner }
70930fdc8d8SChris Lattner 
71030fdc8d8SChris Lattner CommandObjectBreakpointList::CommandOptions::~CommandOptions ()
71130fdc8d8SChris Lattner {
71230fdc8d8SChris Lattner }
71330fdc8d8SChris Lattner 
714e0d378b3SGreg Clayton OptionDefinition
71530fdc8d8SChris Lattner CommandObjectBreakpointList::CommandOptions::g_option_table[] =
71630fdc8d8SChris Lattner {
717deaab222SCaroline Tice     { LLDB_OPT_SET_ALL, false, "internal", 'i', no_argument, NULL, 0, eArgTypeNone,
7188651121cSJim Ingham         "Show debugger internal breakpoints" },
7198651121cSJim Ingham 
720deaab222SCaroline Tice     { LLDB_OPT_SET_1, false, "brief",    'b', no_argument, NULL, 0, eArgTypeNone,
72130fdc8d8SChris Lattner         "Give a brief description of the breakpoint (no location info)."},
72230fdc8d8SChris Lattner 
72330fdc8d8SChris Lattner     // FIXME: We need to add an "internal" command, and then add this sort of thing to it.
72430fdc8d8SChris Lattner     // But I need to see it for now, and don't want to wait.
725deaab222SCaroline Tice     { LLDB_OPT_SET_2, false, "full",    'f', no_argument, NULL, 0, eArgTypeNone,
72630fdc8d8SChris Lattner         "Give a full description of the breakpoint and its locations."},
72730fdc8d8SChris Lattner 
728deaab222SCaroline Tice     { LLDB_OPT_SET_3, false, "verbose", 'v', no_argument, NULL, 0, eArgTypeNone,
72930fdc8d8SChris Lattner         "Explain everything we know about the breakpoint (for debugging debugger bugs)." },
73030fdc8d8SChris Lattner 
731deaab222SCaroline Tice     { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
73230fdc8d8SChris Lattner };
73330fdc8d8SChris Lattner 
734e0d378b3SGreg Clayton const OptionDefinition*
73530fdc8d8SChris Lattner CommandObjectBreakpointList::CommandOptions::GetDefinitions ()
73630fdc8d8SChris Lattner {
73730fdc8d8SChris Lattner     return g_option_table;
73830fdc8d8SChris Lattner }
73930fdc8d8SChris Lattner 
74030fdc8d8SChris Lattner Error
741f6b8b581SGreg Clayton CommandObjectBreakpointList::CommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
74230fdc8d8SChris Lattner {
74330fdc8d8SChris Lattner     Error error;
74430fdc8d8SChris Lattner     char short_option = (char) m_getopt_table[option_idx].val;
74530fdc8d8SChris Lattner 
74630fdc8d8SChris Lattner     switch (short_option)
74730fdc8d8SChris Lattner     {
74830fdc8d8SChris Lattner         case 'b':
74930fdc8d8SChris Lattner             m_level = lldb::eDescriptionLevelBrief;
75030fdc8d8SChris Lattner             break;
75130fdc8d8SChris Lattner         case 'f':
75230fdc8d8SChris Lattner             m_level = lldb::eDescriptionLevelFull;
75330fdc8d8SChris Lattner             break;
75430fdc8d8SChris Lattner         case 'v':
75530fdc8d8SChris Lattner             m_level = lldb::eDescriptionLevelVerbose;
75630fdc8d8SChris Lattner             break;
75730fdc8d8SChris Lattner         case 'i':
75830fdc8d8SChris Lattner             m_internal = true;
75930fdc8d8SChris Lattner             break;
76030fdc8d8SChris Lattner         default:
76186edbf41SGreg Clayton             error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
76230fdc8d8SChris Lattner             break;
76330fdc8d8SChris Lattner     }
76430fdc8d8SChris Lattner 
76530fdc8d8SChris Lattner     return error;
76630fdc8d8SChris Lattner }
76730fdc8d8SChris Lattner 
76830fdc8d8SChris Lattner void
769f6b8b581SGreg Clayton CommandObjectBreakpointList::CommandOptions::OptionParsingStarting ()
77030fdc8d8SChris Lattner {
771d915e16fSJim Ingham     m_level = lldb::eDescriptionLevelFull;
77230fdc8d8SChris Lattner     m_internal = false;
77330fdc8d8SChris Lattner }
77430fdc8d8SChris Lattner 
77530fdc8d8SChris Lattner //-------------------------------------------------------------------------
77630fdc8d8SChris Lattner // CommandObjectBreakpointList
77730fdc8d8SChris Lattner //-------------------------------------------------------------------------
778ae1c4cf5SJim Ingham #pragma mark List
77930fdc8d8SChris Lattner 
780a7015092SGreg Clayton CommandObjectBreakpointList::CommandObjectBreakpointList (CommandInterpreter &interpreter) :
781a7015092SGreg Clayton     CommandObject (interpreter,
782a7015092SGreg Clayton                    "breakpoint list",
78330fdc8d8SChris Lattner                    "List some or all breakpoints at configurable levels of detail.",
784eb0103f2SGreg Clayton                    NULL),
785eb0103f2SGreg Clayton     m_options (interpreter)
78630fdc8d8SChris Lattner {
787e139cf23SCaroline Tice     CommandArgumentEntry arg;
788e139cf23SCaroline Tice     CommandArgumentData bp_id_arg;
789e139cf23SCaroline Tice 
790e139cf23SCaroline Tice     // Define the first (and only) variant of this arg.
791e139cf23SCaroline Tice     bp_id_arg.arg_type = eArgTypeBreakpointID;
792405fe67fSCaroline Tice     bp_id_arg.arg_repetition = eArgRepeatOptional;
793e139cf23SCaroline Tice 
794e139cf23SCaroline Tice     // There is only one variant this argument could be; put it into the argument entry.
795e139cf23SCaroline Tice     arg.push_back (bp_id_arg);
796e139cf23SCaroline Tice 
797e139cf23SCaroline Tice     // Push the data for the first argument into the m_arguments vector.
798e139cf23SCaroline Tice     m_arguments.push_back (arg);
79930fdc8d8SChris Lattner }
80030fdc8d8SChris Lattner 
80130fdc8d8SChris Lattner CommandObjectBreakpointList::~CommandObjectBreakpointList ()
80230fdc8d8SChris Lattner {
80330fdc8d8SChris Lattner }
80430fdc8d8SChris Lattner 
80530fdc8d8SChris Lattner Options *
80630fdc8d8SChris Lattner CommandObjectBreakpointList::GetOptions ()
80730fdc8d8SChris Lattner {
80830fdc8d8SChris Lattner     return &m_options;
80930fdc8d8SChris Lattner }
81030fdc8d8SChris Lattner 
81130fdc8d8SChris Lattner bool
81230fdc8d8SChris Lattner CommandObjectBreakpointList::Execute
81330fdc8d8SChris Lattner (
81430fdc8d8SChris Lattner     Args& args,
81530fdc8d8SChris Lattner     CommandReturnObject &result
81630fdc8d8SChris Lattner )
81730fdc8d8SChris Lattner {
818a7015092SGreg Clayton     Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
81930fdc8d8SChris Lattner     if (target == NULL)
82030fdc8d8SChris Lattner     {
8219068d794SCaroline Tice         result.AppendError ("Invalid target. No current target or breakpoints.");
82230fdc8d8SChris Lattner         result.SetStatus (eReturnStatusSuccessFinishNoResult);
82330fdc8d8SChris Lattner         return true;
82430fdc8d8SChris Lattner     }
82530fdc8d8SChris Lattner 
82630fdc8d8SChris Lattner     const BreakpointList &breakpoints = target->GetBreakpointList(m_options.m_internal);
8271b54c88cSJim Ingham     Mutex::Locker locker;
8281b54c88cSJim Ingham     target->GetBreakpointList(m_options.m_internal).GetListMutex(locker);
8291b54c88cSJim Ingham 
83030fdc8d8SChris Lattner     size_t num_breakpoints = breakpoints.GetSize();
83130fdc8d8SChris Lattner 
83230fdc8d8SChris Lattner     if (num_breakpoints == 0)
83330fdc8d8SChris Lattner     {
83430fdc8d8SChris Lattner         result.AppendMessage ("No breakpoints currently set.");
83530fdc8d8SChris Lattner         result.SetStatus (eReturnStatusSuccessFinishNoResult);
83630fdc8d8SChris Lattner         return true;
83730fdc8d8SChris Lattner     }
83830fdc8d8SChris Lattner 
83985e8b814SJim Ingham     Stream &output_stream = result.GetOutputStream();
84030fdc8d8SChris Lattner 
84130fdc8d8SChris Lattner     if (args.GetArgumentCount() == 0)
84230fdc8d8SChris Lattner     {
84330fdc8d8SChris Lattner         // No breakpoint selected; show info about all currently set breakpoints.
84430fdc8d8SChris Lattner         result.AppendMessage ("Current breakpoints:");
845c982c768SGreg Clayton         for (size_t i = 0; i < num_breakpoints; ++i)
84630fdc8d8SChris Lattner         {
8479fed0d85SGreg Clayton             Breakpoint *breakpoint = breakpoints.GetBreakpointAtIndex (i).get();
8486611103cSGreg Clayton             AddBreakpointDescription (&output_stream, breakpoint, m_options.m_level);
84930fdc8d8SChris Lattner         }
85030fdc8d8SChris Lattner         result.SetStatus (eReturnStatusSuccessFinishNoResult);
85130fdc8d8SChris Lattner     }
85230fdc8d8SChris Lattner     else
85330fdc8d8SChris Lattner     {
85430fdc8d8SChris Lattner         // Particular breakpoints selected; show info about that breakpoint.
85530fdc8d8SChris Lattner         BreakpointIDList valid_bp_ids;
85630fdc8d8SChris Lattner         CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (args, target, result, &valid_bp_ids);
85730fdc8d8SChris Lattner 
85830fdc8d8SChris Lattner         if (result.Succeeded())
85930fdc8d8SChris Lattner         {
860c982c768SGreg Clayton             for (size_t i = 0; i < valid_bp_ids.GetSize(); ++i)
86130fdc8d8SChris Lattner             {
86230fdc8d8SChris Lattner                 BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
86330fdc8d8SChris Lattner                 Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
8646611103cSGreg Clayton                 AddBreakpointDescription (&output_stream, breakpoint, m_options.m_level);
86530fdc8d8SChris Lattner             }
86630fdc8d8SChris Lattner             result.SetStatus (eReturnStatusSuccessFinishNoResult);
86730fdc8d8SChris Lattner         }
86830fdc8d8SChris Lattner         else
86930fdc8d8SChris Lattner         {
87030fdc8d8SChris Lattner             result.AppendError ("Invalid breakpoint id.");
87130fdc8d8SChris Lattner             result.SetStatus (eReturnStatusFailed);
87230fdc8d8SChris Lattner         }
87330fdc8d8SChris Lattner     }
87430fdc8d8SChris Lattner 
87530fdc8d8SChris Lattner     return result.Succeeded();
87630fdc8d8SChris Lattner }
87730fdc8d8SChris Lattner 
87830fdc8d8SChris Lattner //-------------------------------------------------------------------------
87930fdc8d8SChris Lattner // CommandObjectBreakpointEnable
88030fdc8d8SChris Lattner //-------------------------------------------------------------------------
881ae1c4cf5SJim Ingham #pragma mark Enable
88230fdc8d8SChris Lattner 
883a7015092SGreg Clayton CommandObjectBreakpointEnable::CommandObjectBreakpointEnable (CommandInterpreter &interpreter) :
884a7015092SGreg Clayton     CommandObject (interpreter,
885a7015092SGreg Clayton                    "enable",
886e3d26315SCaroline Tice                    "Enable the specified disabled breakpoint(s). If no breakpoints are specified, enable all of them.",
887e139cf23SCaroline Tice                    NULL)
88830fdc8d8SChris Lattner {
889e139cf23SCaroline Tice     CommandArgumentEntry arg;
890de753464SJohnny Chen     CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange);
891e139cf23SCaroline Tice     // Add the entry for the first argument for this command to the object's arguments vector.
892e139cf23SCaroline Tice     m_arguments.push_back (arg);
89330fdc8d8SChris Lattner }
89430fdc8d8SChris Lattner 
89530fdc8d8SChris Lattner 
89630fdc8d8SChris Lattner CommandObjectBreakpointEnable::~CommandObjectBreakpointEnable ()
89730fdc8d8SChris Lattner {
89830fdc8d8SChris Lattner }
89930fdc8d8SChris Lattner 
90030fdc8d8SChris Lattner 
90130fdc8d8SChris Lattner bool
9026611103cSGreg Clayton CommandObjectBreakpointEnable::Execute
9036611103cSGreg Clayton (
9046611103cSGreg Clayton     Args& args,
9056611103cSGreg Clayton     CommandReturnObject &result
9066611103cSGreg Clayton )
90730fdc8d8SChris Lattner {
908a7015092SGreg Clayton     Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
90930fdc8d8SChris Lattner     if (target == NULL)
91030fdc8d8SChris Lattner     {
9119068d794SCaroline Tice         result.AppendError ("Invalid target.  No existing target or breakpoints.");
91230fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
91330fdc8d8SChris Lattner         return false;
91430fdc8d8SChris Lattner     }
91530fdc8d8SChris Lattner 
9161b54c88cSJim Ingham     Mutex::Locker locker;
9171b54c88cSJim Ingham     target->GetBreakpointList().GetListMutex(locker);
9181b54c88cSJim Ingham 
91930fdc8d8SChris Lattner     const BreakpointList &breakpoints = target->GetBreakpointList();
9201b54c88cSJim Ingham 
92130fdc8d8SChris Lattner     size_t num_breakpoints = breakpoints.GetSize();
92230fdc8d8SChris Lattner 
92330fdc8d8SChris Lattner     if (num_breakpoints == 0)
92430fdc8d8SChris Lattner     {
92530fdc8d8SChris Lattner         result.AppendError ("No breakpoints exist to be enabled.");
92630fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
92730fdc8d8SChris Lattner         return false;
92830fdc8d8SChris Lattner     }
92930fdc8d8SChris Lattner 
93030fdc8d8SChris Lattner     if (args.GetArgumentCount() == 0)
93130fdc8d8SChris Lattner     {
93230fdc8d8SChris Lattner         // No breakpoint selected; enable all currently set breakpoints.
93330fdc8d8SChris Lattner         target->EnableAllBreakpoints ();
934fd54b368SJason Molenda         result.AppendMessageWithFormat ("All breakpoints enabled. (%lu breakpoints)\n", num_breakpoints);
93530fdc8d8SChris Lattner         result.SetStatus (eReturnStatusSuccessFinishNoResult);
93630fdc8d8SChris Lattner     }
93730fdc8d8SChris Lattner     else
93830fdc8d8SChris Lattner     {
93930fdc8d8SChris Lattner         // Particular breakpoint selected; enable that breakpoint.
94030fdc8d8SChris Lattner         BreakpointIDList valid_bp_ids;
94130fdc8d8SChris Lattner         CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (args, target, result, &valid_bp_ids);
94230fdc8d8SChris Lattner 
94330fdc8d8SChris Lattner         if (result.Succeeded())
94430fdc8d8SChris Lattner         {
94530fdc8d8SChris Lattner             int enable_count = 0;
94630fdc8d8SChris Lattner             int loc_count = 0;
947c982c768SGreg Clayton             const size_t count = valid_bp_ids.GetSize();
948c982c768SGreg Clayton             for (size_t i = 0; i < count; ++i)
94930fdc8d8SChris Lattner             {
95030fdc8d8SChris Lattner                 BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
95130fdc8d8SChris Lattner 
95230fdc8d8SChris Lattner                 if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
95330fdc8d8SChris Lattner                 {
95430fdc8d8SChris Lattner                     Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
95530fdc8d8SChris Lattner                     if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
95630fdc8d8SChris Lattner                     {
95730fdc8d8SChris Lattner                         BreakpointLocation *location = breakpoint->FindLocationByID (cur_bp_id.GetLocationID()).get();
95830fdc8d8SChris Lattner                         if (location)
95930fdc8d8SChris Lattner                         {
96030fdc8d8SChris Lattner                             location->SetEnabled (true);
96130fdc8d8SChris Lattner                             ++loc_count;
96230fdc8d8SChris Lattner                         }
96330fdc8d8SChris Lattner                     }
96430fdc8d8SChris Lattner                     else
96530fdc8d8SChris Lattner                     {
966ae1c4cf5SJim Ingham                         breakpoint->SetEnabled (true);
96730fdc8d8SChris Lattner                         ++enable_count;
96830fdc8d8SChris Lattner                     }
96930fdc8d8SChris Lattner                 }
97030fdc8d8SChris Lattner             }
97130fdc8d8SChris Lattner             result.AppendMessageWithFormat ("%d breakpoints enabled.\n", enable_count + loc_count);
97230fdc8d8SChris Lattner             result.SetStatus (eReturnStatusSuccessFinishNoResult);
97330fdc8d8SChris Lattner         }
97430fdc8d8SChris Lattner     }
97530fdc8d8SChris Lattner 
97630fdc8d8SChris Lattner     return result.Succeeded();
97730fdc8d8SChris Lattner }
97830fdc8d8SChris Lattner 
97930fdc8d8SChris Lattner //-------------------------------------------------------------------------
98030fdc8d8SChris Lattner // CommandObjectBreakpointDisable
98130fdc8d8SChris Lattner //-------------------------------------------------------------------------
982ae1c4cf5SJim Ingham #pragma mark Disable
98330fdc8d8SChris Lattner 
984a7015092SGreg Clayton CommandObjectBreakpointDisable::CommandObjectBreakpointDisable (CommandInterpreter &interpreter) :
985a7015092SGreg Clayton     CommandObject (interpreter,
986e139cf23SCaroline Tice                    "breakpoint disable",
987e3d26315SCaroline Tice                    "Disable the specified breakpoint(s) without removing it/them.  If no breakpoints are specified, disable them all.",
988e139cf23SCaroline Tice                    NULL)
98930fdc8d8SChris Lattner {
990e139cf23SCaroline Tice     CommandArgumentEntry arg;
991de753464SJohnny Chen     CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange);
992e139cf23SCaroline Tice     // Add the entry for the first argument for this command to the object's arguments vector.
993e139cf23SCaroline Tice     m_arguments.push_back (arg);
99430fdc8d8SChris Lattner }
99530fdc8d8SChris Lattner 
99630fdc8d8SChris Lattner CommandObjectBreakpointDisable::~CommandObjectBreakpointDisable ()
99730fdc8d8SChris Lattner {
99830fdc8d8SChris Lattner }
99930fdc8d8SChris Lattner 
100030fdc8d8SChris Lattner bool
10016611103cSGreg Clayton CommandObjectBreakpointDisable::Execute
10026611103cSGreg Clayton (
10036611103cSGreg Clayton     Args& args,
10046611103cSGreg Clayton     CommandReturnObject &result
10056611103cSGreg Clayton )
100630fdc8d8SChris Lattner {
1007a7015092SGreg Clayton     Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
100830fdc8d8SChris Lattner     if (target == NULL)
100930fdc8d8SChris Lattner     {
10109068d794SCaroline Tice         result.AppendError ("Invalid target.  No existing target or breakpoints.");
101130fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
101230fdc8d8SChris Lattner         return false;
101330fdc8d8SChris Lattner     }
101430fdc8d8SChris Lattner 
10151b54c88cSJim Ingham     Mutex::Locker locker;
10161b54c88cSJim Ingham     target->GetBreakpointList().GetListMutex(locker);
10171b54c88cSJim Ingham 
101830fdc8d8SChris Lattner     const BreakpointList &breakpoints = target->GetBreakpointList();
101930fdc8d8SChris Lattner     size_t num_breakpoints = breakpoints.GetSize();
102030fdc8d8SChris Lattner 
102130fdc8d8SChris Lattner     if (num_breakpoints == 0)
102230fdc8d8SChris Lattner     {
102330fdc8d8SChris Lattner         result.AppendError ("No breakpoints exist to be disabled.");
102430fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
102530fdc8d8SChris Lattner         return false;
102630fdc8d8SChris Lattner     }
102730fdc8d8SChris Lattner 
102830fdc8d8SChris Lattner     if (args.GetArgumentCount() == 0)
102930fdc8d8SChris Lattner     {
103030fdc8d8SChris Lattner         // No breakpoint selected; disable all currently set breakpoints.
103130fdc8d8SChris Lattner         target->DisableAllBreakpoints ();
1032fd54b368SJason Molenda         result.AppendMessageWithFormat ("All breakpoints disabled. (%lu breakpoints)\n", num_breakpoints);
103330fdc8d8SChris Lattner         result.SetStatus (eReturnStatusSuccessFinishNoResult);
103430fdc8d8SChris Lattner     }
103530fdc8d8SChris Lattner     else
103630fdc8d8SChris Lattner     {
103730fdc8d8SChris Lattner         // Particular breakpoint selected; disable that breakpoint.
103830fdc8d8SChris Lattner         BreakpointIDList valid_bp_ids;
103930fdc8d8SChris Lattner 
104030fdc8d8SChris Lattner         CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (args, target, result, &valid_bp_ids);
104130fdc8d8SChris Lattner 
104230fdc8d8SChris Lattner         if (result.Succeeded())
104330fdc8d8SChris Lattner         {
104430fdc8d8SChris Lattner             int disable_count = 0;
104530fdc8d8SChris Lattner             int loc_count = 0;
1046c982c768SGreg Clayton             const size_t count = valid_bp_ids.GetSize();
1047c982c768SGreg Clayton             for (size_t i = 0; i < count; ++i)
104830fdc8d8SChris Lattner             {
104930fdc8d8SChris Lattner                 BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
105030fdc8d8SChris Lattner 
105130fdc8d8SChris Lattner                 if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
105230fdc8d8SChris Lattner                 {
105330fdc8d8SChris Lattner                     Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
105430fdc8d8SChris Lattner                     if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
105530fdc8d8SChris Lattner                     {
105630fdc8d8SChris Lattner                         BreakpointLocation *location = breakpoint->FindLocationByID (cur_bp_id.GetLocationID()).get();
105730fdc8d8SChris Lattner                         if (location)
105830fdc8d8SChris Lattner                         {
105930fdc8d8SChris Lattner                             location->SetEnabled (false);
106030fdc8d8SChris Lattner                             ++loc_count;
106130fdc8d8SChris Lattner                         }
106230fdc8d8SChris Lattner                     }
106330fdc8d8SChris Lattner                     else
106430fdc8d8SChris Lattner                     {
1065ae1c4cf5SJim Ingham                         breakpoint->SetEnabled (false);
106630fdc8d8SChris Lattner                         ++disable_count;
106730fdc8d8SChris Lattner                     }
106830fdc8d8SChris Lattner                 }
106930fdc8d8SChris Lattner             }
107030fdc8d8SChris Lattner             result.AppendMessageWithFormat ("%d breakpoints disabled.\n", disable_count + loc_count);
107130fdc8d8SChris Lattner             result.SetStatus (eReturnStatusSuccessFinishNoResult);
107230fdc8d8SChris Lattner         }
107330fdc8d8SChris Lattner     }
107430fdc8d8SChris Lattner 
107530fdc8d8SChris Lattner     return result.Succeeded();
107630fdc8d8SChris Lattner }
107730fdc8d8SChris Lattner 
107830fdc8d8SChris Lattner //-------------------------------------------------------------------------
1079b7234e40SJohnny Chen // CommandObjectBreakpointClear::CommandOptions
1080b7234e40SJohnny Chen //-------------------------------------------------------------------------
1081b7234e40SJohnny Chen #pragma mark Clear::CommandOptions
1082b7234e40SJohnny Chen 
1083eb0103f2SGreg Clayton CommandObjectBreakpointClear::CommandOptions::CommandOptions(CommandInterpreter &interpreter) :
1084eb0103f2SGreg Clayton     Options (interpreter),
1085b7234e40SJohnny Chen     m_filename (),
1086b7234e40SJohnny Chen     m_line_num (0)
1087b7234e40SJohnny Chen {
1088b7234e40SJohnny Chen }
1089b7234e40SJohnny Chen 
1090b7234e40SJohnny Chen CommandObjectBreakpointClear::CommandOptions::~CommandOptions ()
1091b7234e40SJohnny Chen {
1092b7234e40SJohnny Chen }
1093b7234e40SJohnny Chen 
1094e0d378b3SGreg Clayton OptionDefinition
1095b7234e40SJohnny Chen CommandObjectBreakpointClear::CommandOptions::g_option_table[] =
1096b7234e40SJohnny Chen {
1097b7234e40SJohnny Chen     { LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename,
1098b7234e40SJohnny Chen         "Specify the breakpoint by source location in this particular file."},
1099b7234e40SJohnny Chen 
1100b7234e40SJohnny Chen     { LLDB_OPT_SET_1, true, "line", 'l', required_argument, NULL, 0, eArgTypeLineNum,
1101b7234e40SJohnny Chen         "Specify the breakpoint by source location at this particular line."},
1102b7234e40SJohnny Chen 
1103b7234e40SJohnny Chen     { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
1104b7234e40SJohnny Chen };
1105b7234e40SJohnny Chen 
1106e0d378b3SGreg Clayton const OptionDefinition*
1107b7234e40SJohnny Chen CommandObjectBreakpointClear::CommandOptions::GetDefinitions ()
1108b7234e40SJohnny Chen {
1109b7234e40SJohnny Chen     return g_option_table;
1110b7234e40SJohnny Chen }
1111b7234e40SJohnny Chen 
1112b7234e40SJohnny Chen Error
1113f6b8b581SGreg Clayton CommandObjectBreakpointClear::CommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
1114b7234e40SJohnny Chen {
1115b7234e40SJohnny Chen     Error error;
1116b7234e40SJohnny Chen     char short_option = (char) m_getopt_table[option_idx].val;
1117b7234e40SJohnny Chen 
1118b7234e40SJohnny Chen     switch (short_option)
1119b7234e40SJohnny Chen     {
1120b7234e40SJohnny Chen         case 'f':
1121357132ebSGreg Clayton             m_filename.assign (option_arg);
1122b7234e40SJohnny Chen             break;
1123b7234e40SJohnny Chen 
1124b7234e40SJohnny Chen         case 'l':
1125b7234e40SJohnny Chen             m_line_num = Args::StringToUInt32 (option_arg, 0);
1126b7234e40SJohnny Chen             break;
1127b7234e40SJohnny Chen 
1128b7234e40SJohnny Chen         default:
112986edbf41SGreg Clayton             error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
1130b7234e40SJohnny Chen             break;
1131b7234e40SJohnny Chen     }
1132b7234e40SJohnny Chen 
1133b7234e40SJohnny Chen     return error;
1134b7234e40SJohnny Chen }
1135b7234e40SJohnny Chen 
1136b7234e40SJohnny Chen void
1137f6b8b581SGreg Clayton CommandObjectBreakpointClear::CommandOptions::OptionParsingStarting ()
1138b7234e40SJohnny Chen {
1139b7234e40SJohnny Chen     m_filename.clear();
1140b7234e40SJohnny Chen     m_line_num = 0;
1141b7234e40SJohnny Chen }
1142b7234e40SJohnny Chen 
1143b7234e40SJohnny Chen //-------------------------------------------------------------------------
1144b7234e40SJohnny Chen // CommandObjectBreakpointClear
1145b7234e40SJohnny Chen //-------------------------------------------------------------------------
1146b7234e40SJohnny Chen #pragma mark Clear
1147b7234e40SJohnny Chen 
1148b7234e40SJohnny Chen CommandObjectBreakpointClear::CommandObjectBreakpointClear (CommandInterpreter &interpreter) :
1149b7234e40SJohnny Chen     CommandObject (interpreter,
1150b7234e40SJohnny Chen                    "breakpoint clear",
1151b7234e40SJohnny Chen                    "Clears a breakpoint or set of breakpoints in the executable.",
1152eb0103f2SGreg Clayton                    "breakpoint clear <cmd-options>"),
1153eb0103f2SGreg Clayton     m_options (interpreter)
1154b7234e40SJohnny Chen {
1155b7234e40SJohnny Chen }
1156b7234e40SJohnny Chen 
1157b7234e40SJohnny Chen CommandObjectBreakpointClear::~CommandObjectBreakpointClear ()
1158b7234e40SJohnny Chen {
1159b7234e40SJohnny Chen }
1160b7234e40SJohnny Chen 
1161b7234e40SJohnny Chen Options *
1162b7234e40SJohnny Chen CommandObjectBreakpointClear::GetOptions ()
1163b7234e40SJohnny Chen {
1164b7234e40SJohnny Chen     return &m_options;
1165b7234e40SJohnny Chen }
1166b7234e40SJohnny Chen 
1167b7234e40SJohnny Chen bool
1168b7234e40SJohnny Chen CommandObjectBreakpointClear::Execute
1169b7234e40SJohnny Chen (
1170b7234e40SJohnny Chen     Args& command,
1171b7234e40SJohnny Chen     CommandReturnObject &result
1172b7234e40SJohnny Chen )
1173b7234e40SJohnny Chen {
1174b7234e40SJohnny Chen     Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
1175b7234e40SJohnny Chen     if (target == NULL)
1176b7234e40SJohnny Chen     {
1177b7234e40SJohnny Chen         result.AppendError ("Invalid target. No existing target or breakpoints.");
1178b7234e40SJohnny Chen         result.SetStatus (eReturnStatusFailed);
1179b7234e40SJohnny Chen         return false;
1180b7234e40SJohnny Chen     }
1181b7234e40SJohnny Chen 
1182b7234e40SJohnny Chen     // The following are the various types of breakpoints that could be cleared:
1183b7234e40SJohnny Chen     //   1). -f -l (clearing breakpoint by source location)
1184b7234e40SJohnny Chen 
1185b7234e40SJohnny Chen     BreakpointClearType break_type = eClearTypeInvalid;
1186b7234e40SJohnny Chen 
1187b7234e40SJohnny Chen     if (m_options.m_line_num != 0)
1188b7234e40SJohnny Chen         break_type = eClearTypeFileAndLine;
1189b7234e40SJohnny Chen 
1190b7234e40SJohnny Chen     Mutex::Locker locker;
1191b7234e40SJohnny Chen     target->GetBreakpointList().GetListMutex(locker);
1192b7234e40SJohnny Chen 
1193b7234e40SJohnny Chen     BreakpointList &breakpoints = target->GetBreakpointList();
1194b7234e40SJohnny Chen     size_t num_breakpoints = breakpoints.GetSize();
1195b7234e40SJohnny Chen 
1196b7234e40SJohnny Chen     // Early return if there's no breakpoint at all.
1197b7234e40SJohnny Chen     if (num_breakpoints == 0)
1198b7234e40SJohnny Chen     {
1199b7234e40SJohnny Chen         result.AppendError ("Breakpoint clear: No breakpoint cleared.");
1200b7234e40SJohnny Chen         result.SetStatus (eReturnStatusFailed);
1201b7234e40SJohnny Chen         return result.Succeeded();
1202b7234e40SJohnny Chen     }
1203b7234e40SJohnny Chen 
1204b7234e40SJohnny Chen     // Find matching breakpoints and delete them.
1205b7234e40SJohnny Chen 
1206b7234e40SJohnny Chen     // First create a copy of all the IDs.
1207b7234e40SJohnny Chen     std::vector<break_id_t> BreakIDs;
1208b7234e40SJohnny Chen     for (size_t i = 0; i < num_breakpoints; ++i)
1209b7234e40SJohnny Chen         BreakIDs.push_back(breakpoints.GetBreakpointAtIndex(i).get()->GetID());
1210b7234e40SJohnny Chen 
1211b7234e40SJohnny Chen     int num_cleared = 0;
1212b7234e40SJohnny Chen     StreamString ss;
1213b7234e40SJohnny Chen     switch (break_type)
1214b7234e40SJohnny Chen     {
1215b7234e40SJohnny Chen         case eClearTypeFileAndLine: // Breakpoint by source position
1216b7234e40SJohnny Chen             {
1217b7234e40SJohnny Chen                 const ConstString filename(m_options.m_filename.c_str());
1218b7234e40SJohnny Chen                 BreakpointLocationCollection loc_coll;
1219b7234e40SJohnny Chen 
1220b7234e40SJohnny Chen                 for (size_t i = 0; i < num_breakpoints; ++i)
1221b7234e40SJohnny Chen                 {
1222b7234e40SJohnny Chen                     Breakpoint *bp = breakpoints.FindBreakpointByID(BreakIDs[i]).get();
1223b7234e40SJohnny Chen 
1224b7234e40SJohnny Chen                     if (bp->GetMatchingFileLine(filename, m_options.m_line_num, loc_coll))
1225b7234e40SJohnny Chen                     {
1226b7234e40SJohnny Chen                         // If the collection size is 0, it's a full match and we can just remove the breakpoint.
1227b7234e40SJohnny Chen                         if (loc_coll.GetSize() == 0)
1228b7234e40SJohnny Chen                         {
1229b7234e40SJohnny Chen                             bp->GetDescription(&ss, lldb::eDescriptionLevelBrief);
1230b7234e40SJohnny Chen                             ss.EOL();
1231b7234e40SJohnny Chen                             target->RemoveBreakpointByID (bp->GetID());
1232b7234e40SJohnny Chen                             ++num_cleared;
1233b7234e40SJohnny Chen                         }
1234b7234e40SJohnny Chen                     }
1235b7234e40SJohnny Chen                 }
1236b7234e40SJohnny Chen             }
1237b7234e40SJohnny Chen             break;
1238b7234e40SJohnny Chen 
1239b7234e40SJohnny Chen         default:
1240b7234e40SJohnny Chen             break;
1241b7234e40SJohnny Chen     }
1242b7234e40SJohnny Chen 
1243b7234e40SJohnny Chen     if (num_cleared > 0)
1244b7234e40SJohnny Chen     {
124585e8b814SJim Ingham         Stream &output_stream = result.GetOutputStream();
1246b7234e40SJohnny Chen         output_stream.Printf ("%d breakpoints cleared:\n", num_cleared);
1247b7234e40SJohnny Chen         output_stream << ss.GetData();
1248b7234e40SJohnny Chen         output_stream.EOL();
1249b7234e40SJohnny Chen         result.SetStatus (eReturnStatusSuccessFinishNoResult);
1250b7234e40SJohnny Chen     }
1251b7234e40SJohnny Chen     else
1252b7234e40SJohnny Chen     {
1253b7234e40SJohnny Chen         result.AppendError ("Breakpoint clear: No breakpoint cleared.");
1254b7234e40SJohnny Chen         result.SetStatus (eReturnStatusFailed);
1255b7234e40SJohnny Chen     }
1256b7234e40SJohnny Chen 
1257b7234e40SJohnny Chen     return result.Succeeded();
1258b7234e40SJohnny Chen }
1259b7234e40SJohnny Chen 
1260b7234e40SJohnny Chen //-------------------------------------------------------------------------
126130fdc8d8SChris Lattner // CommandObjectBreakpointDelete
126230fdc8d8SChris Lattner //-------------------------------------------------------------------------
1263ae1c4cf5SJim Ingham #pragma mark Delete
126430fdc8d8SChris Lattner 
1265a7015092SGreg Clayton CommandObjectBreakpointDelete::CommandObjectBreakpointDelete(CommandInterpreter &interpreter) :
1266a7015092SGreg Clayton     CommandObject (interpreter,
1267a7015092SGreg Clayton                    "breakpoint delete",
1268e3d26315SCaroline Tice                    "Delete the specified breakpoint(s).  If no breakpoints are specified, delete them all.",
1269e139cf23SCaroline Tice                    NULL)
127030fdc8d8SChris Lattner {
1271e139cf23SCaroline Tice     CommandArgumentEntry arg;
1272de753464SJohnny Chen     CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange);
1273e139cf23SCaroline Tice     // Add the entry for the first argument for this command to the object's arguments vector.
1274e139cf23SCaroline Tice     m_arguments.push_back (arg);
127530fdc8d8SChris Lattner }
127630fdc8d8SChris Lattner 
127730fdc8d8SChris Lattner 
127830fdc8d8SChris Lattner CommandObjectBreakpointDelete::~CommandObjectBreakpointDelete ()
127930fdc8d8SChris Lattner {
128030fdc8d8SChris Lattner }
128130fdc8d8SChris Lattner 
128230fdc8d8SChris Lattner bool
12836611103cSGreg Clayton CommandObjectBreakpointDelete::Execute
12846611103cSGreg Clayton (
12856611103cSGreg Clayton     Args& args,
12866611103cSGreg Clayton     CommandReturnObject &result
12876611103cSGreg Clayton )
128830fdc8d8SChris Lattner {
1289a7015092SGreg Clayton     Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
129030fdc8d8SChris Lattner     if (target == NULL)
129130fdc8d8SChris Lattner     {
12929068d794SCaroline Tice         result.AppendError ("Invalid target. No existing target or breakpoints.");
129330fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
129430fdc8d8SChris Lattner         return false;
129530fdc8d8SChris Lattner     }
129630fdc8d8SChris Lattner 
12971b54c88cSJim Ingham     Mutex::Locker locker;
12981b54c88cSJim Ingham     target->GetBreakpointList().GetListMutex(locker);
12991b54c88cSJim Ingham 
130030fdc8d8SChris Lattner     const BreakpointList &breakpoints = target->GetBreakpointList();
13011b54c88cSJim Ingham 
130230fdc8d8SChris Lattner     size_t num_breakpoints = breakpoints.GetSize();
130330fdc8d8SChris Lattner 
130430fdc8d8SChris Lattner     if (num_breakpoints == 0)
130530fdc8d8SChris Lattner     {
130630fdc8d8SChris Lattner         result.AppendError ("No breakpoints exist to be deleted.");
130730fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
130830fdc8d8SChris Lattner         return false;
130930fdc8d8SChris Lattner     }
131030fdc8d8SChris Lattner 
131130fdc8d8SChris Lattner     if (args.GetArgumentCount() == 0)
131230fdc8d8SChris Lattner     {
131336f3b369SJim Ingham         if (!m_interpreter.Confirm ("About to delete all breakpoints, do you want to do that?", true))
131430fdc8d8SChris Lattner         {
131536f3b369SJim Ingham             result.AppendMessage("Operation cancelled...");
131630fdc8d8SChris Lattner         }
131736f3b369SJim Ingham         else
131836f3b369SJim Ingham         {
131930fdc8d8SChris Lattner             target->RemoveAllBreakpoints ();
1320fd54b368SJason Molenda             result.AppendMessageWithFormat ("All breakpoints removed. (%lu breakpoints)\n", num_breakpoints);
132136f3b369SJim Ingham         }
132230fdc8d8SChris Lattner         result.SetStatus (eReturnStatusSuccessFinishNoResult);
132330fdc8d8SChris Lattner     }
132430fdc8d8SChris Lattner     else
132530fdc8d8SChris Lattner     {
132630fdc8d8SChris Lattner         // Particular breakpoint selected; disable that breakpoint.
132730fdc8d8SChris Lattner         BreakpointIDList valid_bp_ids;
132830fdc8d8SChris Lattner         CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (args, target, result, &valid_bp_ids);
132930fdc8d8SChris Lattner 
133030fdc8d8SChris Lattner         if (result.Succeeded())
133130fdc8d8SChris Lattner         {
133230fdc8d8SChris Lattner             int delete_count = 0;
133330fdc8d8SChris Lattner             int disable_count = 0;
1334c982c768SGreg Clayton             const size_t count = valid_bp_ids.GetSize();
1335c982c768SGreg Clayton             for (size_t i = 0; i < count; ++i)
133630fdc8d8SChris Lattner             {
133730fdc8d8SChris Lattner                 BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
133830fdc8d8SChris Lattner 
133930fdc8d8SChris Lattner                 if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
134030fdc8d8SChris Lattner                 {
134130fdc8d8SChris Lattner                     if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
134230fdc8d8SChris Lattner                     {
134330fdc8d8SChris Lattner                         Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
134430fdc8d8SChris Lattner                         BreakpointLocation *location = breakpoint->FindLocationByID (cur_bp_id.GetLocationID()).get();
134530fdc8d8SChris Lattner                         // It makes no sense to try to delete individual locations, so we disable them instead.
134630fdc8d8SChris Lattner                         if (location)
134730fdc8d8SChris Lattner                         {
134830fdc8d8SChris Lattner                             location->SetEnabled (false);
134930fdc8d8SChris Lattner                             ++disable_count;
135030fdc8d8SChris Lattner                         }
135130fdc8d8SChris Lattner                     }
135230fdc8d8SChris Lattner                     else
135330fdc8d8SChris Lattner                     {
135430fdc8d8SChris Lattner                         target->RemoveBreakpointByID (cur_bp_id.GetBreakpointID());
135530fdc8d8SChris Lattner                         ++delete_count;
135630fdc8d8SChris Lattner                     }
135730fdc8d8SChris Lattner                 }
135830fdc8d8SChris Lattner             }
135930fdc8d8SChris Lattner             result.AppendMessageWithFormat ("%d breakpoints deleted; %d breakpoint locations disabled.\n",
136030fdc8d8SChris Lattner                                            delete_count, disable_count);
136130fdc8d8SChris Lattner             result.SetStatus (eReturnStatusSuccessFinishNoResult);
136230fdc8d8SChris Lattner         }
136330fdc8d8SChris Lattner     }
136430fdc8d8SChris Lattner     return result.Succeeded();
136530fdc8d8SChris Lattner }
13661b54c88cSJim Ingham 
13671b54c88cSJim Ingham //-------------------------------------------------------------------------
1368ae1c4cf5SJim Ingham // CommandObjectBreakpointModify::CommandOptions
13691b54c88cSJim Ingham //-------------------------------------------------------------------------
1370ae1c4cf5SJim Ingham #pragma mark Modify::CommandOptions
13711b54c88cSJim Ingham 
1372eb0103f2SGreg Clayton CommandObjectBreakpointModify::CommandOptions::CommandOptions(CommandInterpreter &interpreter) :
1373eb0103f2SGreg Clayton     Options (interpreter),
1374c982c768SGreg Clayton     m_ignore_count (0),
13751b54c88cSJim Ingham     m_thread_id(LLDB_INVALID_THREAD_ID),
1376e0a97848SJim Ingham     m_thread_id_passed(false),
1377c982c768SGreg Clayton     m_thread_index (UINT32_MAX),
1378e0a97848SJim Ingham     m_thread_index_passed(false),
13791b54c88cSJim Ingham     m_thread_name(),
13801b54c88cSJim Ingham     m_queue_name(),
138136f3b369SJim Ingham     m_condition (),
1382c982c768SGreg Clayton     m_enable_passed (false),
1383c982c768SGreg Clayton     m_enable_value (false),
1384c982c768SGreg Clayton     m_name_passed (false),
138536f3b369SJim Ingham     m_queue_passed (false),
138636f3b369SJim Ingham     m_condition_passed (false)
13871b54c88cSJim Ingham {
13881b54c88cSJim Ingham }
13891b54c88cSJim Ingham 
1390ae1c4cf5SJim Ingham CommandObjectBreakpointModify::CommandOptions::~CommandOptions ()
13911b54c88cSJim Ingham {
13921b54c88cSJim Ingham }
13931b54c88cSJim Ingham 
1394e0d378b3SGreg Clayton OptionDefinition
1395ae1c4cf5SJim Ingham CommandObjectBreakpointModify::CommandOptions::g_option_table[] =
13961b54c88cSJim Ingham {
1397*a0cd2bcaSBill Wendling { LLDB_OPT_SET_ALL, false, "ignore-count", 'i', required_argument, NULL, 0, eArgTypeCount, "Set the number of times this breakpoint is skipped before stopping." },
1398*a0cd2bcaSBill Wendling { LLDB_OPT_SET_ALL, false, "thread-index", 'x', required_argument, NULL, 0, eArgTypeThreadIndex, "The breakpoint stops only for the thread whose indeX matches this argument."},
1399*a0cd2bcaSBill Wendling { LLDB_OPT_SET_ALL, false, "thread-id",    't', required_argument, NULL, 0, eArgTypeThreadID, "The breakpoint stops only for the thread whose TID matches this argument."},
1400*a0cd2bcaSBill Wendling { LLDB_OPT_SET_ALL, false, "thread-name",  'T', required_argument, NULL, 0, eArgTypeThreadName, "The breakpoint stops only for the thread whose thread name matches this argument."},
1401*a0cd2bcaSBill Wendling { LLDB_OPT_SET_ALL, false, "queue-name",   'q', required_argument, NULL, 0, eArgTypeQueueName, "The breakpoint stops only for threads in the queue whose name is given by this argument."},
1402*a0cd2bcaSBill Wendling { LLDB_OPT_SET_ALL, false, "condition",    'c', required_argument, NULL, 0, eArgTypeExpression, "The breakpoint stops only if this condition expression evaluates to true."},
1403*a0cd2bcaSBill Wendling { LLDB_OPT_SET_1,   false, "enable",       'e', no_argument,       NULL, 0, eArgTypeNone, "Enable the breakpoint."},
1404*a0cd2bcaSBill Wendling { LLDB_OPT_SET_2,   false, "disable",      'd', no_argument,       NULL, 0, eArgTypeNone, "Disable the breakpoint."},
1405deaab222SCaroline Tice { 0,                false, NULL,            0 , 0,                 NULL, 0,    eArgTypeNone, NULL }
14061b54c88cSJim Ingham };
14071b54c88cSJim Ingham 
1408e0d378b3SGreg Clayton const OptionDefinition*
1409ae1c4cf5SJim Ingham CommandObjectBreakpointModify::CommandOptions::GetDefinitions ()
14101b54c88cSJim Ingham {
14111b54c88cSJim Ingham     return g_option_table;
14121b54c88cSJim Ingham }
14131b54c88cSJim Ingham 
14141b54c88cSJim Ingham Error
1415f6b8b581SGreg Clayton CommandObjectBreakpointModify::CommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
14161b54c88cSJim Ingham {
14171b54c88cSJim Ingham     Error error;
14181b54c88cSJim Ingham     char short_option = (char) m_getopt_table[option_idx].val;
14191b54c88cSJim Ingham 
14201b54c88cSJim Ingham     switch (short_option)
14211b54c88cSJim Ingham     {
142236f3b369SJim Ingham         case 'c':
142336f3b369SJim Ingham             if (option_arg != NULL)
1424357132ebSGreg Clayton                 m_condition.assign (option_arg);
142536f3b369SJim Ingham             else
142636f3b369SJim Ingham                 m_condition.clear();
142736f3b369SJim Ingham             m_condition_passed = true;
142836f3b369SJim Ingham             break;
1429ae1c4cf5SJim Ingham         case 'd':
1430ae1c4cf5SJim Ingham             m_enable_passed = true;
1431ae1c4cf5SJim Ingham             m_enable_value = false;
1432ae1c4cf5SJim Ingham             break;
1433ae1c4cf5SJim Ingham         case 'e':
1434ae1c4cf5SJim Ingham             m_enable_passed = true;
1435ae1c4cf5SJim Ingham             m_enable_value = true;
1436ae1c4cf5SJim Ingham             break;
1437ed8a705cSGreg Clayton         case 'i':
14381b54c88cSJim Ingham         {
14390292f4a5SJim Ingham             m_ignore_count = Args::StringToUInt32(option_arg, UINT32_MAX, 0);
1440c982c768SGreg Clayton             if (m_ignore_count == UINT32_MAX)
144186edbf41SGreg Clayton                error.SetErrorStringWithFormat ("invalid ignore count '%s'", option_arg);
14421b54c88cSJim Ingham         }
1443ae1c4cf5SJim Ingham         break;
14441b54c88cSJim Ingham         case 't' :
14451b54c88cSJim Ingham         {
14460292f4a5SJim Ingham             if (option_arg[0] == '\0')
1447e0a97848SJim Ingham             {
1448e0a97848SJim Ingham                 m_thread_id = LLDB_INVALID_THREAD_ID;
1449e0a97848SJim Ingham                 m_thread_id_passed = true;
1450e0a97848SJim Ingham             }
1451e0a97848SJim Ingham             else
1452e0a97848SJim Ingham             {
14530292f4a5SJim Ingham                 m_thread_id = Args::StringToUInt64(option_arg, LLDB_INVALID_THREAD_ID, 0);
14541b54c88cSJim Ingham                 if (m_thread_id == LLDB_INVALID_THREAD_ID)
145586edbf41SGreg Clayton                    error.SetErrorStringWithFormat ("invalid thread id string '%s'", option_arg);
1456e0a97848SJim Ingham                 else
1457e0a97848SJim Ingham                     m_thread_id_passed = true;
1458e0a97848SJim Ingham             }
14591b54c88cSJim Ingham         }
14601b54c88cSJim Ingham         break;
14611b54c88cSJim Ingham         case 'T':
1462b2a38a72SJim Ingham             if (option_arg != NULL)
1463357132ebSGreg Clayton                 m_thread_name.assign (option_arg);
1464b2a38a72SJim Ingham             else
1465b2a38a72SJim Ingham                 m_thread_name.clear();
1466b2a38a72SJim Ingham             m_name_passed = true;
14671b54c88cSJim Ingham             break;
14681b54c88cSJim Ingham         case 'q':
1469b2a38a72SJim Ingham             if (option_arg != NULL)
1470357132ebSGreg Clayton                 m_queue_name.assign (option_arg);
1471b2a38a72SJim Ingham             else
1472b2a38a72SJim Ingham                 m_queue_name.clear();
1473b2a38a72SJim Ingham             m_queue_passed = true;
14741b54c88cSJim Ingham             break;
14751b54c88cSJim Ingham         case 'x':
14761b54c88cSJim Ingham         {
14770292f4a5SJim Ingham             if (option_arg[0] == '\n')
1478e0a97848SJim Ingham             {
1479e0a97848SJim Ingham                 m_thread_index = UINT32_MAX;
1480e0a97848SJim Ingham                 m_thread_index_passed = true;
1481e0a97848SJim Ingham             }
1482e0a97848SJim Ingham             else
1483e0a97848SJim Ingham             {
14840292f4a5SJim Ingham                 m_thread_index = Args::StringToUInt32 (option_arg, UINT32_MAX, 0);
1485c982c768SGreg Clayton                 if (m_thread_id == UINT32_MAX)
148686edbf41SGreg Clayton                    error.SetErrorStringWithFormat ("invalid thread index string '%s'", option_arg);
1487e0a97848SJim Ingham                 else
1488e0a97848SJim Ingham                     m_thread_index_passed = true;
1489e0a97848SJim Ingham             }
14901b54c88cSJim Ingham         }
14911b54c88cSJim Ingham         break;
14921b54c88cSJim Ingham         default:
149386edbf41SGreg Clayton             error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
14941b54c88cSJim Ingham             break;
14951b54c88cSJim Ingham     }
14961b54c88cSJim Ingham 
14971b54c88cSJim Ingham     return error;
14981b54c88cSJim Ingham }
14991b54c88cSJim Ingham 
15001b54c88cSJim Ingham void
1501f6b8b581SGreg Clayton CommandObjectBreakpointModify::CommandOptions::OptionParsingStarting ()
15021b54c88cSJim Ingham {
1503c982c768SGreg Clayton     m_ignore_count = 0;
15041b54c88cSJim Ingham     m_thread_id = LLDB_INVALID_THREAD_ID;
1505e0a97848SJim Ingham     m_thread_id_passed = false;
1506c982c768SGreg Clayton     m_thread_index = UINT32_MAX;
1507e0a97848SJim Ingham     m_thread_index_passed = false;
15081b54c88cSJim Ingham     m_thread_name.clear();
15091b54c88cSJim Ingham     m_queue_name.clear();
151036f3b369SJim Ingham     m_condition.clear();
1511ae1c4cf5SJim Ingham     m_enable_passed = false;
1512b2a38a72SJim Ingham     m_queue_passed = false;
1513b2a38a72SJim Ingham     m_name_passed = false;
151436f3b369SJim Ingham     m_condition_passed = false;
15151b54c88cSJim Ingham }
15161b54c88cSJim Ingham 
15171b54c88cSJim Ingham //-------------------------------------------------------------------------
1518ae1c4cf5SJim Ingham // CommandObjectBreakpointModify
15191b54c88cSJim Ingham //-------------------------------------------------------------------------
1520ae1c4cf5SJim Ingham #pragma mark Modify
15211b54c88cSJim Ingham 
1522a7015092SGreg Clayton CommandObjectBreakpointModify::CommandObjectBreakpointModify (CommandInterpreter &interpreter) :
1523a7015092SGreg Clayton     CommandObject (interpreter,
1524a7015092SGreg Clayton                    "breakpoint modify",
1525a571c010SJim Ingham                    "Modify the options on a breakpoint or set of breakpoints in the executable.  "
1526e0a97848SJim Ingham                    "If no breakpoint is specified, acts on the last created breakpoint.  "
1527e0a97848SJim Ingham                    "With the exception of -e, -d and -i, passing an empty argument clears the modification.",
1528eb0103f2SGreg Clayton                    NULL),
1529eb0103f2SGreg Clayton     m_options (interpreter)
15301b54c88cSJim Ingham {
1531e139cf23SCaroline Tice     CommandArgumentEntry arg;
1532de753464SJohnny Chen     CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange);
1533e139cf23SCaroline Tice     // Add the entry for the first argument for this command to the object's arguments vector.
1534e139cf23SCaroline Tice     m_arguments.push_back (arg);
15351b54c88cSJim Ingham }
15361b54c88cSJim Ingham 
1537ae1c4cf5SJim Ingham CommandObjectBreakpointModify::~CommandObjectBreakpointModify ()
15381b54c88cSJim Ingham {
15391b54c88cSJim Ingham }
15401b54c88cSJim Ingham 
15411b54c88cSJim Ingham Options *
1542ae1c4cf5SJim Ingham CommandObjectBreakpointModify::GetOptions ()
15431b54c88cSJim Ingham {
15441b54c88cSJim Ingham     return &m_options;
15451b54c88cSJim Ingham }
15461b54c88cSJim Ingham 
15471b54c88cSJim Ingham bool
1548ae1c4cf5SJim Ingham CommandObjectBreakpointModify::Execute
15491b54c88cSJim Ingham (
15501b54c88cSJim Ingham     Args& command,
15511b54c88cSJim Ingham     CommandReturnObject &result
15521b54c88cSJim Ingham )
15531b54c88cSJim Ingham {
1554a7015092SGreg Clayton     Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
15551b54c88cSJim Ingham     if (target == NULL)
15561b54c88cSJim Ingham     {
15579068d794SCaroline Tice         result.AppendError ("Invalid target.  No existing target or breakpoints.");
15581b54c88cSJim Ingham         result.SetStatus (eReturnStatusFailed);
15591b54c88cSJim Ingham         return false;
15601b54c88cSJim Ingham     }
15611b54c88cSJim Ingham 
15621b54c88cSJim Ingham     Mutex::Locker locker;
15631b54c88cSJim Ingham     target->GetBreakpointList().GetListMutex(locker);
15641b54c88cSJim Ingham 
15651b54c88cSJim Ingham     BreakpointIDList valid_bp_ids;
15661b54c88cSJim Ingham 
15671b54c88cSJim Ingham     CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids);
15681b54c88cSJim Ingham 
15691b54c88cSJim Ingham     if (result.Succeeded())
15701b54c88cSJim Ingham     {
1571c982c768SGreg Clayton         const size_t count = valid_bp_ids.GetSize();
1572c982c768SGreg Clayton         for (size_t i = 0; i < count; ++i)
15731b54c88cSJim Ingham         {
15741b54c88cSJim Ingham             BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
15751b54c88cSJim Ingham 
15761b54c88cSJim Ingham             if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
15771b54c88cSJim Ingham             {
15781b54c88cSJim Ingham                 Breakpoint *bp = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
15791b54c88cSJim Ingham                 if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
15801b54c88cSJim Ingham                 {
15811b54c88cSJim Ingham                     BreakpointLocation *location = bp->FindLocationByID (cur_bp_id.GetLocationID()).get();
15821b54c88cSJim Ingham                     if (location)
15831b54c88cSJim Ingham                     {
1584e0a97848SJim Ingham                         if (m_options.m_thread_id_passed)
15851b54c88cSJim Ingham                             location->SetThreadID (m_options.m_thread_id);
15861b54c88cSJim Ingham 
1587e0a97848SJim Ingham                         if (m_options.m_thread_index_passed)
1588e6bc6cb9SJim Ingham                             location->SetThreadIndex(m_options.m_thread_index);
15891b54c88cSJim Ingham 
1590b2a38a72SJim Ingham                         if (m_options.m_name_passed)
1591e6bc6cb9SJim Ingham                             location->SetThreadName(m_options.m_thread_name.c_str());
15921b54c88cSJim Ingham 
1593b2a38a72SJim Ingham                         if (m_options.m_queue_passed)
1594e6bc6cb9SJim Ingham                             location->SetQueueName(m_options.m_queue_name.c_str());
15951b54c88cSJim Ingham 
1596c982c768SGreg Clayton                         if (m_options.m_ignore_count != 0)
1597e6bc6cb9SJim Ingham                             location->SetIgnoreCount(m_options.m_ignore_count);
1598ae1c4cf5SJim Ingham 
1599ae1c4cf5SJim Ingham                         if (m_options.m_enable_passed)
1600ae1c4cf5SJim Ingham                             location->SetEnabled (m_options.m_enable_value);
160136f3b369SJim Ingham 
160236f3b369SJim Ingham                         if (m_options.m_condition_passed)
160336f3b369SJim Ingham                             location->SetCondition (m_options.m_condition.c_str());
16041b54c88cSJim Ingham                     }
16051b54c88cSJim Ingham                 }
16061b54c88cSJim Ingham                 else
16071b54c88cSJim Ingham                 {
1608e0a97848SJim Ingham                     if (m_options.m_thread_id_passed)
16091b54c88cSJim Ingham                         bp->SetThreadID (m_options.m_thread_id);
16101b54c88cSJim Ingham 
1611e0a97848SJim Ingham                     if (m_options.m_thread_index_passed)
1612e6bc6cb9SJim Ingham                         bp->SetThreadIndex(m_options.m_thread_index);
16131b54c88cSJim Ingham 
1614b2a38a72SJim Ingham                     if (m_options.m_name_passed)
1615e6bc6cb9SJim Ingham                         bp->SetThreadName(m_options.m_thread_name.c_str());
16161b54c88cSJim Ingham 
1617b2a38a72SJim Ingham                     if (m_options.m_queue_passed)
1618e6bc6cb9SJim Ingham                         bp->SetQueueName(m_options.m_queue_name.c_str());
16191b54c88cSJim Ingham 
1620c982c768SGreg Clayton                     if (m_options.m_ignore_count != 0)
1621e6bc6cb9SJim Ingham                         bp->SetIgnoreCount(m_options.m_ignore_count);
1622ae1c4cf5SJim Ingham 
1623ae1c4cf5SJim Ingham                     if (m_options.m_enable_passed)
1624ae1c4cf5SJim Ingham                         bp->SetEnabled (m_options.m_enable_value);
1625ae1c4cf5SJim Ingham 
162636f3b369SJim Ingham                     if (m_options.m_condition_passed)
162736f3b369SJim Ingham                         bp->SetCondition (m_options.m_condition.c_str());
16281b54c88cSJim Ingham                 }
16291b54c88cSJim Ingham             }
16301b54c88cSJim Ingham         }
16311b54c88cSJim Ingham     }
16321b54c88cSJim Ingham 
16331b54c88cSJim Ingham     return result.Succeeded();
16341b54c88cSJim Ingham }
16351b54c88cSJim Ingham 
16361b54c88cSJim Ingham 
1637