diff options
| author | Tomasz Miąsko <tomasz.miasko@gmail.com> | 2019-11-19 00:00:00 +0000 |
|---|---|---|
| committer | Tomasz Miąsko <tomasz.miasko@gmail.com> | 2019-11-22 19:32:45 +0100 |
| commit | bf121a33c4f9c3361e29545c6448e603952e6944 (patch) | |
| tree | 78167d94c747eca7c51996da4682683aef21b668 | |
| parent | 5141aa36f670ddd04fa281281435a42e153222be (diff) | |
| download | rust-bf121a33c4f9c3361e29545c6448e603952e6944.tar.gz rust-bf121a33c4f9c3361e29545c6448e603952e6944.zip | |
Create sanitizer passes in a separate function
| -rw-r--r-- | src/librustc_codegen_llvm/back/write.rs | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/src/librustc_codegen_llvm/back/write.rs b/src/librustc_codegen_llvm/back/write.rs index b664c78f658..6cc7b0b4b1e 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<LlvmCodegenBackend>, } } - 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<LlvmCodegenBackend>, 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<LlvmCodegenBackend>, diag_handler: &Handler, module: ModuleCodegen<ModuleLlvm>, |
