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.


git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@134090 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/lldb/Breakpoint/BreakpointSiteList.h b/include/lldb/Breakpoint/BreakpointSiteList.h
index f22c7c7..0052468 100644
--- a/include/lldb/Breakpoint/BreakpointSiteList.h
+++ b/include/lldb/Breakpoint/BreakpointSiteList.h
@@ -165,6 +165,9 @@
 
     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/source/Breakpoint/BreakpointSiteList.cpp b/source/Breakpoint/BreakpointSiteList.cpp
index f3f10f0..a8858f7 100644
--- a/source/Breakpoint/BreakpointSiteList.cpp
+++ b/source/Breakpoint/BreakpointSiteList.cpp
@@ -209,6 +209,41 @@
     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/source/Target/Process.cpp b/source/Target/Process.cpp
index 178d3c3..756f999 100644
--- a/source/Target/Process.cpp
+++ b/source/Target/Process.cpp
@@ -1378,18 +1378,22 @@
     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);
+                }
             }
         }
     }