https://github.com/adams381 created 
https://github.com/llvm/llvm-project/pull/223583

The x86-64 classifier implements SysV.  We do not support Windows yet.

Assisted-by: Cursor / claude-opus-5


>From 00d93b6bfd02dc53b598cfb67ceb39f055f6ba6e Mon Sep 17 00:00:00 2001
From: Adam Smith <[email protected]>
Date: Mon, 14 Sep 2026 19:19:15 -0700
Subject: [PATCH] [CIR] Skip call-conv lowering on Windows x86_64

The x86-64 classifier implements SysV.  We do not support Windows yet.

Assisted-by: Cursor / claude-opus-5
---
 clang/lib/CIR/Lowering/CIRPasses.cpp           |  3 ++-
 .../CodeGen/call-conv-lowering-win64-skipped.c | 18 ++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/CIR/CodeGen/call-conv-lowering-win64-skipped.c

diff --git a/clang/lib/CIR/Lowering/CIRPasses.cpp 
b/clang/lib/CIR/Lowering/CIRPasses.cpp
index 64d82dd4e7301..d164d55f512cc 100644
--- a/clang/lib/CIR/Lowering/CIRPasses.cpp
+++ b/clang/lib/CIR/Lowering/CIRPasses.cpp
@@ -24,7 +24,8 @@ namespace cir {
 /// Map a target triple to the ABI target that drives CallConvLowering.
 /// Returns None for targets whose calling convention is not yet implemented.
 static CallConvTarget getCallConvTarget(const llvm::Triple &triple) {
-  if (triple.getArch() == llvm::Triple::x86_64)
+  // Windows is not supported.  UEFI shares its convention.
+  if (triple.getArch() == llvm::Triple::x86_64 && !triple.isOSWindowsOrUEFI())
     return CallConvTarget::X86_64;
   return CallConvTarget::None;
 }
diff --git a/clang/test/CIR/CodeGen/call-conv-lowering-win64-skipped.c 
b/clang/test/CIR/CodeGen/call-conv-lowering-win64-skipped.c
new file mode 100644
index 0000000000000..f72bba7e31f3a
--- /dev/null
+++ b/clang/test/CIR/CodeGen/call-conv-lowering-win64-skipped.c
@@ -0,0 +1,18 @@
+// RUN: not %clang_cc1 -triple x86_64-pc-windows-gnu -Wno-unused-value 
-fclangir -emit-llvm %s -o - | FileCheck %s --check-prefix=WIN64
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value 
-fclangir -emit-llvm %s -o - | FileCheck %s --check-prefix=SYSV
+
+struct S16 {
+  long long a;
+  long long b;
+};
+
+void take16(struct S16 s);
+
+void give16(void) {
+  struct S16 s = {1, 2};
+  take16(s);
+}
+
+// Windows is not supported, so its signature is left as CIRGen emitted it.
+// WIN64: declare void @take16(%struct.S16)
+// SYSV:  declare void @take16(i64, i64)

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

Reply via email to