diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs index 431893b0201b..198b629e2512 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 e7deb97a982c..c869ebbb24c8 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 25185f3cde5d..deac70f3495a 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