From 31c132081857b126524ccd261da331c9b1bda856 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 11 Feb 2025 11:13:41 -0800 Subject: [PATCH] ZigLLVMTargetMachineEmitToFile: schedule sancov pass depending on mode In debug mode, schedule it early. In release modes, schedule it late. --- src/zig_llvm.cpp | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index 53a0faba8a..51fd4aa0a5 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -311,19 +311,35 @@ ZIG_EXTERN_C bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machi } }); - //pass_builder.registerOptimizerEarlyEPCallback([&](ModulePassManager &module_pm, OptimizationLevel OL) { - //}); + const bool early_san = options->is_debug; + + pass_builder.registerOptimizerEarlyEPCallback([&](ModulePassManager &module_pm, OptimizationLevel OL) { + if (early_san) { + // Code coverage instrumentation. + if (options->sancov) { + module_pm.addPass(SanitizerCoveragePass(getSanCovOptions(options->coverage))); + } + + // Thread sanitizer + if (options->tsan) { + module_pm.addPass(ModuleThreadSanitizerPass()); + module_pm.addPass(createModuleToFunctionPassAdaptor(ThreadSanitizerPass())); + } + } + }); pass_builder.registerOptimizerLastEPCallback([&](ModulePassManager &module_pm, OptimizationLevel level) { - // Code coverage instrumentation. - if (options->sancov) { - module_pm.addPass(SanitizerCoveragePass(getSanCovOptions(options->coverage))); - } + if (!early_san) { + // Code coverage instrumentation. + if (options->sancov) { + module_pm.addPass(SanitizerCoveragePass(getSanCovOptions(options->coverage))); + } - // Thread sanitizer - if (options->tsan) { - module_pm.addPass(ModuleThreadSanitizerPass()); - module_pm.addPass(createModuleToFunctionPassAdaptor(ThreadSanitizerPass())); + // Thread sanitizer + if (options->tsan) { + module_pm.addPass(ModuleThreadSanitizerPass()); + module_pm.addPass(createModuleToFunctionPassAdaptor(ThreadSanitizerPass())); + } } // Verify the output