summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2013-06-19 15:18:25 -0700
committerBrian Anderson <banderson@mozilla.com>2013-06-19 15:18:25 -0700
commitb7a69198992fceb7b2c6affb5e0a7ed862ebc090 (patch)
tree226006913791b6edbc424a7f948757212845bf8e /src
parent1120f8c1e57b7b30134d670dd1dfc18c6444c15f (diff)
downloadrust-b7a69198992fceb7b2c6affb5e0a7ed862ebc090.tar.gz
rust-b7a69198992fceb7b2c6affb5e0a7ed862ebc090.zip
rustc: Dispose of LLVM passes in test cases
Diffstat (limited to 'src')
-rw-r--r--src/librustc/back/passes.rs15
-rw-r--r--src/librustc/lib/llvm.rs3
-rw-r--r--src/rustllvm/PassWrapper.cpp5
-rw-r--r--src/rustllvm/rustllvm.def.in1
4 files changed, 21 insertions, 3 deletions
diff --git a/src/librustc/back/passes.rs b/src/librustc/back/passes.rs
index 07e5d9e4f25..987c76dccb4 100644
--- a/src/librustc/back/passes.rs
+++ b/src/librustc/back/passes.rs
@@ -299,18 +299,27 @@ fn passes_exist() {
     let mut failed = ~[];
     unsafe { llvm::LLVMInitializePasses(); }
     for analysis_passes.each() |&(name,_)| {
-        if !create_pass(name).is_some() {
+        let pass = create_pass(name);
+        if !pass.is_some() {
             failed.push(name);
+        } else {
+            unsafe { llvm::LLVMDestroyPass(pass.get()) }
         }
     }
     for transform_passes.each() |&(name,_)| {
-        if !create_pass(name).is_some() {
+        let pass = create_pass(name);
+        if !pass.is_some() {
             failed.push(name);
+        } else {
+            unsafe { llvm::LLVMDestroyPass(pass.get()) }
         }
     }
     for utility_passes.each() |&(name,_)| {
-        if !create_pass(name).is_some() {
+        let pass = create_pass(name);
+        if !pass.is_some() {
             failed.push(name);
+        } else {
+            unsafe { llvm::LLVMDestroyPass(pass.get()) }
         }
     }
 
diff --git a/src/librustc/lib/llvm.rs b/src/librustc/lib/llvm.rs
index 835dd55711b..2b2c1e27cbc 100644
--- a/src/librustc/lib/llvm.rs
+++ b/src/librustc/lib/llvm.rs
@@ -1684,6 +1684,9 @@ pub mod llvm {
         #[fast_ffi]
         pub unsafe fn LLVMCreatePass(PassName:*c_char) -> PassRef;
 
+        #[fast_ffi]
+        pub unsafe fn LLVMDestroyPass(P: PassRef);
+
         /** Adds a verification pass. */
         #[fast_ffi]
         pub unsafe fn LLVMAddVerifierPass(PM: PassManagerRef);
diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp
index 53b291ff470..32b6df4e1dd 100644
--- a/src/rustllvm/PassWrapper.cpp
+++ b/src/rustllvm/PassWrapper.cpp
@@ -63,3 +63,8 @@ extern "C" LLVMPassRef LLVMCreatePass(const char * PassName) {
         return (LLVMPassRef)0;
     }
 }
+
+extern "C" void LLVMDestroyPass(LLVMPassRef PassRef) {
+    Pass *p = unwrap(PassRef);
+    delete p;
+}
diff --git a/src/rustllvm/rustllvm.def.in b/src/rustllvm/rustllvm.def.in
index 2a3f7de9bf5..d5f03ac604b 100644
--- a/src/rustllvm/rustllvm.def.in
+++ b/src/rustllvm/rustllvm.def.in
@@ -588,6 +588,7 @@ LLVMInlineAsm
 LLVMInitializePasses
 LLVMAddPass
 LLVMCreatePass
+LLVMDestroyPass
 LLVMDIBuilderCreate
 LLVMDIBuilderDispose
 LLVMDIBuilderFinalize