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:
Marianne Mailhot-Sarrasin 2016-03-11 13:50:10 +00:00
parent aef32bd319
commit 7a4eed280a
4 changed files with 86 additions and 1 deletions

View File

@ -0,0 +1,5 @@
LEVEL = ../../../make
CXX_SOURCES := main.cpp
include $(LEVEL)/Makefile.rules

View 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))

View File

@ -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.
}

View File

@ -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());