diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-12-24 15:17:52 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-12-24 15:17:52 -0800 |
| commit | 9f33984119ee698a9b344ad0df7b498b334e0f6e (patch) | |
| tree | 9f6fbf983be6d98337ced72a79f3215062bb4e64 /src/zig_llvm.cpp | |
| parent | e18abab55aea4a5c3b347274e41de9fdc24e950c (diff) | |
| parent | 6ab9268a9024fe8e9076f07cb207107d2cad0876 (diff) | |
| download | zig-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.cpp | 12 |
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); |
