Index: include/lldb/Core/Disassembler.h =================================================================== --- include/lldb/Core/Disassembler.h +++ include/lldb/Core/Disassembler.h @@ -290,8 +290,32 @@ 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); Index: packages/Python/lldbsuite/test/functionalities/breakpoint/require_hw_breakpoints/TestRequireHWBreakpoints.py =================================================================== --- packages/Python/lldbsuite/test/functionalities/breakpoint/require_hw_breakpoints/TestRequireHWBreakpoints.py +++ packages/Python/lldbsuite/test/functionalities/breakpoint/require_hw_breakpoints/TestRequireHWBreakpoints.py @@ -79,12 +79,11 @@ 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 Index: source/Core/Disassembler.cpp =================================================================== --- source/Core/Disassembler.cpp +++ source/Core/Disassembler.cpp @@ -1087,13 +1087,16 @@ 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; } Index: source/Target/Process.cpp =================================================================== --- source/Target/Process.cpp +++ source/Target/Process.cpp @@ -5832,7 +5832,8 @@ } 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; } Index: source/Target/ThreadPlanStepRange.cpp =================================================================== --- source/Target/ThreadPlanStepRange.cpp +++ source/Target/ThreadPlanStepRange.cpp @@ -315,9 +315,10 @@ 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;