Index: include/lldb/API/SBAddress.h =================================================================== --- include/lldb/API/SBAddress.h +++ include/lldb/API/SBAddress.h @@ -103,6 +103,8 @@ const lldb_private::Address *operator->() const; + friend bool operator==(const SBAddress &lhs, const SBAddress &rhs); + lldb_private::Address *get(); lldb_private::Address &ref(); @@ -117,6 +119,8 @@ std::unique_ptr m_opaque_ap; }; +bool operator==(const SBAddress &lhs, const SBAddress &rhs); + } // namespace lldb #endif // LLDB_SBAddress_h_ Index: include/lldb/API/SBInstructionList.h =================================================================== --- include/lldb/API/SBInstructionList.h +++ include/lldb/API/SBInstructionList.h @@ -32,6 +32,12 @@ lldb::SBInstruction GetInstructionAtIndex(uint32_t idx); + size_t GetInstructionsCount(const SBAddress &start, + const SBAddress &end, + bool canSetBreakpoint = false); + + bool CanSetBreakpoint(size_t index); + void Clear(); void AppendInstruction(lldb::SBInstruction inst); Index: packages/Python/lldbsuite/test/functionalities/breakpoint/step_over_breakpoint/TestStepOverBreakpoint.py =================================================================== --- packages/Python/lldbsuite/test/functionalities/breakpoint/step_over_breakpoint/TestStepOverBreakpoint.py +++ packages/Python/lldbsuite/test/functionalities/breakpoint/step_over_breakpoint/TestStepOverBreakpoint.py @@ -62,19 +62,11 @@ instructions = function.GetInstructions(self.target) addr_1 = self.breakpoint1.GetLocationAtIndex(0).GetAddress() addr_4 = self.breakpoint4.GetLocationAtIndex(0).GetAddress() - delay_slot = 0 - addr_1_load_address = addr_1.GetLoadAddress(self.target) - addr_4_load_address = addr_4.GetLoadAddress(self.target) - for i in range(instructions.GetSize()) : - addr = instructions.GetInstructionAtIndex(i).GetAddress() - addr_load_address = addr.GetLoadAddress(self.target) - if (addr == addr_1) : index_1 = i - if (addr == addr_4) : index_4 = i - if (addr_1_load_address <= addr_load_address <= addr_4_load_address): - if (instructions.GetInstructionAtIndex(i).HasDelaySlot()) : - delay_slot = delay_slot + 1 - - steps_expected = index_4 - index_1 - delay_slot + + # if third argument is true then the count correspond to the + # number of instructions on which breakpoint can be set. + # start = addr_1, end = addr_4, canSetBreakpoint = True + steps_expected = instructions.GetInstructionsCount(addr_1, addr_4, True) step_count = 0 # Step from breakpoint_1 to breakpoint_4 while True: Index: scripts/interface/SBInstructionList.i =================================================================== --- scripts/interface/SBInstructionList.i +++ scripts/interface/SBInstructionList.i @@ -44,6 +44,11 @@ lldb::SBInstruction GetInstructionAtIndex (uint32_t idx); + size_t GetInstructionsCount(const SBAddress &start, const SBAddress &end, + bool canSetBreakpoint); + + bool CanSetBreakpoint(size_t index); + void Clear (); Index: source/API/SBAddress.cpp =================================================================== --- source/API/SBAddress.cpp +++ source/API/SBAddress.cpp @@ -55,6 +55,12 @@ return *this; } +bool lldb::operator==(const SBAddress &lhs, const SBAddress &rhs) { + if (lhs.IsValid() && rhs.IsValid()) + return lhs.ref() == rhs.ref(); + return false; +} + bool SBAddress::IsValid() const { return m_opaque_ap.get() != NULL && m_opaque_ap->IsValid(); } Index: source/API/SBInstructionList.cpp =================================================================== --- source/API/SBInstructionList.cpp +++ source/API/SBInstructionList.cpp @@ -9,6 +9,7 @@ #include "lldb/API/SBInstructionList.h" #include "lldb/API/SBInstruction.h" +#include "lldb/API/SBAddress.h" #include "lldb/API/SBStream.h" #include "lldb/Core/Disassembler.h" #include "lldb/Core/Module.h" @@ -49,6 +50,34 @@ return inst; } +size_t SBInstructionList::GetInstructionsCount(const SBAddress &start, + const SBAddress &end, + bool canSetBreakpoint) { + size_t num_instructions = GetSize(); + size_t i = 0; + SBAddress addr; + size_t lower_index = 0; + size_t upper_index = 0; + size_t instructions_to_skip = 0; + for (i = 0; i < num_instructions; ++i) { + addr = GetInstructionAtIndex(i).GetAddress(); + if (start == addr) + lower_index = i; + if (end == addr) + upper_index = i; + } + if (canSetBreakpoint) + for (i = lower_index; i <= upper_index; ++i) { + if (!CanSetBreakpoint(i)) + ++instructions_to_skip; + } + return upper_index - lower_index - instructions_to_skip; +} + +bool SBInstructionList::CanSetBreakpoint(size_t index) { + return !GetInstructionAtIndex(index).HasDelaySlot(); +} + void SBInstructionList::Clear() { m_opaque_sp.reset(); } void SBInstructionList::AppendInstruction(SBInstruction insn) {}