authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-07-21 23:53:29-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-07-22 14:26:17-07:00
log105b91d30f732d127a7f23a1a1d4a2c794c05d3d
tree258143fece2ad4b64a5de9dfccbac63637262479
parentbde8c4a46ac924504ef851c733947cb6364d8add

ZigLLVMTargetMachineEmitToFile: make sancov enable the options


1 files changed, 41 insertions(+), 26 deletions(-)

src/zig_llvm.cpp+41-26
...@@ -189,6 +189,27 @@ struct TimeTracerRAII {...@@ -189,6 +189,27 @@ struct TimeTracerRAII {
189};189};
190} // end anonymous namespace190} // end anonymous namespace
191191
192static 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}
192213
193bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref,214bool 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 }
298304
299 // Passes specific for release build305 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 }
307310
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 }
313321
314 // Thread sanitizer322 // 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 });
320328
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 level338 // Setting up the optimization level