[clang] 830a740 - [Clang] [Cygwin] va_list must be treated like normal Windows (#143115)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 10 13:42:39 PDT 2025
Author: Tomohiro Kashiwada
Date: 2025-06-10T23:42:36+03:00
New Revision: 830a74092adafa425db05e1c5120d3294f874777
URL: https://github.com/llvm/llvm-project/commit/830a74092adafa425db05e1c5120d3294f874777
DIFF: https://github.com/llvm/llvm-project/commit/830a74092adafa425db05e1c5120d3294f874777.diff
LOG: [Clang] [Cygwin] va_list must be treated like normal Windows (#143115)
Handling of va_list on Cygwin environment must be matched to normal
Windows environment.
The existing test `test/CodeGen/ms_abi.c` seems relevant, but it
contains `__attribute__((sysv_abi))`, which is not supported on Cygwin.
The new test is based on the `__attribute__((ms_abi))` portion of that
test.
---------
Co-authored-by: jeremyd2019 <github at jdrake.com>
Added:
clang/test/CodeGen/X86/cygwin-varargs.c
Modified:
clang/lib/Basic/Targets/X86.h
Removed:
################################################################################
diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h
index 6f8a2365be256..ecb31ffa4750f 100644
--- a/clang/lib/Basic/Targets/X86.h
+++ b/clang/lib/Basic/Targets/X86.h
@@ -997,6 +997,10 @@ class LLVM_LIBRARY_VISIBILITY CygwinX86_64TargetInfo : public X86_64TargetInfo {
if (Opts.CPlusPlus)
Builder.defineMacro("_GNU_SOURCE");
}
+
+ BuiltinVaListKind getBuiltinVaListKind() const override {
+ return TargetInfo::CharPtrBuiltinVaList;
+ }
};
class LLVM_LIBRARY_VISIBILITY DarwinX86_64TargetInfo
diff --git a/clang/test/CodeGen/X86/cygwin-varargs.c b/clang/test/CodeGen/X86/cygwin-varargs.c
new file mode 100644
index 0000000000000..4eea7d64bcb35
--- /dev/null
+++ b/clang/test/CodeGen/X86/cygwin-varargs.c
@@ -0,0 +1,35 @@
+// RUN: %clang_cc1 -triple x86_64-windows-gnu -emit-llvm < %s | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-pc-cygwin -emit-llvm < %s | FileCheck %s
+
+struct foo {
+ int x;
+ float y;
+ char z;
+};
+// CHECK: %[[STRUCT_FOO:.*]] = type { i32, float, i8 }
+
+void f(int a, ...) {
+ // CHECK-LABEL: define dso_local void @f
+ __builtin_va_list ap;
+ __builtin_va_start(ap, a);
+ // CHECK: %[[AP:.*]] = alloca ptr
+ // CHECK: call void @llvm.va_start
+ int b = __builtin_va_arg(ap, int);
+ // CHECK: %[[AP_CUR:.*]] = load ptr, ptr %[[AP]]
+ // CHECK-NEXT: %[[AP_NEXT:.*]] = getelementptr inbounds i8, ptr %[[AP_CUR]], i64 8
+ // CHECK-NEXT: store ptr %[[AP_NEXT]], ptr %[[AP]]
+ double _Complex c = __builtin_va_arg(ap, double _Complex);
+ // CHECK: %[[AP_CUR2:.*]] = load ptr, ptr %[[AP]]
+ // CHECK-NEXT: %[[AP_NEXT2:.*]] = getelementptr inbounds i8, ptr %[[AP_CUR2]], i64 8
+ // CHECK-NEXT: store ptr %[[AP_NEXT2]], ptr %[[AP]]
+ // CHECK-NEXT: load ptr, ptr %[[AP_CUR2]]
+ struct foo d = __builtin_va_arg(ap, struct foo);
+ // CHECK: %[[AP_CUR3:.*]] = load ptr, ptr %[[AP]]
+ // CHECK-NEXT: %[[AP_NEXT3:.*]] = getelementptr inbounds i8, ptr %[[AP_CUR3]], i64 8
+ // CHECK-NEXT: store ptr %[[AP_NEXT3]], ptr %[[AP]]
+ __builtin_va_list ap2;
+ __builtin_va_copy(ap2, ap);
+ // CHECK: call void @llvm.va_copy
+ __builtin_va_end(ap);
+ // CHECK: call void @llvm.va_end
+}
More information about the cfe-commits
mailing list