diff options
author | Kostya Serebryany <kcc@google.com> | 2012-03-01 22:27:08 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2012-03-01 22:27:08 +0000 |
commit | 28a7a1198b60ba73930112191a308eeddcd8102f (patch) | |
tree | 6037d41d3e9e832f11fe555c8202c80a22f14bc9 /clang/lib/CodeGen/BackendUtil.cpp | |
parent | c429b80da154c7ee7a9fd81d7707343d77b05565 (diff) | |
download | llvm-28a7a1198b60ba73930112191a308eeddcd8102f.zip llvm-28a7a1198b60ba73930112191a308eeddcd8102f.tar.gz llvm-28a7a1198b60ba73930112191a308eeddcd8102f.tar.bz2 |
Add a flag -fthread-sanitizer.
This flag enables ThreadSanitizer instrumentation committed to llvm as r150423.
The patch includes one test for -fthread-sanitizer and one similar test for -faddress-sanitizer.
This patch does not modify the linker flags (as we do it for -faddress-sanitizer) because the run-time library is not yet
committed and it's structure in compiler-rt is not 100% clear.
The users manual wil be changed in a separate commit.
llvm-svn: 151846
Diffstat (limited to 'clang/lib/CodeGen/BackendUtil.cpp')
-rw-r--r-- | clang/lib/CodeGen/BackendUtil.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index d9bdc32..79cdb3c 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -126,6 +126,11 @@ static void addAddressSanitizerPass(const PassManagerBuilder &Builder, PM.add(createAddressSanitizerPass()); } +static void addThreadSanitizerPass(const PassManagerBuilder &Builder, + PassManagerBase &PM) { + PM.add(createThreadSanitizerPass()); +} + void EmitAssemblyHelper::CreatePasses() { unsigned OptLevel = CodeGenOpts.OptimizationLevel; CodeGenOptions::InliningMethod Inlining = CodeGenOpts.Inlining; @@ -161,7 +166,14 @@ void EmitAssemblyHelper::CreatePasses() { PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0, addAddressSanitizerPass); } - + + if (LangOpts.ThreadSanitizer) { + PMBuilder.addExtension(PassManagerBuilder::EP_ScalarOptimizerLate, + addThreadSanitizerPass); + PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0, + addThreadSanitizerPass); + } + // Figure out TargetLibraryInfo. Triple TargetTriple(TheModule->getTargetTriple()); PMBuilder.LibraryInfo = new TargetLibraryInfo(TargetTriple); |