aboutsummaryrefslogtreecommitdiff
path: root/src/zig_llvm.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-12-24 15:17:52 -0800
committerGitHub <noreply@github.com>2020-12-24 15:17:52 -0800
commit9f33984119ee698a9b344ad0df7b498b334e0f6e (patch)
tree9f6fbf983be6d98337ced72a79f3215062bb4e64 /src/zig_llvm.cpp
parente18abab55aea4a5c3b347274e41de9fdc24e950c (diff)
parent6ab9268a9024fe8e9076f07cb207107d2cad0876 (diff)
downloadzig-9f33984119ee698a9b344ad0df7b498b334e0f6e.tar.gz
zig-9f33984119ee698a9b344ad0df7b498b334e0f6e.zip
Merge pull request #7520 from ziglang/tsan
add support for TSAN
Diffstat (limited to 'src/zig_llvm.cpp')
-rw-r--r--src/zig_llvm.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp
index 9b1ab71e9a..51af5e06d1 100644
--- a/src/zig_llvm.cpp
+++ b/src/zig_llvm.cpp
@@ -50,6 +50,7 @@
#include <llvm/Transforms/IPO.h>
#include <llvm/Transforms/IPO/AlwaysInliner.h>
#include <llvm/Transforms/IPO/PassManagerBuilder.h>
+#include <llvm/Transforms/Instrumentation/ThreadSanitizer.h>
#include <llvm/Transforms/Scalar.h>
#include <llvm/Transforms/Utils.h>
@@ -93,6 +94,10 @@ static void addDiscriminatorsPass(const PassManagerBuilder &Builder, legacy::Pas
PM.add(createAddDiscriminatorsPass());
}
+static void addThreadSanitizerPass(const PassManagerBuilder &Builder, legacy::PassManagerBase &PM) {
+ PM.add(createThreadSanitizerLegacyPassPass());
+}
+
#ifndef NDEBUG
static const bool assertions_on = true;
#else
@@ -179,7 +184,7 @@ unsigned ZigLLVMDataLayoutGetProgramAddressSpace(LLVMTargetDataRef TD) {
bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref,
char **error_message, bool is_debug,
- bool is_small, bool time_report,
+ bool is_small, bool time_report, bool tsan,
const char *asm_filename, const char *bin_filename, const char *llvm_ir_filename)
{
TimePassesIsEnabled = time_report;
@@ -245,6 +250,11 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM
PMBuilder->Inliner = createFunctionInliningPass(PMBuilder->OptLevel, PMBuilder->SizeLevel, false);
}
+ if (tsan) {
+ PMBuilder->addExtension(PassManagerBuilder::EP_OptimizerLast, addThreadSanitizerPass);
+ PMBuilder->addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0, addThreadSanitizerPass);
+ }
+
// Set up the per-function pass manager.
legacy::FunctionPassManager FPM = legacy::FunctionPassManager(module);
auto tliwp = new(std::nothrow) TargetLibraryInfoWrapperPass(tlii);