| ... | @@ -189,6 +189,27 @@ struct TimeTracerRAII { | ... | @@ -189,6 +189,27 @@ struct TimeTracerRAII { |
| 189 | }; | 189 | }; |
| 190 | } // end anonymous namespace | 190 | } // end anonymous namespace |
| 191 | | 191 | |
| | 192 | static SanitizerCoverageOptions getSanCovOptions(void) { |
| | 193 | SanitizerCoverageOptions o; |
| | 194 | o.CoverageType = SanitizerCoverageOptions::SCK_Edge; |
| | 195 | o.IndirectCalls = true; |
| | 196 | o.TraceBB = false; |
| | 197 | o.TraceCmp = true; |
| | 198 | o.TraceDiv = false; |
| | 199 | o.TraceGep = false; |
| | 200 | o.Use8bitCounters = false; |
| | 201 | o.TracePC = false; |
| | 202 | o.TracePCGuard = false; |
| | 203 | o.Inline8bitCounters = true; |
| | 204 | o.InlineBoolFlag = false; |
| | 205 | o.PCTable = true; |
| | 206 | o.NoPrune = false; |
| | 207 | o.StackDepth = true; |
| | 208 | o.TraceLoads = false; |
| | 209 | o.TraceStores = false; |
| | 210 | o.CollectControlFlow = false; |
| | 211 | return o; |
| | 212 | } |
| 192 | | 213 | |
| 193 | bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref, | 214 | bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref, |
| 194 | char **error_message, bool is_debug, | 215 | char **error_message, bool is_debug, |
| ... | @@ -279,36 +300,23 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM | ... | @@ -279,36 +300,23 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM |
| 279 | pass_builder.registerCGSCCAnalyses(cgscc_am); | 300 | pass_builder.registerCGSCCAnalyses(cgscc_am); |
| 280 | pass_builder.registerFunctionAnalyses(function_am); | 301 | pass_builder.registerFunctionAnalyses(function_am); |
| 281 | pass_builder.registerLoopAnalyses(loop_am); | 302 | pass_builder.registerLoopAnalyses(loop_am); |
| 282 | pass_builder.crossRegisterProxies(loop_am, function_am, | 303 | pass_builder.crossRegisterProxies(loop_am, function_am, cgscc_am, module_am); |
| 283 | cgscc_am, module_am); | | |
| 284 | | | |
| 285 | // IR verification | | |
| 286 | if (assertions_on) { | | |
| 287 | // Verify the input | | |
| 288 | pass_builder.registerPipelineStartEPCallback( | | |
| 289 | [](ModulePassManager &module_pm, OptimizationLevel OL) { | | |
| 290 | module_pm.addPass(VerifierPass()); | | |
| 291 | }); | | |
| 292 | // Verify the output | | |
| 293 | pass_builder.registerOptimizerLastEPCallback( | | |
| 294 | [](ModulePassManager &module_pm, OptimizationLevel OL) { | | |
| 295 | module_pm.addPass(VerifierPass()); | | |
| 296 | }); | | |
| 297 | } | | |
| 298 | | 304 | |
| 299 | // Passes specific for release build | 305 | pass_builder.registerPipelineStartEPCallback([&](ModulePassManager &module_pm, OptimizationLevel OL) { |
| 300 | if (!is_debug) { | 306 | // Verify the input |
| 301 | pass_builder.registerPipelineStartEPCallback( | 307 | if (assertions_on) { |
| 302 | [](ModulePassManager &module_pm, OptimizationLevel OL) { | 308 | module_pm.addPass(VerifierPass()); |
| 303 | module_pm.addPass( | 309 | } |
| 304 | createModuleToFunctionPassAdaptor(AddDiscriminatorsPass())); | | |
| 305 | }); | | |
| 306 | } | | |
| 307 | | 310 | |
| 308 | pass_builder.registerOptimizerLastEPCallback([&](ModulePassManager &module_pm, OptimizationLevel level) { | 311 | if (!is_debug) { |
| | 312 | module_pm.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass())); |
| | 313 | } |
| | 314 | }); |
| | 315 | |
| | 316 | pass_builder.registerOptimizerEarlyEPCallback([&](ModulePassManager &module_pm, OptimizationLevel OL) { |
| 309 | // Code coverage instrumentation. | 317 | // Code coverage instrumentation. |
| 310 | if (sancov) { | 318 | if (sancov) { |
| 311 | module_pm.addPass(SanitizerCoveragePass()); | 319 | module_pm.addPass(SanitizerCoveragePass(getSanCovOptions())); |
| 312 | } | 320 | } |
| 313 | | 321 | |
| 314 | // Thread sanitizer | 322 | // Thread sanitizer |
| ... | @@ -318,6 +326,13 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM | ... | @@ -318,6 +326,13 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM |
| 318 | } | 326 | } |
| 319 | }); | 327 | }); |
| 320 | | 328 | |
| | 329 | pass_builder.registerOptimizerLastEPCallback([&](ModulePassManager &module_pm, OptimizationLevel level) { |
| | 330 | // Verify the output |
| | 331 | if (assertions_on) { |
| | 332 | module_pm.addPass(VerifierPass()); |
| | 333 | } |
| | 334 | }); |
| | 335 | |
| 321 | ModulePassManager module_pm; | 336 | ModulePassManager module_pm; |
| 322 | OptimizationLevel opt_level; | 337 | OptimizationLevel opt_level; |
| 323 | // Setting up the optimization level | 338 | // Setting up the optimization level |