* i386-tdep.c (i386_reg_struct_return_p): Handle structures with a

single 'long double' member correctly.
(i386_return_value): Tweak comment.
This commit is contained in:
Mark Kettenis
2005-07-18 12:40:13 +00:00
parent 6bdae935ab
commit 9edde48e00
2 changed files with 21 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2005-07-18 Mark Kettenis <kettenis@gnu.org>
* i386-tdep.c (i386_reg_struct_return_p): Handle structures with a
single 'long double' member correctly.
(i386_return_value): Tweak comment.
2005-07-16 Nick Roberts <nickrob@snap.net.nz> 2005-07-16 Nick Roberts <nickrob@snap.net.nz>
* mi/gdb-mi.el: Update for changes in Emacs 22.0.50. Bring more * mi/gdb-mi.el: Update for changes in Emacs 22.0.50. Bring more

View File

@ -1427,6 +1427,15 @@ i386_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type)
&& tdep->struct_return == pcc_struct_return)) && tdep->struct_return == pcc_struct_return))
return 0; return 0;
/* Structures consisting of a single `float', `double' or 'long
double' member are returned in %st(0). */
if (code == TYPE_CODE_STRUCT && TYPE_NFIELDS (type) == 1)
{
type = check_typedef (TYPE_FIELD_TYPE (type, 0));
if (TYPE_CODE (type) == TYPE_CODE_FLT)
return (len == 4 || len == 8 || len == 12);
}
return (len == 1 || len == 2 || len == 4 || len == 8); return (len == 1 || len == 2 || len == 4 || len == 8);
} }
@ -1469,11 +1478,12 @@ i386_return_value (struct gdbarch *gdbarch, struct type *type,
} }
/* This special case is for structures consisting of a single /* This special case is for structures consisting of a single
`float' or `double' member. These structures are returned in `float', `double' or 'long double' member. These structures are
%st(0). For these structures, we call ourselves recursively, returned in %st(0). For these structures, we call ourselves
changing TYPE into the type of the first member of the structure. recursively, changing TYPE into the type of the first member of
Since that should work for all structures that have only one the structure. Since that should work for all structures that
member, we don't bother to check the member's type here. */ have only one member, we don't bother to check the member's type
here. */
if (code == TYPE_CODE_STRUCT && TYPE_NFIELDS (type) == 1) if (code == TYPE_CODE_STRUCT && TYPE_NFIELDS (type) == 1)
{ {
type = check_typedef (TYPE_FIELD_TYPE (type, 0)); type = check_typedef (TYPE_FIELD_TYPE (type, 0));