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; } } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits