[llvm-dev] Using TSAN along with custom llvm IR pass

Dmitry Vyukov via llvm-dev llvm-dev at lists.llvm.org
Sun Jul 9 22:21:06 PDT 2017

On Sun, Jul 9, 2017 at 3:50 PM, Nischai Vinesh <nischai.vinesh at gmail.com> wrote:
> Hello,
> I tried that as well but there are no tsan warnings thrown at run time, even
> though there are data race error!
> The steps I followed:
> 1. Generate bitcode using 'clang -emit-llvm' command
> 2. Using the 'opt -load ..' command, I instrumented the bitcode file with my
> custom pass
> 3. Using the command 'opt -tsan ..', instrumented the output bitcode file
> from step 2
> 4. Using the llvm backend compiler, 'llc', compiled the program to native
> assembly
> 5. The output from step 4 is compiled again with 'clang -fsanitize=thread'
> (linking tsan here) for the final object file.
> Executing this final output file works fine, except that it doesn't throws
> any TSAN warnings!

Hi Nischai,

I see 3 possibilities:
1. Either the code is somehow ends up being non-instrumented, or
2. tsan does not consider what it sees a data race, or
3. the data race is masked by unrelated synchronization.

For 1 you can check that the resulting code in fact contains __tsan_* callbacks.
For 2 and 3 you can rebuilt tsan runtime with TSAN_DEBUG_OUTPUT=2
define, then it will print everything it sees (memory accesses and
synchronization). This output will allow us to figure out why it does
not report a race.

More information about the llvm-dev mailing list