summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohnny Chen <johnny.chen@apple.com>2012-05-25 21:10:46 +0000
committerJohnny Chen <johnny.chen@apple.com>2012-05-25 21:10:46 +0000
commit7d49c9c8610f1d8756292efa875717470db1d067 (patch)
treeae23edcc9ee717f45fd9d605b3d917de5d2ea900
parent03968fac4f04d863346bf5e28e815a2fc613a325 (diff)
downloadbcm5719-llvm-7d49c9c8610f1d8756292efa875717470db1d067.tar.gz
bcm5719-llvm-7d49c9c8610f1d8756292efa875717470db1d067.zip
rdar://problem/11533713
Allow setting conditions inline with breakpoints. Add test cases. llvm-svn: 157497
-rw-r--r--lldb/source/Commands/CommandObjectBreakpoint.cpp16
-rw-r--r--lldb/source/Commands/CommandObjectBreakpoint.h1
-rw-r--r--lldb/test/functionalities/breakpoint/breakpoint_conditions/TestBreakpointConditions.py40
3 files changed, 44 insertions, 13 deletions
diff --git a/lldb/source/Commands/CommandObjectBreakpoint.cpp b/lldb/source/Commands/CommandObjectBreakpoint.cpp
index 63bcb62ef83..4f0af6aeaaa 100644
--- a/lldb/source/Commands/CommandObjectBreakpoint.cpp
+++ b/lldb/source/Commands/CommandObjectBreakpoint.cpp
@@ -49,6 +49,7 @@ AddBreakpointDescription (Stream *s, Breakpoint *bp, lldb::DescriptionLevel leve
CommandObjectBreakpointSet::CommandOptions::CommandOptions(CommandInterpreter &interpreter) :
Options (interpreter),
+ m_condition (),
m_filenames (),
m_line_num (0),
m_column (0),
@@ -91,6 +92,9 @@ CommandObjectBreakpointSet::CommandOptions::g_option_table[] =
{ LLDB_OPT_SET_ALL, false, "ignore-count", 'i', required_argument, NULL, 0, eArgTypeCount,
"Set the number of times this breakpoint is skipped before stopping." },
+ { LLDB_OPT_SET_ALL, false, "condition", 'c', required_argument, NULL, 0, eArgTypeExpression,
+ "The breakpoint stops only if this condition expression evaluates to true."},
+
{ LLDB_OPT_SET_ALL, false, "thread-index", 'x', required_argument, NULL, 0, eArgTypeThreadIndex,
"The breakpoint stops only for the thread whose index matches this argument."},
@@ -111,7 +115,7 @@ CommandObjectBreakpointSet::CommandOptions::g_option_table[] =
// Comment out this option for the moment, as we don't actually use it, but will in the future.
// This way users won't see it, but the infrastructure is left in place.
- // { 0, false, "column", 'c', required_argument, NULL, "<column>",
+ // { 0, false, "column", 'C', required_argument, NULL, "<column>",
// "Set the breakpoint by source location at this particular column."},
{ LLDB_OPT_SET_2, true, "address", 'a', required_argument, NULL, 0, eArgTypeAddress,
@@ -179,10 +183,14 @@ CommandObjectBreakpointSet::CommandOptions::SetOptionValue (uint32_t option_idx,
error.SetErrorStringWithFormat ("invalid address string '%s'", option_arg);
break;
- case 'c':
+ case 'C':
m_column = Args::StringToUInt32 (option_arg, 0);
break;
+ case 'c':
+ m_condition.assign(option_arg);
+ break;
+
case 'f':
m_filenames.AppendIfUnique (FileSpec(option_arg, false));
break;
@@ -325,6 +333,7 @@ CommandObjectBreakpointSet::CommandOptions::SetOptionValue (uint32_t option_idx,
void
CommandObjectBreakpointSet::CommandOptions::OptionParsingStarting ()
{
+ m_condition.clear();
m_filenames.Clear();
m_line_num = 0;
m_column = 0;
@@ -586,6 +595,9 @@ CommandObjectBreakpointSet::Execute
if (m_options.m_ignore_count != 0)
bp->GetOptions()->SetIgnoreCount(m_options.m_ignore_count);
+
+ if (!m_options.m_condition.empty())
+ bp->GetOptions()->SetCondition(m_options.m_condition.c_str());
}
if (bp)
diff --git a/lldb/source/Commands/CommandObjectBreakpoint.h b/lldb/source/Commands/CommandObjectBreakpoint.h
index c9447452adc..143b95462cc 100644
--- a/lldb/source/Commands/CommandObjectBreakpoint.h
+++ b/lldb/source/Commands/CommandObjectBreakpoint.h
@@ -98,6 +98,7 @@ public:
// Instance variables to hold the values for command options.
+ std::string m_condition;
FileSpecList m_filenames;
uint32_t m_line_num;
uint32_t m_column;
diff --git a/lldb/test/functionalities/breakpoint/breakpoint_conditions/TestBreakpointConditions.py b/lldb/test/functionalities/breakpoint/breakpoint_conditions/TestBreakpointConditions.py
index d9c50d70d25..bd5df2d5f78 100644
--- a/lldb/test/functionalities/breakpoint/breakpoint_conditions/TestBreakpointConditions.py
+++ b/lldb/test/functionalities/breakpoint/breakpoint_conditions/TestBreakpointConditions.py
@@ -14,28 +14,41 @@ class BreakpointConditionsTestCase(TestBase):
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
@dsym_test
- def test_with_dsym_and_run_command(self):
+ def test_breakpoint_condition_with_dsym_and_run_command(self):
"""Exercise breakpoint condition with 'breakpoint modify -c <expr> id'."""
self.buildDsym()
self.breakpoint_conditions()
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
+ @dsym_test
+ def test_breakpoint_condition_inline_with_dsym_and_run_command(self):
+ """Exercise breakpoint condition inline with 'breakpoint set'."""
+ self.buildDsym()
+ self.breakpoint_conditions(inline=True)
+
+ @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
@python_api_test
@dsym_test
- def test_with_dsym_and_python_api(self):
+ def test_breakpoint_condition_with_dsym_and_python_api(self):
"""Use Python APIs to set breakpoint conditions."""
self.buildDsym()
self.breakpoint_conditions_python()
@dwarf_test
- def test_with_dwarf_and_run_command(self):
+ def test_breakpoint_condition_with_dwarf_and_run_command(self):
"""Exercise breakpoint condition with 'breakpoint modify -c <expr> id'."""
self.buildDwarf()
self.breakpoint_conditions()
+ @dwarf_test
+ def test_breakpoint_condition_inline_with_dwarf_and_run_command(self):
+ """Exercise breakpoint condition inline with 'breakpoint set'."""
+ self.buildDwarf()
+ self.breakpoint_conditions(inline=True)
+
@python_api_test
@dwarf_test
- def test_with_dwarf_and_python_api(self):
+ def test_breakpoint_condition_with_dwarf_and_python_api(self):
"""Use Python APIs to set breakpoint conditions."""
self.buildDwarf()
self.breakpoint_conditions_python()
@@ -47,17 +60,22 @@ class BreakpointConditionsTestCase(TestBase):
self.line1 = line_number('main.c', '// Find the line number of function "c" here.')
self.line2 = line_number('main.c', "// Find the line number of c's parent call here.")
- def breakpoint_conditions(self):
+ def breakpoint_conditions(self, inline=False):
"""Exercise breakpoint condition with 'breakpoint modify -c <expr> id'."""
exe = os.path.join(os.getcwd(), "a.out")
self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
- # Create a breakpoint by function name 'c'.
- self.expect("breakpoint set -n c", BREAKPOINT_CREATED,
- startstr = "Breakpoint created: 1: name = 'c', locations = 1")
-
- # And set a condition on the breakpoint to stop on when 'val == 3'.
- self.runCmd("breakpoint modify -c 'val == 3' 1")
+ if inline:
+ # Create a breakpoint by function name 'c' and set the condition.
+ self.expect("breakpoint set -n c -c 'val == 3'", BREAKPOINT_CREATED,
+ startstr = "Breakpoint created: 1: name = 'c', locations = 1")
+ else:
+ # Create a breakpoint by function name 'c'.
+ self.expect("breakpoint set -n c", BREAKPOINT_CREATED,
+ startstr = "Breakpoint created: 1: name = 'c', locations = 1")
+
+ # And set a condition on the breakpoint to stop on when 'val == 3'.
+ self.runCmd("breakpoint modify -c 'val == 3' 1")
# Now run the program.
self.runCmd("run", RUN_SUCCEEDED)
OpenPOWER on IntegriCloud