* i386-tdep.c (i386_reg_struct_return_p): Allow array types as well.
authorJoel Brobecker <brobecker@gnat.com>
Mon, 10 Oct 2005 01:08:07 +0000 (01:08 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Mon, 10 Oct 2005 01:08:07 +0000 (01:08 +0000)
        (i386_return_value): Add handling for functions that return array
        types.

gdb/ChangeLog
gdb/i386-tdep.c

index 666fd79..13a0717 100644 (file)
@@ -1,5 +1,11 @@
 2005-10-09  Joel Brobecker  <brobecker@adacore.com>
 
+       * i386-tdep.c (i386_reg_struct_return_p): Allow array types as well.
+       (i386_return_value): Add handling for functions that return array
+       types.
+
+2005-10-09  Joel Brobecker  <brobecker@adacore.com>
+
        * ada-valprint.c (print_optional_low_bound): Handle properly
        cases where the array index type is a TYPE_CODE_RANGE.
 
index b060a22..c4016a8 100644 (file)
@@ -1424,9 +1424,9 @@ static const char *valid_conventions[] =
 };
 static const char *struct_convention = default_struct_convention;
 
-/* Return non-zero if TYPE, which is assumed to be a structure or
-   union type, should be returned in registers for architecture
-   GDBARCH.  */
+/* Return non-zero if TYPE, which is assumed to be a structure,
+   a union type, or an array type, should be returned in registers
+   for architecture GDBARCH.  */
 
 static int
 i386_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type)
@@ -1435,7 +1435,9 @@ i386_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type)
   enum type_code code = TYPE_CODE (type);
   int len = TYPE_LENGTH (type);
 
-  gdb_assert (code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION);
+  gdb_assert (code == TYPE_CODE_STRUCT
+              || code == TYPE_CODE_UNION
+              || code == TYPE_CODE_ARRAY);
 
   if (struct_convention == pcc_struct_convention
       || (struct_convention == default_struct_convention
@@ -1467,7 +1469,9 @@ i386_return_value (struct gdbarch *gdbarch, struct type *type,
 {
   enum type_code code = TYPE_CODE (type);
 
-  if ((code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION)
+  if ((code == TYPE_CODE_STRUCT
+       || code == TYPE_CODE_UNION
+       || code == TYPE_CODE_ARRAY)
       && !i386_reg_struct_return_p (gdbarch, type))
     {
       /* The System V ABI says that:
@@ -1481,6 +1485,12 @@ i386_return_value (struct gdbarch *gdbarch, struct type *type,
         So the ABI guarantees that we can always find the return
         value just after the function has returned.  */
 
+      /* Note that the ABI doesn't mention functions returning arrays,
+         which is something possible in certain languages such as Ada.
+         In this case, the value is returned as if it was wrapped in
+         a record, so the convention applied to records also applies
+         to arrays.  */
+
       if (readbuf)
        {
          ULONGEST addr;