diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2012-09-02 11:23:39 +0000 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2012-09-02 11:23:39 +0000 |
| commit | 72cddf33d969326bc80ad476089d0870b49de6a6 (patch) | |
| tree | 965f64b2b695e625e2e3ac07ae7546cfb05d5cb1 | |
| parent | c6fd8209375e30ad12c37cbeb69b68dcc2779c4a (diff) | |
| download | bcm5719-llvm-72cddf33d969326bc80ad476089d0870b49de6a6.tar.gz bcm5719-llvm-72cddf33d969326bc80ad476089d0870b49de6a6.zip | |
tsan: more robust current thread stack restoration
llvm-svn: 163089
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc index 0015c4bae8a..39ad2f9d3ab 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc @@ -399,6 +399,11 @@ void ReportRace(ThreadState *thr) { Shadow s(thr->racy_state[i]); RestoreStack(s.tid(), s.epoch(), &traces[i]); } + // Failure to restore stack of the current thread + // was observed on free() interceptor called from pthread. + // Just get the current shadow stack instead. + if (traces[0].IsEmpty()) + traces[0].ObtainCurrent(thr, 0); if (HandleRacyStacks(thr, traces, addr_min, addr_max)) return; @@ -408,9 +413,6 @@ void ReportRace(ThreadState *thr) { rep.AddMemoryAccess(addr, s, &traces[i]); } - // Ensure that we have at least something for the current thread. - DCHECK_EQ(traces[0].IsEmpty(), false); - for (uptr i = 0; i < kMop; i++) { FastState s(thr->racy_state[i]); ThreadContext *tctx = ctx->threads[s.tid()]; |

