| ... | @@ -50,6 +50,7 @@ | ... | @@ -50,6 +50,7 @@ |
| 50 | #include <llvm/Transforms/IPO.h> | 50 | #include <llvm/Transforms/IPO.h> |
| 51 | #include <llvm/Transforms/IPO/AlwaysInliner.h> | 51 | #include <llvm/Transforms/IPO/AlwaysInliner.h> |
| 52 | #include <llvm/Transforms/IPO/PassManagerBuilder.h> | 52 | #include <llvm/Transforms/IPO/PassManagerBuilder.h> |
| | 53 | #include <llvm/Transforms/Instrumentation/ThreadSanitizer.h> |
| 53 | #include <llvm/Transforms/Scalar.h> | 54 | #include <llvm/Transforms/Scalar.h> |
| 54 | #include <llvm/Transforms/Utils.h> | 55 | #include <llvm/Transforms/Utils.h> |
| 55 | | 56 | |
| ... | @@ -93,6 +94,10 @@ static void addDiscriminatorsPass(const PassManagerBuilder &Builder, legacy::Pas | ... | @@ -93,6 +94,10 @@ static void addDiscriminatorsPass(const PassManagerBuilder &Builder, legacy::Pas |
| 93 | PM.add(createAddDiscriminatorsPass()); | 94 | PM.add(createAddDiscriminatorsPass()); |
| 94 | } | 95 | } |
| 95 | | 96 | |
| | 97 | static void addThreadSanitizerPass(const PassManagerBuilder &Builder, legacy::PassManagerBase &PM) { |
| | 98 | PM.add(createThreadSanitizerLegacyPassPass()); |
| | 99 | } |
| | 100 | |
| 96 | #ifndef NDEBUG | 101 | #ifndef NDEBUG |
| 97 | static const bool assertions_on = true; | 102 | static const bool assertions_on = true; |
| 98 | #else | 103 | #else |
| ... | @@ -179,7 +184,7 @@ unsigned ZigLLVMDataLayoutGetProgramAddressSpace(LLVMTargetDataRef TD) { | ... | @@ -179,7 +184,7 @@ unsigned ZigLLVMDataLayoutGetProgramAddressSpace(LLVMTargetDataRef TD) { |
| 179 | | 184 | |
| 180 | bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref, | 185 | bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref, |
| 181 | char **error_message, bool is_debug, | 186 | char **error_message, bool is_debug, |
| 182 | bool is_small, bool time_report, | 187 | bool is_small, bool time_report, bool tsan, |
| 183 | const char *asm_filename, const char *bin_filename, const char *llvm_ir_filename) | 188 | const char *asm_filename, const char *bin_filename, const char *llvm_ir_filename) |
| 184 | { | 189 | { |
| 185 | TimePassesIsEnabled = time_report; | 190 | TimePassesIsEnabled = time_report; |
| ... | @@ -245,6 +250,11 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM | ... | @@ -245,6 +250,11 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM |
| 245 | PMBuilder->Inliner = createFunctionInliningPass(PMBuilder->OptLevel, PMBuilder->SizeLevel, false); | 250 | PMBuilder->Inliner = createFunctionInliningPass(PMBuilder->OptLevel, PMBuilder->SizeLevel, false); |
| 246 | } | 251 | } |
| 247 | | 252 | |
| | 253 | if (tsan) { |
| | 254 | PMBuilder->addExtension(PassManagerBuilder::EP_OptimizerLast, addThreadSanitizerPass); |
| | 255 | PMBuilder->addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0, addThreadSanitizerPass); |
| | 256 | } |
| | 257 | |
| 248 | // Set up the per-function pass manager. | 258 | // Set up the per-function pass manager. |
| 249 | legacy::FunctionPassManager FPM = legacy::FunctionPassManager(module); | 259 | legacy::FunctionPassManager FPM = legacy::FunctionPassManager(module); |
| 250 | auto tliwp = new(std::nothrow) TargetLibraryInfoWrapperPass(tlii); | 260 | auto tliwp = new(std::nothrow) TargetLibraryInfoWrapperPass(tlii); |