aboutsummaryrefslogtreecommitdiff
path: root/clang/test
diff options
context:
space:
mode:
authorLongsheng Mou <moulongsheng@huawei.com>2024-04-03 19:12:12 +0800
committerGitHub <noreply@github.com>2024-04-03 19:12:12 +0800
commit956b47b48616148c15f8f95d76d5e0c215fe095c (patch)
treec77f658d68b2347fc6d1d7250b2bb6d3e98f9a76 /clang/test
parent1f268092c7af20c21d4a594678b647cab050602a (diff)
downloadllvm-956b47b48616148c15f8f95d76d5e0c215fe095c.zip
llvm-956b47b48616148c15f8f95d76d5e0c215fe095c.tar.gz
llvm-956b47b48616148c15f8f95d76d5e0c215fe095c.tar.bz2
[X86_32] Teach X86_32 va_arg to ignore empty structs. (#86075)
Empty structs are ignored for parameter passing purposes, but va_arg was incrementing the pointer anyway for that the size of empty struct in c++ is 1 byte, which could lead to va_list getting out of sync. Fix #86057.
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/CodeGenCXX/x86_32-vaarg.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/x86_32-vaarg.cpp b/clang/test/CodeGenCXX/x86_32-vaarg.cpp
new file mode 100644
index 0000000..dcc2f7f
--- /dev/null
+++ b/clang/test/CodeGenCXX/x86_32-vaarg.cpp
@@ -0,0 +1,21 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
+// RUN: %clang_cc1 -triple i386-linux-gnu -emit-llvm -o - %s | FileCheck %s
+
+typedef struct {} empty;
+
+// CHECK-LABEL: @_Z17empty_record_testiz(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[RESULT_PTR:%.*]] = alloca ptr, align 4
+// CHECK-NEXT: [[Z_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT: [[LIST:%.*]] = alloca ptr, align 4
+// CHECK-NEXT: [[TMP:%.*]] = alloca [[STRUCT_EMPTY:%.*]], align 1
+// CHECK-NEXT: store ptr [[AGG_RESULT:%.*]], ptr [[RESULT_PTR]], align 4
+// CHECK-NEXT: store i32 [[Z:%.*]], ptr [[Z_ADDR]], align 4
+// CHECK-NEXT: call void @llvm.va_start.p0(ptr [[LIST]])
+// CHECK-NEXT: ret void
+//
+empty empty_record_test(int z, ...) {
+ __builtin_va_list list;
+ __builtin_va_start(list, z);
+ return __builtin_va_arg(list, empty);
+}