[Lldb-commits] [lldb] r255421 - Fix the L1 cache search in MemoryCache::Read to use the

Jason Molenda via lldb-commits lldb-commits at lists.llvm.org
Fri Dec 11 19:06:11 PST 2015


Author: jmolenda
Date: Fri Dec 11 21:06:10 2015
New Revision: 255421

URL: http://llvm.org/viewvc/llvm-project?rev=255421&view=rev
Log:
Fix the L1 cache search in MemoryCache::Read to use the 
stl upper_bound method instead of lower_bound - we were
failing to find some cached data in the L1 cache resulting
in extra memory read packets while stepping.

The bug with the existing code looked like this:
If the L1 cache has 8 bytes at address 0x1000 and 8 bytes
at address 0x2000 and we are searching for 4 bytes at 0x2004,
the use of lower_bound would return the end() of the container
and so we would incorrectly treat the memory as uncached.

(the L1 cache is memory seeded from debugserver in the T aka
questionmark packet, where debugserver will send up the stack
memory that likely contains the caller's stack pointer and 
frame pointer values.)

<rdar://problem/23869227> 

Modified:
    lldb/trunk/source/Target/Memory.cpp

Modified: lldb/trunk/source/Target/Memory.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Memory.cpp?rev=255421&r1=255420&r2=255421&view=diff
==============================================================================
--- lldb/trunk/source/Target/Memory.cpp (original)
+++ lldb/trunk/source/Target/Memory.cpp Fri Dec 11 21:06:10 2015
@@ -164,24 +164,16 @@ MemoryCache::Read (addr_t addr,
     if (!m_L1_cache.empty())
     {
         AddrRange read_range(addr, dst_len);
-        BlockMap::iterator pos = m_L1_cache.lower_bound(addr);
-        if (pos != m_L1_cache.end())
+        BlockMap::iterator pos = m_L1_cache.upper_bound(addr);
+        if (pos != m_L1_cache.begin ())
         {
-            AddrRange chunk_range(pos->first, pos->second->GetByteSize());
-            bool match = chunk_range.Contains(read_range);
-            if (!match && pos != m_L1_cache.begin())
-            {
-                --pos;
-                chunk_range.SetRangeBase(pos->first);
-                chunk_range.SetByteSize(pos->second->GetByteSize());
-                match = chunk_range.Contains(read_range);
-            }
-
-            if (match)
-            {
-                memcpy(dst, pos->second->GetBytes() + addr - chunk_range.GetRangeBase(), dst_len);
-                return dst_len;
-            }
+            --pos;
+        }
+        AddrRange chunk_range(pos->first, pos->second->GetByteSize());
+        if (chunk_range.Contains(read_range))
+        {
+            memcpy(dst, pos->second->GetBytes() + addr - chunk_range.GetRangeBase(), dst_len);
+            return dst_len;
         }
     }
 




More information about the lldb-commits mailing list