* 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:
parent
ac7b618e10
commit
200cc5539f
2 changed files with 19 additions and 0 deletions
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue