https://github.com/aheejin updated https://github.com/llvm/llvm-project/pull/128105
>From 8702f84a3f3271e97bc963e997b9f441f05e83da Mon Sep 17 00:00:00 2001 From: Heejin Ahn <ahee...@gmail.com> Date: Thu, 20 Feb 2025 22:23:33 +0000 Subject: [PATCH] [WebAssembly] Generate invokes with llvm.wasm.(re)throw Even though `__builtin_wasm_throw`, which is lowered down to `llvm.wasm.throw`, throws, ```cpp try { __builtin_wasm_throw(0, obj); } catch (...) { } ``` does not generate `invoke`. This is because we have assumed the intrinsic cannot be invoked, which doesn't make much sense. (See #128104 for the historical context) #128104 made `llvm.wasm.throw` intrinsic invokable in the backend. This actually generates `invoke`s in Clang for `__builtin_wasm_throw`. While we're at it, this also generates `invoke`s for `__builtin_wasm_rethrow`, which is actually not used anywhere in C++ support. I haven't deleted it just in case in may have uses later. (For example, to support rethrow functionality that carries stack trace with exnref) Depends on #128104 for the CI to pass. Fixes #124710. --- clang/lib/CodeGen/CGBuiltin.cpp | 4 ++-- clang/test/CodeGenCXX/builtins-eh-wasm.cpp | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 clang/test/CodeGenCXX/builtins-eh-wasm.cpp diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 348cb523b1718..d63e3cc093e17 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -22493,11 +22493,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() +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits