tsan: suport for Go finalizers


git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@160723 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/tsan/go/tsan_go.cc b/lib/tsan/go/tsan_go.cc
index a0c52ed..d0437d9 100644
--- a/lib/tsan/go/tsan_go.cc
+++ b/lib/tsan/go/tsan_go.cc
@@ -221,5 +221,10 @@
   }
 }
 
+void __tsan_finalizer_goroutine(int tid) {
+  ThreadState *thr = goroutines[tid];
+  ThreadFinalizerGoroutine(thr);
+}
+
 }  // extern "C"
 }  // namespace __tsan
diff --git a/lib/tsan/rtl/tsan_clock.cc b/lib/tsan/rtl/tsan_clock.cc
index e0f750f..1918f8d 100644
--- a/lib/tsan/rtl/tsan_clock.cc
+++ b/lib/tsan/rtl/tsan_clock.cc
@@ -93,6 +93,11 @@
   release(dst);
 }
 
+void ThreadClock::Disable() {
+  for (uptr i = 0; i < kMaxTidInClock; i++)
+    clk_[i] = (u64)-1;
+}
+
 SyncClock::SyncClock()
   : clk_(MBlockClock) {
 }
diff --git a/lib/tsan/rtl/tsan_clock.h b/lib/tsan/rtl/tsan_clock.h
index 6911850..c6a8062 100644
--- a/lib/tsan/rtl/tsan_clock.h
+++ b/lib/tsan/rtl/tsan_clock.h
@@ -61,6 +61,8 @@
       nclk_ = tid + 1;
   }
 
+  void Disable();
+
   uptr size() const {
     return nclk_;
   }
diff --git a/lib/tsan/rtl/tsan_rtl.h b/lib/tsan/rtl/tsan_rtl.h
index 5cb95da..4064351 100644
--- a/lib/tsan/rtl/tsan_rtl.h
+++ b/lib/tsan/rtl/tsan_rtl.h
@@ -437,6 +437,7 @@
 void ThreadJoin(ThreadState *thr, uptr pc, int tid);
 void ThreadDetach(ThreadState *thr, uptr pc, int tid);
 void ThreadFinalize(ThreadState *thr);
+void ThreadFinalizerGoroutine(ThreadState *thr);
 
 void MutexCreate(ThreadState *thr, uptr pc, uptr addr, bool rw, bool recursive);
 void MutexDestroy(ThreadState *thr, uptr pc, uptr addr);
diff --git a/lib/tsan/rtl/tsan_rtl_thread.cc b/lib/tsan/rtl/tsan_rtl_thread.cc
index 6756bd3..65449ff 100644
--- a/lib/tsan/rtl/tsan_rtl_thread.cc
+++ b/lib/tsan/rtl/tsan_rtl_thread.cc
@@ -298,6 +298,10 @@
   }
 }
 
+void ThreadFinalizerGoroutine(ThreadState *thr) {
+  thr->clock.Disable();
+}
+
 void MemoryAccessRange(ThreadState *thr, uptr pc, uptr addr,
                        uptr size, bool is_write) {
   if (size == 0)