summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2012-07-25 13:16:35 +0000
committerDmitry Vyukov <dvyukov@google.com>2012-07-25 13:16:35 +0000
commitdfc8e52400498682f2ad995dada66a53d5d1e33f (patch)
treea72e3dff6656a15cea503508ec5e8d2930956c81
parentd654f066441386b28a8b7ba091434beed6495ae7 (diff)
downloadbcm5719-llvm-dfc8e52400498682f2ad995dada66a53d5d1e33f.tar.gz
bcm5719-llvm-dfc8e52400498682f2ad995dada66a53d5d1e33f.zip
tsan: suport for Go finalizers
llvm-svn: 160723
-rw-r--r--compiler-rt/lib/tsan/go/tsan_go.cc5
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_clock.cc5
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_clock.h2
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_rtl.h1
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc4
5 files changed, 17 insertions, 0 deletions
diff --git a/compiler-rt/lib/tsan/go/tsan_go.cc b/compiler-rt/lib/tsan/go/tsan_go.cc
index a0c52edb761..d0437d9efcf 100644
--- a/compiler-rt/lib/tsan/go/tsan_go.cc
+++ b/compiler-rt/lib/tsan/go/tsan_go.cc
@@ -221,5 +221,10 @@ void __tsan_event(int typ, int tid, void *pc, void *addr, int info) {
}
}
+void __tsan_finalizer_goroutine(int tid) {
+ ThreadState *thr = goroutines[tid];
+ ThreadFinalizerGoroutine(thr);
+}
+
} // extern "C"
} // namespace __tsan
diff --git a/compiler-rt/lib/tsan/rtl/tsan_clock.cc b/compiler-rt/lib/tsan/rtl/tsan_clock.cc
index e0f750fb1e9..1918f8df1fa 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_clock.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_clock.cc
@@ -93,6 +93,11 @@ void ThreadClock::acq_rel(SyncClock *dst) {
release(dst);
}
+void ThreadClock::Disable() {
+ for (uptr i = 0; i < kMaxTidInClock; i++)
+ clk_[i] = (u64)-1;
+}
+
SyncClock::SyncClock()
: clk_(MBlockClock) {
}
diff --git a/compiler-rt/lib/tsan/rtl/tsan_clock.h b/compiler-rt/lib/tsan/rtl/tsan_clock.h
index 691185039b6..c6a8062562d 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_clock.h
+++ b/compiler-rt/lib/tsan/rtl/tsan_clock.h
@@ -61,6 +61,8 @@ struct ThreadClock {
nclk_ = tid + 1;
}
+ void Disable();
+
uptr size() const {
return nclk_;
}
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl.h b/compiler-rt/lib/tsan/rtl/tsan_rtl.h
index 5cb95da1dd1..40643516f32 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_rtl.h
+++ b/compiler-rt/lib/tsan/rtl/tsan_rtl.h
@@ -437,6 +437,7 @@ int ThreadTid(ThreadState *thr, uptr pc, uptr uid);
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/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc
index 6756bd317ea..65449ffd99f 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc
@@ -298,6 +298,10 @@ void ThreadDetach(ThreadState *thr, uptr pc, int tid) {
}
}
+void ThreadFinalizerGoroutine(ThreadState *thr) {
+ thr->clock.Disable();
+}
+
void MemoryAccessRange(ThreadState *thr, uptr pc, uptr addr,
uptr size, bool is_write) {
if (size == 0)
OpenPOWER on IntegriCloud