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 | binutils-gdb-73021deb50855f31bb312241899a464c62155f6a.tar.gz |
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 b0515639378..7c5d74858d1 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; } |