[clang] [CodeGen][ObjC] Initial WebAssembly Support for GNUstep v2 (PR #183753)
Jonathan Schleifer via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 3 13:09:49 PST 2026
================
@@ -0,0 +1,37 @@
+// RUN: %clang_cc1 -triple wasm32-unknown-emscripten -fobjc-exceptions -fexceptions -exception-model=wasm -mllvm -wasm-enable-eh -emit-llvm -fobjc-runtime=gnustep-2.2 -o - %s | FileCheck %s
+
+void may_throw(void) {
+ @throw (id) 1;
+}
+
+int main(void) {
+ int retval = 0;
+ @try {
+ may_throw();
+ // CHECK: invoke void @may_throw()
+ // CHECK-NEXT: to label %[[INVOKE_CONT:.*]] unwind label %[[CATCH_DISPATCH:.*]]
+ }
+ // Check that the dispatch block has been emitted correctly.
+ // CHECK: [[CATCH_DISPATCH]]:
+ // CHECK-NEXT: %[[CATCHSWITCH:.*]] = catchswitch within none [label %[[CATCH_START:.*]] unwind to caller
+
+
+ // The native WASM EH uses the new exception handling IR instructions
+ // (catchswitch, catchpad, etc.) that are also used when targeting Windows MSVC.
+ // For SEH, we emit a catchpad instruction for each catch statement. On WASM, we
+ // merge all catch statements into one big catch block.
+
+ // CHECK: catchpad within %[[CATCHSWITCH]] [ptr @__objc_id_type_info, ptr null]
+
+ // We use the cxa functions instead of objc_{begin,end}_catch.
+ // CHECK: call ptr @__cxa_begin_catch
+ @catch(id a) {
+ retval = 1;
+ }
+ @catch(...) {
+ retval = 2;
+ }
+ return retval;
----------------
Midar wrote:
The test case should probably also contain a @finally to make sure that a.) it is there in the non-exception flow b.) in all catch handler flows c.) in the catch all and rethrow flow.
https://github.com/llvm/llvm-project/pull/183753
More information about the cfe-commits
mailing list