forked from OSchip/llvm-project
[WebAssembly] Add throw/rethrow builtins for exception handling
Summary: Add new builtins for throw/rethrow instructions. This follows exception handling handling proposal in https://github.com/WebAssembly/exception-handling/blob/master/proposals/Exceptions.md Reviewers: sunfish, dschuff Reviewed By: dschuff Subscribers: jfb, dschuff, sbc100, jgravelle-google Differential Revision: https://reviews.llvm.org/D34783 llvm-svn: 306775
This commit is contained in:
parent
ac62b05d05
commit
b92440eab0
|
@ -21,4 +21,8 @@
|
|||
BUILTIN(__builtin_wasm_current_memory, "z", "n")
|
||||
BUILTIN(__builtin_wasm_grow_memory, "zz", "n")
|
||||
|
||||
// Exception handling builtins.
|
||||
BUILTIN(__builtin_wasm_throw, "vUiv*", "r")
|
||||
BUILTIN(__builtin_wasm_rethrow, "v", "r")
|
||||
|
||||
#undef BUILTIN
|
||||
|
|
|
@ -9372,6 +9372,16 @@ Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID,
|
|||
Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_grow_memory, X->getType());
|
||||
return Builder.CreateCall(Callee, X);
|
||||
}
|
||||
case WebAssembly::BI__builtin_wasm_throw: {
|
||||
Value *Tag = EmitScalarExpr(E->getArg(0));
|
||||
Value *Obj = EmitScalarExpr(E->getArg(1));
|
||||
Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_throw);
|
||||
return Builder.CreateCall(Callee, {Tag, Obj});
|
||||
}
|
||||
case WebAssembly::BI__builtin_wasm_rethrow: {
|
||||
Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_rethrow);
|
||||
return Builder.CreateCall(Callee);
|
||||
}
|
||||
|
||||
default:
|
||||
return nullptr;
|
||||
|
|
|
@ -14,3 +14,15 @@ __SIZE_TYPE__ f2(__SIZE_TYPE__ delta) {
|
|||
// WEBASSEMBLY32: call i32 @llvm.wasm.grow.memory.i32(i32 %{{.*}})
|
||||
// WEBASSEMBLY64: call i64 @llvm.wasm.grow.memory.i64(i64 %{{.*}})
|
||||
}
|
||||
|
||||
void f3(unsigned int tag, void *obj) {
|
||||
return __builtin_wasm_throw(tag, obj);
|
||||
// WEBASSEMBLY32: call void @llvm.wasm.throw(i32 %{{.*}}, i8* %{{.*}})
|
||||
// WEBASSEMBLY64: call void @llvm.wasm.throw(i32 %{{.*}}, i8* %{{.*}})
|
||||
}
|
||||
|
||||
void f4() {
|
||||
return __builtin_wasm_rethrow();
|
||||
// WEBASSEMBLY32: call void @llvm.wasm.rethrow()
|
||||
// WEBASSEMBLY64: call void @llvm.wasm.rethrow()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue