Skip to content

Commit e492c11

Browse files
committed
Add trace, based on MemoryAccess() and MemoryAccessRange()
1 parent 5200bd9 commit e492c11

3 files changed

Lines changed: 46 additions & 0 deletions

File tree

compiler-rt/lib/tsan/rtl/tsan_rtl.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,8 @@ int Finalize(ThreadState *thr) {
800800

801801
failed = OnFinalize(failed);
802802

803+
LogFlushData();
804+
803805
return failed ? common_flags()->exitcode : 0;
804806
}
805807

compiler-rt/lib/tsan/rtl/tsan_rtl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454

5555
namespace __tsan {
5656

57+
void LogFlushData();
58+
5759
#if !SANITIZER_GO
5860
struct MapUnmapCallback;
5961
# if defined(__mips64) || defined(__aarch64__) || defined(__loongarch__) || \

compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,45 @@
1515

1616
namespace __tsan {
1717

18+
// How many log accesses to flush at one time
19+
#define STATS_BUFFER_COUNT 10000000
20+
21+
struct AccessData {
22+
uptr Address;
23+
uptr Size;
24+
Tid ThreadId;
25+
u8 Type;
26+
};
27+
28+
static Mutex LogMutex;
29+
static u32 LogDataOffset = 0;
30+
static AccessData LogData[STATS_BUFFER_COUNT];
31+
static char LogString[STATS_BUFFER_COUNT * 64];
32+
33+
void LogFlushData() {
34+
u32 Offset = 0;
35+
for (u32 I = 0; I < LogDataOffset; ++I)
36+
Offset += internal_snprintf(LogString + Offset,
37+
sizeof(LogString) - Offset,
38+
" > 0x%8lx %lu 0x%02x %u\n",
39+
LogData[I].Address,
40+
LogData[I].Size,
41+
LogData[I].Type,
42+
LogData[I].ThreadId);
43+
Printf("%s", LogString);
44+
}
45+
46+
void LogMemoryAccess(uptr Address, uptr Size,
47+
AccessType Type, Tid ThreadId) {
48+
LogMutex.Lock();
49+
LogData[LogDataOffset++] = {Address, Size, ThreadId, static_cast<u8>(Type)};
50+
if (LogDataOffset == STATS_BUFFER_COUNT) {
51+
LogFlushData();
52+
LogDataOffset = 0;
53+
}
54+
LogMutex.Unlock();
55+
}
56+
1857
ALWAYS_INLINE USED bool TryTraceMemoryAccess(ThreadState* thr, uptr pc,
1958
uptr addr, uptr size,
2059
AccessType typ) {
@@ -419,6 +458,7 @@ NOINLINE void TraceRestartMemoryAccess(ThreadState* thr, uptr pc, uptr addr,
419458

420459
ALWAYS_INLINE USED void MemoryAccess(ThreadState* thr, uptr pc, uptr addr,
421460
uptr size, AccessType typ) {
461+
LogMemoryAccess(addr, size, typ, thr->tid);
422462
RawShadow* shadow_mem = MemToShadow(addr);
423463
UNUSED char memBuf[4][64];
424464
DPrintf2("#%d: Access: %d@%d %p/%zd typ=0x%x {%s, %s, %s, %s}\n", thr->tid,
@@ -454,6 +494,7 @@ void RestartMemoryAccess16(ThreadState* thr, uptr pc, uptr addr,
454494
ALWAYS_INLINE USED void MemoryAccess16(ThreadState* thr, uptr pc, uptr addr,
455495
AccessType typ) {
456496
const uptr size = 16;
497+
LogMemoryAccess(addr, size, typ, thr->tid);
457498
FastState fast_state = thr->fast_state;
458499
if (UNLIKELY(fast_state.GetIgnoreBit()))
459500
return;
@@ -666,6 +707,7 @@ template <bool is_read>
666707
void MemoryAccessRangeT(ThreadState* thr, uptr pc, uptr addr, uptr size) {
667708
const AccessType typ =
668709
(is_read ? kAccessRead : kAccessWrite) | kAccessNoRodata;
710+
LogMemoryAccess(addr, size, typ, thr->tid);
669711
RawShadow* shadow_mem = MemToShadow(addr);
670712
DPrintf2("#%d: MemoryAccessRange: @%p %p size=%d is_read=%d\n", thr->tid,
671713
(void*)pc, (void*)addr, (int)size, is_read);

0 commit comments

Comments
 (0)