[compiler-rt] [TSan] Fix deadlocks during TSan error reporting on Apple platforms (PR #151495)

Dan Blackwell via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 5 10:13:20 PDT 2025


================
@@ -2141,13 +2142,29 @@ static void ReportErrnoSpoiling(ThreadState *thr, uptr pc, int sig) {
   // StackTrace::GetNestInstructionPc(pc) is used because return address is
   // expected, OutputReport() will undo this.
   ObtainCurrentStack(thr, StackTrace::GetNextInstructionPc(pc), &stack);
-  ThreadRegistryLock l(&ctx->thread_registry);
-  ScopedReport rep(ReportTypeErrnoInSignal);
-  rep.SetSigNum(sig);
-  if (!IsFiredSuppression(ctx, ReportTypeErrnoInSignal, stack)) {
-    rep.AddStack(stack, true);
-    OutputReport(thr, rep);
+  ScopedReport *rep = (ScopedReport *)__builtin_alloca(sizeof(ScopedReport));
+  bool suppressed;
+  // Take a new scope as Apple platforms require the below locks released
+  // before symbolizing in order to avoid a deadlock
+  {
+    ThreadRegistryLock l(&ctx->thread_registry);
+    new (rep) ScopedReport(ReportTypeErrnoInSignal);
+    rep->SetSigNum(sig);
+    suppressed = IsFiredSuppression(ctx, ReportTypeErrnoInSignal, stack);
+    if (!suppressed)
+      rep->AddStack(stack, true);
+#if SANITIZER_APPLE
+  }  // Close this scope to release the locks before writing report
+  if (!suppressed)
+    OutputReport(thr, *rep);
+#else
+    if (!suppressed)
+      OutputReport(thr, *rep);
   }
+#endif
----------------
DanBlackwell wrote:

You mean to change these:
```
#if SANITIZER_APPLE
  }  // Close this scope to release the locks
  OutputReport(thr, *rep);
#else
    OutputReport(thr, *rep);
  }
#endif
```

Into these:
```
#if SANITIZER_APPLE
  }  // Close this scope to release the locks
#endif
    OutputReport(thr, *rep);
#if !SANITIZER_APPLE
  }
#endif
```

What's your opinion?

https://github.com/llvm/llvm-project/pull/151495


More information about the llvm-commits mailing list