forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[CodeGen][ARM] Fix ARMABIInfo::EmitVAAarg crash with empty record typ…
…e variadic arg Fix ARMABIInfo::EmitVAAarg crash with empty record type variadic arg Open issue: llvm#58794 Reviewed By: rjmccall Differential Revision: https://reviews.llvm.org/D138137 (cherry picked from commit 80f4446)
- Loading branch information
Showing
2 changed files
with
27 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} |