diff options
| author | Jim Ingham <jingham@apple.com> | 2011-06-29 19:42:28 +0000 |
|---|---|---|
| committer | Jim Ingham <jingham@apple.com> | 2011-06-29 19:42:28 +0000 |
| commit | 20c771998b59d485e1857f72730e41d848dad555 (patch) | |
| tree | 4f07f540c91235a47a307438e3b2328d9585af6a | |
| parent | e44914178866bcf1ecee169d5e29fe93be7a0d70 (diff) | |
| download | bcm5719-llvm-20c771998b59d485e1857f72730e41d848dad555.tar.gz bcm5719-llvm-20c771998b59d485e1857f72730e41d848dad555.zip | |
Remove a few more places where we were iterating linearly over the Breakpoint Site's rather than
looking up what we needed by address, which is much faster.
llvm-svn: 134090
| -rw-r--r-- | lldb/include/lldb/Breakpoint/BreakpointSiteList.h | 3 | ||||
| -rw-r--r-- | lldb/source/Breakpoint/BreakpointSiteList.cpp | 35 | ||||
| -rw-r--r-- | lldb/source/Target/Process.cpp | 20 |
3 files changed, 50 insertions, 8 deletions
diff --git a/lldb/include/lldb/Breakpoint/BreakpointSiteList.h b/lldb/include/lldb/Breakpoint/BreakpointSiteList.h index f22c7c74e40..005246815a9 100644 --- a/lldb/include/lldb/Breakpoint/BreakpointSiteList.h +++ b/lldb/include/lldb/Breakpoint/BreakpointSiteList.h @@ -165,6 +165,9 @@ public: void SetEnabledForAll(const bool enable, const lldb::break_id_t except_id = LLDB_INVALID_BREAK_ID); + + bool + FindInRange (lldb::addr_t lower_bound, lldb::addr_t upper_bound, BreakpointSiteList &bp_site_list) const; typedef void (*BreakpointSiteSPMapFunc) (lldb::BreakpointSiteSP &bp, void *baton); diff --git a/lldb/source/Breakpoint/BreakpointSiteList.cpp b/lldb/source/Breakpoint/BreakpointSiteList.cpp index f3f10f06ed7..a8858f71d69 100644 --- a/lldb/source/Breakpoint/BreakpointSiteList.cpp +++ b/lldb/source/Breakpoint/BreakpointSiteList.cpp @@ -209,6 +209,41 @@ BreakpointSiteList::GetByIndex (uint32_t i) const return stop_sp; } +bool +BreakpointSiteList::FindInRange (lldb::addr_t lower_bound, lldb::addr_t upper_bound, BreakpointSiteList &bp_site_list) const +{ + + if (lower_bound > upper_bound) + return false; + + collection::const_iterator lower, upper, pos; + lower = m_bp_site_list.lower_bound(lower_bound); + if (lower == m_bp_site_list.end() + || (*lower).first >= upper_bound) + return false; + + // This is one tricky bit. The breakpoint might overlap the bottom end of the range. So we grab the + // breakpoint prior to the lower bound, and check that that + its byte size isn't in our range. + if (lower != m_bp_site_list.begin()) + { + collection::const_iterator prev_pos = lower; + prev_pos--; + const BreakpointSiteSP &prev_bp = (*prev_pos).second; + if (prev_bp->GetLoadAddress() + prev_bp->GetByteSize() > lower_bound) + bp_site_list.Add (prev_bp); + + } + + upper = m_bp_site_list.upper_bound(upper_bound); + + for (pos = lower; pos != upper; pos++) + { + bp_site_list.Add ((*pos).second); + } + return true; +} + + void BreakpointSiteList::SetEnabledForAll (const bool enabled, const lldb::break_id_t except_id) { diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 178d3c39856..756f9995080 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -1378,18 +1378,22 @@ Process::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t size_t opcode_offset; size_t idx; BreakpointSiteSP bp; + BreakpointSiteList bp_sites_in_range; - for (idx = 0; (bp = m_breakpoint_site_list.GetByIndex(idx)) != NULL; ++idx) + if (m_breakpoint_site_list.FindInRange (bp_addr, bp_addr + size, bp_sites_in_range)) { - if (bp->GetType() == BreakpointSite::eSoftware) + for (idx = 0; (bp = bp_sites_in_range.GetByIndex(idx)) != NULL; ++idx) { - if (bp->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset)) + if (bp->GetType() == BreakpointSite::eSoftware) { - assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size); - assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size); - assert(opcode_offset + intersect_size <= bp->GetByteSize()); - size_t buf_offset = intersect_addr - bp_addr; - ::memcpy(buf + buf_offset, bp->GetSavedOpcodeBytes() + opcode_offset, intersect_size); + if (bp->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset)) + { + assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size); + assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size); + assert(opcode_offset + intersect_size <= bp->GetByteSize()); + size_t buf_offset = intersect_addr - bp_addr; + ::memcpy(buf + buf_offset, bp->GetSavedOpcodeBytes() + opcode_offset, intersect_size); + } } } } |

