[llvm] r276015 - [tsan] Don't instrument __llvm_gcov_global_state_pred or __llvm_gcda*

Vedant Kumar via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 26 13:09:28 PDT 2016


Hi Hans,

Could we take this fix for llvm 4.0?

It makes it possible to use GCov instrumentation along with TSan. Anna reviewed this patch for me internally and we're shipping it with swift 3.

best,
vedant

> On Jul 19, 2016, at 1:16 PM, Vedant Kumar via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: vedantk
> Date: Tue Jul 19 15:16:08 2016
> New Revision: 276015
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=276015&view=rev
> Log:
> [tsan] Don't instrument __llvm_gcov_global_state_pred or __llvm_gcda*
> 
> r274801 did not go far enough to allow gcov+tsan to cooperate. With this
> commit it's possible to run the following code without false positives:
> 
>  std::thread T1(fib), T2(fib);
>  T1.join(); T2.join();
> 
> Modified:
>    llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp
>    llvm/trunk/test/Instrumentation/ThreadSanitizer/do-not-instrument-memory-access.ll
> 
> Modified: llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp?rev=276015&r1=276014&r2=276015&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp Tue Jul 19 15:16:08 2016
> @@ -272,8 +272,9 @@ static bool shouldInstrumentReadWriteFro
>         return false;
>     }
> 
> -    // Check if the global is in a GCOV counter array.
> -    if (GV->getName().startswith("__llvm_gcov_ctr"))
> +    // Check if the global is private gcov data.
> +    if (GV->getName().startswith("__llvm_gcov") ||
> +        GV->getName().startswith("__llvm_gcda"))
>       return false;
>   }
> 
> 
> Modified: llvm/trunk/test/Instrumentation/ThreadSanitizer/do-not-instrument-memory-access.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/ThreadSanitizer/do-not-instrument-memory-access.ll?rev=276015&r1=276014&r2=276015&view=diff
> ==============================================================================
> --- llvm/trunk/test/Instrumentation/ThreadSanitizer/do-not-instrument-memory-access.ll (original)
> +++ llvm/trunk/test/Instrumentation/ThreadSanitizer/do-not-instrument-memory-access.ll Tue Jul 19 15:16:08 2016
> @@ -13,6 +13,8 @@ target triple = "x86_64-apple-macosx10.9
> 
> @__llvm_gcov_ctr = internal global [1 x i64] zeroinitializer
> @__llvm_gcov_ctr.1 = internal global [1 x i64] zeroinitializer
> + at __llvm_gcov_global_state_pred = internal global i32 0
> + at __llvm_gcda_foo = internal global i32 0
> 
> define i32 @test_gep() sanitize_thread {
> entry:
> @@ -42,5 +44,16 @@ entry:
>   ret i32 undef
> }
> 
> +define void @test_load() sanitize_thread {
> +entry:
> +  %0 = load i32, i32* @__llvm_gcov_global_state_pred
> +  store i32 1, i32* @__llvm_gcov_global_state_pred
> +
> +  %1 = load i32, i32* @__llvm_gcda_foo
> +  store i32 1, i32* @__llvm_gcda_foo
> +
> +  ret void
> +}
> +
> ; CHECK-NOT: {{call void @__tsan_write}}
> ; CHECK: __tsan_init
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list