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 1093a64300SDaniel Malea #include "lldb/lldb-python.h" 1193a64300SDaniel Malea 1230fdc8d8SChris Lattner #include "CommandObjectBreakpoint.h" 1330fdc8d8SChris Lattner #include "CommandObjectBreakpointCommand.h" 1430fdc8d8SChris Lattner 1530fdc8d8SChris Lattner // C Includes 1630fdc8d8SChris Lattner // C++ Includes 1730fdc8d8SChris Lattner // Other libraries and framework includes 1830fdc8d8SChris Lattner // Project includes 1930fdc8d8SChris Lattner #include "lldb/Breakpoint/Breakpoint.h" 2030fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointIDList.h" 2130fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h" 225275aaa0SVince Harron #include "lldb/Host/StringConvert.h" 2340af72e1SJim Ingham #include "lldb/Interpreter/Options.h" 245e09c8c3SJim Ingham #include "lldb/Interpreter/OptionValueString.h" 255e09c8c3SJim Ingham #include "lldb/Interpreter/OptionValueUInt64.h" 2630fdc8d8SChris Lattner #include "lldb/Core/RegularExpression.h" 2730fdc8d8SChris Lattner #include "lldb/Core/StreamString.h" 2830fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h" 2930fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h" 3030fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3130fdc8d8SChris Lattner #include "lldb/Interpreter/CommandCompletions.h" 32b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h" 331b54c88cSJim Ingham #include "lldb/Target/Thread.h" 341b54c88cSJim Ingham #include "lldb/Target/ThreadSpec.h" 3530fdc8d8SChris Lattner 36b7234e40SJohnny Chen #include <vector> 37b7234e40SJohnny Chen 3830fdc8d8SChris Lattner using namespace lldb; 3930fdc8d8SChris Lattner using namespace lldb_private; 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner static void 4285e8b814SJim Ingham AddBreakpointDescription (Stream *s, Breakpoint *bp, lldb::DescriptionLevel level) 4330fdc8d8SChris Lattner { 4430fdc8d8SChris Lattner s->IndentMore(); 4530fdc8d8SChris Lattner bp->GetDescription (s, level, true); 4630fdc8d8SChris Lattner s->IndentLess(); 4730fdc8d8SChris Lattner s->EOL(); 4830fdc8d8SChris Lattner } 4930fdc8d8SChris Lattner 5030fdc8d8SChris Lattner //------------------------------------------------------------------------- 515a988416SJim Ingham // CommandObjectBreakpointSet 5230fdc8d8SChris Lattner //------------------------------------------------------------------------- 5330fdc8d8SChris Lattner 545a988416SJim Ingham 555a988416SJim Ingham class CommandObjectBreakpointSet : public CommandObjectParsed 565a988416SJim Ingham { 575a988416SJim Ingham public: 585a988416SJim Ingham 595a988416SJim Ingham typedef enum BreakpointSetType 605a988416SJim Ingham { 615a988416SJim Ingham eSetTypeInvalid, 625a988416SJim Ingham eSetTypeFileAndLine, 635a988416SJim Ingham eSetTypeAddress, 645a988416SJim Ingham eSetTypeFunctionName, 655a988416SJim Ingham eSetTypeFunctionRegexp, 665a988416SJim Ingham eSetTypeSourceRegexp, 675a988416SJim Ingham eSetTypeException 685a988416SJim Ingham } BreakpointSetType; 695a988416SJim Ingham 705a988416SJim Ingham CommandObjectBreakpointSet (CommandInterpreter &interpreter) : 715a988416SJim Ingham CommandObjectParsed (interpreter, 725a988416SJim Ingham "breakpoint set", 735a988416SJim Ingham "Sets a breakpoint or set of breakpoints in the executable.", 745a988416SJim Ingham "breakpoint set <cmd-options>"), 755a988416SJim Ingham m_options (interpreter) 765a988416SJim Ingham { 775a988416SJim Ingham } 785a988416SJim Ingham 795a988416SJim Ingham 805a988416SJim Ingham virtual 815a988416SJim Ingham ~CommandObjectBreakpointSet () {} 825a988416SJim Ingham 835a988416SJim Ingham virtual Options * 845a988416SJim Ingham GetOptions () 855a988416SJim Ingham { 865a988416SJim Ingham return &m_options; 875a988416SJim Ingham } 885a988416SJim Ingham 895a988416SJim Ingham class CommandOptions : public Options 905a988416SJim Ingham { 915a988416SJim Ingham public: 925a988416SJim Ingham 935a988416SJim Ingham CommandOptions (CommandInterpreter &interpreter) : 94eb0103f2SGreg Clayton Options (interpreter), 957d49c9c8SJohnny Chen m_condition (), 9687df91b8SJim Ingham m_filenames (), 9730fdc8d8SChris Lattner m_line_num (0), 9830fdc8d8SChris Lattner m_column (0), 99fab10e89SJim Ingham m_func_names (), 100fab10e89SJim Ingham m_func_name_type_mask (eFunctionNameTypeNone), 10130fdc8d8SChris Lattner m_func_regexp (), 102969795f1SJim Ingham m_source_text_regexp(), 10330fdc8d8SChris Lattner m_modules (), 1041b54c88cSJim Ingham m_load_addr(), 105c982c768SGreg Clayton m_ignore_count (0), 1061b54c88cSJim Ingham m_thread_id(LLDB_INVALID_THREAD_ID), 107c982c768SGreg Clayton m_thread_index (UINT32_MAX), 1081b54c88cSJim Ingham m_thread_name(), 109fab10e89SJim Ingham m_queue_name(), 110fab10e89SJim Ingham m_catch_bp (false), 1111f746071SGreg Clayton m_throw_bp (true), 112eb023e75SGreg Clayton m_hardware (false), 113a8558b62SJim Ingham m_language (eLanguageTypeUnknown), 114ca36cd16SJim Ingham m_skip_prologue (eLazyBoolCalculate), 115e732052fSJim Ingham m_one_shot (false), 116e732052fSJim Ingham m_all_files (false) 11730fdc8d8SChris Lattner { 11830fdc8d8SChris Lattner } 11930fdc8d8SChris Lattner 12030fdc8d8SChris Lattner 1215a988416SJim Ingham virtual 1225a988416SJim Ingham ~CommandOptions () {} 12387df91b8SJim Ingham 1245a988416SJim Ingham virtual Error 1255a988416SJim Ingham SetOptionValue (uint32_t option_idx, const char *option_arg) 12630fdc8d8SChris Lattner { 12730fdc8d8SChris Lattner Error error; 1283bcdfc0eSGreg Clayton const int short_option = m_getopt_table[option_idx].val; 12930fdc8d8SChris Lattner 13030fdc8d8SChris Lattner switch (short_option) 13130fdc8d8SChris Lattner { 13230fdc8d8SChris Lattner case 'a': 133b9d5df58SGreg Clayton { 134b9d5df58SGreg Clayton ExecutionContext exe_ctx (m_interpreter.GetExecutionContext()); 135b9d5df58SGreg Clayton m_load_addr = Args::StringToAddress(&exe_ctx, option_arg, LLDB_INVALID_ADDRESS, &error); 136b9d5df58SGreg Clayton } 13730fdc8d8SChris Lattner break; 13830fdc8d8SChris Lattner 139e732052fSJim Ingham case 'A': 140e732052fSJim Ingham m_all_files = true; 141e732052fSJim Ingham break; 142e732052fSJim Ingham 143ca36cd16SJim Ingham case 'b': 144ca36cd16SJim Ingham m_func_names.push_back (option_arg); 145ca36cd16SJim Ingham m_func_name_type_mask |= eFunctionNameTypeBase; 146ca36cd16SJim Ingham break; 147ca36cd16SJim Ingham 1487d49c9c8SJohnny Chen case 'C': 1495275aaa0SVince Harron m_column = StringConvert::ToUInt32 (option_arg, 0); 15030fdc8d8SChris Lattner break; 1510c5cd90dSGreg Clayton 1527d49c9c8SJohnny Chen case 'c': 1537d49c9c8SJohnny Chen m_condition.assign(option_arg); 1547d49c9c8SJohnny Chen break; 1557d49c9c8SJohnny Chen 15633df7cd3SJim Ingham case 'D': 15733df7cd3SJim Ingham m_use_dummy = true; 15833df7cd3SJim Ingham break; 15933df7cd3SJim Ingham 160fab10e89SJim Ingham case 'E': 161fab10e89SJim Ingham { 162fab10e89SJim Ingham LanguageType language = LanguageRuntime::GetLanguageTypeFromString (option_arg); 163fab10e89SJim Ingham 164fab10e89SJim Ingham switch (language) 165fab10e89SJim Ingham { 166fab10e89SJim Ingham case eLanguageTypeC89: 167fab10e89SJim Ingham case eLanguageTypeC: 168fab10e89SJim Ingham case eLanguageTypeC99: 1691d0089faSBruce Mitchener case eLanguageTypeC11: 170fab10e89SJim Ingham m_language = eLanguageTypeC; 171fab10e89SJim Ingham break; 172fab10e89SJim Ingham case eLanguageTypeC_plus_plus: 1731d0089faSBruce Mitchener case eLanguageTypeC_plus_plus_03: 1741d0089faSBruce Mitchener case eLanguageTypeC_plus_plus_11: 1752ba84a6aSBruce Mitchener case eLanguageTypeC_plus_plus_14: 176fab10e89SJim Ingham m_language = eLanguageTypeC_plus_plus; 177fab10e89SJim Ingham break; 178fab10e89SJim Ingham case eLanguageTypeObjC: 179fab10e89SJim Ingham m_language = eLanguageTypeObjC; 180fab10e89SJim Ingham break; 181fab10e89SJim Ingham case eLanguageTypeObjC_plus_plus: 182fab10e89SJim Ingham error.SetErrorStringWithFormat ("Set exception breakpoints separately for c++ and objective-c"); 183fab10e89SJim Ingham break; 184fab10e89SJim Ingham case eLanguageTypeUnknown: 185fab10e89SJim Ingham error.SetErrorStringWithFormat ("Unknown language type: '%s' for exception breakpoint", option_arg); 186fab10e89SJim Ingham break; 187fab10e89SJim Ingham default: 188fab10e89SJim Ingham error.SetErrorStringWithFormat ("Unsupported language type: '%s' for exception breakpoint", option_arg); 189fab10e89SJim Ingham } 190fab10e89SJim Ingham } 191fab10e89SJim Ingham break; 192ca36cd16SJim Ingham 193ca36cd16SJim Ingham case 'f': 194ca36cd16SJim Ingham m_filenames.AppendIfUnique (FileSpec(option_arg, false)); 195fab10e89SJim Ingham break; 196ca36cd16SJim Ingham 197ca36cd16SJim Ingham case 'F': 198ca36cd16SJim Ingham m_func_names.push_back (option_arg); 199ca36cd16SJim Ingham m_func_name_type_mask |= eFunctionNameTypeFull; 200ca36cd16SJim Ingham break; 201ca36cd16SJim Ingham 202fab10e89SJim Ingham case 'h': 203fab10e89SJim Ingham { 204fab10e89SJim Ingham bool success; 205fab10e89SJim Ingham m_catch_bp = Args::StringToBoolean (option_arg, true, &success); 206fab10e89SJim Ingham if (!success) 207fab10e89SJim Ingham error.SetErrorStringWithFormat ("Invalid boolean value for on-catch option: '%s'", option_arg); 208fab10e89SJim Ingham } 209168d469aSJim Ingham break; 210eb023e75SGreg Clayton 211eb023e75SGreg Clayton case 'H': 212eb023e75SGreg Clayton m_hardware = true; 213eb023e75SGreg Clayton break; 214eb023e75SGreg Clayton 215ca36cd16SJim Ingham case 'i': 216ca36cd16SJim Ingham { 2175275aaa0SVince Harron m_ignore_count = StringConvert::ToUInt32(option_arg, UINT32_MAX, 0); 218ca36cd16SJim Ingham if (m_ignore_count == UINT32_MAX) 219ca36cd16SJim Ingham error.SetErrorStringWithFormat ("invalid ignore count '%s'", option_arg); 220ca36cd16SJim Ingham break; 221ca36cd16SJim Ingham } 222ca36cd16SJim Ingham 223a8558b62SJim Ingham case 'K': 224a8558b62SJim Ingham { 225a8558b62SJim Ingham bool success; 226a8558b62SJim Ingham bool value; 227a8558b62SJim Ingham value = Args::StringToBoolean (option_arg, true, &success); 228a8558b62SJim Ingham if (value) 229a8558b62SJim Ingham m_skip_prologue = eLazyBoolYes; 230a8558b62SJim Ingham else 231a8558b62SJim Ingham m_skip_prologue = eLazyBoolNo; 232a8558b62SJim Ingham 233a8558b62SJim Ingham if (!success) 234a8558b62SJim Ingham error.SetErrorStringWithFormat ("Invalid boolean value for skip prologue option: '%s'", option_arg); 235a8558b62SJim Ingham } 236fab10e89SJim Ingham break; 237ca36cd16SJim Ingham 238ca36cd16SJim Ingham case 'l': 2395275aaa0SVince Harron m_line_num = StringConvert::ToUInt32 (option_arg, 0); 240ca36cd16SJim Ingham break; 241ca36cd16SJim Ingham 242ca36cd16SJim Ingham case 'M': 243ca36cd16SJim Ingham m_func_names.push_back (option_arg); 244ca36cd16SJim Ingham m_func_name_type_mask |= eFunctionNameTypeMethod; 245ca36cd16SJim Ingham break; 246ca36cd16SJim Ingham 247ca36cd16SJim Ingham case 'n': 248ca36cd16SJim Ingham m_func_names.push_back (option_arg); 249ca36cd16SJim Ingham m_func_name_type_mask |= eFunctionNameTypeAuto; 250ca36cd16SJim Ingham break; 251ca36cd16SJim Ingham 2525e09c8c3SJim Ingham case 'N': 2535e09c8c3SJim Ingham if (BreakpointID::StringIsBreakpointName(option_arg, error)) 2545e09c8c3SJim Ingham m_breakpoint_names.push_back (option_arg); 2555e09c8c3SJim Ingham break; 2565e09c8c3SJim Ingham 257ca36cd16SJim Ingham case 'o': 258ca36cd16SJim Ingham m_one_shot = true; 259ca36cd16SJim Ingham break; 260ca36cd16SJim Ingham 261ca36cd16SJim Ingham case 'p': 262ca36cd16SJim Ingham m_source_text_regexp.assign (option_arg); 263ca36cd16SJim Ingham break; 264ca36cd16SJim Ingham 265ca36cd16SJim Ingham case 'q': 266ca36cd16SJim Ingham m_queue_name.assign (option_arg); 267ca36cd16SJim Ingham break; 268ca36cd16SJim Ingham 269ca36cd16SJim Ingham case 'r': 270ca36cd16SJim Ingham m_func_regexp.assign (option_arg); 271ca36cd16SJim Ingham break; 272ca36cd16SJim Ingham 273ca36cd16SJim Ingham case 's': 274ca36cd16SJim Ingham { 275ca36cd16SJim Ingham m_modules.AppendIfUnique (FileSpec (option_arg, false)); 276ca36cd16SJim Ingham break; 277ca36cd16SJim Ingham } 278ca36cd16SJim Ingham 279ca36cd16SJim Ingham case 'S': 280ca36cd16SJim Ingham m_func_names.push_back (option_arg); 281ca36cd16SJim Ingham m_func_name_type_mask |= eFunctionNameTypeSelector; 282ca36cd16SJim Ingham break; 283ca36cd16SJim Ingham 284ca36cd16SJim Ingham case 't' : 285ca36cd16SJim Ingham { 2865275aaa0SVince Harron m_thread_id = StringConvert::ToUInt64(option_arg, LLDB_INVALID_THREAD_ID, 0); 287ca36cd16SJim Ingham if (m_thread_id == LLDB_INVALID_THREAD_ID) 288ca36cd16SJim Ingham error.SetErrorStringWithFormat ("invalid thread id string '%s'", option_arg); 289ca36cd16SJim Ingham } 290ca36cd16SJim Ingham break; 291ca36cd16SJim Ingham 292ca36cd16SJim Ingham case 'T': 293ca36cd16SJim Ingham m_thread_name.assign (option_arg); 294ca36cd16SJim Ingham break; 295ca36cd16SJim Ingham 296ca36cd16SJim Ingham case 'w': 297ca36cd16SJim Ingham { 298ca36cd16SJim Ingham bool success; 299ca36cd16SJim Ingham m_throw_bp = Args::StringToBoolean (option_arg, true, &success); 300ca36cd16SJim Ingham if (!success) 301ca36cd16SJim Ingham error.SetErrorStringWithFormat ("Invalid boolean value for on-throw option: '%s'", option_arg); 302ca36cd16SJim Ingham } 303ca36cd16SJim Ingham break; 304ca36cd16SJim Ingham 305ca36cd16SJim Ingham case 'x': 306ca36cd16SJim Ingham { 3075275aaa0SVince Harron m_thread_index = StringConvert::ToUInt32(option_arg, UINT32_MAX, 0); 308ca36cd16SJim Ingham if (m_thread_id == UINT32_MAX) 309ca36cd16SJim Ingham error.SetErrorStringWithFormat ("invalid thread index string '%s'", option_arg); 310ca36cd16SJim Ingham 311ca36cd16SJim Ingham } 312ca36cd16SJim Ingham break; 313ca36cd16SJim Ingham 31430fdc8d8SChris Lattner default: 31586edbf41SGreg Clayton error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option); 31630fdc8d8SChris Lattner break; 31730fdc8d8SChris Lattner } 31830fdc8d8SChris Lattner 31930fdc8d8SChris Lattner return error; 32030fdc8d8SChris Lattner } 32130fdc8d8SChris Lattner void 3225a988416SJim Ingham OptionParsingStarting () 32330fdc8d8SChris Lattner { 3247d49c9c8SJohnny Chen m_condition.clear(); 32587df91b8SJim Ingham m_filenames.Clear(); 32630fdc8d8SChris Lattner m_line_num = 0; 32730fdc8d8SChris Lattner m_column = 0; 328fab10e89SJim Ingham m_func_names.clear(); 3291f746071SGreg Clayton m_func_name_type_mask = eFunctionNameTypeNone; 33030fdc8d8SChris Lattner m_func_regexp.clear(); 3311f746071SGreg Clayton m_source_text_regexp.clear(); 33287df91b8SJim Ingham m_modules.Clear(); 3331f746071SGreg Clayton m_load_addr = LLDB_INVALID_ADDRESS; 334c982c768SGreg Clayton m_ignore_count = 0; 3351b54c88cSJim Ingham m_thread_id = LLDB_INVALID_THREAD_ID; 336c982c768SGreg Clayton m_thread_index = UINT32_MAX; 3371b54c88cSJim Ingham m_thread_name.clear(); 3381b54c88cSJim Ingham m_queue_name.clear(); 339fab10e89SJim Ingham m_catch_bp = false; 340fab10e89SJim Ingham m_throw_bp = true; 341eb023e75SGreg Clayton m_hardware = false; 3421f746071SGreg Clayton m_language = eLanguageTypeUnknown; 343a8558b62SJim Ingham m_skip_prologue = eLazyBoolCalculate; 344ca36cd16SJim Ingham m_one_shot = false; 34533df7cd3SJim Ingham m_use_dummy = false; 3465e09c8c3SJim Ingham m_breakpoint_names.clear(); 347e732052fSJim Ingham m_all_files = false; 34830fdc8d8SChris Lattner } 34930fdc8d8SChris Lattner 3505a988416SJim Ingham const OptionDefinition* 3515a988416SJim Ingham GetDefinitions () 35230fdc8d8SChris Lattner { 3535a988416SJim Ingham return g_option_table; 35430fdc8d8SChris Lattner } 35530fdc8d8SChris Lattner 3565a988416SJim Ingham // Options table: Required for subclasses of Options. 35730fdc8d8SChris Lattner 3585a988416SJim Ingham static OptionDefinition g_option_table[]; 35930fdc8d8SChris Lattner 3605a988416SJim Ingham // Instance variables to hold the values for command options. 361969795f1SJim Ingham 3625a988416SJim Ingham std::string m_condition; 3635a988416SJim Ingham FileSpecList m_filenames; 3645a988416SJim Ingham uint32_t m_line_num; 3655a988416SJim Ingham uint32_t m_column; 3665a988416SJim Ingham std::vector<std::string> m_func_names; 3675e09c8c3SJim Ingham std::vector<std::string> m_breakpoint_names; 3685a988416SJim Ingham uint32_t m_func_name_type_mask; 3695a988416SJim Ingham std::string m_func_regexp; 3705a988416SJim Ingham std::string m_source_text_regexp; 3715a988416SJim Ingham FileSpecList m_modules; 3725a988416SJim Ingham lldb::addr_t m_load_addr; 3735a988416SJim Ingham uint32_t m_ignore_count; 3745a988416SJim Ingham lldb::tid_t m_thread_id; 3755a988416SJim Ingham uint32_t m_thread_index; 3765a988416SJim Ingham std::string m_thread_name; 3775a988416SJim Ingham std::string m_queue_name; 3785a988416SJim Ingham bool m_catch_bp; 3795a988416SJim Ingham bool m_throw_bp; 380eb023e75SGreg Clayton bool m_hardware; // Request to use hardware breakpoints 3815a988416SJim Ingham lldb::LanguageType m_language; 3825a988416SJim Ingham LazyBool m_skip_prologue; 383ca36cd16SJim Ingham bool m_one_shot; 38433df7cd3SJim Ingham bool m_use_dummy; 385e732052fSJim Ingham bool m_all_files; 3865a988416SJim Ingham 3875a988416SJim Ingham }; 3885a988416SJim Ingham 3895a988416SJim Ingham protected: 3905a988416SJim Ingham virtual bool 3915a988416SJim Ingham DoExecute (Args& command, 3925a988416SJim Ingham CommandReturnObject &result) 39330fdc8d8SChris Lattner { 39433df7cd3SJim Ingham Target *target = GetSelectedOrDummyTarget(m_options.m_use_dummy); 39533df7cd3SJim Ingham 396893c932aSJim Ingham if (target == nullptr) 39730fdc8d8SChris Lattner { 398effe5c95SGreg Clayton result.AppendError ("Invalid target. Must set target before setting breakpoints (see 'target create' command)."); 39930fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 40030fdc8d8SChris Lattner return false; 40130fdc8d8SChris Lattner } 40230fdc8d8SChris Lattner 40330fdc8d8SChris Lattner // The following are the various types of breakpoints that could be set: 40430fdc8d8SChris Lattner // 1). -f -l -p [-s -g] (setting breakpoint by source location) 40530fdc8d8SChris Lattner // 2). -a [-s -g] (setting breakpoint by address) 40630fdc8d8SChris Lattner // 3). -n [-s -g] (setting breakpoint by function name) 40730fdc8d8SChris Lattner // 4). -r [-s -g] (setting breakpoint by function name regular expression) 408969795f1SJim Ingham // 5). -p -f (setting a breakpoint by comparing a reg-exp to source text) 409fab10e89SJim Ingham // 6). -E [-w -h] (setting a breakpoint for exceptions for a given language.) 41030fdc8d8SChris Lattner 41130fdc8d8SChris Lattner BreakpointSetType break_type = eSetTypeInvalid; 41230fdc8d8SChris Lattner 41330fdc8d8SChris Lattner if (m_options.m_line_num != 0) 41430fdc8d8SChris Lattner break_type = eSetTypeFileAndLine; 41530fdc8d8SChris Lattner else if (m_options.m_load_addr != LLDB_INVALID_ADDRESS) 41630fdc8d8SChris Lattner break_type = eSetTypeAddress; 417fab10e89SJim Ingham else if (!m_options.m_func_names.empty()) 41830fdc8d8SChris Lattner break_type = eSetTypeFunctionName; 41930fdc8d8SChris Lattner else if (!m_options.m_func_regexp.empty()) 42030fdc8d8SChris Lattner break_type = eSetTypeFunctionRegexp; 421969795f1SJim Ingham else if (!m_options.m_source_text_regexp.empty()) 422969795f1SJim Ingham break_type = eSetTypeSourceRegexp; 423fab10e89SJim Ingham else if (m_options.m_language != eLanguageTypeUnknown) 424fab10e89SJim Ingham break_type = eSetTypeException; 42530fdc8d8SChris Lattner 42630fdc8d8SChris Lattner Breakpoint *bp = NULL; 427274060b6SGreg Clayton FileSpec module_spec; 428a8558b62SJim Ingham const bool internal = false; 429a8558b62SJim Ingham 43030fdc8d8SChris Lattner switch (break_type) 43130fdc8d8SChris Lattner { 43230fdc8d8SChris Lattner case eSetTypeFileAndLine: // Breakpoint by source position 43330fdc8d8SChris Lattner { 43430fdc8d8SChris Lattner FileSpec file; 435c7bece56SGreg Clayton const size_t num_files = m_options.m_filenames.GetSize(); 43687df91b8SJim Ingham if (num_files == 0) 43787df91b8SJim Ingham { 43887df91b8SJim Ingham if (!GetDefaultFile (target, file, result)) 43987df91b8SJim Ingham { 44087df91b8SJim Ingham result.AppendError("No file supplied and no default file available."); 44187df91b8SJim Ingham result.SetStatus (eReturnStatusFailed); 44287df91b8SJim Ingham return false; 44387df91b8SJim Ingham } 44487df91b8SJim Ingham } 44587df91b8SJim Ingham else if (num_files > 1) 44687df91b8SJim Ingham { 44787df91b8SJim Ingham result.AppendError("Only one file at a time is allowed for file and line breakpoints."); 44887df91b8SJim Ingham result.SetStatus (eReturnStatusFailed); 44987df91b8SJim Ingham return false; 45087df91b8SJim Ingham } 45187df91b8SJim Ingham else 45287df91b8SJim Ingham file = m_options.m_filenames.GetFileSpecAtIndex(0); 45330fdc8d8SChris Lattner 4541f746071SGreg Clayton // Only check for inline functions if 4551f746071SGreg Clayton LazyBool check_inlines = eLazyBoolCalculate; 4561f746071SGreg Clayton 45787df91b8SJim Ingham bp = target->CreateBreakpoint (&(m_options.m_modules), 45830fdc8d8SChris Lattner file, 45930fdc8d8SChris Lattner m_options.m_line_num, 4601f746071SGreg Clayton check_inlines, 461a8558b62SJim Ingham m_options.m_skip_prologue, 462eb023e75SGreg Clayton internal, 463eb023e75SGreg Clayton m_options.m_hardware).get(); 46430fdc8d8SChris Lattner } 46530fdc8d8SChris Lattner break; 4666eee5aa0SGreg Clayton 46730fdc8d8SChris Lattner case eSetTypeAddress: // Breakpoint by address 468eb023e75SGreg Clayton bp = target->CreateBreakpoint (m_options.m_load_addr, 469eb023e75SGreg Clayton internal, 470eb023e75SGreg Clayton m_options.m_hardware).get(); 47130fdc8d8SChris Lattner break; 4720c5cd90dSGreg Clayton 47330fdc8d8SChris Lattner case eSetTypeFunctionName: // Breakpoint by function name 4740c5cd90dSGreg Clayton { 4750c5cd90dSGreg Clayton uint32_t name_type_mask = m_options.m_func_name_type_mask; 4760c5cd90dSGreg Clayton 4770c5cd90dSGreg Clayton if (name_type_mask == 0) 478e02b8504SGreg Clayton name_type_mask = eFunctionNameTypeAuto; 4790c5cd90dSGreg Clayton 48087df91b8SJim Ingham bp = target->CreateBreakpoint (&(m_options.m_modules), 48187df91b8SJim Ingham &(m_options.m_filenames), 482fab10e89SJim Ingham m_options.m_func_names, 483274060b6SGreg Clayton name_type_mask, 484a8558b62SJim Ingham m_options.m_skip_prologue, 485eb023e75SGreg Clayton internal, 486eb023e75SGreg Clayton m_options.m_hardware).get(); 4870c5cd90dSGreg Clayton } 48830fdc8d8SChris Lattner break; 4890c5cd90dSGreg Clayton 49030fdc8d8SChris Lattner case eSetTypeFunctionRegexp: // Breakpoint by regular expression function name 49130fdc8d8SChris Lattner { 49230fdc8d8SChris Lattner RegularExpression regexp(m_options.m_func_regexp.c_str()); 493969795f1SJim Ingham if (!regexp.IsValid()) 49430fdc8d8SChris Lattner { 495969795f1SJim Ingham char err_str[1024]; 496969795f1SJim Ingham regexp.GetErrorAsCString(err_str, sizeof(err_str)); 497969795f1SJim Ingham result.AppendErrorWithFormat("Function name regular expression could not be compiled: \"%s\"", 498969795f1SJim Ingham err_str); 49930fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 500969795f1SJim Ingham return false; 50130fdc8d8SChris Lattner } 50287df91b8SJim Ingham 503a8558b62SJim Ingham bp = target->CreateFuncRegexBreakpoint (&(m_options.m_modules), 504a8558b62SJim Ingham &(m_options.m_filenames), 505a8558b62SJim Ingham regexp, 506a8558b62SJim Ingham m_options.m_skip_prologue, 507eb023e75SGreg Clayton internal, 508eb023e75SGreg Clayton m_options.m_hardware).get(); 50930fdc8d8SChris Lattner } 51030fdc8d8SChris Lattner break; 511969795f1SJim Ingham case eSetTypeSourceRegexp: // Breakpoint by regexp on source text. 512969795f1SJim Ingham { 513c7bece56SGreg Clayton const size_t num_files = m_options.m_filenames.GetSize(); 51487df91b8SJim Ingham 515e732052fSJim Ingham if (num_files == 0 && !m_options.m_all_files) 51687df91b8SJim Ingham { 517969795f1SJim Ingham FileSpec file; 51887df91b8SJim Ingham if (!GetDefaultFile (target, file, result)) 51987df91b8SJim Ingham { 52087df91b8SJim Ingham result.AppendError ("No files provided and could not find default file."); 52187df91b8SJim Ingham result.SetStatus (eReturnStatusFailed); 52287df91b8SJim Ingham return false; 52387df91b8SJim Ingham } 52487df91b8SJim Ingham else 52587df91b8SJim Ingham { 52687df91b8SJim Ingham m_options.m_filenames.Append (file); 52787df91b8SJim Ingham } 52887df91b8SJim Ingham } 5290c5cd90dSGreg Clayton 530969795f1SJim Ingham RegularExpression regexp(m_options.m_source_text_regexp.c_str()); 531969795f1SJim Ingham if (!regexp.IsValid()) 532969795f1SJim Ingham { 533969795f1SJim Ingham char err_str[1024]; 534969795f1SJim Ingham regexp.GetErrorAsCString(err_str, sizeof(err_str)); 535969795f1SJim Ingham result.AppendErrorWithFormat("Source text regular expression could not be compiled: \"%s\"", 536969795f1SJim Ingham err_str); 537969795f1SJim Ingham result.SetStatus (eReturnStatusFailed); 538969795f1SJim Ingham return false; 539969795f1SJim Ingham } 540eb023e75SGreg Clayton bp = target->CreateSourceRegexBreakpoint (&(m_options.m_modules), 541eb023e75SGreg Clayton &(m_options.m_filenames), 542eb023e75SGreg Clayton regexp, 543eb023e75SGreg Clayton internal, 544eb023e75SGreg Clayton m_options.m_hardware).get(); 545969795f1SJim Ingham } 546969795f1SJim Ingham break; 547fab10e89SJim Ingham case eSetTypeException: 548fab10e89SJim Ingham { 549eb023e75SGreg Clayton bp = target->CreateExceptionBreakpoint (m_options.m_language, 550eb023e75SGreg Clayton m_options.m_catch_bp, 551eb023e75SGreg Clayton m_options.m_throw_bp, 552eb023e75SGreg Clayton m_options.m_hardware).get(); 553fab10e89SJim Ingham } 554fab10e89SJim Ingham break; 55530fdc8d8SChris Lattner default: 55630fdc8d8SChris Lattner break; 55730fdc8d8SChris Lattner } 55830fdc8d8SChris Lattner 5591b54c88cSJim Ingham // Now set the various options that were passed in: 5601b54c88cSJim Ingham if (bp) 5611b54c88cSJim Ingham { 5621b54c88cSJim Ingham if (m_options.m_thread_id != LLDB_INVALID_THREAD_ID) 5631b54c88cSJim Ingham bp->SetThreadID (m_options.m_thread_id); 5641b54c88cSJim Ingham 565c982c768SGreg Clayton if (m_options.m_thread_index != UINT32_MAX) 5661b54c88cSJim Ingham bp->GetOptions()->GetThreadSpec()->SetIndex(m_options.m_thread_index); 5671b54c88cSJim Ingham 5681b54c88cSJim Ingham if (!m_options.m_thread_name.empty()) 5691b54c88cSJim Ingham bp->GetOptions()->GetThreadSpec()->SetName(m_options.m_thread_name.c_str()); 5701b54c88cSJim Ingham 5711b54c88cSJim Ingham if (!m_options.m_queue_name.empty()) 5721b54c88cSJim Ingham bp->GetOptions()->GetThreadSpec()->SetQueueName(m_options.m_queue_name.c_str()); 5731b54c88cSJim Ingham 574c982c768SGreg Clayton if (m_options.m_ignore_count != 0) 5751b54c88cSJim Ingham bp->GetOptions()->SetIgnoreCount(m_options.m_ignore_count); 5767d49c9c8SJohnny Chen 5777d49c9c8SJohnny Chen if (!m_options.m_condition.empty()) 5787d49c9c8SJohnny Chen bp->GetOptions()->SetCondition(m_options.m_condition.c_str()); 579ca36cd16SJim Ingham 5805e09c8c3SJim Ingham if (!m_options.m_breakpoint_names.empty()) 5815e09c8c3SJim Ingham { 5825e09c8c3SJim Ingham Error error; // We don't need to check the error here, since the option parser checked it... 5835e09c8c3SJim Ingham for (auto name : m_options.m_breakpoint_names) 5845e09c8c3SJim Ingham bp->AddName(name.c_str(), error); 5855e09c8c3SJim Ingham } 5865e09c8c3SJim Ingham 587ca36cd16SJim Ingham bp->SetOneShot (m_options.m_one_shot); 5881b54c88cSJim Ingham } 5891b54c88cSJim Ingham 590969795f1SJim Ingham if (bp) 59130fdc8d8SChris Lattner { 59285e8b814SJim Ingham Stream &output_stream = result.GetOutputStream(); 5931391cc7dSJim Ingham const bool show_locations = false; 5941391cc7dSJim Ingham bp->GetDescription(&output_stream, lldb::eDescriptionLevelInitial, show_locations); 5954aeb1989SJim Ingham if (target == m_interpreter.GetDebugger().GetDummyTarget()) 5964aeb1989SJim Ingham output_stream.Printf ("Breakpoint set in dummy target, will get copied into future targets.\n"); 5974aeb1989SJim Ingham else 5984aeb1989SJim Ingham { 599fab10e89SJim Ingham // Don't print out this warning for exception breakpoints. They can get set before the target 600fab10e89SJim Ingham // is set, but we won't know how to actually set the breakpoint till we run. 601fab10e89SJim Ingham if (bp->GetNumLocations() == 0 && break_type != eSetTypeException) 6024aeb1989SJim Ingham { 603be484f41SCaroline Tice output_stream.Printf ("WARNING: Unable to resolve breakpoint to any actual locations.\n"); 6044aeb1989SJim Ingham } 6054aeb1989SJim Ingham } 60630fdc8d8SChris Lattner result.SetStatus (eReturnStatusSuccessFinishResult); 60730fdc8d8SChris Lattner } 60830fdc8d8SChris Lattner else if (!bp) 60930fdc8d8SChris Lattner { 61030fdc8d8SChris Lattner result.AppendError ("Breakpoint creation failed: No breakpoint created."); 61130fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 61230fdc8d8SChris Lattner } 61330fdc8d8SChris Lattner 61430fdc8d8SChris Lattner return result.Succeeded(); 61530fdc8d8SChris Lattner } 61630fdc8d8SChris Lattner 6175a988416SJim Ingham private: 6185a988416SJim Ingham bool 6195a988416SJim Ingham GetDefaultFile (Target *target, FileSpec &file, CommandReturnObject &result) 6205a988416SJim Ingham { 6215a988416SJim Ingham uint32_t default_line; 6225a988416SJim Ingham // First use the Source Manager's default file. 6235a988416SJim Ingham // Then use the current stack frame's file. 6245a988416SJim Ingham if (!target->GetSourceManager().GetDefaultFileAndLine(file, default_line)) 6255a988416SJim Ingham { 626b57e4a1bSJason Molenda StackFrame *cur_frame = m_exe_ctx.GetFramePtr(); 6275a988416SJim Ingham if (cur_frame == NULL) 6285a988416SJim Ingham { 6295a988416SJim Ingham result.AppendError ("No selected frame to use to find the default file."); 6305a988416SJim Ingham result.SetStatus (eReturnStatusFailed); 6315a988416SJim Ingham return false; 6325a988416SJim Ingham } 6335a988416SJim Ingham else if (!cur_frame->HasDebugInformation()) 6345a988416SJim Ingham { 6355a988416SJim Ingham result.AppendError ("Cannot use the selected frame to find the default file, it has no debug info."); 6365a988416SJim Ingham result.SetStatus (eReturnStatusFailed); 6375a988416SJim Ingham return false; 6385a988416SJim Ingham } 6395a988416SJim Ingham else 6405a988416SJim Ingham { 6415a988416SJim Ingham const SymbolContext &sc = cur_frame->GetSymbolContext (eSymbolContextLineEntry); 6425a988416SJim Ingham if (sc.line_entry.file) 6435a988416SJim Ingham { 6445a988416SJim Ingham file = sc.line_entry.file; 6455a988416SJim Ingham } 6465a988416SJim Ingham else 6475a988416SJim Ingham { 6485a988416SJim Ingham result.AppendError ("Can't find the file for the selected frame to use as the default file."); 6495a988416SJim Ingham result.SetStatus (eReturnStatusFailed); 6505a988416SJim Ingham return false; 6515a988416SJim Ingham } 6525a988416SJim Ingham } 6535a988416SJim Ingham } 6545a988416SJim Ingham return true; 6555a988416SJim Ingham } 6565a988416SJim Ingham 6575a988416SJim Ingham CommandOptions m_options; 6585a988416SJim Ingham }; 6595a988416SJim Ingham // If an additional option set beyond LLDB_OPTION_SET_10 is added, make sure to 6605a988416SJim Ingham // update the numbers passed to LLDB_OPT_SET_FROM_TO(...) appropriately. 6615a988416SJim Ingham #define LLDB_OPT_FILE ( LLDB_OPT_SET_FROM_TO(1, 9) & ~LLDB_OPT_SET_2 ) 6625a988416SJim Ingham #define LLDB_OPT_NOT_10 ( LLDB_OPT_SET_FROM_TO(1, 10) & ~LLDB_OPT_SET_10 ) 6635a988416SJim Ingham #define LLDB_OPT_SKIP_PROLOGUE ( LLDB_OPT_SET_1 | LLDB_OPT_SET_FROM_TO(3,8) ) 6645a988416SJim Ingham 6655a988416SJim Ingham OptionDefinition 6665a988416SJim Ingham CommandObjectBreakpointSet::CommandOptions::g_option_table[] = 6675a988416SJim Ingham { 668d37221dcSZachary Turner { LLDB_OPT_NOT_10, false, "shlib", 's', OptionParser::eRequiredArgument, NULL, NULL, CommandCompletions::eModuleCompletion, eArgTypeShlibName, 6695a988416SJim Ingham "Set the breakpoint only in this shared library. " 6705a988416SJim Ingham "Can repeat this option multiple times to specify multiple shared libraries."}, 6715a988416SJim Ingham 672d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "ignore-count", 'i', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeCount, 6735a988416SJim Ingham "Set the number of times this breakpoint is skipped before stopping." }, 6745a988416SJim Ingham 675d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "one-shot", 'o', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, 676b2b256afSJim Ingham "The breakpoint is deleted the first time it causes a stop." }, 677ca36cd16SJim Ingham 678d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "condition", 'c', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeExpression, 6795a988416SJim Ingham "The breakpoint stops only if this condition expression evaluates to true."}, 6805a988416SJim Ingham 681d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "thread-index", 'x', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeThreadIndex, 682a89be91fSJim Ingham "The breakpoint stops only for the thread whose indeX matches this argument."}, 6835a988416SJim Ingham 684d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "thread-id", 't', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeThreadID, 6855a988416SJim Ingham "The breakpoint stops only for the thread whose TID matches this argument."}, 6865a988416SJim Ingham 687d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "thread-name", 'T', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeThreadName, 6885a988416SJim Ingham "The breakpoint stops only for the thread whose thread name matches this argument."}, 6895a988416SJim Ingham 690d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "hardware", 'H', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, 691eb023e75SGreg Clayton "Require the breakpoint to use hardware breakpoints."}, 692eb023e75SGreg Clayton 693d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "queue-name", 'q', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeQueueName, 6945a988416SJim Ingham "The breakpoint stops only for threads in the queue whose name is given by this argument."}, 6955a988416SJim Ingham 696d37221dcSZachary Turner { LLDB_OPT_FILE, false, "file", 'f', OptionParser::eRequiredArgument, NULL, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename, 697289aca64SJim Ingham "Specifies the source file in which to set this breakpoint. " 698289aca64SJim Ingham "Note, by default lldb only looks for files that are #included if they use the standard include file extensions. " 6996394479eSJim Ingham "To set breakpoints on .c/.cpp/.m/.mm files that are #included, set target.inline-breakpoint-strategy" 700289aca64SJim Ingham " to \"always\"."}, 7015a988416SJim Ingham 702d37221dcSZachary Turner { LLDB_OPT_SET_1, true, "line", 'l', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeLineNum, 7035a988416SJim Ingham "Specifies the line number on which to set this breakpoint."}, 7045a988416SJim Ingham 7055a988416SJim Ingham // Comment out this option for the moment, as we don't actually use it, but will in the future. 7065a988416SJim Ingham // This way users won't see it, but the infrastructure is left in place. 707e2607b50SVirgile Bello // { 0, false, "column", 'C', OptionParser::eRequiredArgument, NULL, "<column>", 7085a988416SJim Ingham // "Set the breakpoint by source location at this particular column."}, 7095a988416SJim Ingham 710d37221dcSZachary Turner { LLDB_OPT_SET_2, true, "address", 'a', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeAddressOrExpression, 7115a988416SJim Ingham "Set the breakpoint by address, at the specified address."}, 7125a988416SJim Ingham 713d37221dcSZachary Turner { LLDB_OPT_SET_3, true, "name", 'n', OptionParser::eRequiredArgument, NULL, NULL, CommandCompletions::eSymbolCompletion, eArgTypeFunctionName, 714551262d7SJim Ingham "Set the breakpoint by function name. Can be repeated multiple times to make one breakpoint for multiple names" }, 7155a988416SJim Ingham 716d37221dcSZachary Turner { LLDB_OPT_SET_4, true, "fullname", 'F', OptionParser::eRequiredArgument, NULL, NULL, CommandCompletions::eSymbolCompletion, eArgTypeFullName, 7175a988416SJim Ingham "Set the breakpoint by fully qualified function names. For C++ this means namespaces and all arguments, and " 7185a988416SJim Ingham "for Objective C this means a full function prototype with class and selector. " 7195a988416SJim Ingham "Can be repeated multiple times to make one breakpoint for multiple names." }, 7205a988416SJim Ingham 721d37221dcSZachary Turner { LLDB_OPT_SET_5, true, "selector", 'S', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeSelector, 7225a988416SJim Ingham "Set the breakpoint by ObjC selector name. Can be repeated multiple times to make one breakpoint for multiple Selectors." }, 7235a988416SJim Ingham 724d37221dcSZachary Turner { LLDB_OPT_SET_6, true, "method", 'M', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeMethod, 7255a988416SJim Ingham "Set the breakpoint by C++ method names. Can be repeated multiple times to make one breakpoint for multiple methods." }, 7265a988416SJim Ingham 727d37221dcSZachary Turner { LLDB_OPT_SET_7, true, "func-regex", 'r', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeRegularExpression, 7285a988416SJim Ingham "Set the breakpoint by function name, evaluating a regular-expression to find the function name(s)." }, 7295a988416SJim Ingham 730d37221dcSZachary Turner { LLDB_OPT_SET_8, true, "basename", 'b', OptionParser::eRequiredArgument, NULL, NULL, CommandCompletions::eSymbolCompletion, eArgTypeFunctionName, 7315a988416SJim Ingham "Set the breakpoint by function basename (C++ namespaces and arguments will be ignored). " 7325a988416SJim Ingham "Can be repeated multiple times to make one breakpoint for multiple symbols." }, 7335a988416SJim Ingham 734d37221dcSZachary Turner { LLDB_OPT_SET_9, true, "source-pattern-regexp", 'p', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeRegularExpression, 735e96ade8bSJim Ingham "Set the breakpoint by specifying a regular expression which is matched against the source text in a source file or files " 736e96ade8bSJim Ingham "specified with the -f option. The -f option can be specified more than once. " 737e96ade8bSJim Ingham "If no source files are specified, uses the current \"default source file\"" }, 7385a988416SJim Ingham 739e732052fSJim Ingham { LLDB_OPT_SET_9, false, "all-files", 'A', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, 740e732052fSJim Ingham "All files are searched for source pattern matches." }, 741e732052fSJim Ingham 742d37221dcSZachary Turner { LLDB_OPT_SET_10, true, "language-exception", 'E', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeLanguage, 7435a988416SJim Ingham "Set the breakpoint on exceptions thrown by the specified language (without options, on throw but not catch.)" }, 7445a988416SJim Ingham 745d37221dcSZachary Turner { LLDB_OPT_SET_10, false, "on-throw", 'w', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeBoolean, 7465a988416SJim Ingham "Set the breakpoint on exception throW." }, 7475a988416SJim Ingham 748d37221dcSZachary Turner { LLDB_OPT_SET_10, false, "on-catch", 'h', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeBoolean, 7495a988416SJim Ingham "Set the breakpoint on exception catcH." }, 7505a988416SJim Ingham 751d37221dcSZachary Turner { LLDB_OPT_SKIP_PROLOGUE, false, "skip-prologue", 'K', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeBoolean, 7525a988416SJim Ingham "sKip the prologue if the breakpoint is at the beginning of a function. If not set the target.skip-prologue setting is used." }, 7535a988416SJim Ingham 75433df7cd3SJim Ingham { LLDB_OPT_SET_ALL, false, "dummy-breakpoints", 'D', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, 75533df7cd3SJim Ingham "Sets Dummy breakpoints - i.e. breakpoints set before a file is provided, which prime new targets."}, 75633df7cd3SJim Ingham 7575e09c8c3SJim Ingham { LLDB_OPT_SET_ALL, false, "breakpoint-name", 'N', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeBreakpointName, 7585e09c8c3SJim Ingham "Adds this to the list of names for this breakopint."}, 7595e09c8c3SJim Ingham 760d37221dcSZachary Turner { 0, false, NULL, 0, 0, NULL, NULL, 0, eArgTypeNone, NULL } 7615a988416SJim Ingham }; 7625a988416SJim Ingham 7635a988416SJim Ingham //------------------------------------------------------------------------- 7645a988416SJim Ingham // CommandObjectBreakpointModify 7655a988416SJim Ingham //------------------------------------------------------------------------- 7665a988416SJim Ingham #pragma mark Modify 7675a988416SJim Ingham 7685a988416SJim Ingham class CommandObjectBreakpointModify : public CommandObjectParsed 7695a988416SJim Ingham { 7705a988416SJim Ingham public: 7715a988416SJim Ingham 7725a988416SJim Ingham CommandObjectBreakpointModify (CommandInterpreter &interpreter) : 7735a988416SJim Ingham CommandObjectParsed (interpreter, 7745a988416SJim Ingham "breakpoint modify", 7755a988416SJim Ingham "Modify the options on a breakpoint or set of breakpoints in the executable. " 7765a988416SJim Ingham "If no breakpoint is specified, acts on the last created breakpoint. " 7775a988416SJim Ingham "With the exception of -e, -d and -i, passing an empty argument clears the modification.", 7785a988416SJim Ingham NULL), 7795a988416SJim Ingham m_options (interpreter) 7805a988416SJim Ingham { 7815a988416SJim Ingham CommandArgumentEntry arg; 7825a988416SJim Ingham CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange); 7835a988416SJim Ingham // Add the entry for the first argument for this command to the object's arguments vector. 7845a988416SJim Ingham m_arguments.push_back (arg); 7855a988416SJim Ingham } 7865a988416SJim Ingham 7875a988416SJim Ingham 7885a988416SJim Ingham virtual 7895a988416SJim Ingham ~CommandObjectBreakpointModify () {} 7905a988416SJim Ingham 7915a988416SJim Ingham virtual Options * 7925a988416SJim Ingham GetOptions () 7935a988416SJim Ingham { 7945a988416SJim Ingham return &m_options; 7955a988416SJim Ingham } 7965a988416SJim Ingham 7975a988416SJim Ingham class CommandOptions : public Options 7985a988416SJim Ingham { 7995a988416SJim Ingham public: 8005a988416SJim Ingham 8015a988416SJim Ingham CommandOptions (CommandInterpreter &interpreter) : 8025a988416SJim Ingham Options (interpreter), 8035a988416SJim Ingham m_ignore_count (0), 8045a988416SJim Ingham m_thread_id(LLDB_INVALID_THREAD_ID), 8055a988416SJim Ingham m_thread_id_passed(false), 8065a988416SJim Ingham m_thread_index (UINT32_MAX), 8075a988416SJim Ingham m_thread_index_passed(false), 8085a988416SJim Ingham m_thread_name(), 8095a988416SJim Ingham m_queue_name(), 8105a988416SJim Ingham m_condition (), 811ca36cd16SJim Ingham m_one_shot (false), 8125a988416SJim Ingham m_enable_passed (false), 8135a988416SJim Ingham m_enable_value (false), 8145a988416SJim Ingham m_name_passed (false), 8155a988416SJim Ingham m_queue_passed (false), 816ca36cd16SJim Ingham m_condition_passed (false), 81733df7cd3SJim Ingham m_one_shot_passed (false), 81833df7cd3SJim Ingham m_use_dummy (false) 8195a988416SJim Ingham { 8205a988416SJim Ingham } 8215a988416SJim Ingham 8225a988416SJim Ingham virtual 8235a988416SJim Ingham ~CommandOptions () {} 8245a988416SJim Ingham 8255a988416SJim Ingham virtual Error 8265a988416SJim Ingham SetOptionValue (uint32_t option_idx, const char *option_arg) 8275a988416SJim Ingham { 8285a988416SJim Ingham Error error; 8293bcdfc0eSGreg Clayton const int short_option = m_getopt_table[option_idx].val; 8305a988416SJim Ingham 8315a988416SJim Ingham switch (short_option) 8325a988416SJim Ingham { 8335a988416SJim Ingham case 'c': 8345a988416SJim Ingham if (option_arg != NULL) 8355a988416SJim Ingham m_condition.assign (option_arg); 8365a988416SJim Ingham else 8375a988416SJim Ingham m_condition.clear(); 8385a988416SJim Ingham m_condition_passed = true; 8395a988416SJim Ingham break; 8405a988416SJim Ingham case 'd': 8415a988416SJim Ingham m_enable_passed = true; 8425a988416SJim Ingham m_enable_value = false; 8435a988416SJim Ingham break; 84433df7cd3SJim Ingham case 'D': 84533df7cd3SJim Ingham m_use_dummy = true; 84633df7cd3SJim Ingham break; 8475a988416SJim Ingham case 'e': 8485a988416SJim Ingham m_enable_passed = true; 8495a988416SJim Ingham m_enable_value = true; 8505a988416SJim Ingham break; 8515a988416SJim Ingham case 'i': 8525a988416SJim Ingham { 8535275aaa0SVince Harron m_ignore_count = StringConvert::ToUInt32(option_arg, UINT32_MAX, 0); 8545a988416SJim Ingham if (m_ignore_count == UINT32_MAX) 8555a988416SJim Ingham error.SetErrorStringWithFormat ("invalid ignore count '%s'", option_arg); 8565a988416SJim Ingham } 8575a988416SJim Ingham break; 858ca36cd16SJim Ingham case 'o': 859ca36cd16SJim Ingham { 860ca36cd16SJim Ingham bool value, success; 861ca36cd16SJim Ingham value = Args::StringToBoolean(option_arg, false, &success); 862ca36cd16SJim Ingham if (success) 863ca36cd16SJim Ingham { 864ca36cd16SJim Ingham m_one_shot_passed = true; 865ca36cd16SJim Ingham m_one_shot = value; 866ca36cd16SJim Ingham } 867ca36cd16SJim Ingham else 868ca36cd16SJim Ingham error.SetErrorStringWithFormat("invalid boolean value '%s' passed for -o option", option_arg); 869ca36cd16SJim Ingham } 870ca36cd16SJim Ingham break; 8715a988416SJim Ingham case 't' : 8725a988416SJim Ingham { 8735a988416SJim Ingham if (option_arg[0] == '\0') 8745a988416SJim Ingham { 8755a988416SJim Ingham m_thread_id = LLDB_INVALID_THREAD_ID; 8765a988416SJim Ingham m_thread_id_passed = true; 8775a988416SJim Ingham } 8785a988416SJim Ingham else 8795a988416SJim Ingham { 8805275aaa0SVince Harron m_thread_id = StringConvert::ToUInt64(option_arg, LLDB_INVALID_THREAD_ID, 0); 8815a988416SJim Ingham if (m_thread_id == LLDB_INVALID_THREAD_ID) 8825a988416SJim Ingham error.SetErrorStringWithFormat ("invalid thread id string '%s'", option_arg); 8835a988416SJim Ingham else 8845a988416SJim Ingham m_thread_id_passed = true; 8855a988416SJim Ingham } 8865a988416SJim Ingham } 8875a988416SJim Ingham break; 8885a988416SJim Ingham case 'T': 8895a988416SJim Ingham if (option_arg != NULL) 8905a988416SJim Ingham m_thread_name.assign (option_arg); 8915a988416SJim Ingham else 8925a988416SJim Ingham m_thread_name.clear(); 8935a988416SJim Ingham m_name_passed = true; 8945a988416SJim Ingham break; 8955a988416SJim Ingham case 'q': 8965a988416SJim Ingham if (option_arg != NULL) 8975a988416SJim Ingham m_queue_name.assign (option_arg); 8985a988416SJim Ingham else 8995a988416SJim Ingham m_queue_name.clear(); 9005a988416SJim Ingham m_queue_passed = true; 9015a988416SJim Ingham break; 9025a988416SJim Ingham case 'x': 9035a988416SJim Ingham { 9045a988416SJim Ingham if (option_arg[0] == '\n') 9055a988416SJim Ingham { 9065a988416SJim Ingham m_thread_index = UINT32_MAX; 9075a988416SJim Ingham m_thread_index_passed = true; 9085a988416SJim Ingham } 9095a988416SJim Ingham else 9105a988416SJim Ingham { 9115275aaa0SVince Harron m_thread_index = StringConvert::ToUInt32 (option_arg, UINT32_MAX, 0); 9125a988416SJim Ingham if (m_thread_id == UINT32_MAX) 9135a988416SJim Ingham error.SetErrorStringWithFormat ("invalid thread index string '%s'", option_arg); 9145a988416SJim Ingham else 9155a988416SJim Ingham m_thread_index_passed = true; 9165a988416SJim Ingham } 9175a988416SJim Ingham } 9185a988416SJim Ingham break; 9195a988416SJim Ingham default: 9205a988416SJim Ingham error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option); 9215a988416SJim Ingham break; 9225a988416SJim Ingham } 9235a988416SJim Ingham 9245a988416SJim Ingham return error; 9255a988416SJim Ingham } 9265a988416SJim Ingham void 9275a988416SJim Ingham OptionParsingStarting () 9285a988416SJim Ingham { 9295a988416SJim Ingham m_ignore_count = 0; 9305a988416SJim Ingham m_thread_id = LLDB_INVALID_THREAD_ID; 9315a988416SJim Ingham m_thread_id_passed = false; 9325a988416SJim Ingham m_thread_index = UINT32_MAX; 9335a988416SJim Ingham m_thread_index_passed = false; 9345a988416SJim Ingham m_thread_name.clear(); 9355a988416SJim Ingham m_queue_name.clear(); 9365a988416SJim Ingham m_condition.clear(); 937ca36cd16SJim Ingham m_one_shot = false; 9385a988416SJim Ingham m_enable_passed = false; 9395a988416SJim Ingham m_queue_passed = false; 9405a988416SJim Ingham m_name_passed = false; 9415a988416SJim Ingham m_condition_passed = false; 942ca36cd16SJim Ingham m_one_shot_passed = false; 94333df7cd3SJim Ingham m_use_dummy = false; 9445a988416SJim Ingham } 9455a988416SJim Ingham 9465a988416SJim Ingham const OptionDefinition* 9475a988416SJim Ingham GetDefinitions () 9485a988416SJim Ingham { 9495a988416SJim Ingham return g_option_table; 9505a988416SJim Ingham } 9515a988416SJim Ingham 9525a988416SJim Ingham 9535a988416SJim Ingham // Options table: Required for subclasses of Options. 9545a988416SJim Ingham 9555a988416SJim Ingham static OptionDefinition g_option_table[]; 9565a988416SJim Ingham 9575a988416SJim Ingham // Instance variables to hold the values for command options. 9585a988416SJim Ingham 9595a988416SJim Ingham uint32_t m_ignore_count; 9605a988416SJim Ingham lldb::tid_t m_thread_id; 9615a988416SJim Ingham bool m_thread_id_passed; 9625a988416SJim Ingham uint32_t m_thread_index; 9635a988416SJim Ingham bool m_thread_index_passed; 9645a988416SJim Ingham std::string m_thread_name; 9655a988416SJim Ingham std::string m_queue_name; 9665a988416SJim Ingham std::string m_condition; 967ca36cd16SJim Ingham bool m_one_shot; 9685a988416SJim Ingham bool m_enable_passed; 9695a988416SJim Ingham bool m_enable_value; 9705a988416SJim Ingham bool m_name_passed; 9715a988416SJim Ingham bool m_queue_passed; 9725a988416SJim Ingham bool m_condition_passed; 973ca36cd16SJim Ingham bool m_one_shot_passed; 97433df7cd3SJim Ingham bool m_use_dummy; 9755a988416SJim Ingham 9765a988416SJim Ingham }; 9775a988416SJim Ingham 9785a988416SJim Ingham protected: 9795a988416SJim Ingham virtual bool 9805a988416SJim Ingham DoExecute (Args& command, CommandReturnObject &result) 9815a988416SJim Ingham { 98233df7cd3SJim Ingham Target *target = GetSelectedOrDummyTarget(m_options.m_use_dummy); 9835a988416SJim Ingham if (target == NULL) 9845a988416SJim Ingham { 9855a988416SJim Ingham result.AppendError ("Invalid target. No existing target or breakpoints."); 9865a988416SJim Ingham result.SetStatus (eReturnStatusFailed); 9875a988416SJim Ingham return false; 9885a988416SJim Ingham } 9895a988416SJim Ingham 9905a988416SJim Ingham Mutex::Locker locker; 9915a988416SJim Ingham target->GetBreakpointList().GetListMutex(locker); 9925a988416SJim Ingham 9935a988416SJim Ingham BreakpointIDList valid_bp_ids; 9945a988416SJim Ingham 9955e09c8c3SJim Ingham CommandObjectMultiwordBreakpoint::VerifyBreakpointOrLocationIDs (command, target, result, &valid_bp_ids); 9965a988416SJim Ingham 9975a988416SJim Ingham if (result.Succeeded()) 9985a988416SJim Ingham { 9995a988416SJim Ingham const size_t count = valid_bp_ids.GetSize(); 10005a988416SJim Ingham for (size_t i = 0; i < count; ++i) 10015a988416SJim Ingham { 10025a988416SJim Ingham BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i); 10035a988416SJim Ingham 10045a988416SJim Ingham if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID) 10055a988416SJim Ingham { 10065a988416SJim Ingham Breakpoint *bp = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get(); 10075a988416SJim Ingham if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID) 10085a988416SJim Ingham { 10095a988416SJim Ingham BreakpointLocation *location = bp->FindLocationByID (cur_bp_id.GetLocationID()).get(); 10105a988416SJim Ingham if (location) 10115a988416SJim Ingham { 10125a988416SJim Ingham if (m_options.m_thread_id_passed) 10135a988416SJim Ingham location->SetThreadID (m_options.m_thread_id); 10145a988416SJim Ingham 10155a988416SJim Ingham if (m_options.m_thread_index_passed) 10165a988416SJim Ingham location->SetThreadIndex(m_options.m_thread_index); 10175a988416SJim Ingham 10185a988416SJim Ingham if (m_options.m_name_passed) 10195a988416SJim Ingham location->SetThreadName(m_options.m_thread_name.c_str()); 10205a988416SJim Ingham 10215a988416SJim Ingham if (m_options.m_queue_passed) 10225a988416SJim Ingham location->SetQueueName(m_options.m_queue_name.c_str()); 10235a988416SJim Ingham 10245a988416SJim Ingham if (m_options.m_ignore_count != 0) 10255a988416SJim Ingham location->SetIgnoreCount(m_options.m_ignore_count); 10265a988416SJim Ingham 10275a988416SJim Ingham if (m_options.m_enable_passed) 10285a988416SJim Ingham location->SetEnabled (m_options.m_enable_value); 10295a988416SJim Ingham 10305a988416SJim Ingham if (m_options.m_condition_passed) 10315a988416SJim Ingham location->SetCondition (m_options.m_condition.c_str()); 10325a988416SJim Ingham } 10335a988416SJim Ingham } 10345a988416SJim Ingham else 10355a988416SJim Ingham { 10365a988416SJim Ingham if (m_options.m_thread_id_passed) 10375a988416SJim Ingham bp->SetThreadID (m_options.m_thread_id); 10385a988416SJim Ingham 10395a988416SJim Ingham if (m_options.m_thread_index_passed) 10405a988416SJim Ingham bp->SetThreadIndex(m_options.m_thread_index); 10415a988416SJim Ingham 10425a988416SJim Ingham if (m_options.m_name_passed) 10435a988416SJim Ingham bp->SetThreadName(m_options.m_thread_name.c_str()); 10445a988416SJim Ingham 10455a988416SJim Ingham if (m_options.m_queue_passed) 10465a988416SJim Ingham bp->SetQueueName(m_options.m_queue_name.c_str()); 10475a988416SJim Ingham 10485a988416SJim Ingham if (m_options.m_ignore_count != 0) 10495a988416SJim Ingham bp->SetIgnoreCount(m_options.m_ignore_count); 10505a988416SJim Ingham 10515a988416SJim Ingham if (m_options.m_enable_passed) 10525a988416SJim Ingham bp->SetEnabled (m_options.m_enable_value); 10535a988416SJim Ingham 10545a988416SJim Ingham if (m_options.m_condition_passed) 10555a988416SJim Ingham bp->SetCondition (m_options.m_condition.c_str()); 10565a988416SJim Ingham } 10575a988416SJim Ingham } 10585a988416SJim Ingham } 10595a988416SJim Ingham } 10605a988416SJim Ingham 10615a988416SJim Ingham return result.Succeeded(); 10625a988416SJim Ingham } 10635a988416SJim Ingham 10645a988416SJim Ingham private: 10655a988416SJim Ingham CommandOptions m_options; 10665a988416SJim Ingham }; 10675a988416SJim Ingham 10685a988416SJim Ingham #pragma mark Modify::CommandOptions 10695a988416SJim Ingham OptionDefinition 10705a988416SJim Ingham CommandObjectBreakpointModify::CommandOptions::g_option_table[] = 10715a988416SJim Ingham { 1072d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "ignore-count", 'i', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeCount, "Set the number of times this breakpoint is skipped before stopping." }, 1073d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "one-shot", 'o', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeBoolean, "The breakpoint is deleted the first time it stop causes a stop." }, 1074d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "thread-index", 'x', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeThreadIndex, "The breakpoint stops only for the thread whose index matches this argument."}, 1075d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "thread-id", 't', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeThreadID, "The breakpoint stops only for the thread whose TID matches this argument."}, 1076d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "thread-name", 'T', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeThreadName, "The breakpoint stops only for the thread whose thread name matches this argument."}, 1077d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "queue-name", 'q', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeQueueName, "The breakpoint stops only for threads in the queue whose name is given by this argument."}, 1078d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "condition", 'c', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeExpression, "The breakpoint stops only if this condition expression evaluates to true."}, 1079d37221dcSZachary Turner { LLDB_OPT_SET_1, false, "enable", 'e', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, "Enable the breakpoint."}, 1080d37221dcSZachary Turner { LLDB_OPT_SET_2, false, "disable", 'd', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, "Disable the breakpoint."}, 108133df7cd3SJim Ingham { LLDB_OPT_SET_ALL, false, "dummy-breakpoints", 'D', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, "Sets Dummy breakpoints - i.e. breakpoints set before a file is provided, which prime new targets."}, 108233df7cd3SJim Ingham 1083d37221dcSZachary Turner { 0, false, NULL, 0 , 0, NULL, NULL, 0, eArgTypeNone, NULL } 10845a988416SJim Ingham }; 10855a988416SJim Ingham 10865a988416SJim Ingham //------------------------------------------------------------------------- 10875a988416SJim Ingham // CommandObjectBreakpointEnable 10885a988416SJim Ingham //------------------------------------------------------------------------- 10895a988416SJim Ingham #pragma mark Enable 10905a988416SJim Ingham 10915a988416SJim Ingham class CommandObjectBreakpointEnable : public CommandObjectParsed 10925a988416SJim Ingham { 10935a988416SJim Ingham public: 10945a988416SJim Ingham CommandObjectBreakpointEnable (CommandInterpreter &interpreter) : 10955a988416SJim Ingham CommandObjectParsed (interpreter, 10965a988416SJim Ingham "enable", 10975a988416SJim Ingham "Enable the specified disabled breakpoint(s). If no breakpoints are specified, enable all of them.", 10985a988416SJim Ingham NULL) 10995a988416SJim Ingham { 11005a988416SJim Ingham CommandArgumentEntry arg; 11015a988416SJim Ingham CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange); 11025a988416SJim Ingham // Add the entry for the first argument for this command to the object's arguments vector. 11035a988416SJim Ingham m_arguments.push_back (arg); 11045a988416SJim Ingham } 11055a988416SJim Ingham 11065a988416SJim Ingham 11075a988416SJim Ingham virtual 11085a988416SJim Ingham ~CommandObjectBreakpointEnable () {} 11095a988416SJim Ingham 11105a988416SJim Ingham protected: 11115a988416SJim Ingham virtual bool 11125a988416SJim Ingham DoExecute (Args& command, CommandReturnObject &result) 11135a988416SJim Ingham { 1114893c932aSJim Ingham Target *target = GetSelectedOrDummyTarget(); 11155a988416SJim Ingham if (target == NULL) 11165a988416SJim Ingham { 11175a988416SJim Ingham result.AppendError ("Invalid target. No existing target or breakpoints."); 11185a988416SJim Ingham result.SetStatus (eReturnStatusFailed); 11195a988416SJim Ingham return false; 11205a988416SJim Ingham } 11215a988416SJim Ingham 11225a988416SJim Ingham Mutex::Locker locker; 11235a988416SJim Ingham target->GetBreakpointList().GetListMutex(locker); 11245a988416SJim Ingham 11255a988416SJim Ingham const BreakpointList &breakpoints = target->GetBreakpointList(); 11265a988416SJim Ingham 11275a988416SJim Ingham size_t num_breakpoints = breakpoints.GetSize(); 11285a988416SJim Ingham 11295a988416SJim Ingham if (num_breakpoints == 0) 11305a988416SJim Ingham { 11315a988416SJim Ingham result.AppendError ("No breakpoints exist to be enabled."); 11325a988416SJim Ingham result.SetStatus (eReturnStatusFailed); 11335a988416SJim Ingham return false; 11345a988416SJim Ingham } 11355a988416SJim Ingham 11365a988416SJim Ingham if (command.GetArgumentCount() == 0) 11375a988416SJim Ingham { 11385a988416SJim Ingham // No breakpoint selected; enable all currently set breakpoints. 11395a988416SJim Ingham target->EnableAllBreakpoints (); 11406fea17e8SGreg Clayton result.AppendMessageWithFormat ("All breakpoints enabled. (%" PRIu64 " breakpoints)\n", (uint64_t)num_breakpoints); 11415a988416SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 11425a988416SJim Ingham } 11435a988416SJim Ingham else 11445a988416SJim Ingham { 11455a988416SJim Ingham // Particular breakpoint selected; enable that breakpoint. 11465a988416SJim Ingham BreakpointIDList valid_bp_ids; 11475e09c8c3SJim Ingham CommandObjectMultiwordBreakpoint::VerifyBreakpointOrLocationIDs (command, target, result, &valid_bp_ids); 11485a988416SJim Ingham 11495a988416SJim Ingham if (result.Succeeded()) 11505a988416SJim Ingham { 11515a988416SJim Ingham int enable_count = 0; 11525a988416SJim Ingham int loc_count = 0; 11535a988416SJim Ingham const size_t count = valid_bp_ids.GetSize(); 11545a988416SJim Ingham for (size_t i = 0; i < count; ++i) 11555a988416SJim Ingham { 11565a988416SJim Ingham BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i); 11575a988416SJim Ingham 11585a988416SJim Ingham if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID) 11595a988416SJim Ingham { 11605a988416SJim Ingham Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get(); 11615a988416SJim Ingham if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID) 11625a988416SJim Ingham { 11635a988416SJim Ingham BreakpointLocation *location = breakpoint->FindLocationByID (cur_bp_id.GetLocationID()).get(); 11645a988416SJim Ingham if (location) 11655a988416SJim Ingham { 11665a988416SJim Ingham location->SetEnabled (true); 11675a988416SJim Ingham ++loc_count; 11685a988416SJim Ingham } 11695a988416SJim Ingham } 11705a988416SJim Ingham else 11715a988416SJim Ingham { 11725a988416SJim Ingham breakpoint->SetEnabled (true); 11735a988416SJim Ingham ++enable_count; 11745a988416SJim Ingham } 11755a988416SJim Ingham } 11765a988416SJim Ingham } 11775a988416SJim Ingham result.AppendMessageWithFormat ("%d breakpoints enabled.\n", enable_count + loc_count); 11785a988416SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 11795a988416SJim Ingham } 11805a988416SJim Ingham } 11815a988416SJim Ingham 11825a988416SJim Ingham return result.Succeeded(); 11835a988416SJim Ingham } 11845a988416SJim Ingham }; 11855a988416SJim Ingham 11865a988416SJim Ingham //------------------------------------------------------------------------- 11875a988416SJim Ingham // CommandObjectBreakpointDisable 11885a988416SJim Ingham //------------------------------------------------------------------------- 11895a988416SJim Ingham #pragma mark Disable 11905a988416SJim Ingham 11915a988416SJim Ingham class CommandObjectBreakpointDisable : public CommandObjectParsed 11925a988416SJim Ingham { 11935a988416SJim Ingham public: 11945a988416SJim Ingham CommandObjectBreakpointDisable (CommandInterpreter &interpreter) : 11955a988416SJim Ingham CommandObjectParsed (interpreter, 11965a988416SJim Ingham "breakpoint disable", 11975a988416SJim Ingham "Disable the specified breakpoint(s) without removing it/them. If no breakpoints are specified, disable them all.", 11985a988416SJim Ingham NULL) 11995a988416SJim Ingham { 1200b0fac509SJim Ingham SetHelpLong( 1201b0fac509SJim Ingham "Disable the specified breakpoint(s) without removing it/them. \n\ 1202b0fac509SJim Ingham If no breakpoints are specified, disable them all.\n\ 1203b0fac509SJim Ingham \n\ 1204b0fac509SJim Ingham Note: disabling a breakpoint will cause none of its locations to be hit\n\ 1205b0fac509SJim Ingham regardless of whether they are enabled or disabled. So the sequence: \n\ 1206b0fac509SJim Ingham \n\ 1207b0fac509SJim Ingham (lldb) break disable 1\n\ 1208b0fac509SJim Ingham (lldb) break enable 1.1\n\ 1209b0fac509SJim Ingham \n\ 1210b0fac509SJim Ingham will NOT cause location 1.1 to get hit. To achieve that, do:\n\ 1211b0fac509SJim Ingham \n\ 1212b0fac509SJim Ingham (lldb) break disable 1.*\n\ 1213b0fac509SJim Ingham (lldb) break enable 1.1\n\ 1214b0fac509SJim Ingham \n\ 1215b0fac509SJim Ingham The first command disables all the locations of breakpoint 1, \n\ 1216b0fac509SJim Ingham the second re-enables the first location." 1217b0fac509SJim Ingham ); 1218b0fac509SJim Ingham 12195a988416SJim Ingham CommandArgumentEntry arg; 12205a988416SJim Ingham CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange); 12215a988416SJim Ingham // Add the entry for the first argument for this command to the object's arguments vector. 12225a988416SJim Ingham m_arguments.push_back (arg); 1223b0fac509SJim Ingham 12245a988416SJim Ingham } 12255a988416SJim Ingham 12265a988416SJim Ingham 12275a988416SJim Ingham virtual 12285a988416SJim Ingham ~CommandObjectBreakpointDisable () {} 12295a988416SJim Ingham 12305a988416SJim Ingham protected: 12315a988416SJim Ingham virtual bool 12325a988416SJim Ingham DoExecute (Args& command, CommandReturnObject &result) 12335a988416SJim Ingham { 1234893c932aSJim Ingham Target *target = GetSelectedOrDummyTarget(); 12355a988416SJim Ingham if (target == NULL) 12365a988416SJim Ingham { 12375a988416SJim Ingham result.AppendError ("Invalid target. No existing target or breakpoints."); 12385a988416SJim Ingham result.SetStatus (eReturnStatusFailed); 12395a988416SJim Ingham return false; 12405a988416SJim Ingham } 12415a988416SJim Ingham 12425a988416SJim Ingham Mutex::Locker locker; 12435a988416SJim Ingham target->GetBreakpointList().GetListMutex(locker); 12445a988416SJim Ingham 12455a988416SJim Ingham const BreakpointList &breakpoints = target->GetBreakpointList(); 12465a988416SJim Ingham size_t num_breakpoints = breakpoints.GetSize(); 12475a988416SJim Ingham 12485a988416SJim Ingham if (num_breakpoints == 0) 12495a988416SJim Ingham { 12505a988416SJim Ingham result.AppendError ("No breakpoints exist to be disabled."); 12515a988416SJim Ingham result.SetStatus (eReturnStatusFailed); 12525a988416SJim Ingham return false; 12535a988416SJim Ingham } 12545a988416SJim Ingham 12555a988416SJim Ingham if (command.GetArgumentCount() == 0) 12565a988416SJim Ingham { 12575a988416SJim Ingham // No breakpoint selected; disable all currently set breakpoints. 12585a988416SJim Ingham target->DisableAllBreakpoints (); 12596fea17e8SGreg Clayton result.AppendMessageWithFormat ("All breakpoints disabled. (%" PRIu64 " breakpoints)\n", (uint64_t)num_breakpoints); 12605a988416SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 12615a988416SJim Ingham } 12625a988416SJim Ingham else 12635a988416SJim Ingham { 12645a988416SJim Ingham // Particular breakpoint selected; disable that breakpoint. 12655a988416SJim Ingham BreakpointIDList valid_bp_ids; 12665a988416SJim Ingham 12675e09c8c3SJim Ingham CommandObjectMultiwordBreakpoint::VerifyBreakpointOrLocationIDs (command, target, result, &valid_bp_ids); 12685a988416SJim Ingham 12695a988416SJim Ingham if (result.Succeeded()) 12705a988416SJim Ingham { 12715a988416SJim Ingham int disable_count = 0; 12725a988416SJim Ingham int loc_count = 0; 12735a988416SJim Ingham const size_t count = valid_bp_ids.GetSize(); 12745a988416SJim Ingham for (size_t i = 0; i < count; ++i) 12755a988416SJim Ingham { 12765a988416SJim Ingham BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i); 12775a988416SJim Ingham 12785a988416SJim Ingham if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID) 12795a988416SJim Ingham { 12805a988416SJim Ingham Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get(); 12815a988416SJim Ingham if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID) 12825a988416SJim Ingham { 12835a988416SJim Ingham BreakpointLocation *location = breakpoint->FindLocationByID (cur_bp_id.GetLocationID()).get(); 12845a988416SJim Ingham if (location) 12855a988416SJim Ingham { 12865a988416SJim Ingham location->SetEnabled (false); 12875a988416SJim Ingham ++loc_count; 12885a988416SJim Ingham } 12895a988416SJim Ingham } 12905a988416SJim Ingham else 12915a988416SJim Ingham { 12925a988416SJim Ingham breakpoint->SetEnabled (false); 12935a988416SJim Ingham ++disable_count; 12945a988416SJim Ingham } 12955a988416SJim Ingham } 12965a988416SJim Ingham } 12975a988416SJim Ingham result.AppendMessageWithFormat ("%d breakpoints disabled.\n", disable_count + loc_count); 12985a988416SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 12995a988416SJim Ingham } 13005a988416SJim Ingham } 13015a988416SJim Ingham 13025a988416SJim Ingham return result.Succeeded(); 13035a988416SJim Ingham } 13045a988416SJim Ingham 13055a988416SJim Ingham }; 13065a988416SJim Ingham 13075a988416SJim Ingham //------------------------------------------------------------------------- 13085a988416SJim Ingham // CommandObjectBreakpointList 13095a988416SJim Ingham //------------------------------------------------------------------------- 13105a988416SJim Ingham #pragma mark List 13115a988416SJim Ingham 13125a988416SJim Ingham class CommandObjectBreakpointList : public CommandObjectParsed 13135a988416SJim Ingham { 13145a988416SJim Ingham public: 13155a988416SJim Ingham CommandObjectBreakpointList (CommandInterpreter &interpreter) : 13165a988416SJim Ingham CommandObjectParsed (interpreter, 13175a988416SJim Ingham "breakpoint list", 13185a988416SJim Ingham "List some or all breakpoints at configurable levels of detail.", 13195a988416SJim Ingham NULL), 13205a988416SJim Ingham m_options (interpreter) 13215a988416SJim Ingham { 13225a988416SJim Ingham CommandArgumentEntry arg; 13235a988416SJim Ingham CommandArgumentData bp_id_arg; 13245a988416SJim Ingham 13255a988416SJim Ingham // Define the first (and only) variant of this arg. 13265a988416SJim Ingham bp_id_arg.arg_type = eArgTypeBreakpointID; 13275a988416SJim Ingham bp_id_arg.arg_repetition = eArgRepeatOptional; 13285a988416SJim Ingham 13295a988416SJim Ingham // There is only one variant this argument could be; put it into the argument entry. 13305a988416SJim Ingham arg.push_back (bp_id_arg); 13315a988416SJim Ingham 13325a988416SJim Ingham // Push the data for the first argument into the m_arguments vector. 13335a988416SJim Ingham m_arguments.push_back (arg); 13345a988416SJim Ingham } 13355a988416SJim Ingham 13365a988416SJim Ingham 13375a988416SJim Ingham virtual 13385a988416SJim Ingham ~CommandObjectBreakpointList () {} 13395a988416SJim Ingham 13405a988416SJim Ingham virtual Options * 13415a988416SJim Ingham GetOptions () 13425a988416SJim Ingham { 13435a988416SJim Ingham return &m_options; 13445a988416SJim Ingham } 13455a988416SJim Ingham 13465a988416SJim Ingham class CommandOptions : public Options 13475a988416SJim Ingham { 13485a988416SJim Ingham public: 13495a988416SJim Ingham 13505a988416SJim Ingham CommandOptions (CommandInterpreter &interpreter) : 13515a988416SJim Ingham Options (interpreter), 135233df7cd3SJim Ingham m_level (lldb::eDescriptionLevelBrief), 135333df7cd3SJim Ingham m_use_dummy(false) 13545a988416SJim Ingham { 13555a988416SJim Ingham } 13565a988416SJim Ingham 13575a988416SJim Ingham virtual 13585a988416SJim Ingham ~CommandOptions () {} 13595a988416SJim Ingham 13605a988416SJim Ingham virtual Error 13615a988416SJim Ingham SetOptionValue (uint32_t option_idx, const char *option_arg) 13625a988416SJim Ingham { 13635a988416SJim Ingham Error error; 13643bcdfc0eSGreg Clayton const int short_option = m_getopt_table[option_idx].val; 13655a988416SJim Ingham 13665a988416SJim Ingham switch (short_option) 13675a988416SJim Ingham { 13685a988416SJim Ingham case 'b': 13695a988416SJim Ingham m_level = lldb::eDescriptionLevelBrief; 13705a988416SJim Ingham break; 137133df7cd3SJim Ingham case 'D': 137233df7cd3SJim Ingham m_use_dummy = true; 137333df7cd3SJim Ingham break; 13745a988416SJim Ingham case 'f': 13755a988416SJim Ingham m_level = lldb::eDescriptionLevelFull; 13765a988416SJim Ingham break; 13775a988416SJim Ingham case 'v': 13785a988416SJim Ingham m_level = lldb::eDescriptionLevelVerbose; 13795a988416SJim Ingham break; 13805a988416SJim Ingham case 'i': 13815a988416SJim Ingham m_internal = true; 13825a988416SJim Ingham break; 13835a988416SJim Ingham default: 13845a988416SJim Ingham error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option); 13855a988416SJim Ingham break; 13865a988416SJim Ingham } 13875a988416SJim Ingham 13885a988416SJim Ingham return error; 13895a988416SJim Ingham } 13905a988416SJim Ingham 13915a988416SJim Ingham void 13925a988416SJim Ingham OptionParsingStarting () 13935a988416SJim Ingham { 13945a988416SJim Ingham m_level = lldb::eDescriptionLevelFull; 13955a988416SJim Ingham m_internal = false; 139633df7cd3SJim Ingham m_use_dummy = false; 13975a988416SJim Ingham } 13985a988416SJim Ingham 13995a988416SJim Ingham const OptionDefinition * 14005a988416SJim Ingham GetDefinitions () 14015a988416SJim Ingham { 14025a988416SJim Ingham return g_option_table; 14035a988416SJim Ingham } 14045a988416SJim Ingham 14055a988416SJim Ingham // Options table: Required for subclasses of Options. 14065a988416SJim Ingham 14075a988416SJim Ingham static OptionDefinition g_option_table[]; 14085a988416SJim Ingham 14095a988416SJim Ingham // Instance variables to hold the values for command options. 14105a988416SJim Ingham 14115a988416SJim Ingham lldb::DescriptionLevel m_level; 14125a988416SJim Ingham 14135a988416SJim Ingham bool m_internal; 141433df7cd3SJim Ingham bool m_use_dummy; 14155a988416SJim Ingham }; 14165a988416SJim Ingham 14175a988416SJim Ingham protected: 14185a988416SJim Ingham virtual bool 14195a988416SJim Ingham DoExecute (Args& command, CommandReturnObject &result) 14205a988416SJim Ingham { 142133df7cd3SJim Ingham Target *target = GetSelectedOrDummyTarget(m_options.m_use_dummy); 142233df7cd3SJim Ingham 14235a988416SJim Ingham if (target == NULL) 14245a988416SJim Ingham { 14255a988416SJim Ingham result.AppendError ("Invalid target. No current target or breakpoints."); 14265a988416SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 14275a988416SJim Ingham return true; 14285a988416SJim Ingham } 14295a988416SJim Ingham 14305a988416SJim Ingham const BreakpointList &breakpoints = target->GetBreakpointList(m_options.m_internal); 14315a988416SJim Ingham Mutex::Locker locker; 14325a988416SJim Ingham target->GetBreakpointList(m_options.m_internal).GetListMutex(locker); 14335a988416SJim Ingham 14345a988416SJim Ingham size_t num_breakpoints = breakpoints.GetSize(); 14355a988416SJim Ingham 14365a988416SJim Ingham if (num_breakpoints == 0) 14375a988416SJim Ingham { 14385a988416SJim Ingham result.AppendMessage ("No breakpoints currently set."); 14395a988416SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 14405a988416SJim Ingham return true; 14415a988416SJim Ingham } 14425a988416SJim Ingham 14435a988416SJim Ingham Stream &output_stream = result.GetOutputStream(); 14445a988416SJim Ingham 14455a988416SJim Ingham if (command.GetArgumentCount() == 0) 14465a988416SJim Ingham { 14475a988416SJim Ingham // No breakpoint selected; show info about all currently set breakpoints. 14485a988416SJim Ingham result.AppendMessage ("Current breakpoints:"); 14495a988416SJim Ingham for (size_t i = 0; i < num_breakpoints; ++i) 14505a988416SJim Ingham { 14515a988416SJim Ingham Breakpoint *breakpoint = breakpoints.GetBreakpointAtIndex (i).get(); 14525a988416SJim Ingham AddBreakpointDescription (&output_stream, breakpoint, m_options.m_level); 14535a988416SJim Ingham } 14545a988416SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 14555a988416SJim Ingham } 14565a988416SJim Ingham else 14575a988416SJim Ingham { 14585a988416SJim Ingham // Particular breakpoints selected; show info about that breakpoint. 14595a988416SJim Ingham BreakpointIDList valid_bp_ids; 14605e09c8c3SJim Ingham CommandObjectMultiwordBreakpoint::VerifyBreakpointOrLocationIDs (command, target, result, &valid_bp_ids); 14615a988416SJim Ingham 14625a988416SJim Ingham if (result.Succeeded()) 14635a988416SJim Ingham { 14645a988416SJim Ingham for (size_t i = 0; i < valid_bp_ids.GetSize(); ++i) 14655a988416SJim Ingham { 14665a988416SJim Ingham BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i); 14675a988416SJim Ingham Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get(); 14685a988416SJim Ingham AddBreakpointDescription (&output_stream, breakpoint, m_options.m_level); 14695a988416SJim Ingham } 14705a988416SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 14715a988416SJim Ingham } 14725a988416SJim Ingham else 14735a988416SJim Ingham { 14745a988416SJim Ingham result.AppendError ("Invalid breakpoint id."); 14755a988416SJim Ingham result.SetStatus (eReturnStatusFailed); 14765a988416SJim Ingham } 14775a988416SJim Ingham } 14785a988416SJim Ingham 14795a988416SJim Ingham return result.Succeeded(); 14805a988416SJim Ingham } 14815a988416SJim Ingham 14825a988416SJim Ingham private: 14835a988416SJim Ingham CommandOptions m_options; 14845a988416SJim Ingham }; 14855a988416SJim Ingham 14865a988416SJim Ingham #pragma mark List::CommandOptions 14875a988416SJim Ingham OptionDefinition 14885a988416SJim Ingham CommandObjectBreakpointList::CommandOptions::g_option_table[] = 14895a988416SJim Ingham { 1490d37221dcSZachary Turner { LLDB_OPT_SET_ALL, false, "internal", 'i', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, 14915a988416SJim Ingham "Show debugger internal breakpoints" }, 14925a988416SJim Ingham 1493d37221dcSZachary Turner { LLDB_OPT_SET_1, false, "brief", 'b', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, 14945a988416SJim Ingham "Give a brief description of the breakpoint (no location info)."}, 14955a988416SJim Ingham 14965a988416SJim Ingham // FIXME: We need to add an "internal" command, and then add this sort of thing to it. 14975a988416SJim Ingham // But I need to see it for now, and don't want to wait. 1498d37221dcSZachary Turner { LLDB_OPT_SET_2, false, "full", 'f', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, 14995a988416SJim Ingham "Give a full description of the breakpoint and its locations."}, 15005a988416SJim Ingham 1501d37221dcSZachary Turner { LLDB_OPT_SET_3, false, "verbose", 'v', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, 15025a988416SJim Ingham "Explain everything we know about the breakpoint (for debugging debugger bugs)." }, 15035a988416SJim Ingham 150433df7cd3SJim Ingham { LLDB_OPT_SET_ALL, false, "dummy-breakpoints", 'D', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, 150533df7cd3SJim Ingham "List Dummy breakpoints - i.e. breakpoints set before a file is provided, which prime new targets."}, 150633df7cd3SJim Ingham 1507d37221dcSZachary Turner { 0, false, NULL, 0, 0, NULL, NULL, 0, eArgTypeNone, NULL } 15085a988416SJim Ingham }; 15095a988416SJim Ingham 15105a988416SJim Ingham //------------------------------------------------------------------------- 15115a988416SJim Ingham // CommandObjectBreakpointClear 15125a988416SJim Ingham //------------------------------------------------------------------------- 15135a988416SJim Ingham #pragma mark Clear 15145a988416SJim Ingham 15155a988416SJim Ingham class CommandObjectBreakpointClear : public CommandObjectParsed 15165a988416SJim Ingham { 15175a988416SJim Ingham public: 15185a988416SJim Ingham 15195a988416SJim Ingham typedef enum BreakpointClearType 15205a988416SJim Ingham { 15215a988416SJim Ingham eClearTypeInvalid, 15225a988416SJim Ingham eClearTypeFileAndLine 15235a988416SJim Ingham } BreakpointClearType; 15245a988416SJim Ingham 15255a988416SJim Ingham CommandObjectBreakpointClear (CommandInterpreter &interpreter) : 15265a988416SJim Ingham CommandObjectParsed (interpreter, 15275a988416SJim Ingham "breakpoint clear", 15285a988416SJim Ingham "Clears a breakpoint or set of breakpoints in the executable.", 15295a988416SJim Ingham "breakpoint clear <cmd-options>"), 15305a988416SJim Ingham m_options (interpreter) 15315a988416SJim Ingham { 15325a988416SJim Ingham } 15335a988416SJim Ingham 15345a988416SJim Ingham virtual 15355a988416SJim Ingham ~CommandObjectBreakpointClear () {} 15365a988416SJim Ingham 15375a988416SJim Ingham virtual Options * 15385a988416SJim Ingham GetOptions () 15395a988416SJim Ingham { 15405a988416SJim Ingham return &m_options; 15415a988416SJim Ingham } 15425a988416SJim Ingham 15435a988416SJim Ingham class CommandOptions : public Options 15445a988416SJim Ingham { 15455a988416SJim Ingham public: 15465a988416SJim Ingham 15475a988416SJim Ingham CommandOptions (CommandInterpreter &interpreter) : 15485a988416SJim Ingham Options (interpreter), 15495a988416SJim Ingham m_filename (), 15505a988416SJim Ingham m_line_num (0) 15515a988416SJim Ingham { 15525a988416SJim Ingham } 15535a988416SJim Ingham 15545a988416SJim Ingham virtual 15555a988416SJim Ingham ~CommandOptions () {} 15565a988416SJim Ingham 15575a988416SJim Ingham virtual Error 15585a988416SJim Ingham SetOptionValue (uint32_t option_idx, const char *option_arg) 15595a988416SJim Ingham { 15605a988416SJim Ingham Error error; 15613bcdfc0eSGreg Clayton const int short_option = m_getopt_table[option_idx].val; 15625a988416SJim Ingham 15635a988416SJim Ingham switch (short_option) 15645a988416SJim Ingham { 15655a988416SJim Ingham case 'f': 15665a988416SJim Ingham m_filename.assign (option_arg); 15675a988416SJim Ingham break; 15685a988416SJim Ingham 15695a988416SJim Ingham case 'l': 15705275aaa0SVince Harron m_line_num = StringConvert::ToUInt32 (option_arg, 0); 15715a988416SJim Ingham break; 15725a988416SJim Ingham 15735a988416SJim Ingham default: 15745a988416SJim Ingham error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option); 15755a988416SJim Ingham break; 15765a988416SJim Ingham } 15775a988416SJim Ingham 15785a988416SJim Ingham return error; 15795a988416SJim Ingham } 15805a988416SJim Ingham 15815a988416SJim Ingham void 15825a988416SJim Ingham OptionParsingStarting () 15835a988416SJim Ingham { 15845a988416SJim Ingham m_filename.clear(); 15855a988416SJim Ingham m_line_num = 0; 15865a988416SJim Ingham } 15875a988416SJim Ingham 15885a988416SJim Ingham const OptionDefinition* 15895a988416SJim Ingham GetDefinitions () 15905a988416SJim Ingham { 15915a988416SJim Ingham return g_option_table; 15925a988416SJim Ingham } 15935a988416SJim Ingham 15945a988416SJim Ingham // Options table: Required for subclasses of Options. 15955a988416SJim Ingham 15965a988416SJim Ingham static OptionDefinition g_option_table[]; 15975a988416SJim Ingham 15985a988416SJim Ingham // Instance variables to hold the values for command options. 15995a988416SJim Ingham 16005a988416SJim Ingham std::string m_filename; 16015a988416SJim Ingham uint32_t m_line_num; 16025a988416SJim Ingham 16035a988416SJim Ingham }; 16045a988416SJim Ingham 16055a988416SJim Ingham protected: 16065a988416SJim Ingham virtual bool 16075a988416SJim Ingham DoExecute (Args& command, CommandReturnObject &result) 16085a988416SJim Ingham { 1609893c932aSJim Ingham Target *target = GetSelectedOrDummyTarget(); 16105a988416SJim Ingham if (target == NULL) 16115a988416SJim Ingham { 16125a988416SJim Ingham result.AppendError ("Invalid target. No existing target or breakpoints."); 16135a988416SJim Ingham result.SetStatus (eReturnStatusFailed); 16145a988416SJim Ingham return false; 16155a988416SJim Ingham } 16165a988416SJim Ingham 16175a988416SJim Ingham // The following are the various types of breakpoints that could be cleared: 16185a988416SJim Ingham // 1). -f -l (clearing breakpoint by source location) 16195a988416SJim Ingham 16205a988416SJim Ingham BreakpointClearType break_type = eClearTypeInvalid; 16215a988416SJim Ingham 16225a988416SJim Ingham if (m_options.m_line_num != 0) 16235a988416SJim Ingham break_type = eClearTypeFileAndLine; 16245a988416SJim Ingham 16255a988416SJim Ingham Mutex::Locker locker; 16265a988416SJim Ingham target->GetBreakpointList().GetListMutex(locker); 16275a988416SJim Ingham 16285a988416SJim Ingham BreakpointList &breakpoints = target->GetBreakpointList(); 16295a988416SJim Ingham size_t num_breakpoints = breakpoints.GetSize(); 16305a988416SJim Ingham 16315a988416SJim Ingham // Early return if there's no breakpoint at all. 16325a988416SJim Ingham if (num_breakpoints == 0) 16335a988416SJim Ingham { 16345a988416SJim Ingham result.AppendError ("Breakpoint clear: No breakpoint cleared."); 16355a988416SJim Ingham result.SetStatus (eReturnStatusFailed); 16365a988416SJim Ingham return result.Succeeded(); 16375a988416SJim Ingham } 16385a988416SJim Ingham 16395a988416SJim Ingham // Find matching breakpoints and delete them. 16405a988416SJim Ingham 16415a988416SJim Ingham // First create a copy of all the IDs. 16425a988416SJim Ingham std::vector<break_id_t> BreakIDs; 16435a988416SJim Ingham for (size_t i = 0; i < num_breakpoints; ++i) 16445a988416SJim Ingham BreakIDs.push_back(breakpoints.GetBreakpointAtIndex(i).get()->GetID()); 16455a988416SJim Ingham 16465a988416SJim Ingham int num_cleared = 0; 16475a988416SJim Ingham StreamString ss; 16485a988416SJim Ingham switch (break_type) 16495a988416SJim Ingham { 16505a988416SJim Ingham case eClearTypeFileAndLine: // Breakpoint by source position 16515a988416SJim Ingham { 16525a988416SJim Ingham const ConstString filename(m_options.m_filename.c_str()); 16535a988416SJim Ingham BreakpointLocationCollection loc_coll; 16545a988416SJim Ingham 16555a988416SJim Ingham for (size_t i = 0; i < num_breakpoints; ++i) 16565a988416SJim Ingham { 16575a988416SJim Ingham Breakpoint *bp = breakpoints.FindBreakpointByID(BreakIDs[i]).get(); 16585a988416SJim Ingham 16595a988416SJim Ingham if (bp->GetMatchingFileLine(filename, m_options.m_line_num, loc_coll)) 16605a988416SJim Ingham { 16615a988416SJim Ingham // If the collection size is 0, it's a full match and we can just remove the breakpoint. 16625a988416SJim Ingham if (loc_coll.GetSize() == 0) 16635a988416SJim Ingham { 16645a988416SJim Ingham bp->GetDescription(&ss, lldb::eDescriptionLevelBrief); 16655a988416SJim Ingham ss.EOL(); 16665a988416SJim Ingham target->RemoveBreakpointByID (bp->GetID()); 16675a988416SJim Ingham ++num_cleared; 16685a988416SJim Ingham } 16695a988416SJim Ingham } 16705a988416SJim Ingham } 16715a988416SJim Ingham } 16725a988416SJim Ingham break; 16735a988416SJim Ingham 16745a988416SJim Ingham default: 16755a988416SJim Ingham break; 16765a988416SJim Ingham } 16775a988416SJim Ingham 16785a988416SJim Ingham if (num_cleared > 0) 16795a988416SJim Ingham { 16805a988416SJim Ingham Stream &output_stream = result.GetOutputStream(); 16815a988416SJim Ingham output_stream.Printf ("%d breakpoints cleared:\n", num_cleared); 16825a988416SJim Ingham output_stream << ss.GetData(); 16835a988416SJim Ingham output_stream.EOL(); 16845a988416SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 16855a988416SJim Ingham } 16865a988416SJim Ingham else 16875a988416SJim Ingham { 16885a988416SJim Ingham result.AppendError ("Breakpoint clear: No breakpoint cleared."); 16895a988416SJim Ingham result.SetStatus (eReturnStatusFailed); 16905a988416SJim Ingham } 16915a988416SJim Ingham 16925a988416SJim Ingham return result.Succeeded(); 16935a988416SJim Ingham } 16945a988416SJim Ingham 16955a988416SJim Ingham private: 16965a988416SJim Ingham CommandOptions m_options; 16975a988416SJim Ingham }; 16985a988416SJim Ingham 16995a988416SJim Ingham #pragma mark Clear::CommandOptions 17005a988416SJim Ingham 17015a988416SJim Ingham OptionDefinition 17025a988416SJim Ingham CommandObjectBreakpointClear::CommandOptions::g_option_table[] = 17035a988416SJim Ingham { 1704d37221dcSZachary Turner { LLDB_OPT_SET_1, false, "file", 'f', OptionParser::eRequiredArgument, NULL, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename, 17055a988416SJim Ingham "Specify the breakpoint by source location in this particular file."}, 17065a988416SJim Ingham 1707d37221dcSZachary Turner { LLDB_OPT_SET_1, true, "line", 'l', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeLineNum, 17085a988416SJim Ingham "Specify the breakpoint by source location at this particular line."}, 17095a988416SJim Ingham 1710d37221dcSZachary Turner { 0, false, NULL, 0, 0, NULL, NULL, 0, eArgTypeNone, NULL } 17115a988416SJim Ingham }; 17125a988416SJim Ingham 17135a988416SJim Ingham //------------------------------------------------------------------------- 17145a988416SJim Ingham // CommandObjectBreakpointDelete 17155a988416SJim Ingham //------------------------------------------------------------------------- 17165a988416SJim Ingham #pragma mark Delete 17175a988416SJim Ingham 17185a988416SJim Ingham class CommandObjectBreakpointDelete : public CommandObjectParsed 17195a988416SJim Ingham { 17205a988416SJim Ingham public: 17215a988416SJim Ingham CommandObjectBreakpointDelete (CommandInterpreter &interpreter) : 17225a988416SJim Ingham CommandObjectParsed (interpreter, 17235a988416SJim Ingham "breakpoint delete", 17245a988416SJim Ingham "Delete the specified breakpoint(s). If no breakpoints are specified, delete them all.", 172533df7cd3SJim Ingham NULL), 172633df7cd3SJim Ingham m_options (interpreter) 17275a988416SJim Ingham { 17285a988416SJim Ingham CommandArgumentEntry arg; 17295a988416SJim Ingham CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange); 17305a988416SJim Ingham // Add the entry for the first argument for this command to the object's arguments vector. 17315a988416SJim Ingham m_arguments.push_back (arg); 17325a988416SJim Ingham } 17335a988416SJim Ingham 17345a988416SJim Ingham virtual 17355a988416SJim Ingham ~CommandObjectBreakpointDelete () {} 17365a988416SJim Ingham 173733df7cd3SJim Ingham virtual Options * 173833df7cd3SJim Ingham GetOptions () 173933df7cd3SJim Ingham { 174033df7cd3SJim Ingham return &m_options; 174133df7cd3SJim Ingham } 174233df7cd3SJim Ingham 174333df7cd3SJim Ingham class CommandOptions : public Options 174433df7cd3SJim Ingham { 174533df7cd3SJim Ingham public: 174633df7cd3SJim Ingham 174733df7cd3SJim Ingham CommandOptions (CommandInterpreter &interpreter) : 174833df7cd3SJim Ingham Options (interpreter), 174933df7cd3SJim Ingham m_use_dummy (false), 175033df7cd3SJim Ingham m_force (false) 175133df7cd3SJim Ingham { 175233df7cd3SJim Ingham } 175333df7cd3SJim Ingham 175433df7cd3SJim Ingham virtual 175533df7cd3SJim Ingham ~CommandOptions () {} 175633df7cd3SJim Ingham 175733df7cd3SJim Ingham virtual Error 175833df7cd3SJim Ingham SetOptionValue (uint32_t option_idx, const char *option_arg) 175933df7cd3SJim Ingham { 176033df7cd3SJim Ingham Error error; 176133df7cd3SJim Ingham const int short_option = m_getopt_table[option_idx].val; 176233df7cd3SJim Ingham 176333df7cd3SJim Ingham switch (short_option) 176433df7cd3SJim Ingham { 176533df7cd3SJim Ingham case 'f': 176633df7cd3SJim Ingham m_force = true; 176733df7cd3SJim Ingham break; 176833df7cd3SJim Ingham 176933df7cd3SJim Ingham case 'D': 177033df7cd3SJim Ingham m_use_dummy = true; 177133df7cd3SJim Ingham break; 177233df7cd3SJim Ingham 177333df7cd3SJim Ingham default: 177433df7cd3SJim Ingham error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option); 177533df7cd3SJim Ingham break; 177633df7cd3SJim Ingham } 177733df7cd3SJim Ingham 177833df7cd3SJim Ingham return error; 177933df7cd3SJim Ingham } 178033df7cd3SJim Ingham 178133df7cd3SJim Ingham void 178233df7cd3SJim Ingham OptionParsingStarting () 178333df7cd3SJim Ingham { 178433df7cd3SJim Ingham m_use_dummy = false; 178533df7cd3SJim Ingham m_force = false; 178633df7cd3SJim Ingham } 178733df7cd3SJim Ingham 178833df7cd3SJim Ingham const OptionDefinition* 178933df7cd3SJim Ingham GetDefinitions () 179033df7cd3SJim Ingham { 179133df7cd3SJim Ingham return g_option_table; 179233df7cd3SJim Ingham } 179333df7cd3SJim Ingham 179433df7cd3SJim Ingham // Options table: Required for subclasses of Options. 179533df7cd3SJim Ingham 179633df7cd3SJim Ingham static OptionDefinition g_option_table[]; 179733df7cd3SJim Ingham 179833df7cd3SJim Ingham // Instance variables to hold the values for command options. 179933df7cd3SJim Ingham bool m_use_dummy; 180033df7cd3SJim Ingham bool m_force; 180133df7cd3SJim Ingham }; 180233df7cd3SJim Ingham 18035a988416SJim Ingham protected: 18045a988416SJim Ingham virtual bool 18055a988416SJim Ingham DoExecute (Args& command, CommandReturnObject &result) 18065a988416SJim Ingham { 180733df7cd3SJim Ingham Target *target = GetSelectedOrDummyTarget(m_options.m_use_dummy); 180833df7cd3SJim Ingham 18095a988416SJim Ingham if (target == NULL) 18105a988416SJim Ingham { 18115a988416SJim Ingham result.AppendError ("Invalid target. No existing target or breakpoints."); 18125a988416SJim Ingham result.SetStatus (eReturnStatusFailed); 18135a988416SJim Ingham return false; 18145a988416SJim Ingham } 18155a988416SJim Ingham 18165a988416SJim Ingham Mutex::Locker locker; 18175a988416SJim Ingham target->GetBreakpointList().GetListMutex(locker); 18185a988416SJim Ingham 18195a988416SJim Ingham const BreakpointList &breakpoints = target->GetBreakpointList(); 18205a988416SJim Ingham 18215a988416SJim Ingham size_t num_breakpoints = breakpoints.GetSize(); 18225a988416SJim Ingham 18235a988416SJim Ingham if (num_breakpoints == 0) 18245a988416SJim Ingham { 18255a988416SJim Ingham result.AppendError ("No breakpoints exist to be deleted."); 18265a988416SJim Ingham result.SetStatus (eReturnStatusFailed); 18275a988416SJim Ingham return false; 18285a988416SJim Ingham } 18295a988416SJim Ingham 18305a988416SJim Ingham if (command.GetArgumentCount() == 0) 18315a988416SJim Ingham { 183233df7cd3SJim Ingham if (!m_options.m_force && !m_interpreter.Confirm ("About to delete all breakpoints, do you want to do that?", true)) 18335a988416SJim Ingham { 18345a988416SJim Ingham result.AppendMessage("Operation cancelled..."); 18355a988416SJim Ingham } 18365a988416SJim Ingham else 18375a988416SJim Ingham { 18385a988416SJim Ingham target->RemoveAllBreakpoints (); 18396fea17e8SGreg Clayton result.AppendMessageWithFormat ("All breakpoints removed. (%" PRIu64 " breakpoint%s)\n", (uint64_t)num_breakpoints, num_breakpoints > 1 ? "s" : ""); 18405a988416SJim Ingham } 18415a988416SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 18425a988416SJim Ingham } 18435a988416SJim Ingham else 18445a988416SJim Ingham { 18455a988416SJim Ingham // Particular breakpoint selected; disable that breakpoint. 18465a988416SJim Ingham BreakpointIDList valid_bp_ids; 18475e09c8c3SJim Ingham CommandObjectMultiwordBreakpoint::VerifyBreakpointOrLocationIDs (command, target, result, &valid_bp_ids); 18485a988416SJim Ingham 18495a988416SJim Ingham if (result.Succeeded()) 18505a988416SJim Ingham { 18515a988416SJim Ingham int delete_count = 0; 18525a988416SJim Ingham int disable_count = 0; 18535a988416SJim Ingham const size_t count = valid_bp_ids.GetSize(); 18545a988416SJim Ingham for (size_t i = 0; i < count; ++i) 18555a988416SJim Ingham { 18565a988416SJim Ingham BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i); 18575a988416SJim Ingham 18585a988416SJim Ingham if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID) 18595a988416SJim Ingham { 18605a988416SJim Ingham if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID) 18615a988416SJim Ingham { 18625a988416SJim Ingham Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get(); 18635a988416SJim Ingham BreakpointLocation *location = breakpoint->FindLocationByID (cur_bp_id.GetLocationID()).get(); 18645a988416SJim Ingham // It makes no sense to try to delete individual locations, so we disable them instead. 18655a988416SJim Ingham if (location) 18665a988416SJim Ingham { 18675a988416SJim Ingham location->SetEnabled (false); 18685a988416SJim Ingham ++disable_count; 18695a988416SJim Ingham } 18705a988416SJim Ingham } 18715a988416SJim Ingham else 18725a988416SJim Ingham { 18735a988416SJim Ingham target->RemoveBreakpointByID (cur_bp_id.GetBreakpointID()); 18745a988416SJim Ingham ++delete_count; 18755a988416SJim Ingham } 18765a988416SJim Ingham } 18775a988416SJim Ingham } 18785a988416SJim Ingham result.AppendMessageWithFormat ("%d breakpoints deleted; %d breakpoint locations disabled.\n", 18795a988416SJim Ingham delete_count, disable_count); 18805a988416SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 18815a988416SJim Ingham } 18825a988416SJim Ingham } 18835a988416SJim Ingham return result.Succeeded(); 18845a988416SJim Ingham } 188533df7cd3SJim Ingham private: 188633df7cd3SJim Ingham CommandOptions m_options; 188733df7cd3SJim Ingham }; 188833df7cd3SJim Ingham 188933df7cd3SJim Ingham OptionDefinition 189033df7cd3SJim Ingham CommandObjectBreakpointDelete::CommandOptions::g_option_table[] = 189133df7cd3SJim Ingham { 189233df7cd3SJim Ingham { LLDB_OPT_SET_1, false, "force", 'f', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, 189333df7cd3SJim Ingham "Delete all breakpoints without querying for confirmation."}, 189433df7cd3SJim Ingham 189533df7cd3SJim Ingham { LLDB_OPT_SET_1, false, "dummy-breakpoints", 'D', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, 189633df7cd3SJim Ingham "Delete Dummy breakpoints - i.e. breakpoints set before a file is provided, which prime new targets."}, 189733df7cd3SJim Ingham 189833df7cd3SJim Ingham { 0, false, NULL, 0, 0, NULL, NULL, 0, eArgTypeNone, NULL } 18995a988416SJim Ingham }; 19005a988416SJim Ingham 190130fdc8d8SChris Lattner //------------------------------------------------------------------------- 19025e09c8c3SJim Ingham // CommandObjectBreakpointName 19035e09c8c3SJim Ingham //------------------------------------------------------------------------- 19045e09c8c3SJim Ingham 19055e09c8c3SJim Ingham static OptionDefinition 19065e09c8c3SJim Ingham g_breakpoint_name_options[] = 19075e09c8c3SJim Ingham { 19085e09c8c3SJim Ingham { LLDB_OPT_SET_1, false, "name", 'N', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeBreakpointName, "Specifies a breakpoint name to use."}, 19095e09c8c3SJim Ingham { LLDB_OPT_SET_2, false, "breakpoint-id", 'B', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeBreakpointID, "Specify a breakpoint id to use."}, 19105e09c8c3SJim Ingham { LLDB_OPT_SET_ALL, false, "dummy-breakpoints", 'D', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, 19115e09c8c3SJim Ingham "Operate on Dummy breakpoints - i.e. breakpoints set before a file is provided, which prime new targets."}, 19125e09c8c3SJim Ingham }; 19135e09c8c3SJim Ingham class BreakpointNameOptionGroup : public OptionGroup 19145e09c8c3SJim Ingham { 19155e09c8c3SJim Ingham public: 19165e09c8c3SJim Ingham BreakpointNameOptionGroup() : 19175e09c8c3SJim Ingham OptionGroup(), 19185e09c8c3SJim Ingham m_breakpoint(LLDB_INVALID_BREAK_ID), 19195e09c8c3SJim Ingham m_use_dummy (false) 19205e09c8c3SJim Ingham { 19215e09c8c3SJim Ingham 19225e09c8c3SJim Ingham } 19235e09c8c3SJim Ingham 19245e09c8c3SJim Ingham virtual 19255e09c8c3SJim Ingham ~BreakpointNameOptionGroup () 19265e09c8c3SJim Ingham { 19275e09c8c3SJim Ingham } 19285e09c8c3SJim Ingham 19295e09c8c3SJim Ingham virtual uint32_t 19305e09c8c3SJim Ingham GetNumDefinitions () 19315e09c8c3SJim Ingham { 19325e09c8c3SJim Ingham return sizeof (g_breakpoint_name_options) / sizeof (OptionDefinition); 19335e09c8c3SJim Ingham } 19345e09c8c3SJim Ingham 19355e09c8c3SJim Ingham virtual const OptionDefinition* 19365e09c8c3SJim Ingham GetDefinitions () 19375e09c8c3SJim Ingham { 19385e09c8c3SJim Ingham return g_breakpoint_name_options; 19395e09c8c3SJim Ingham } 19405e09c8c3SJim Ingham 19415e09c8c3SJim Ingham virtual Error 19425e09c8c3SJim Ingham SetOptionValue (CommandInterpreter &interpreter, 19435e09c8c3SJim Ingham uint32_t option_idx, 19445e09c8c3SJim Ingham const char *option_value) 19455e09c8c3SJim Ingham { 19465e09c8c3SJim Ingham Error error; 19475e09c8c3SJim Ingham const int short_option = g_breakpoint_name_options[option_idx].short_option; 19485e09c8c3SJim Ingham 19495e09c8c3SJim Ingham switch (short_option) 19505e09c8c3SJim Ingham { 19515e09c8c3SJim Ingham case 'N': 19525e09c8c3SJim Ingham if (BreakpointID::StringIsBreakpointName(option_value, error) && error.Success()) 1953*c95f7e2aSPavel Labath m_name.SetValueFromString(option_value); 19545e09c8c3SJim Ingham break; 19555e09c8c3SJim Ingham 19565e09c8c3SJim Ingham case 'B': 1957*c95f7e2aSPavel Labath if (m_breakpoint.SetValueFromString(option_value).Fail()) 19585e09c8c3SJim Ingham error.SetErrorStringWithFormat ("unrecognized value \"%s\" for breakpoint", option_value); 19595e09c8c3SJim Ingham break; 19605e09c8c3SJim Ingham case 'D': 1961*c95f7e2aSPavel Labath if (m_use_dummy.SetValueFromString(option_value).Fail()) 19625e09c8c3SJim Ingham error.SetErrorStringWithFormat ("unrecognized value \"%s\" for use-dummy", option_value); 19635e09c8c3SJim Ingham break; 19645e09c8c3SJim Ingham 19655e09c8c3SJim Ingham default: 19665e09c8c3SJim Ingham error.SetErrorStringWithFormat("unrecognized short option '%c'", short_option); 19675e09c8c3SJim Ingham break; 19685e09c8c3SJim Ingham } 19695e09c8c3SJim Ingham return error; 19705e09c8c3SJim Ingham } 19715e09c8c3SJim Ingham 19725e09c8c3SJim Ingham virtual void 19735e09c8c3SJim Ingham OptionParsingStarting (CommandInterpreter &interpreter) 19745e09c8c3SJim Ingham { 19755e09c8c3SJim Ingham m_name.Clear(); 19765e09c8c3SJim Ingham m_breakpoint.Clear(); 19775e09c8c3SJim Ingham m_use_dummy.Clear(); 19785e09c8c3SJim Ingham m_use_dummy.SetDefaultValue(false); 19795e09c8c3SJim Ingham } 19805e09c8c3SJim Ingham 19815e09c8c3SJim Ingham OptionValueString m_name; 19825e09c8c3SJim Ingham OptionValueUInt64 m_breakpoint; 19835e09c8c3SJim Ingham OptionValueBoolean m_use_dummy; 19845e09c8c3SJim Ingham }; 19855e09c8c3SJim Ingham 19865e09c8c3SJim Ingham 19875e09c8c3SJim Ingham class CommandObjectBreakpointNameAdd : public CommandObjectParsed 19885e09c8c3SJim Ingham { 19895e09c8c3SJim Ingham public: 19905e09c8c3SJim Ingham CommandObjectBreakpointNameAdd (CommandInterpreter &interpreter) : 19915e09c8c3SJim Ingham CommandObjectParsed (interpreter, 19925e09c8c3SJim Ingham "add", 19935e09c8c3SJim Ingham "Add a name to the breakpoints provided.", 19945e09c8c3SJim Ingham "breakpoint name add <command-options> <breakpoint-id-list>"), 19955e09c8c3SJim Ingham m_name_options(), 19965e09c8c3SJim Ingham m_option_group(interpreter) 19975e09c8c3SJim Ingham { 19985e09c8c3SJim Ingham // Create the first variant for the first (and only) argument for this command. 19995e09c8c3SJim Ingham CommandArgumentEntry arg1; 20005e09c8c3SJim Ingham CommandArgumentData id_arg; 20015e09c8c3SJim Ingham id_arg.arg_type = eArgTypeBreakpointID; 20025e09c8c3SJim Ingham id_arg.arg_repetition = eArgRepeatOptional; 20035e09c8c3SJim Ingham arg1.push_back(id_arg); 20045e09c8c3SJim Ingham m_arguments.push_back (arg1); 20055e09c8c3SJim Ingham 20065e09c8c3SJim Ingham m_option_group.Append (&m_name_options, LLDB_OPT_SET_1, LLDB_OPT_SET_ALL); 20075e09c8c3SJim Ingham m_option_group.Finalize(); 20085e09c8c3SJim Ingham } 20095e09c8c3SJim Ingham 20105e09c8c3SJim Ingham virtual 20115e09c8c3SJim Ingham ~CommandObjectBreakpointNameAdd () {} 20125e09c8c3SJim Ingham 20135e09c8c3SJim Ingham Options * 20145e09c8c3SJim Ingham GetOptions () 20155e09c8c3SJim Ingham { 20165e09c8c3SJim Ingham return &m_option_group; 20175e09c8c3SJim Ingham } 20185e09c8c3SJim Ingham 20195e09c8c3SJim Ingham protected: 20205e09c8c3SJim Ingham virtual bool 20215e09c8c3SJim Ingham DoExecute (Args& command, CommandReturnObject &result) 20225e09c8c3SJim Ingham { 20235e09c8c3SJim Ingham if (!m_name_options.m_name.OptionWasSet()) 20245e09c8c3SJim Ingham { 20255e09c8c3SJim Ingham result.SetError("No name option provided."); 20265e09c8c3SJim Ingham return false; 20275e09c8c3SJim Ingham } 20285e09c8c3SJim Ingham 20295e09c8c3SJim Ingham Target *target = GetSelectedOrDummyTarget(m_name_options.m_use_dummy.GetCurrentValue()); 20305e09c8c3SJim Ingham 20315e09c8c3SJim Ingham if (target == NULL) 20325e09c8c3SJim Ingham { 20335e09c8c3SJim Ingham result.AppendError ("Invalid target. No existing target or breakpoints."); 20345e09c8c3SJim Ingham result.SetStatus (eReturnStatusFailed); 20355e09c8c3SJim Ingham return false; 20365e09c8c3SJim Ingham } 20375e09c8c3SJim Ingham 20385e09c8c3SJim Ingham Mutex::Locker locker; 20395e09c8c3SJim Ingham target->GetBreakpointList().GetListMutex(locker); 20405e09c8c3SJim Ingham 20415e09c8c3SJim Ingham const BreakpointList &breakpoints = target->GetBreakpointList(); 20425e09c8c3SJim Ingham 20435e09c8c3SJim Ingham size_t num_breakpoints = breakpoints.GetSize(); 20445e09c8c3SJim Ingham if (num_breakpoints == 0) 20455e09c8c3SJim Ingham { 20465e09c8c3SJim Ingham result.SetError("No breakpoints, cannot add names."); 20475e09c8c3SJim Ingham result.SetStatus (eReturnStatusFailed); 20485e09c8c3SJim Ingham return false; 20495e09c8c3SJim Ingham } 20505e09c8c3SJim Ingham 20515e09c8c3SJim Ingham // Particular breakpoint selected; disable that breakpoint. 20525e09c8c3SJim Ingham BreakpointIDList valid_bp_ids; 20535e09c8c3SJim Ingham CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids); 20545e09c8c3SJim Ingham 20555e09c8c3SJim Ingham if (result.Succeeded()) 20565e09c8c3SJim Ingham { 20575e09c8c3SJim Ingham if (valid_bp_ids.GetSize() == 0) 20585e09c8c3SJim Ingham { 20595e09c8c3SJim Ingham result.SetError("No breakpoints specified, cannot add names."); 20605e09c8c3SJim Ingham result.SetStatus (eReturnStatusFailed); 20615e09c8c3SJim Ingham return false; 20625e09c8c3SJim Ingham } 20635e09c8c3SJim Ingham size_t num_valid_ids = valid_bp_ids.GetSize(); 20645e09c8c3SJim Ingham for (size_t index = 0; index < num_valid_ids; index++) 20655e09c8c3SJim Ingham { 20665e09c8c3SJim Ingham lldb::break_id_t bp_id = valid_bp_ids.GetBreakpointIDAtIndex(index).GetBreakpointID(); 20675e09c8c3SJim Ingham BreakpointSP bp_sp = breakpoints.FindBreakpointByID(bp_id); 20685e09c8c3SJim Ingham Error error; // We don't need to check the error here, since the option parser checked it... 20695e09c8c3SJim Ingham bp_sp->AddName(m_name_options.m_name.GetCurrentValue(), error); 20705e09c8c3SJim Ingham } 20715e09c8c3SJim Ingham } 20725e09c8c3SJim Ingham 20735e09c8c3SJim Ingham return true; 20745e09c8c3SJim Ingham } 20755e09c8c3SJim Ingham 20765e09c8c3SJim Ingham private: 20775e09c8c3SJim Ingham BreakpointNameOptionGroup m_name_options; 20785e09c8c3SJim Ingham OptionGroupOptions m_option_group; 20795e09c8c3SJim Ingham }; 20805e09c8c3SJim Ingham 20815e09c8c3SJim Ingham 20825e09c8c3SJim Ingham 20835e09c8c3SJim Ingham class CommandObjectBreakpointNameDelete : public CommandObjectParsed 20845e09c8c3SJim Ingham { 20855e09c8c3SJim Ingham public: 20865e09c8c3SJim Ingham CommandObjectBreakpointNameDelete (CommandInterpreter &interpreter) : 20875e09c8c3SJim Ingham CommandObjectParsed (interpreter, 20885e09c8c3SJim Ingham "delete", 20895e09c8c3SJim Ingham "Delete a name from the breakpoints provided.", 20905e09c8c3SJim Ingham "breakpoint name delete <command-options> <breakpoint-id-list>"), 20915e09c8c3SJim Ingham m_name_options(), 20925e09c8c3SJim Ingham m_option_group(interpreter) 20935e09c8c3SJim Ingham { 20945e09c8c3SJim Ingham // Create the first variant for the first (and only) argument for this command. 20955e09c8c3SJim Ingham CommandArgumentEntry arg1; 20965e09c8c3SJim Ingham CommandArgumentData id_arg; 20975e09c8c3SJim Ingham id_arg.arg_type = eArgTypeBreakpointID; 20985e09c8c3SJim Ingham id_arg.arg_repetition = eArgRepeatOptional; 20995e09c8c3SJim Ingham arg1.push_back(id_arg); 21005e09c8c3SJim Ingham m_arguments.push_back (arg1); 21015e09c8c3SJim Ingham 21025e09c8c3SJim Ingham m_option_group.Append (&m_name_options, LLDB_OPT_SET_1, LLDB_OPT_SET_ALL); 21035e09c8c3SJim Ingham m_option_group.Finalize(); 21045e09c8c3SJim Ingham } 21055e09c8c3SJim Ingham 21065e09c8c3SJim Ingham virtual 21075e09c8c3SJim Ingham ~CommandObjectBreakpointNameDelete () {} 21085e09c8c3SJim Ingham 21095e09c8c3SJim Ingham Options * 21105e09c8c3SJim Ingham GetOptions () 21115e09c8c3SJim Ingham { 21125e09c8c3SJim Ingham return &m_option_group; 21135e09c8c3SJim Ingham } 21145e09c8c3SJim Ingham 21155e09c8c3SJim Ingham protected: 21165e09c8c3SJim Ingham virtual bool 21175e09c8c3SJim Ingham DoExecute (Args& command, CommandReturnObject &result) 21185e09c8c3SJim Ingham { 21195e09c8c3SJim Ingham if (!m_name_options.m_name.OptionWasSet()) 21205e09c8c3SJim Ingham { 21215e09c8c3SJim Ingham result.SetError("No name option provided."); 21225e09c8c3SJim Ingham return false; 21235e09c8c3SJim Ingham } 21245e09c8c3SJim Ingham 21255e09c8c3SJim Ingham Target *target = GetSelectedOrDummyTarget(m_name_options.m_use_dummy.GetCurrentValue()); 21265e09c8c3SJim Ingham 21275e09c8c3SJim Ingham if (target == NULL) 21285e09c8c3SJim Ingham { 21295e09c8c3SJim Ingham result.AppendError ("Invalid target. No existing target or breakpoints."); 21305e09c8c3SJim Ingham result.SetStatus (eReturnStatusFailed); 21315e09c8c3SJim Ingham return false; 21325e09c8c3SJim Ingham } 21335e09c8c3SJim Ingham 21345e09c8c3SJim Ingham Mutex::Locker locker; 21355e09c8c3SJim Ingham target->GetBreakpointList().GetListMutex(locker); 21365e09c8c3SJim Ingham 21375e09c8c3SJim Ingham const BreakpointList &breakpoints = target->GetBreakpointList(); 21385e09c8c3SJim Ingham 21395e09c8c3SJim Ingham size_t num_breakpoints = breakpoints.GetSize(); 21405e09c8c3SJim Ingham if (num_breakpoints == 0) 21415e09c8c3SJim Ingham { 21425e09c8c3SJim Ingham result.SetError("No breakpoints, cannot delete names."); 21435e09c8c3SJim Ingham result.SetStatus (eReturnStatusFailed); 21445e09c8c3SJim Ingham return false; 21455e09c8c3SJim Ingham } 21465e09c8c3SJim Ingham 21475e09c8c3SJim Ingham // Particular breakpoint selected; disable that breakpoint. 21485e09c8c3SJim Ingham BreakpointIDList valid_bp_ids; 21495e09c8c3SJim Ingham CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids); 21505e09c8c3SJim Ingham 21515e09c8c3SJim Ingham if (result.Succeeded()) 21525e09c8c3SJim Ingham { 21535e09c8c3SJim Ingham if (valid_bp_ids.GetSize() == 0) 21545e09c8c3SJim Ingham { 21555e09c8c3SJim Ingham result.SetError("No breakpoints specified, cannot delete names."); 21565e09c8c3SJim Ingham result.SetStatus (eReturnStatusFailed); 21575e09c8c3SJim Ingham return false; 21585e09c8c3SJim Ingham } 21595e09c8c3SJim Ingham size_t num_valid_ids = valid_bp_ids.GetSize(); 21605e09c8c3SJim Ingham for (size_t index = 0; index < num_valid_ids; index++) 21615e09c8c3SJim Ingham { 21625e09c8c3SJim Ingham lldb::break_id_t bp_id = valid_bp_ids.GetBreakpointIDAtIndex(index).GetBreakpointID(); 21635e09c8c3SJim Ingham BreakpointSP bp_sp = breakpoints.FindBreakpointByID(bp_id); 21645e09c8c3SJim Ingham bp_sp->RemoveName(m_name_options.m_name.GetCurrentValue()); 21655e09c8c3SJim Ingham } 21665e09c8c3SJim Ingham } 21675e09c8c3SJim Ingham 21685e09c8c3SJim Ingham return true; 21695e09c8c3SJim Ingham } 21705e09c8c3SJim Ingham 21715e09c8c3SJim Ingham private: 21725e09c8c3SJim Ingham BreakpointNameOptionGroup m_name_options; 21735e09c8c3SJim Ingham OptionGroupOptions m_option_group; 21745e09c8c3SJim Ingham }; 21755e09c8c3SJim Ingham 21765e09c8c3SJim Ingham class CommandObjectBreakpointNameList : public CommandObjectParsed 21775e09c8c3SJim Ingham { 21785e09c8c3SJim Ingham public: 21795e09c8c3SJim Ingham CommandObjectBreakpointNameList (CommandInterpreter &interpreter) : 21805e09c8c3SJim Ingham CommandObjectParsed (interpreter, 21815e09c8c3SJim Ingham "list", 21825e09c8c3SJim Ingham "List either the names for a breakpoint or the breakpoints for a given name.", 21835e09c8c3SJim Ingham "breakpoint name list <command-options>"), 21845e09c8c3SJim Ingham m_name_options(), 21855e09c8c3SJim Ingham m_option_group(interpreter) 21865e09c8c3SJim Ingham { 21875e09c8c3SJim Ingham m_option_group.Append (&m_name_options); 21885e09c8c3SJim Ingham m_option_group.Finalize(); 21895e09c8c3SJim Ingham } 21905e09c8c3SJim Ingham 21915e09c8c3SJim Ingham virtual 21925e09c8c3SJim Ingham ~CommandObjectBreakpointNameList () {} 21935e09c8c3SJim Ingham 21945e09c8c3SJim Ingham Options * 21955e09c8c3SJim Ingham GetOptions () 21965e09c8c3SJim Ingham { 21975e09c8c3SJim Ingham return &m_option_group; 21985e09c8c3SJim Ingham } 21995e09c8c3SJim Ingham 22005e09c8c3SJim Ingham protected: 22015e09c8c3SJim Ingham protected: 22025e09c8c3SJim Ingham virtual bool 22035e09c8c3SJim Ingham DoExecute (Args& command, CommandReturnObject &result) 22045e09c8c3SJim Ingham { 22055e09c8c3SJim Ingham Target *target = GetSelectedOrDummyTarget(m_name_options.m_use_dummy.GetCurrentValue()); 22065e09c8c3SJim Ingham 22075e09c8c3SJim Ingham if (target == NULL) 22085e09c8c3SJim Ingham { 22095e09c8c3SJim Ingham result.AppendError ("Invalid target. No existing target or breakpoints."); 22105e09c8c3SJim Ingham result.SetStatus (eReturnStatusFailed); 22115e09c8c3SJim Ingham return false; 22125e09c8c3SJim Ingham } 22135e09c8c3SJim Ingham 22145e09c8c3SJim Ingham if (m_name_options.m_name.OptionWasSet()) 22155e09c8c3SJim Ingham { 22165e09c8c3SJim Ingham const char *name = m_name_options.m_name.GetCurrentValue(); 22175e09c8c3SJim Ingham Mutex::Locker locker; 22185e09c8c3SJim Ingham target->GetBreakpointList().GetListMutex(locker); 22195e09c8c3SJim Ingham 22205e09c8c3SJim Ingham BreakpointList &breakpoints = target->GetBreakpointList(); 22215e09c8c3SJim Ingham for (BreakpointSP bp_sp : breakpoints.Breakpoints()) 22225e09c8c3SJim Ingham { 22235e09c8c3SJim Ingham if (bp_sp->MatchesName(name)) 22245e09c8c3SJim Ingham { 22255e09c8c3SJim Ingham StreamString s; 22265e09c8c3SJim Ingham bp_sp->GetDescription(&s, eDescriptionLevelBrief); 22275e09c8c3SJim Ingham s.EOL(); 22285e09c8c3SJim Ingham result.AppendMessage(s.GetData()); 22295e09c8c3SJim Ingham } 22305e09c8c3SJim Ingham } 22315e09c8c3SJim Ingham 22325e09c8c3SJim Ingham } 22335e09c8c3SJim Ingham else if (m_name_options.m_breakpoint.OptionWasSet()) 22345e09c8c3SJim Ingham { 22355e09c8c3SJim Ingham BreakpointSP bp_sp = target->GetBreakpointList().FindBreakpointByID(m_name_options.m_breakpoint.GetCurrentValue()); 22365e09c8c3SJim Ingham if (bp_sp) 22375e09c8c3SJim Ingham { 22385e09c8c3SJim Ingham std::vector<std::string> names; 22395e09c8c3SJim Ingham bp_sp->GetNames (names); 22405e09c8c3SJim Ingham result.AppendMessage ("Names:"); 22415e09c8c3SJim Ingham for (auto name : names) 22425e09c8c3SJim Ingham result.AppendMessageWithFormat (" %s\n", name.c_str()); 22435e09c8c3SJim Ingham } 22445e09c8c3SJim Ingham else 22455e09c8c3SJim Ingham { 22465e09c8c3SJim Ingham result.AppendErrorWithFormat ("Could not find breakpoint %" PRId64 ".\n", 22475e09c8c3SJim Ingham m_name_options.m_breakpoint.GetCurrentValue()); 22485e09c8c3SJim Ingham result.SetStatus (eReturnStatusFailed); 22495e09c8c3SJim Ingham return false; 22505e09c8c3SJim Ingham } 22515e09c8c3SJim Ingham } 22525e09c8c3SJim Ingham else 22535e09c8c3SJim Ingham { 22545e09c8c3SJim Ingham result.SetError ("Must specify -N or -B option to list."); 22555e09c8c3SJim Ingham result.SetStatus (eReturnStatusFailed); 22565e09c8c3SJim Ingham return false; 22575e09c8c3SJim Ingham } 22585e09c8c3SJim Ingham return true; 22595e09c8c3SJim Ingham } 22605e09c8c3SJim Ingham 22615e09c8c3SJim Ingham private: 22625e09c8c3SJim Ingham BreakpointNameOptionGroup m_name_options; 22635e09c8c3SJim Ingham OptionGroupOptions m_option_group; 22645e09c8c3SJim Ingham }; 22655e09c8c3SJim Ingham 22665e09c8c3SJim Ingham //------------------------------------------------------------------------- 22675e09c8c3SJim Ingham // CommandObjectMultiwordBreakpoint 22685e09c8c3SJim Ingham //------------------------------------------------------------------------- 22695e09c8c3SJim Ingham class CommandObjectBreakpointName : public CommandObjectMultiword 22705e09c8c3SJim Ingham { 22715e09c8c3SJim Ingham public: 22725e09c8c3SJim Ingham CommandObjectBreakpointName (CommandInterpreter &interpreter) : 22735e09c8c3SJim Ingham CommandObjectMultiword(interpreter, 22745e09c8c3SJim Ingham "name", 22755e09c8c3SJim Ingham "A set of commands to manage name tags for breakpoints", 22765e09c8c3SJim Ingham "breakpoint name <command> [<command-options>]") 22775e09c8c3SJim Ingham { 22785e09c8c3SJim Ingham CommandObjectSP add_command_object (new CommandObjectBreakpointNameAdd (interpreter)); 22795e09c8c3SJim Ingham CommandObjectSP delete_command_object (new CommandObjectBreakpointNameDelete (interpreter)); 22805e09c8c3SJim Ingham CommandObjectSP list_command_object (new CommandObjectBreakpointNameList (interpreter)); 22815e09c8c3SJim Ingham 22825e09c8c3SJim Ingham LoadSubCommand ("add", add_command_object); 22835e09c8c3SJim Ingham LoadSubCommand ("delete", delete_command_object); 22845e09c8c3SJim Ingham LoadSubCommand ("list", list_command_object); 22855e09c8c3SJim Ingham 22865e09c8c3SJim Ingham } 22875e09c8c3SJim Ingham 22885e09c8c3SJim Ingham virtual 22895e09c8c3SJim Ingham ~CommandObjectBreakpointName () 22905e09c8c3SJim Ingham { 22915e09c8c3SJim Ingham } 22925e09c8c3SJim Ingham 22935e09c8c3SJim Ingham }; 22945e09c8c3SJim Ingham 22955e09c8c3SJim Ingham 22965e09c8c3SJim Ingham //------------------------------------------------------------------------- 229730fdc8d8SChris Lattner // CommandObjectMultiwordBreakpoint 229830fdc8d8SChris Lattner //------------------------------------------------------------------------- 2299ae1c4cf5SJim Ingham #pragma mark MultiwordBreakpoint 230030fdc8d8SChris Lattner 23016611103cSGreg Clayton CommandObjectMultiwordBreakpoint::CommandObjectMultiwordBreakpoint (CommandInterpreter &interpreter) : 2302a7015092SGreg Clayton CommandObjectMultiword (interpreter, 2303a7015092SGreg Clayton "breakpoint", 230446fbc60fSJim Ingham "A set of commands for operating on breakpoints. Also see _regexp-break.", 230530fdc8d8SChris Lattner "breakpoint <command> [<command-options>]") 230630fdc8d8SChris Lattner { 2307a7015092SGreg Clayton CommandObjectSP list_command_object (new CommandObjectBreakpointList (interpreter)); 2308a7015092SGreg Clayton CommandObjectSP enable_command_object (new CommandObjectBreakpointEnable (interpreter)); 2309a7015092SGreg Clayton CommandObjectSP disable_command_object (new CommandObjectBreakpointDisable (interpreter)); 2310b7234e40SJohnny Chen CommandObjectSP clear_command_object (new CommandObjectBreakpointClear (interpreter)); 2311b7234e40SJohnny Chen CommandObjectSP delete_command_object (new CommandObjectBreakpointDelete (interpreter)); 2312a7015092SGreg Clayton CommandObjectSP set_command_object (new CommandObjectBreakpointSet (interpreter)); 231330fdc8d8SChris Lattner CommandObjectSP command_command_object (new CommandObjectBreakpointCommand (interpreter)); 2314a7015092SGreg Clayton CommandObjectSP modify_command_object (new CommandObjectBreakpointModify(interpreter)); 23155e09c8c3SJim Ingham CommandObjectSP name_command_object (new CommandObjectBreakpointName(interpreter)); 231630fdc8d8SChris Lattner 2317b7234e40SJohnny Chen list_command_object->SetCommandName ("breakpoint list"); 231830fdc8d8SChris Lattner enable_command_object->SetCommandName("breakpoint enable"); 231930fdc8d8SChris Lattner disable_command_object->SetCommandName("breakpoint disable"); 2320b7234e40SJohnny Chen clear_command_object->SetCommandName("breakpoint clear"); 2321b7234e40SJohnny Chen delete_command_object->SetCommandName("breakpoint delete"); 2322ae1c4cf5SJim Ingham set_command_object->SetCommandName("breakpoint set"); 2323b7234e40SJohnny Chen command_command_object->SetCommandName ("breakpoint command"); 2324b7234e40SJohnny Chen modify_command_object->SetCommandName ("breakpoint modify"); 23255e09c8c3SJim Ingham name_command_object->SetCommandName ("breakpoint name"); 232630fdc8d8SChris Lattner 232723f59509SGreg Clayton LoadSubCommand ("list", list_command_object); 232823f59509SGreg Clayton LoadSubCommand ("enable", enable_command_object); 232923f59509SGreg Clayton LoadSubCommand ("disable", disable_command_object); 233023f59509SGreg Clayton LoadSubCommand ("clear", clear_command_object); 233123f59509SGreg Clayton LoadSubCommand ("delete", delete_command_object); 233223f59509SGreg Clayton LoadSubCommand ("set", set_command_object); 233323f59509SGreg Clayton LoadSubCommand ("command", command_command_object); 233423f59509SGreg Clayton LoadSubCommand ("modify", modify_command_object); 23355e09c8c3SJim Ingham LoadSubCommand ("name", name_command_object); 233630fdc8d8SChris Lattner } 233730fdc8d8SChris Lattner 233830fdc8d8SChris Lattner CommandObjectMultiwordBreakpoint::~CommandObjectMultiwordBreakpoint () 233930fdc8d8SChris Lattner { 234030fdc8d8SChris Lattner } 234130fdc8d8SChris Lattner 234230fdc8d8SChris Lattner void 23435e09c8c3SJim Ingham CommandObjectMultiwordBreakpoint::VerifyIDs (Args &args, 23445e09c8c3SJim Ingham Target *target, 23455e09c8c3SJim Ingham bool allow_locations, 23465e09c8c3SJim Ingham CommandReturnObject &result, 234730fdc8d8SChris Lattner BreakpointIDList *valid_ids) 234830fdc8d8SChris Lattner { 234930fdc8d8SChris Lattner // args can be strings representing 1). integers (for breakpoint ids) 235030fdc8d8SChris Lattner // 2). the full breakpoint & location canonical representation 235130fdc8d8SChris Lattner // 3). the word "to" or a hyphen, representing a range (in which case there 235230fdc8d8SChris Lattner // had *better* be an entry both before & after of one of the first two types. 23535e09c8c3SJim Ingham // 4). A breakpoint name 235436f3b369SJim Ingham // If args is empty, we will use the last created breakpoint (if there is one.) 235530fdc8d8SChris Lattner 235630fdc8d8SChris Lattner Args temp_args; 235730fdc8d8SChris Lattner 235836f3b369SJim Ingham if (args.GetArgumentCount() == 0) 235936f3b369SJim Ingham { 23604d122c40SGreg Clayton if (target->GetLastCreatedBreakpoint()) 236136f3b369SJim Ingham { 236236f3b369SJim Ingham valid_ids->AddBreakpointID (BreakpointID(target->GetLastCreatedBreakpoint()->GetID(), LLDB_INVALID_BREAK_ID)); 236336f3b369SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 236436f3b369SJim Ingham } 236536f3b369SJim Ingham else 236636f3b369SJim Ingham { 236736f3b369SJim Ingham result.AppendError("No breakpoint specified and no last created breakpoint."); 236836f3b369SJim Ingham result.SetStatus (eReturnStatusFailed); 236936f3b369SJim Ingham } 237036f3b369SJim Ingham return; 237136f3b369SJim Ingham } 237236f3b369SJim Ingham 237330fdc8d8SChris Lattner // Create a new Args variable to use; copy any non-breakpoint-id-ranges stuff directly from the old ARGS to 237430fdc8d8SChris Lattner // the new TEMP_ARGS. Do not copy breakpoint id range strings over; instead generate a list of strings for 237530fdc8d8SChris Lattner // all the breakpoint ids in the range, and shove all of those breakpoint id strings into TEMP_ARGS. 237630fdc8d8SChris Lattner 23775e09c8c3SJim Ingham BreakpointIDList::FindAndReplaceIDRanges (args, target, allow_locations, result, temp_args); 237830fdc8d8SChris Lattner 237930fdc8d8SChris Lattner // NOW, convert the list of breakpoint id strings in TEMP_ARGS into an actual BreakpointIDList: 238030fdc8d8SChris Lattner 2381c982c768SGreg Clayton valid_ids->InsertStringArray (temp_args.GetConstArgumentVector(), temp_args.GetArgumentCount(), result); 238230fdc8d8SChris Lattner 238330fdc8d8SChris Lattner // At this point, all of the breakpoint ids that the user passed in have been converted to breakpoint IDs 238430fdc8d8SChris Lattner // and put into valid_ids. 238530fdc8d8SChris Lattner 238630fdc8d8SChris Lattner if (result.Succeeded()) 238730fdc8d8SChris Lattner { 238830fdc8d8SChris Lattner // Now that we've converted everything from args into a list of breakpoint ids, go through our tentative list 238930fdc8d8SChris Lattner // of breakpoint id's and verify that they correspond to valid/currently set breakpoints. 239030fdc8d8SChris Lattner 2391c982c768SGreg Clayton const size_t count = valid_ids->GetSize(); 2392c982c768SGreg Clayton for (size_t i = 0; i < count; ++i) 239330fdc8d8SChris Lattner { 239430fdc8d8SChris Lattner BreakpointID cur_bp_id = valid_ids->GetBreakpointIDAtIndex (i); 239530fdc8d8SChris Lattner Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get(); 239630fdc8d8SChris Lattner if (breakpoint != NULL) 239730fdc8d8SChris Lattner { 2398c7bece56SGreg Clayton const size_t num_locations = breakpoint->GetNumLocations(); 23993985c8c6SSaleem Abdulrasool if (static_cast<size_t>(cur_bp_id.GetLocationID()) > num_locations) 240030fdc8d8SChris Lattner { 240130fdc8d8SChris Lattner StreamString id_str; 2402c982c768SGreg Clayton BreakpointID::GetCanonicalReference (&id_str, 2403c982c768SGreg Clayton cur_bp_id.GetBreakpointID(), 240430fdc8d8SChris Lattner cur_bp_id.GetLocationID()); 2405c982c768SGreg Clayton i = valid_ids->GetSize() + 1; 240630fdc8d8SChris Lattner result.AppendErrorWithFormat ("'%s' is not a currently valid breakpoint/location id.\n", 240730fdc8d8SChris Lattner id_str.GetData()); 240830fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 240930fdc8d8SChris Lattner } 241030fdc8d8SChris Lattner } 241130fdc8d8SChris Lattner else 241230fdc8d8SChris Lattner { 2413c982c768SGreg Clayton i = valid_ids->GetSize() + 1; 241430fdc8d8SChris Lattner result.AppendErrorWithFormat ("'%d' is not a currently valid breakpoint id.\n", cur_bp_id.GetBreakpointID()); 241530fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 241630fdc8d8SChris Lattner } 241730fdc8d8SChris Lattner } 241830fdc8d8SChris Lattner } 241930fdc8d8SChris Lattner } 2420