From b7a69198992fceb7b2c6affb5e0a7ed862ebc090 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 19 Jun 2013 15:18:25 -0700 Subject: [PATCH] rustc: Dispose of LLVM passes in test cases --- src/librustc/back/passes.rs | 15 ++++++++++++--- src/librustc/lib/llvm.rs | 3 +++ src/rustllvm/PassWrapper.cpp | 5 +++++ src/rustllvm/rustllvm.def.in | 1 + 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/librustc/back/passes.rs b/src/librustc/back/passes.rs index 07e5d9e4f25a..987c76dccb42 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 835dd55711b5..2b2c1e27cbc3 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 53b291ff470d..32b6df4e1dd5 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 2a3f7de9bf5a..d5f03ac604b7 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