forked from OSchip/llvm-project
Fixed MemoryCache L1 cache flush
Use the same method to find the cache line as in Read(). Differential Revision: http://reviews.llvm.org/D18050 llvm-svn: 263233
This commit is contained in:
parent
aef32bd319
commit
7a4eed280a
|
@ -0,0 +1,5 @@
|
|||
LEVEL = ../../../make
|
||||
|
||||
CXX_SOURCES := main.cpp
|
||||
|
||||
include $(LEVEL)/Makefile.rules
|
62
lldb/packages/Python/lldbsuite/test/functionalities/memory/cache/TestMemoryCache.py
vendored
Normal file
62
lldb/packages/Python/lldbsuite/test/functionalities/memory/cache/TestMemoryCache.py
vendored
Normal file
|
@ -0,0 +1,62 @@
|
|||
"""
|
||||
Test the MemoryCache L1 flush.
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
|
||||
|
||||
import os, time
|
||||
import re
|
||||
import lldb
|
||||
from lldbsuite.test.lldbtest import *
|
||||
import lldbsuite.test.lldbutil as lldbutil
|
||||
|
||||
class MemoryCacheTestCase(TestBase):
|
||||
|
||||
mydir = TestBase.compute_mydir(__file__)
|
||||
|
||||
def setUp(self):
|
||||
# Call super's setUp().
|
||||
TestBase.setUp(self)
|
||||
# Find the line number to break inside main().
|
||||
self.line = line_number('main.cpp', '// Set break point at this line.')
|
||||
|
||||
def test_memory_cache(self):
|
||||
"""Test the MemoryCache class with a sequence of 'memory read' and 'memory write' operations."""
|
||||
self.build()
|
||||
exe = os.path.join(os.getcwd(), "a.out")
|
||||
self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
|
||||
|
||||
# Break in main() after the variables are assigned values.
|
||||
lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
|
||||
|
||||
self.runCmd("run", RUN_SUCCEEDED)
|
||||
|
||||
# The stop reason of the thread should be breakpoint.
|
||||
self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
|
||||
substrs = ['stopped', 'stop reason = breakpoint'])
|
||||
|
||||
# The breakpoint should have a hit count of 1.
|
||||
self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
|
||||
substrs = [' resolved, hit count = 1'])
|
||||
|
||||
# Read a chunk of memory containing &my_ints[0]. The number of bytes read
|
||||
# must be greater than m_L2_cache_line_byte_size to make sure the L1
|
||||
# cache is used.
|
||||
self.runCmd('memory read -f d -c 201 `&my_ints - 100`')
|
||||
|
||||
# Check the value of my_ints[0] is the same as set in main.cpp.
|
||||
line = self.res.GetOutput().splitlines()[100]
|
||||
self.assertTrue(0x00000042 == int(line.split(':')[1], 0))
|
||||
|
||||
# Change the value of my_ints[0] in memory.
|
||||
self.runCmd("memory write `&my_ints` AA")
|
||||
|
||||
# Re-read the chunk of memory. The cache line should have been
|
||||
# flushed because of the 'memory write'.
|
||||
self.runCmd('memory read -f d -c 201 `&my_ints - 100`')
|
||||
|
||||
# Check the value of my_ints[0] have been updated correctly.
|
||||
line = self.res.GetOutput().splitlines()[100]
|
||||
self.assertTrue(0x000000AA == int(line.split(':')[1], 0))
|
|
@ -0,0 +1,14 @@
|
|||
//===-- main.cpp ------------------------------------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
int main ()
|
||||
{
|
||||
int my_ints[] = {0x42};
|
||||
return 0; // Set break point at this line.
|
||||
}
|
|
@ -78,7 +78,11 @@ MemoryCache::Flush (addr_t addr, size_t size)
|
|||
if (!m_L1_cache.empty())
|
||||
{
|
||||
AddrRange flush_range(addr, size);
|
||||
BlockMap::iterator pos = m_L1_cache.lower_bound(addr);
|
||||
BlockMap::iterator pos = m_L1_cache.upper_bound(addr);
|
||||
if (pos != m_L1_cache.begin())
|
||||
{
|
||||
--pos;
|
||||
}
|
||||
while (pos != m_L1_cache.end())
|
||||
{
|
||||
AddrRange chunk_range(pos->first, pos->second->GetByteSize());
|
||||
|
|
Loading…
Reference in New Issue