https://github.com/MaxDesiatov updated 
https://github.com/llvm/llvm-project/pull/203330

>From 45cf40c972f70342619723896779a33e1a9dac50 Mon Sep 17 00:00:00 2001
From: Max Desiatov <[email protected]>
Date: Thu, 11 Jun 2026 17:28:40 +0100
Subject: [PATCH 1/2] clang: enable `swiftasynccall` for Wasm

Follow-up to https://github.com/llvm/llvm-project/pull/188296, where in LLVM 
`swiftasynccall` is lowered to Wasm `return_call` and `return_call_indirect` 
instructions when tail calls are enabled. This still needed to be enabled at 
the Clang level in `checkCallingConvention` in 
`lib/Basic/Targets/WebAssembly.h`.
---
 clang/lib/Basic/Targets/WebAssembly.h |  2 +-
 clang/test/Sema/wasm-swiftasynccall.c | 11 +++++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Sema/wasm-swiftasynccall.c

diff --git a/clang/lib/Basic/Targets/WebAssembly.h 
b/clang/lib/Basic/Targets/WebAssembly.h
index 6085197498163..fa0a2b9b505e0 100644
--- a/clang/lib/Basic/Targets/WebAssembly.h
+++ b/clang/lib/Basic/Targets/WebAssembly.h
@@ -186,7 +186,7 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : 
public TargetInfo {
     case CC_Swift:
       return CCCR_OK;
     case CC_SwiftAsync:
-      return CCCR_Error;
+      return HasTailCall ? CCCR_OK : CCCR_Error;
     default:
       return CCCR_Warning;
     }
diff --git a/clang/test/Sema/wasm-swiftasynccall.c 
b/clang/test/Sema/wasm-swiftasynccall.c
new file mode 100644
index 0000000000000..37061b7cdcaab
--- /dev/null
+++ b/clang/test/Sema/wasm-swiftasynccall.c
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -triple wasm32-unknown-unknown -target-feature +tail-call 
-fsyntax-only -verify=tail %s
+// RUN: %clang_cc1 -triple wasm32-unknown-unknown -fsyntax-only -verify=notail 
%s
+
+// tail-no-diagnostics
+
+// With the tail-call feature, swiftasynccall should be accepted on
+// WebAssembly since the backend can lower musttail calls to return_call.
+// Without it, swiftasynccall should be rejected.
+
+// notail-error@+1 {{'swiftasynccall' calling convention is not supported for 
this target}}
+void __attribute__((swiftasynccall)) async_func(char 
*__attribute__((swift_async_context)) ctx) {}

>From ab5b3fa07313c1eba7888b7b78d649e0961e45b3 Mon Sep 17 00:00:00 2001
From: Max Desiatov <[email protected]>
Date: Thu, 18 Jun 2026 14:28:56 +0100
Subject: [PATCH 2/2] clang/wasm-swiftasynccall: add IR and asm codegen tests

---
 .../CodeGen/WebAssembly/wasm-swiftasynccall.c | 42 +++++++++++++++++++
 clang/test/Sema/wasm-swiftasynccall.c         |  5 +--
 2 files changed, 44 insertions(+), 3 deletions(-)
 create mode 100644 clang/test/CodeGen/WebAssembly/wasm-swiftasynccall.c

diff --git a/clang/test/CodeGen/WebAssembly/wasm-swiftasynccall.c 
b/clang/test/CodeGen/WebAssembly/wasm-swiftasynccall.c
new file mode 100644
index 0000000000000..991f187aaf5b5
--- /dev/null
+++ b/clang/test/CodeGen/WebAssembly/wasm-swiftasynccall.c
@@ -0,0 +1,42 @@
+// REQUIRES: webassembly-registered-target
+// RUN: %clang_cc1 -no-enable-noundef-analysis -triple wasm32-unknown-unknown \
+// RUN:   -target-feature +tail-call -emit-llvm -o - %s | FileCheck %s 
--check-prefix=IR
+// RUN: %clang_cc1 -triple wasm32-unknown-unknown -target-feature +tail-call \
+// RUN:   -S -o - %s | FileCheck %s --check-prefix=ASM
+
+// swiftasynccall uses the swifttailcc CC and musttail calls, which the
+// WebAssembly backend lowers to return_call / return_call_indirect with the
+// tail-call feature. Sema acceptance: Sema/wasm-swiftasynccall.c.
+
+#define SWIFTASYNCCALL __attribute__((swiftasynccall))
+#define ASYNC_CONTEXT  __attribute__((swift_async_context))
+
+// Definition uses swifttailcc.
+// IR-LABEL: define {{.*}}swifttailcc void @async_leaf(ptr swiftasync
+SWIFTASYNCCALL void async_leaf(char *ASYNC_CONTEXT ctx) {
+  *ctx += 1;
+}
+
+// Direct tail call lowers to return_call.
+// IR-LABEL: define {{.*}}swifttailcc void @async_direct(ptr swiftasync
+// IR: musttail call swifttailcc void @async_leaf(ptr swiftasync
+// IR-NEXT: ret void
+//
+// ASM-LABEL: async_direct:
+// ASM: return_call async_leaf
+SWIFTASYNCCALL void async_direct(char *ASYNC_CONTEXT ctx) {
+  return async_leaf(ctx);
+}
+
+typedef SWIFTASYNCCALL void (*async_fn_t)(char *ASYNC_CONTEXT);
+
+// Indirect tail call lowers to return_call_indirect.
+// IR-LABEL: define {{.*}}swifttailcc void @async_indirect(ptr
+// IR: musttail call swifttailcc void %{{.*}}(ptr swiftasync
+// IR-NEXT: ret void
+//
+// ASM-LABEL: async_indirect:
+// ASM: return_call_indirect
+SWIFTASYNCCALL void async_indirect(async_fn_t fn, char *ASYNC_CONTEXT ctx) {
+  return fn(ctx);
+}
diff --git a/clang/test/Sema/wasm-swiftasynccall.c 
b/clang/test/Sema/wasm-swiftasynccall.c
index 37061b7cdcaab..838a9a2e00227 100644
--- a/clang/test/Sema/wasm-swiftasynccall.c
+++ b/clang/test/Sema/wasm-swiftasynccall.c
@@ -3,9 +3,8 @@
 
 // tail-no-diagnostics
 
-// With the tail-call feature, swiftasynccall should be accepted on
-// WebAssembly since the backend can lower musttail calls to return_call.
-// Without it, swiftasynccall should be rejected.
+// swiftasynccall is accepted only with the tail-call feature, which lets the
+// backend lower its musttail calls to return_call.
 
 // notail-error@+1 {{'swiftasynccall' calling convention is not supported for 
this target}}
 void __attribute__((swiftasynccall)) async_func(char 
*__attribute__((swift_async_context)) ctx) {}

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to