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:
parent
573ec4f1aa
commit
0fffc0088c
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue