diff --git a/src/librustc/back/passes.rs b/src/librustc/back/passes.rs index 07e5d9e4f25a0e936d30e48585b320cd3f521e69..987c76dccb4242a80d7cc38a55b64477be9907e3 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 835dd55711b5739d181e65f1f1f02b5419a9a9ed..2b2c1e27cbc3d9f0b7d5e2d5dc8584477290abf0 100644 --- a/src/librustc/lib/llvm.rs +++ b/src/librustc/lib/llvm.rs @@ -1684,6 +1684,9 @@ pub unsafe fn LLVMRunPassManager(PM: PassManagerRef, #[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 53b291ff470d196e67866277fbc5937d2adc6602..32b6df4e1dd595c572d1cab9a45b3731750798aa 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 2a3f7de9bf5a07659ba2ef9b74c50c71a531090e..d5f03ac604b7605724c4aa70a33ca3b9e9a7a180 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