Fix passing of struct with bitfields on x86-64

Commit 4aa866af ("Fix AMD64 return value ABI in expression
evaluation") introduced a regression when calling a function with a
structure that contains bitfields.

Because the caller of amd64_has_unaligned_fields handles bitfields
already, it seemed to me that the simplest fix was to ignore bitfields
here.

gdb/ChangeLog
2019-04-24  Tom Tromey  <tromey@adacore.com>

	* amd64-tdep.c (amd64_has_unaligned_fields): Ignore bitfields.

gdb/testsuite/ChangeLog
2019-04-24  Tom Tromey  <tromey@adacore.com>

	* gdb.arch/amd64-eval.exp: Test bitfield return.
	* gdb.arch/amd64-eval.cc (struct Bitfields): New.
	(class Foo) <return_bitfields>: New method.
	(main): Call it.
This commit is contained in:
Tom Tromey
2019-04-16 11:11:10 -06:00
parent 1b8dd64326
commit a59240a41a
5 changed files with 37 additions and 4 deletions

View File

@ -555,11 +555,13 @@ amd64_has_unaligned_fields (struct type *type)
int bitpos = TYPE_FIELD_BITPOS (type, i);
int align = type_align(subtype);
/* Ignore static fields, or empty fields, for example nested
empty structures. */
/* Ignore static fields, empty fields (for example nested
empty structures), and bitfields (these are handled by
the caller). */
if (field_is_static (&TYPE_FIELD (type, i))
|| (TYPE_FIELD_BITSIZE (type, i) == 0
&& TYPE_LENGTH (subtype) == 0))
&& TYPE_LENGTH (subtype) == 0)
|| TYPE_FIELD_PACKED (type, i))
continue;
if (bitpos % 8 != 0)
@ -569,7 +571,7 @@ amd64_has_unaligned_fields (struct type *type)
if (bytepos % align != 0)
return true;
if (amd64_has_unaligned_fields(subtype))
if (amd64_has_unaligned_fields (subtype))
return true;
}
}