summaryrefslogtreecommitdiffstats
path: root/lldb
diff options
context:
space:
mode:
Diffstat (limited to 'lldb')
-rw-r--r--lldb/include/lldb/Core/Disassembler.h26
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/require_hw_breakpoints/TestRequireHWBreakpoints.py7
-rw-r--r--lldb/source/Core/Disassembler.cpp5
-rw-r--r--lldb/source/Target/Process.cpp3
-rw-r--r--lldb/source/Target/ThreadPlanStepRange.cpp7
5 files changed, 38 insertions, 10 deletions
diff --git a/lldb/include/lldb/Core/Disassembler.h b/lldb/include/lldb/Core/Disassembler.h
index a2a0bd5b99c..b708fee0163 100644
--- a/lldb/include/lldb/Core/Disassembler.h
+++ b/lldb/include/lldb/Core/Disassembler.h
@@ -290,8 +290,32 @@ public:
lldb::InstructionSP GetInstructionAtIndex(size_t idx) const;
+ //------------------------------------------------------------------
+ /// Get the index of the next branch instruction.
+ ///
+ /// Given a list of instructions, find the next branch instruction
+ /// in the list by returning an index.
+ ///
+ /// @param[in] start
+ /// The instruction index of the first instruction to check.
+ ///
+ /// @param[in] target
+ /// A LLDB target object that is used to resolve addresses.
+ ///
+ /// @param[in] ignore_calls
+ /// It true, then fine the first branch instruction that isn't
+ /// a function call (a branch that calls and returns to the next
+ /// instruction). If false, find the instruction index of any
+ /// branch in the list.
+ ///
+ /// @return
+ /// The instruction index of the first branch that is at or past
+ /// \a start. Returns UINT32_MAX if no matching branches are
+ /// found.
+ //------------------------------------------------------------------
uint32_t GetIndexOfNextBranchInstruction(uint32_t start,
- Target &target) const;
+ Target &target,
+ bool ignore_calls) const;
uint32_t GetIndexOfInstructionAtLoadAddress(lldb::addr_t load_addr,
Target &target);
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/require_hw_breakpoints/TestRequireHWBreakpoints.py b/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/require_hw_breakpoints/TestRequireHWBreakpoints.py
index cda15fee84b..c0587946261 100644
--- a/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/require_hw_breakpoints/TestRequireHWBreakpoints.py
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/require_hw_breakpoints/TestRequireHWBreakpoints.py
@@ -79,12 +79,11 @@ class BreakpointLocationsTestCase(TestBase):
self.runCmd("settings set target.require-hardware-breakpoint true")
# Step over doesn't fail immediately but fails later on.
- self.expect("thread step-over")
self.expect(
- "process status",
+ "thread step-over",
+ error=True,
substrs=[
- 'step over failed',
- 'Could not create hardware breakpoint for thread plan'
+ 'error: Could not create hardware breakpoint for thread plan.'
])
@skipIfWindows
diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp
index 74f66b5d479..af7cf82d470 100644
--- a/lldb/source/Core/Disassembler.cpp
+++ b/lldb/source/Core/Disassembler.cpp
@@ -1087,13 +1087,16 @@ void InstructionList::Append(lldb::InstructionSP &inst_sp) {
uint32_t
InstructionList::GetIndexOfNextBranchInstruction(uint32_t start,
- Target &target) const {
+ Target &target,
+ bool ignore_calls) const {
size_t num_instructions = m_instructions.size();
uint32_t next_branch = UINT32_MAX;
size_t i;
for (i = start; i < num_instructions; i++) {
if (m_instructions[i]->DoesBranch()) {
+ if (ignore_calls && m_instructions[i]->IsCall())
+ continue;
next_branch = i;
break;
}
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index 75566150320..6156abe6353 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -5832,7 +5832,8 @@ Process::AdvanceAddressToNextBranchInstruction(Address default_stop_addr,
}
uint32_t branch_index =
- insn_list->GetIndexOfNextBranchInstruction(insn_offset, target);
+ insn_list->GetIndexOfNextBranchInstruction(insn_offset, target,
+ false /* ignore_calls*/);
if (branch_index == UINT32_MAX) {
return retval;
}
diff --git a/lldb/source/Target/ThreadPlanStepRange.cpp b/lldb/source/Target/ThreadPlanStepRange.cpp
index e5b3eee5cfb..49c72dbf091 100644
--- a/lldb/source/Target/ThreadPlanStepRange.cpp
+++ b/lldb/source/Target/ThreadPlanStepRange.cpp
@@ -315,9 +315,10 @@ bool ThreadPlanStepRange::SetNextBranchBreakpoint() {
return false;
else {
Target &target = GetThread().GetProcess()->GetTarget();
- uint32_t branch_index;
- branch_index =
- instructions->GetIndexOfNextBranchInstruction(pc_index, target);
+ const bool ignore_calls = GetKind() == eKindStepOverRange;
+ uint32_t branch_index =
+ instructions->GetIndexOfNextBranchInstruction(pc_index, target,
+ ignore_calls);
Address run_to_address;
OpenPOWER on IntegriCloud