[llvm-commits] [compiler-rt] r165317 - in /compiler-rt/trunk/lib/tsan/rtl: tsan_interceptors.cc tsan_mman.cc tsan_rtl.cc tsan_rtl.h tsan_rtl_mutex.cc tsan_rtl_report.cc tsan_rtl_thread.cc tsan_suppressions.cc tsan_suppressions.h

Dmitry Vyukov dvyukov at google.com
Fri Oct 5 08:51:33 PDT 2012


Author: dvyukov
Date: Fri Oct  5 10:51:32 2012
New Revision: 165317

URL: http://llvm.org/viewvc/llvm-project?rev=165317&view=rev
Log:
tsan: cache pc's that cause suppressions (this way we do not need to symbolize the reports)


Modified:
    compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
    compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc
    compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc
    compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h
    compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc
    compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc
    compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc
    compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.cc
    compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.h

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=165317&r1=165316&r2=165317&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc Fri Oct  5 10:51:32 2012
@@ -1324,6 +1324,7 @@
   SignalContext *sctx = SigCtx(thr);
   if (sctx == 0 || sctx->pending_signal_count == 0 || thr->in_signal_handler)
     return;
+  Context *ctx = CTX();
   thr->in_signal_handler = true;
   sctx->pending_signal_count = 0;
   // These are too big for stack.
@@ -1351,8 +1352,10 @@
               (uptr)sigactions[sig].sa_handler;
           stack.Init(&pc, 1);
           ScopedReport rep(ReportTypeErrnoInSignal);
-          rep.AddStack(&stack);
-          OutputReport(rep, rep.GetReport()->stacks[0]);
+          if (!IsFiredSuppression(ctx, rep, stack)) {
+            rep.AddStack(&stack);
+            OutputReport(ctx, rep, rep.GetReport()->stacks[0]);
+          }
         }
         errno = saved_errno;
       }

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc?rev=165317&r1=165316&r2=165317&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc Fri Oct  5 10:51:32 2012
@@ -45,11 +45,14 @@
 static void SignalUnsafeCall(ThreadState *thr, uptr pc) {
   if (!thr->in_signal_handler || !flags()->report_signal_unsafe)
     return;
+  Context *ctx = CTX();
   StackTrace stack;
   stack.ObtainCurrent(thr, pc);
   ScopedReport rep(ReportTypeSignalUnsafe);
-  rep.AddStack(&stack);
-  OutputReport(rep, rep.GetReport()->stacks[0]);
+  if (!IsFiredSuppression(ctx, rep, stack)) {
+    rep.AddStack(&stack);
+    OutputReport(ctx, rep, rep.GetReport()->stacks[0]);
+  }
 }
 
 void *user_alloc(ThreadState *thr, uptr pc, uptr sz, uptr align) {

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc?rev=165317&r1=165316&r2=165317&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc Fri Oct  5 10:51:32 2012
@@ -49,7 +49,8 @@
   , nmissed_expected()
   , thread_mtx(MutexTypeThreads, StatMtxThreads)
   , racy_stacks(MBlockRacyStacks)
-  , racy_addresses(MBlockRacyAddresses) {
+  , racy_addresses(MBlockRacyAddresses)
+  , fired_suppressions(MBlockRacyAddresses) {
 }
 
 // The objects are allocated in TLS, so one may rely on zero-initialization.

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h?rev=165317&r1=165316&r2=165317&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h Fri Oct  5 10:51:32 2012
@@ -362,6 +362,11 @@
   uptr addr_max;
 };
 
+struct FiredSuppression {
+  ReportType type;
+  uptr pc;
+};
+
 struct Context {
   Context();
 
@@ -385,6 +390,7 @@
 
   Vector<RacyStacks> racy_stacks;
   Vector<RacyAddress> racy_addresses;
+  Vector<FiredSuppression> fired_suppressions;
 
   Flags flags;
 
@@ -439,8 +445,12 @@
 void InitializeDynamicAnnotations();
 
 void ReportRace(ThreadState *thr);
-bool OutputReport(const ScopedReport &srep,
+bool OutputReport(Context *ctx,
+                  const ScopedReport &srep,
                   const ReportStack *suppress_stack = 0);
+bool IsFiredSuppression(Context *ctx,
+                        const ScopedReport &srep,
+                        const StackTrace &trace);
 bool IsExpectedReport(uptr addr, uptr size);
 
 #if defined(TSAN_DEBUG_OUTPUT) && TSAN_DEBUG_OUTPUT >= 1

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc?rev=165317&r1=165316&r2=165317&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc Fri Oct  5 10:51:32 2012
@@ -64,7 +64,7 @@
     RestoreStack(last.tid(), last.epoch(), &trace);
     rep.AddStack(&trace);
     rep.AddLocation(s->addr, 1);
-    OutputReport(rep);
+    OutputReport(ctx, rep);
   }
   DestroyAndFree(s);
 }

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc?rev=165317&r1=165316&r2=165317&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc Fri Oct  5 10:51:32 2012
@@ -354,17 +354,36 @@
   }
 }
 
-bool OutputReport(const ScopedReport &srep, const ReportStack *suppress_stack) {
+bool OutputReport(Context *ctx,
+                  const ScopedReport &srep,
+                  const ReportStack *suppress_stack) {
   const ReportDesc *rep = srep.GetReport();
-  bool suppressed = IsSuppressed(rep->typ, suppress_stack);
-  suppressed = OnReport(rep, suppressed);
-  if (suppressed)
+  const uptr suppress_pc = IsSuppressed(rep->typ, suppress_stack);
+  if (suppress_pc != 0) {
+    FiredSuppression supp = {srep.GetReport()->typ, suppress_pc};
+    ctx->fired_suppressions.PushBack(supp);
+  }
+  if (OnReport(rep, suppress_pc != 0))
     return false;
   PrintReport(rep);
   CTX()->nreported++;
   return true;
 }
 
+bool IsFiredSuppression(Context *ctx,
+                        const ScopedReport &srep,
+                        const StackTrace &trace) {
+  for (uptr k = 0; k < ctx->fired_suppressions.Size(); k++) {
+    if (ctx->fired_suppressions[k].type != srep.GetReport()->typ)
+      continue;
+    for (uptr j = 0; j < trace.Size(); j++) {
+      if (trace.Get(j) == ctx->fired_suppressions[k].pc)
+        return true;
+    }
+  }
+  return false;
+}
+
 void ReportRace(ThreadState *thr) {
   ScopedInRtl in_rtl;
 
@@ -395,15 +414,13 @@
   ScopedReport rep(freed ? ReportTypeUseAfterFree : ReportTypeRace);
   const uptr kMop = 2;
   StackTrace traces[kMop];
-  for (uptr i = 0; i < kMop; i++) {
-    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);
+  const uptr toppc = thr->trace.events[thr->fast_state.epoch() % kTraceSize]
+      & ((1ull << 61) - 1);
+  traces[0].ObtainCurrent(thr, toppc);
+  if (IsFiredSuppression(ctx, rep, traces[0]))
+    return;
+  Shadow s2(thr->racy_state[1]);
+  RestoreStack(s2.tid(), s2.epoch(), &traces[1]);
 
   if (HandleRacyStacks(thr, traces, addr_min, addr_max))
     return;
@@ -431,7 +448,7 @@
   }
 #endif
 
-  if (!OutputReport(rep, rep.GetReport()->mops[0]->stack))
+  if (!OutputReport(ctx, rep, rep.GetReport()->mops[0]->stack))
     return;
 
   AddRacyStacks(thr, traces, addr_min, addr_max);

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc?rev=165317&r1=165316&r2=165317&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc Fri Oct  5 10:51:32 2012
@@ -35,7 +35,7 @@
     return;
   ScopedReport rep(ReportTypeThreadLeak);
   rep.AddThread(tctx);
-  OutputReport(rep);
+  OutputReport(CTX(), rep);
 }
 
 void ThreadFinalize(ThreadState *thr) {

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.cc?rev=165317&r1=165316&r2=165317&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.cc Fri Oct  5 10:51:32 2012
@@ -134,9 +134,9 @@
   g_suppressions = SuppressionParse(supp);
 }
 
-bool IsSuppressed(ReportType typ, const ReportStack *stack) {
+uptr IsSuppressed(ReportType typ, const ReportStack *stack) {
   if (g_suppressions == 0 || stack == 0)
-    return false;
+    return 0;
   SuppressionType stype;
   if (typ == ReportTypeRace)
     stype = SuppressionRace;
@@ -147,17 +147,17 @@
   else if (typ == ReportTypeSignalUnsafe)
     stype = SuppressionSignal;
   else
-    return false;
+    return 0;
   for (const ReportStack *frame = stack; frame; frame = frame->next) {
     for (Suppression *supp = g_suppressions; supp; supp = supp->next) {
       if (stype == supp->type &&
           (SuppressionMatch(supp->templ, frame->func) ||
           SuppressionMatch(supp->templ, frame->file))) {
         DPrintf("ThreadSanitizer: matched suppression '%s'\n", supp->templ);
-        return true;
+        return frame->pc;
       }
     }
   }
-  return false;
+  return 0;
 }
 }  // namespace __tsan

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.h?rev=165317&r1=165316&r2=165317&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.h (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.h Fri Oct  5 10:51:32 2012
@@ -19,7 +19,7 @@
 
 void InitializeSuppressions();
 void FinalizeSuppressions();
-bool IsSuppressed(ReportType typ, const ReportStack *stack);
+uptr IsSuppressed(ReportType typ, const ReportStack *stack);
 
 // Exposed for testing.
 enum SuppressionType {





More information about the llvm-commits mailing list