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