[clang] [Cygwin] va_list must be treated like normal Windows (PR #143115)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 6 04:42:42 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-x86
@llvm/pr-subscribers-clang
Author: Tomohiro Kashiwada (kikairoya)
<details>
<summary>Changes</summary>
Handling of va_list on Cygwin environment must be matched to normal Windows environment.
A new test file is added as existing test contains a unsupported functionality.
---
Full diff: https://github.com/llvm/llvm-project/pull/143115.diff
2 Files Affected:
- (modified) clang/lib/Basic/Targets/X86.h (+3)
- (added) clang/test/CodeGen/X86/cygwin-varargs.c (+37)
``````````diff
diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h
index 780385f9c9bc5..92aa9b5dc92cb 100644
--- a/clang/lib/Basic/Targets/X86.h
+++ b/clang/lib/Basic/Targets/X86.h
@@ -979,6 +979,9 @@ 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..1d2b9af8a0225
--- /dev/null
+++ b/clang/test/CodeGen/X86/cygwin-varargs.c
@@ -0,0 +1,37 @@
+// 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
+
+// copy ms_abi block only from ../ms_abi.c
+
+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
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/143115
More information about the cfe-commits
mailing list