* sparc64-tdep.c (sparc64_store_floating_fields): If TYPE is a
authorMark Kettenis <kettenis@gnu.org>
Sat, 3 Jan 2004 20:46:30 +0000 (20:46 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sat, 3 Jan 2004 20:46:30 +0000 (20:46 +0000)
structure that has a single `float' member, store it in %f1 in
addition to %f0.

gdb/ChangeLog
gdb/sparc64-tdep.c

index 9ffebe8..65db16f 100644 (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.
index 1e06ea5..bf3aeca 100644 (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);
+       }
     }
 }