about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTomasz Miąsko <tomasz.miasko@gmail.com>2019-11-19 00:00:00 +0000
committerTomasz Miąsko <tomasz.miasko@gmail.com>2019-11-22 19:32:45 +0100
commitbf121a33c4f9c3361e29545c6448e603952e6944 (patch)
tree78167d94c747eca7c51996da4682683aef21b668
parent5141aa36f670ddd04fa281281435a42e153222be (diff)
downloadrust-bf121a33c4f9c3361e29545c6448e603952e6944.tar.gz
rust-bf121a33c4f9c3361e29545c6448e603952e6944.zip
Create sanitizer passes in a separate function
-rw-r--r--src/librustc_codegen_llvm/back/write.rs46
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>,