OSDN Git Service

* i386-tdep.c (i386_extract_return_value): If the type of the
authorkettenis <kettenis>
Sat, 31 Mar 2001 13:05:14 +0000 (13:05 +0000)
committerkettenis <kettenis>
Sat, 31 Mar 2001 13:05:14 +0000 (13:05 +0000)
return value is TYPE_STRUCT and the number of fields is one, call
ourselves with TYPE set tp the type of the first field.
(i386_store_return_value): Likewise.
This fixes a problem with returning structs consisting of a single
`float' or `double' on *BSD.

gdb/ChangeLog
gdb/i386-tdep.c

index 0489c98..550af70 100644 (file)
@@ -1,3 +1,12 @@
+2001-03-31  Mark Kettenis  <kettenis@gnu.org>
+
+       * i386-tdep.c (i386_extract_return_value): If the type of the
+       return value is TYPE_STRUCT and the number of fields is one, call
+       ourselves with TYPE set tp the type of the first field.
+       (i386_store_return_value): Likewise.
+       This fixes a problem with returning structs consisting of a single
+       `float' or `double' on *BSD.
+
 2001-03-30  Mark Kettenis  <kettenis@gnu.org>
 
        * lin-lwp.c (lin_lwp_resume): Don't mark LWP as not stopped until
index a5d3ef7..db001da 100644 (file)
@@ -733,7 +733,12 @@ i386_extract_return_value (struct type *type, char *regbuf, char *valbuf)
 {
   int len = TYPE_LENGTH (type);
 
-  if (TYPE_CODE_FLT == TYPE_CODE (type))
+  if (TYPE_CODE (type) == TYPE_CODE_STRUCT
+      && TYPE_NFIELDS (type) == 1)
+    return i386_extract_return_value (TYPE_FIELD_TYPE (type, 0),
+                                     regbuf, valbuf);
+
+  if (TYPE_CODE (type) == TYPE_CODE_FLT)
     {
       if (NUM_FREGS == 0)
        {
@@ -791,7 +796,11 @@ i386_store_return_value (struct type *type, char *valbuf)
 {
   int len = TYPE_LENGTH (type);
 
-  if (TYPE_CODE_FLT == TYPE_CODE (type))
+  if (TYPE_CODE (type) == TYPE_CODE_STRUCT
+      && TYPE_NFIELDS (type) == 1)
+    return i386_store_return_value (TYPE_FIELD_TYPE (type, 0), valbuf);
+
+  if (TYPE_CODE (type) == TYPE_CODE_FLT)
     {
       if (NUM_FREGS == 0)
        {