* i386-tdep.c (i386_reg_struct_return_p): Handle structures with a
authorMark Kettenis <kettenis@gnu.org>
Mon, 18 Jul 2005 12:40:13 +0000 (12:40 +0000)
committerMark Kettenis <kettenis@gnu.org>
Mon, 18 Jul 2005 12:40:13 +0000 (12:40 +0000)
single 'long double' member correctly.
(i386_return_value): Tweak comment.

gdb/ChangeLog
gdb/i386-tdep.c

index 4f617785e53a5192184d11dd2ef8925827aa66f3..b200e701170a66d9ceb0e327b562869ea7d143ed 100644 (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>
 
        * mi/gdb-mi.el:  Update for changes in Emacs 22.0.50.  Bring more
index 40739a093d076f266fbf665cee34f583abede7ad..7c047870b3dded89e522ec830a4355caac40c4e8 100644 (file)
@@ -1427,6 +1427,15 @@ i386_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type)
          && tdep->struct_return == pcc_struct_return))
     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);
 }
 
@@ -1469,11 +1478,12 @@ i386_return_value (struct gdbarch *gdbarch, struct type *type,
     }
 
   /* This special case is for structures consisting of a single
-     `float' or `double' member.  These structures are returned in
-     %st(0).  For these structures, we call ourselves recursively,
-     changing TYPE into the type of the first member of the structure.
-     Since that should work for all structures that have only one
-     member, we don't bother to check the member's type here.  */
+     `float', `double' or 'long double' member.  These structures are
+     returned in %st(0).  For these structures, we call ourselves
+     recursively, changing TYPE into the type of the first member of
+     the structure.  Since that should work for all structures that
+     have only one member, we don't bother to check the member's type
+     here.  */
   if (code == TYPE_CODE_STRUCT && TYPE_NFIELDS (type) == 1)
     {
       type = check_typedef (TYPE_FIELD_TYPE (type, 0));