diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 96d4e9732ed0e..65fac01d58362 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -22524,11 +22524,11 @@ Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, Value *Tag = EmitScalarExpr(E->getArg(0)); Value *Obj = EmitScalarExpr(E->getArg(1)); Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_throw); - return Builder.CreateCall(Callee, {Tag, Obj}); + return EmitRuntimeCallOrInvoke(Callee, {Tag, Obj}); } case WebAssembly::BI__builtin_wasm_rethrow: { Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_rethrow); - return Builder.CreateCall(Callee); + return EmitRuntimeCallOrInvoke(Callee); } case WebAssembly::BI__builtin_wasm_memory_atomic_wait32: { Value *Addr = EmitScalarExpr(E->getArg(0)); diff --git a/clang/test/CodeGenCXX/builtins-eh-wasm.cpp b/clang/test/CodeGenCXX/builtins-eh-wasm.cpp new file mode 100644 index 0000000000000..b0f763d3e54dc --- /dev/null +++ b/clang/test/CodeGenCXX/builtins-eh-wasm.cpp @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -triple wasm32-unknown-unknown -fexceptions -fcxx-exceptions -target-feature +reference-types -target-feature +exception-handling -target-feature +multivalue -exception-model=wasm -emit-llvm -o - %s | FileCheck %s + +// Check if __builtin_wasm_throw and __builtin_wasm_rethrow are correctly +// invoked when placed in try-catch. + +void throw_in_try(void *obj) { + try { + __builtin_wasm_throw(0, obj); + } catch (...) { + } + // CHECK: invoke void @llvm.wasm.throw(i32 0, ptr %{{.*}}) +} + +void rethrow_in_try() { + try { + __builtin_wasm_rethrow(); + } catch (...) { + } + // CHECK: invoke void @llvm.wasm.rethrow() +}