diff options
author | Alan Hayward <alan.hayward@arm.com> | 2019-01-21 15:51:49 +0000 |
---|---|---|
committer | Alan Hayward <alan.hayward@arm.com> | 2019-01-21 15:51:49 +0000 |
commit | 73021deb50855f31bb312241899a464c62155f6a (patch) | |
tree | 244743e4b0361fb6426946c1dfe9567a1ec64f53 /gdb/aarch64-tdep.c | |
parent | a6c9b4042921847ee52003811383e4b8bf5d5875 (diff) | |
download | fsf-binutils-gdb-73021deb50855f31bb312241899a464c62155f6a.zip fsf-binutils-gdb-73021deb50855f31bb312241899a464c62155f6a.tar.gz fsf-binutils-gdb-73021deb50855f31bb312241899a464c62155f6a.tar.bz2 |
AArch64 AAPCS: Empty structs have non zero size in C++
When gdb.base/infcall-nested-structs.c is complied as C++, the compiler
will not pass structs containing empty structs via float arguments.
This is because structs in C++ have a minimum size of 1, causing padding
in the struct once compiled. The AAPCS does not allow structs with
padding to be passed in float arguments.
Add padding checks to AArch64 and add C++ compile variant to the test.
Some of the tests fail on X86_64. This has been raised as bug gdb/24104.
gdb/ChangeLog:
* aarch64-tdep.c (aapcs_is_vfp_call_or_return_candidate_1): Check
for padding.
gdb/testsuite/ChangeLog:
* gdb.base/infcall-nested-structs.exp: Test C++ in addition to C.
Diffstat (limited to 'gdb/aarch64-tdep.c')
-rw-r--r-- | gdb/aarch64-tdep.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index b051563..7c5d748 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -1232,6 +1232,14 @@ aapcs_is_vfp_call_or_return_candidate_1 (struct type *type, return -1; count += sub_count; } + + /* Ensure there is no padding between the fields (allowing for empty + zero length structs) */ + int ftype_length = (*fundamental_type == nullptr) + ? 0 : TYPE_LENGTH (*fundamental_type); + if (count * ftype_length != TYPE_LENGTH (type)) + return -1; + return count; } |