aboutsummaryrefslogtreecommitdiff
path: root/src/comp/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/comp/lib')
-rw-r--r--src/comp/lib/llvm.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs
index 6063c3c6..c5236725 100644
--- a/src/comp/lib/llvm.rs
+++ b/src/comp/lib/llvm.rs
@@ -687,6 +687,16 @@ native mod llvm = llvm_lib {
fn LLVMPreferredAlignmentOfType(TargetDataRef TD, TypeRef Ty) -> uint;
/** Disposes target data. */
fn LLVMDisposeTargetData(TargetDataRef TD);
+
+ /** Creates a pass manager. */
+ fn LLVMCreatePassManager() -> PassManagerRef;
+ /** Disposes a pass manager. */
+ fn LLVMDisposePassManager(PassManagerRef PM);
+ /** Runs a pass manager on a module. */
+ fn LLVMRunPassManager(PassManagerRef PM, ModuleRef M) -> Bool;
+
+ /** Adds a verification pass. */
+ fn LLVMAddVerifierPass(PassManagerRef PM);
}
/* Slightly more terse object-interface to LLVM's 'builder' functions. */
@@ -1209,6 +1219,19 @@ fn mk_target_data(str string_rep) -> target_data {
ret rec(lltd=lltd, dtor=target_data_dtor(lltd));
}
+/* Memory-managed interface to pass managers. */
+
+obj pass_manager_dtor(PassManagerRef PM) {
+ drop { llvm.LLVMDisposePassManager(PM); }
+}
+
+type pass_manager = rec(PassManagerRef llpm, pass_manager_dtor dtor);
+
+fn mk_pass_manager() -> pass_manager {
+ auto llpm = llvm.LLVMCreatePassManager();
+ ret rec(llpm=llpm, dtor=pass_manager_dtor(llpm));
+}
+
//
// Local Variables: