* sparc64-tdep.c (sparc64_store_floating_fields): If TYPE is a

structure that has a single `float' member, store it in %f1 in
addition to %f0.
This commit is contained in:
Mark Kettenis 2004-01-03 20:46:30 +00:00
parent ac7b618e10
commit 200cc5539f
2 changed files with 19 additions and 0 deletions

View File

@ -1,5 +1,9 @@
2004-01-03 Mark Kettenis <kettenis@gnu.org>
* sparc64-tdep.c (sparc64_store_floating_fields): If TYPE is a
structure that has a single `float' member, store it in %f1 in
addition to %f0.
* sparc-sol2-nat.c: Add missing '\'.
* sparc-tdep.c (sparc32_return_value): New function.

View File

@ -668,6 +668,21 @@ sparc64_store_floating_fields (struct regcache *regcache, struct type *type,
sparc64_store_floating_fields (regcache, subtype, valbuf,
element, subpos);
}
/* GCC has an interesting bug. If TYPE is a structure that has
a single `float' member, GCC doesn't treat it as a structure
at all, but rather as an ordinary `float' argument. This
argument will be stored in %f1, as required by the psABI.
However, as a member of a structure the psABI requires it to
be stored in. To appease GCC, if a structure has only a
single `float' member, we store its value in %f1 too. */
if (TYPE_NFIELDS (type) == 1)
{
struct type *subtype = check_typedef (TYPE_FIELD_TYPE (type, 0));
if (sparc64_floating_p (subtype) && TYPE_LENGTH (subtype) == 4)
regcache_cooked_write (regcache, SPARC_F1_REGNUM, valbuf);
}
}
}