about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-09-07 11:58:49 -0700
committerBrian Anderson <banderson@mozilla.com>2011-09-11 17:31:38 -0700
commit5e4637b61facfb607c02026e5d605e6bb6fe1a60 (patch)
tree90084b079a37aed679eea0e2c5bf0fc8e41ad60b
parent4bced5e5f2fcf7e1c7725e747ac3110ef0a9c1e4 (diff)
downloadrust-5e4637b61facfb607c02026e5d605e6bb6fe1a60.tar.gz
rust-5e4637b61facfb607c02026e5d605e6bb6fe1a60.zip
Add Rust definitions for new LLVM EH instructions
Issue #236
-rw-r--r--src/comp/lib/llvm.rs9
-rw-r--r--src/comp/middle/trans_build.rs16
-rw-r--r--src/rustllvm/rustllvm.def.in4
3 files changed, 29 insertions, 0 deletions
diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs
index 431893b0201..198b629e251 100644
--- a/src/comp/lib/llvm.rs
+++ b/src/comp/lib/llvm.rs
@@ -572,6 +572,9 @@ native "cdecl" mod llvm = "rustllvm" {
     fn LLVMBuildInvoke(B: BuilderRef, Fn: ValueRef, Args: *ValueRef,
                        NumArgs: uint, Then: BasicBlockRef,
                        Catch: BasicBlockRef, Name: sbuf) -> ValueRef;
+    fn LLVMBuildLandingPad(B: BuilderRef, Ty: TypeRef, PersFn: ValueRef,
+                           NumClauses: uint, Name: sbuf) -> ValueRef;
+    fn LLVMBuildResume(B: BuilderRef, Exn: ValueRef) -> ValueRef;
     fn LLVMBuildUnreachable(B: BuilderRef) -> ValueRef;
 
     /* Add a case to the switch instruction */
@@ -580,6 +583,12 @@ native "cdecl" mod llvm = "rustllvm" {
     /* Add a destination to the indirectbr instruction */
     fn LLVMAddDestination(IndirectBr: ValueRef, Dest: BasicBlockRef);
 
+    /* Add a clause to the landing pad instruction */
+    fn LLVMAddClause(LandingPad: ValueRef, ClauseVal: ValueRef);
+
+    /* Set the cleanup on a landing pad instruction */
+    fn LLVMSetCleanup(LandingPad: ValueRef, Val: Bool);
+
     /* Arithmetic */
     fn LLVMBuildAdd(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf)
        -> ValueRef;
diff --git a/src/comp/middle/trans_build.rs b/src/comp/middle/trans_build.rs
index e7deb97a982..c869ebbb24c 100644
--- a/src/comp/middle/trans_build.rs
+++ b/src/comp/middle/trans_build.rs
@@ -545,6 +545,22 @@ fn Trap(cx: &@block_ctxt) -> ValueRef {
                     });
 }
 
+fn LandingPad(cx: &@block_ctxt, Ty: TypeRef, PersFn: ValueRef,
+              NumClauses: uint) -> ValueRef {
+    ret str::as_buf("",
+                    {|buf|
+                        llvm::LLVMBuildLandingPad(B(cx),
+                                                  Ty,
+                                                  PersFn,
+                                                  NumClauses,
+                                                  buf)
+                    });
+}
+
+fn SetCleanup(_cx: &@block_ctxt, LandingPad: ValueRef) {
+    llvm::LLVMSetCleanup(LandingPad, lib::llvm::True);
+}
+
 //
 // Local Variables:
 // mode: rust
diff --git a/src/rustllvm/rustllvm.def.in b/src/rustllvm/rustllvm.def.in
index 25185f3cde5..deac70f3495 100644
--- a/src/rustllvm/rustllvm.def.in
+++ b/src/rustllvm/rustllvm.def.in
@@ -25,6 +25,7 @@ LLVMAddAttribute
 LLVMAddBasicAliasAnalysisPass
 LLVMAddCFGSimplificationPass
 LLVMAddCase
+LLVMAddClause
 LLVMAddConstantMergePass
 LLVMAddConstantPropagationPass
 LLVMAddCorrelatedValuePropagationPass
@@ -122,6 +123,7 @@ LLVMBuildIntToPtr
 LLVMBuildInvoke
 LLVMBuildIsNotNull
 LLVMBuildIsNull
+LLVMBuildLandingPad
 LLVMBuildLShr
 LLVMBuildLoad
 LLVMBuildMalloc
@@ -141,6 +143,7 @@ LLVMBuildPhi
 LLVMBuildPointerCast
 LLVMBuildPtrDiff
 LLVMBuildPtrToInt
+LLVMBuildResume
 LLVMBuildRet
 LLVMBuildRetVoid
 LLVMBuildSDiv
@@ -548,6 +551,7 @@ LLVMRunPassManager
 LLVMRunStaticConstructors
 LLVMRunStaticDestructors
 LLVMSetAlignment
+LLVMSetCleanup
 LLVMSetCurrentDebugLocation
 LLVMSetDataLayout
 LLVMSetFunctionCallConv