<div style="font-family: arial, helvetica, sans-serif; font-size: 10pt">Excellent, thanks! <br><br><div class="gmail_quote">On Wed, Nov 28, 2012 at 2:35 PM, Dmitry Vyukov <span dir="ltr"><<a href="mailto:dvyukov@google.com" target="_blank">dvyukov@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dvyukov<br>
Date: Wed Nov 28 04:35:31 2012<br>
New Revision: 168783<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=168783&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=168783&view=rev</a><br>
Log:<br>
tsan: move traces from tls into dedicated storage at fixed address<br>
helps to reduce tls size (it's weird to have multi-MB tls)<br>
will help with dynamically adjustable trace size<br>
<br>
Modified:<br>
compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_allocator64_test.cc<br>
compiler-rt/trunk/lib/tsan/go/test.c<br>
compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h<br>
compiler-rt/trunk/lib/tsan/rtl/tsan_platform_linux.cc<br>
compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc<br>
compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h<br>
compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc<br>
compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc<br>
compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc<br>
compiler-rt/trunk/lib/tsan/rtl/tsan_trace.h<br>
compiler-rt/trunk/lib/tsan/tests/unit/tsan_platform_test.cc<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_allocator64_test.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_allocator64_test.cc?rev=168783&r1=168782&r2=168783&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_allocator64_test.cc?rev=168783&r1=168782&r2=168783&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_allocator64_test.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_allocator64_test.cc Wed Nov 28 04:35:31 2012<br>
@@ -14,8 +14,8 @@<br>
#include <algorithm><br>
#include <vector><br>
<br>
-static const uptr kAllocatorSpace = 0x600000000000ULL;<br>
-static const uptr kAllocatorSize = 0x10000000000; // 1T.<br>
+static const uptr kAllocatorSpace = 0x700000000000ULL;<br>
+static const uptr kAllocatorSize = 0x010000000000ULL; // 1T.<br>
<br>
typedef DefaultSizeClassMap SCMap;<br>
typedef<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/go/test.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/go/test.c?rev=168783&r1=168782&r2=168783&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/go/test.c?rev=168783&r1=168782&r2=168783&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/go/test.c (original)<br>
+++ compiler-rt/trunk/lib/tsan/go/test.c Wed Nov 28 04:35:31 2012<br>
@@ -36,7 +36,7 @@<br>
<br>
int main(void) {<br>
__tsan_init();<br>
- __tsan_map_shadow(buf, sizeof(buf));<br>
+ __tsan_map_shadow(buf, sizeof(buf) + 4096);<br>
__tsan_func_enter(0, &main);<br>
__tsan_malloc(0, buf, 10, 0);<br>
__tsan_release(0, buf);<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h?rev=168783&r1=168782&r2=168783&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h?rev=168783&r1=168782&r2=168783&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h Wed Nov 28 04:35:31 2012<br>
@@ -16,7 +16,9 @@<br>
C++ linux memory layout:<br>
0000 0000 0000 - 03c0 0000 0000: protected<br>
03c0 0000 0000 - 1000 0000 0000: shadow<br>
-1000 0000 0000 - 7d00 0000 0000: protected<br>
+1000 0000 0000 - 6000 0000 0000: protected<br>
+6000 0000 0000 - 6200 0000 0000: traces<br>
+6200 0000 0000 - 7d00 0000 0000: -<br>
7d00 0000 0000 - 7e00 0000 0000: heap<br>
7e00 0000 0000 - 7fff ffff ffff: modules and main thread stack<br>
<br>
@@ -25,7 +27,9 @@<br>
0400 0000 0000 - 1000 0000 0000: shadow<br>
1000 0000 0000 - 2900 0000 0000: protected<br>
2900 0000 0000 - 2c00 0000 0000: modules<br>
-2c00 0000 0000 - 7d00 0000 0000: -<br>
+2c00 0000 0000 - 6000 0000 0000: -<br>
+6000 0000 0000 - 6200 0000 0000: traces<br>
+6200 0000 0000 - 7d00 0000 0000: -<br>
7d00 0000 0000 - 7e00 0000 0000: heap<br>
7e00 0000 0000 - 7f00 0000 0000: -<br>
7f00 0000 0000 - 7fff ffff ffff: main thread stack<br>
@@ -36,7 +40,9 @@<br>
00f8 0000 0000 - 0118 0000 0000: heap<br>
0118 0000 0000 - 1000 0000 0000: -<br>
1000 0000 0000 - 1460 0000 0000: shadow<br>
-1460 0000 0000 - 7fff ffff ffff: -<br>
+1460 0000 0000 - 6000 0000 0000: -<br>
+6000 0000 0000 - 6200 0000 0000: traces<br>
+6200 0000 0000 - 7fff ffff ffff: -<br>
<br>
Go windows memory layout:<br>
0000 0000 0000 - 0000 1000 0000: executable<br>
@@ -44,13 +50,15 @@<br>
00f8 0000 0000 - 0118 0000 0000: heap<br>
0118 0000 0000 - 0100 0000 0000: -<br>
0100 0000 0000 - 0560 0000 0000: shadow<br>
-0560 0000 0000 - 07ff ffff ffff: -<br>
+0560 0000 0000 - 0760 0000 0000: traces<br>
+0760 0000 0000 - 07ff ffff ffff: -<br>
*/<br>
<br>
#ifndef TSAN_PLATFORM_H<br>
#define TSAN_PLATFORM_H<br>
<br>
-#include "tsan_rtl.h"<br>
+#include "tsan_defs.h"<br>
+#include "tsan_trace.h"<br>
<br>
#if defined(__LP64__) || defined(_WIN64)<br>
namespace __tsan {<br>
@@ -76,6 +84,13 @@<br>
<br>
static const uptr kLinuxAppMemMsk = 0x7c0000000000ULL;<br>
<br>
+#if defined(_WIN32)<br>
+const uptr kTraceMemBegin = 0x056000000000ULL;<br>
+#else<br>
+const uptr kTraceMemBegin = 0x600000000000ULL;<br>
+#endif<br>
+const uptr kTraceMemSize = 0x020000000000ULL;<br>
+<br>
// This has to be a macro to allow constant initialization of constants below.<br>
#ifndef TSAN_GO<br>
#define MemToShadow(addr) \<br>
@@ -122,6 +137,12 @@<br>
<br>
const char *InitializePlatform();<br>
void FinalizePlatform();<br>
+void MapThreadTrace(uptr addr, uptr size);<br>
+uptr ALWAYS_INLINE INLINE GetThreadTrace(int tid) {<br>
+ uptr p = kTraceMemBegin + tid * kTraceSize * sizeof(Event);<br>
+ DCHECK_LT(p, kTraceMemBegin + kTraceMemSize);<br>
+ return p;<br>
+}<br>
<br>
void internal_start_thread(void(*func)(void*), void *arg);<br>
<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_platform_linux.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_platform_linux.cc?rev=168783&r1=168782&r2=168783&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_platform_linux.cc?rev=168783&r1=168782&r2=168783&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_platform_linux.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_platform_linux.cc Wed Nov 28 04:35:31 2012<br>
@@ -103,7 +103,7 @@<br>
const uptr kClosedLowBeg = 0x200000;<br>
const uptr kClosedLowEnd = kLinuxShadowBeg - 1;<br>
const uptr kClosedMidBeg = kLinuxShadowEnd + 1;<br>
- const uptr kClosedMidEnd = kLinuxAppMemBeg - 1;<br>
+ const uptr kClosedMidEnd = min(kLinuxAppMemBeg, kTraceMemBegin);<br>
ProtectRange(kClosedLowBeg, kClosedLowEnd);<br>
ProtectRange(kClosedMidBeg, kClosedMidEnd);<br>
DPrintf("kClosedLow %zx-%zx (%zuGB)\n",<br>
@@ -120,6 +120,16 @@<br>
}<br>
#endif<br>
<br>
+void MapThreadTrace(uptr addr, uptr size) {<br>
+ DPrintf("Mapping trace at %p-%p(0x%zx)\n", addr, addr + size, size);<br>
+ CHECK_GE(addr, kTraceMemBegin);<br>
+ CHECK_LE(addr + size, kTraceMemBegin + kTraceMemSize);<br>
+ if (addr != (uptr)MmapFixedNoReserve(addr, size)) {<br>
+ Printf("FATAL: ThreadSanitizer can not mmap thread trace\n");<br>
+ Die();<br>
+ }<br>
+}<br>
+<br>
static uptr g_data_start;<br>
static uptr g_data_end;<br>
<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc?rev=168783&r1=168782&r2=168783&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc?rev=168783&r1=168782&r2=168783&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc Wed Nov 28 04:35:31 2012<br>
@@ -288,6 +288,13 @@<br>
thr->nomalloc--;<br>
}<br>
<br>
+uptr TraceTopPC(ThreadState *thr) {<br>
+ Event *events = (Event*)GetThreadTrace(thr->tid);<br>
+ uptr pc = events[thr->fast_state.epoch() % kTraceSize]<br>
+ & ((1ull << 61) - 1);<br>
+ return pc;<br>
+}<br>
+<br>
#ifndef TSAN_GO<br>
extern "C" void __tsan_trace_switch() {<br>
TraceSwitch(cur_thread());<br>
@@ -453,7 +460,7 @@<br>
<br>
// We must not store to the trace if we do not store to the shadow.<br>
// That is, this call must be moved somewhere below.<br>
- TraceAddEvent(thr, fast_state.epoch(), EventTypeMop, pc);<br>
+ TraceAddEvent(thr, fast_state, EventTypeMop, pc);<br>
<br>
MemoryAccessImpl(thr, addr, kAccessSizeLog, kAccessIsWrite,<br>
shadow_mem, cur);<br>
@@ -523,7 +530,7 @@<br>
StatInc(thr, StatFuncEnter);<br>
DPrintf2("#%d: FuncEntry %p\n", (int)thr->fast_state.tid(), (void*)pc);<br>
thr->fast_state.IncrementEpoch();<br>
- TraceAddEvent(thr, thr->fast_state.epoch(), EventTypeFuncEnter, pc);<br>
+ TraceAddEvent(thr, thr->fast_state, EventTypeFuncEnter, pc);<br>
<br>
// Shadow stack maintenance can be replaced with<br>
// stack unwinding during trace switch (which presumably must be faster).<br>
@@ -553,7 +560,7 @@<br>
StatInc(thr, StatFuncExit);<br>
DPrintf2("#%d: FuncExit\n", (int)thr->fast_state.tid());<br>
thr->fast_state.IncrementEpoch();<br>
- TraceAddEvent(thr, thr->fast_state.epoch(), EventTypeFuncExit, 0);<br>
+ TraceAddEvent(thr, thr->fast_state, EventTypeFuncExit, 0);<br>
<br>
DCHECK_GT(thr->shadow_stack_pos, &thr->shadow_stack[0]);<br>
#ifndef TSAN_GO<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h?rev=168783&r1=168782&r2=168783&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h?rev=168783&r1=168782&r2=168783&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h Wed Nov 28 04:35:31 2012<br>
@@ -35,6 +35,7 @@<br>
#include "tsan_trace.h"<br>
#include "tsan_vector.h"<br>
#include "tsan_report.h"<br>
+#include "tsan_platform.h"<br>
<br>
namespace __tsan {<br>
<br>
@@ -533,11 +534,13 @@<br>
#endif<br>
<br>
void TraceSwitch(ThreadState *thr);<br>
+uptr TraceTopPC(ThreadState *thr);<br>
<br>
extern "C" void __tsan_trace_switch();<br>
-void ALWAYS_INLINE INLINE TraceAddEvent(ThreadState *thr, u64 epoch,<br>
+void ALWAYS_INLINE INLINE TraceAddEvent(ThreadState *thr, FastState fs,<br>
EventType typ, uptr addr) {<br>
StatInc(thr, StatEvents);<br>
+ u64 epoch = fs.epoch();<br>
if (UNLIKELY((epoch % kTracePartSize) == 0)) {<br>
#ifndef TSAN_GO<br>
HACKY_CALL(__tsan_trace_switch);<br>
@@ -545,7 +548,8 @@<br>
TraceSwitch(thr);<br>
#endif<br>
}<br>
- Event *evp = &thr->trace.events[epoch % kTraceSize];<br>
+ Event *trace = (Event*)GetThreadTrace(fs.tid());<br>
+ Event *evp = &trace[epoch % kTraceSize];<br>
Event ev = (u64)addr | ((u64)typ << 61);<br>
*evp = ev;<br>
}<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc?rev=168783&r1=168782&r2=168783&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc?rev=168783&r1=168782&r2=168783&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc Wed Nov 28 04:35:31 2012<br>
@@ -75,7 +75,7 @@<br>
if (IsAppMem(addr))<br>
MemoryRead1Byte(thr, pc, addr);<br>
thr->fast_state.IncrementEpoch();<br>
- TraceAddEvent(thr, thr->fast_state.epoch(), EventTypeLock, addr);<br>
+ TraceAddEvent(thr, thr->fast_state, EventTypeLock, addr);<br>
SyncVar *s = CTX()->synctab.GetAndLock(thr, pc, addr, true);<br>
if (s->owner_tid == SyncVar::kInvalidTid) {<br>
CHECK_EQ(s->recursion, 0);<br>
@@ -107,7 +107,7 @@<br>
if (IsAppMem(addr))<br>
MemoryRead1Byte(thr, pc, addr);<br>
thr->fast_state.IncrementEpoch();<br>
- TraceAddEvent(thr, thr->fast_state.epoch(), EventTypeUnlock, addr);<br>
+ TraceAddEvent(thr, thr->fast_state, EventTypeUnlock, addr);<br>
SyncVar *s = CTX()->synctab.GetAndLock(thr, pc, addr, true);<br>
if (s->recursion == 0) {<br>
if (!s->is_broken) {<br>
@@ -144,7 +144,7 @@<br>
if (IsAppMem(addr))<br>
MemoryRead1Byte(thr, pc, addr);<br>
thr->fast_state.IncrementEpoch();<br>
- TraceAddEvent(thr, thr->fast_state.epoch(), EventTypeRLock, addr);<br>
+ TraceAddEvent(thr, thr->fast_state, EventTypeRLock, addr);<br>
SyncVar *s = CTX()->synctab.GetAndLock(thr, pc, addr, false);<br>
if (s->owner_tid != SyncVar::kInvalidTid) {<br>
Printf("ThreadSanitizer WARNING: read lock of a write locked mutex\n");<br>
@@ -164,7 +164,7 @@<br>
if (IsAppMem(addr))<br>
MemoryRead1Byte(thr, pc, addr);<br>
thr->fast_state.IncrementEpoch();<br>
- TraceAddEvent(thr, thr->fast_state.epoch(), EventTypeRUnlock, addr);<br>
+ TraceAddEvent(thr, thr->fast_state, EventTypeRUnlock, addr);<br>
SyncVar *s = CTX()->synctab.GetAndLock(thr, pc, addr, true);<br>
if (s->owner_tid != SyncVar::kInvalidTid) {<br>
Printf("ThreadSanitizer WARNING: read unlock of a write "<br>
@@ -188,7 +188,7 @@<br>
// Seems to be read unlock.<br>
StatInc(thr, StatMutexReadUnlock);<br>
thr->fast_state.IncrementEpoch();<br>
- TraceAddEvent(thr, thr->fast_state.epoch(), EventTypeRUnlock, addr);<br>
+ TraceAddEvent(thr, thr->fast_state, EventTypeRUnlock, addr);<br>
thr->clock.set(thr->tid, thr->fast_state.epoch());<br>
thr->fast_synch_epoch = thr->fast_state.epoch();<br>
thr->clock.release(&s->read_clock);<br>
@@ -205,7 +205,7 @@<br>
// First, it's a bug to increment the epoch w/o writing to the trace.<br>
// Then, the acquire/release logic can be factored out as well.<br>
thr->fast_state.IncrementEpoch();<br>
- TraceAddEvent(thr, thr->fast_state.epoch(), EventTypeUnlock, addr);<br>
+ TraceAddEvent(thr, thr->fast_state, EventTypeUnlock, addr);<br>
thr->clock.set(thr->tid, thr->fast_state.epoch());<br>
thr->fast_synch_epoch = thr->fast_state.epoch();<br>
thr->clock.ReleaseStore(&s->clock);<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc?rev=168783&r1=168782&r2=168783&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc?rev=168783&r1=168782&r2=168783&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc Wed Nov 28 04:35:31 2012<br>
@@ -277,8 +277,9 @@<br>
DPrintf2(" #%02lu: pc=%zx\n", i, stack[i]);<br>
}<br>
uptr pos = hdr->stack0.Size();<br>
+ Event *events = (Event*)GetThreadTrace(tid);<br>
for (uptr i = ebegin; i <= eend; i++) {<br>
- Event ev = trace->events[i];<br>
+ Event ev = events[i];<br>
EventType typ = (EventType)(ev >> 61);<br>
uptr pc = (uptr)(ev & 0xffffffffffffull);<br>
DPrintf2(" %zu typ=%d pc=%zx\n", i, typ, pc);<br>
@@ -416,8 +417,7 @@<br>
ScopedReport rep(freed ? ReportTypeUseAfterFree : ReportTypeRace);<br>
const uptr kMop = 2;<br>
StackTrace traces[kMop];<br>
- const uptr toppc = thr->trace.events[thr->fast_state.epoch() % kTraceSize]<br>
- & ((1ull << 61) - 1);<br>
+ const uptr toppc = TraceTopPC(thr);<br>
traces[0].ObtainCurrent(thr, toppc);<br>
if (IsFiredSuppression(ctx, rep, traces[0]))<br>
return;<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc?rev=168783&r1=168782&r2=168783&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc?rev=168783&r1=168782&r2=168783&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc Wed Nov 28 04:35:31 2012<br>
@@ -123,6 +123,7 @@<br>
void *mem = internal_alloc(MBlockThreadContex, sizeof(ThreadContext));<br>
tctx = new(mem) ThreadContext(tid);<br>
ctx->threads[tid] = tctx;<br>
+ MapThreadTrace(GetThreadTrace(tid), kTraceSize * sizeof(Event));<br>
}<br>
CHECK_NE(tctx, 0);<br>
CHECK_GE(tid, 0);<br>
@@ -143,7 +144,7 @@<br>
if (tid) {<br>
thr->fast_state.IncrementEpoch();<br>
// Can't increment epoch w/o writing to the trace as well.<br>
- TraceAddEvent(thr, thr->fast_state.epoch(), EventTypeMop, 0);<br>
+ TraceAddEvent(thr, thr->fast_state, EventTypeMop, 0);<br>
thr->clock.set(thr->tid, thr->fast_state.epoch());<br>
thr->fast_synch_epoch = thr->fast_state.epoch();<br>
thr->clock.release(&tctx->sync);<br>
@@ -238,7 +239,7 @@<br>
} else {<br>
thr->fast_state.IncrementEpoch();<br>
// Can't increment epoch w/o writing to the trace as well.<br>
- TraceAddEvent(thr, thr->fast_state.epoch(), EventTypeMop, 0);<br>
+ TraceAddEvent(thr, thr->fast_state, EventTypeMop, 0);<br>
thr->clock.set(thr->tid, thr->fast_state.epoch());<br>
thr->fast_synch_epoch = thr->fast_state.epoch();<br>
thr->clock.release(&tctx->sync);<br>
@@ -249,9 +250,8 @@<br>
// Save from info about the thread.<br>
tctx->dead_info = new(internal_alloc(MBlockDeadInfo, sizeof(ThreadDeadInfo)))<br>
ThreadDeadInfo();<br>
- internal_memcpy(&tctx->dead_info->trace.events[0],<br>
- &thr->trace.events[0], sizeof(thr->trace.events));<br>
for (int i = 0; i < kTraceParts; i++) {<br>
+ tctx->dead_info->trace.headers[i].epoch0 = thr->trace.headers[i].epoch0;<br>
tctx->dead_info->trace.headers[i].stack0.CopyFrom(<br>
thr->trace.headers[i].stack0);<br>
}<br>
@@ -358,7 +358,7 @@<br>
<br>
fast_state.IncrementEpoch();<br>
thr->fast_state = fast_state;<br>
- TraceAddEvent(thr, fast_state.epoch(), EventTypeMop, pc);<br>
+ TraceAddEvent(thr, fast_state, EventTypeMop, pc);<br>
<br>
bool unaligned = (addr % kShadowCell) != 0;<br>
<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_trace.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_trace.h?rev=168783&r1=168782&r2=168783&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_trace.h?rev=168783&r1=168782&r2=168783&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_trace.h (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_trace.h Wed Nov 28 04:35:31 2012<br>
@@ -61,7 +61,6 @@<br>
};<br>
<br>
struct Trace {<br>
- Event events[kTraceSize];<br>
TraceHeader headers[kTraceParts];<br>
Mutex mtx;<br>
<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/tests/unit/tsan_platform_test.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/tsan_platform_test.cc?rev=168783&r1=168782&r2=168783&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/tsan_platform_test.cc?rev=168783&r1=168782&r2=168783&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/tests/unit/tsan_platform_test.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/tests/unit/tsan_platform_test.cc Wed Nov 28 04:35:31 2012<br>
@@ -12,6 +12,7 @@<br>
//===----------------------------------------------------------------------===//<br>
#include "sanitizer_common/sanitizer_libc.h"<br>
#include "tsan_platform.h"<br>
+#include "tsan_rtl.h"<br>
#include "gtest/gtest.h"<br>
<br>
namespace __tsan {<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>