From 3b45626386358f711ecd68ece28cac5fea77c9f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Mi=C4=85sko?= Date: Tue, 19 Nov 2019 00:00:00 +0000 Subject: [PATCH] Create sanitizer passes in a separate function --- src/librustc_codegen_llvm/back/write.rs | 46 ++++++++++++++----------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/librustc_codegen_llvm/back/write.rs b/src/librustc_codegen_llvm/back/write.rs index b664c78f65843..6cc7b0b4b1e42 100644 --- a/src/librustc_codegen_llvm/back/write.rs +++ b/src/librustc_codegen_llvm/back/write.rs @@ -363,26 +363,7 @@ pub(crate) unsafe fn optimize(cgcx: &CodegenContext, } } - if let Some(sanitizer) = &config.sanitizer { - let recover = config.sanitizer_recover.contains(sanitizer); - match sanitizer { - Sanitizer::Address => { - extra_passes.push(llvm::LLVMRustCreateAddressSanitizerFunctionPass( - recover)); - extra_passes.push(llvm::LLVMRustCreateModuleAddressSanitizerPass( - recover)); - } - Sanitizer::Memory => { - let track_origins = config.sanitizer_memory_track_origins as c_int; - extra_passes.push(llvm::LLVMRustCreateMemorySanitizerPass( - track_origins, recover)); - } - Sanitizer::Thread => { - extra_passes.push(llvm::LLVMRustCreateThreadSanitizerPass()); - } - _ => {} - } - } + add_sanitizer_passes(config, &mut extra_passes); for pass_name in &cgcx.plugin_passes { if let Some(pass) = find_pass(pass_name) { @@ -469,6 +450,31 @@ pub(crate) unsafe fn optimize(cgcx: &CodegenContext, Ok(()) } +unsafe fn add_sanitizer_passes(config: &ModuleConfig, + passes: &mut Vec<&'static mut llvm::Pass>) { + + let sanitizer = match &config.sanitizer { + None => return, + Some(s) => s, + }; + + let recover = config.sanitizer_recover.contains(sanitizer); + match sanitizer { + Sanitizer::Address => { + passes.push(llvm::LLVMRustCreateAddressSanitizerFunctionPass(recover)); + passes.push(llvm::LLVMRustCreateModuleAddressSanitizerPass(recover)); + } + Sanitizer::Memory => { + let track_origins = config.sanitizer_memory_track_origins as c_int; + passes.push(llvm::LLVMRustCreateMemorySanitizerPass(track_origins, recover)); + } + Sanitizer::Thread => { + passes.push(llvm::LLVMRustCreateThreadSanitizerPass()); + } + Sanitizer::Leak => {} + } +} + pub(crate) unsafe fn codegen(cgcx: &CodegenContext, diag_handler: &Handler, module: ModuleCodegen,