tsan: use memory access size for Go after all

helps to make range access functions correct and fast

llvm-svn: 183418
This commit is contained in:
Dmitry Vyukov 2013-06-06 14:31:15 +00:00
parent 573ec4f1aa
commit 0fffc0088c
3 changed files with 5 additions and 25 deletions

View File

@ -116,12 +116,14 @@ void __tsan_write(ThreadState *thr, void *addr, void *pc) {
void __tsan_read_range(ThreadState *thr, void *addr, uptr size, uptr step,
void *pc) {
MemoryAccessRangeStep(thr, (uptr)pc, (uptr)addr, size, step, false);
(void)step;
MemoryAccessRange(thr, (uptr)pc, (uptr)addr, size, false);
}
void __tsan_write_range(ThreadState *thr, void *addr, uptr size, uptr step,
void *pc) {
MemoryAccessRangeStep(thr, (uptr)pc, (uptr)addr, size, step, true);
(void)step;
MemoryAccessRange(thr, (uptr)pc, (uptr)addr, size, true);
}
void __tsan_func_enter(ThreadState *thr, void *pc) {

View File

@ -374,25 +374,4 @@ void MemoryAccessRange(ThreadState *thr, uptr pc, uptr addr,
}
}
void MemoryAccessRangeStep(ThreadState *thr, uptr pc, uptr addr,
uptr size, uptr step, bool is_write) {
if (size == 0)
return;
FastState fast_state = thr->fast_state;
if (fast_state.GetIgnoreBit())
return;
StatInc(thr, StatMopRange);
fast_state.IncrementEpoch();
thr->fast_state = fast_state;
TraceAddEvent(thr, fast_state, EventTypeMop, pc);
for (uptr addr_end = addr + size; addr < addr_end; addr += step) {
u64 *shadow_mem = (u64*)MemToShadow(addr);
Shadow cur(fast_state);
cur.SetWrite(is_write);
cur.SetAddr0AndSizeLog(addr & (kShadowCell - 1), kSizeLog1);
MemoryAccessImpl(thr, addr, kSizeLog1, is_write, false,
shadow_mem, cur);
}
}
} // namespace __tsan

View File

@ -57,8 +57,7 @@ do {
goto RACE;
}
// Do the memory access intersect?
// In Go all memory accesses are 1 byte, so there can be no intersections.
if (kCppMode && Shadow::TwoRangesIntersect(old, cur, kAccessSize)) {
if (Shadow::TwoRangesIntersect(old, cur, kAccessSize)) {
StatInc(thr, StatShadowIntersect);
if (Shadow::TidsAreEqual(old, cur)) {
StatInc(thr, StatShadowSameThread);