diff options
author | yronglin <yronglin777@gmail.com> | 2022-11-17 23:06:21 +0800 |
---|---|---|
committer | Tobias Hieta <tobias@hieta.se> | 2022-11-29 11:05:58 +0100 |
commit | 088f33605d8a61ff519c580a71b1dd57d16a03f8 (patch) | |
tree | 9cb55cd5d29b861b91028dd4663ed88e93c5ed6e /clang/test | |
parent | abcd0341d8465d55d7293dfc7142fef5055047fa (diff) | |
download | llvm-llvmorg-15.0.6.zip llvm-llvmorg-15.0.6.tar.gz llvm-llvmorg-15.0.6.tar.bz2 |
[CodeGen][ARM] Fix ARMABIInfo::EmitVAAarg crash with empty record type variadic argllvmorg-15.0.6
Fix ARMABIInfo::EmitVAAarg crash with empty record type variadic arg
Open issue: https://github.com/llvm/llvm-project/issues/58794
Reviewed By: rjmccall
Differential Revision: https://reviews.llvm.org/D138137
(cherry picked from commit 80f444646c62ccc8b2399d60ac91e62e6e576da6)
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/CodeGen/arm-vaarg.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/clang/test/CodeGen/arm-vaarg.c b/clang/test/CodeGen/arm-vaarg.c new file mode 100644 index 0000000..4dab397 --- /dev/null +++ b/clang/test/CodeGen/arm-vaarg.c @@ -0,0 +1,23 @@ +// RUN: %clang -Xclang -no-opaque-pointers -mfloat-abi=soft -target arm-linux-gnu -emit-llvm -S -o - %s | FileCheck %s + +struct Empty {}; + +struct Empty emptyvar; + +void take_args(int a, ...) { +// CHECK: [[ALLOCA_VA_LIST:%[a-zA-Z0-9._]+]] = alloca %struct.__va_list, align 4 +// CHECK: call void @llvm.va_start +// CHECK-NEXT: [[AP_ADDR:%[a-zA-Z0-9._]+]] = bitcast %struct.__va_list* [[ALLOCA_VA_LIST]] to i8** +// CHECK-NEXT: [[LOAD_AP:%[a-zA-Z0-9._]+]] = load i8*, i8** [[AP_ADDR]], align 4 +// CHECK-NEXT: [[EMPTY_PTR:%[a-zA-Z0-9._]+]] = bitcast i8* [[LOAD_AP]] to %struct.Empty* + + // It's conceivable that EMPTY_PTR may not actually be a valid pointer + // (e.g. it's at the very bottom of the stack and the next page is + // invalid). This doesn't matter provided it's never loaded (there's no + // well-defined way to tell), but it becomes a problem if we do try to use it. +// CHECK-NOT: load %struct.Empty, %struct.Empty* [[EMPTY_PTR]] + __builtin_va_list l; + __builtin_va_start(l, a); + emptyvar = __builtin_va_arg(l, struct Empty); + __builtin_va_end(l); +} |