[compiler-rt] 1c094a1 - [TSan][Test-Only] Account for race in cxa_guard_acquire.cpp test (#165853)

via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 3 06:59:53 PST 2025


Author: Dan Blackwell
Date: 2025-11-03T14:59:49Z
New Revision: 1c094a1ce2ef15b5855b11aa85dbb2f1eea54f13

URL: https://github.com/llvm/llvm-project/commit/1c094a1ce2ef15b5855b11aa85dbb2f1eea54f13
DIFF: https://github.com/llvm/llvm-project/commit/1c094a1ce2ef15b5855b11aa85dbb2f1eea54f13.diff

LOG: [TSan][Test-Only] Account for race in cxa_guard_acquire.cpp test (#165853)

It is possible for "Enter potentially blocking region" to come before
"Enter constructor" in this test - if the thread that acquires the guard
fails to reach its printf before the other thread that enters the
blocking region reaches its own printf. Note that for the exit logs this
inversion is not possible.

This patch addresses this by allowing those two log lines to come in
either order.

rdar://163375661

Added: 
    

Modified: 
    compiler-rt/test/tsan/cxa_guard_acquire.cpp

Removed: 
    


################################################################################
diff  --git a/compiler-rt/test/tsan/cxa_guard_acquire.cpp b/compiler-rt/test/tsan/cxa_guard_acquire.cpp
index fc407259e8968..6050c243cb8c1 100644
--- a/compiler-rt/test/tsan/cxa_guard_acquire.cpp
+++ b/compiler-rt/test/tsan/cxa_guard_acquire.cpp
@@ -66,10 +66,17 @@ int main(int argc, char **argv) {
   printf("Enter main\n");
 
   // If initialization is contended, the blocked thread should enter a
-  // potentially blocking region.
+  // potentially blocking region. Note that we use a DAG check because it is
+  // possible for Thread 1 to acquire the guard, then Thread 2 fail to acquire
+  // the guard then call `OnPotentiallyBlockingRegionBegin` and print "Enter
+  // potentially blocking region\n", before Thread 1 manages to reach "Enter
+  // constructor\n". This is exceptionally rare, but can be replicated by
+  // inserting a `sleep(1)` between `LazyInit() {` and `printf("Enter
+  // constructor\n");`. Due to the barrier it is not possible for the exit logs
+  // to be inverted.
   //
-  // CHECK-NEXT: Enter constructor
-  // CHECK-NEXT: Enter potentially blocking region
+  // CHECK-DAG: Enter constructor
+  // CHECK-DAG: Enter potentially blocking region
   // CHECK-NEXT: Exit constructor
   // CHECK-NEXT: Exit potentially blocking region
   barrier_init(&barrier, 2);


        


More information about the llvm-commits mailing list