* i386-tdep.c (i386_reg_struct_return_p): Allow array types as well.

(i386_return_value): Add handling for functions that return array
        types.
This commit is contained in:
Joel Brobecker
2005-10-10 01:08:07 +00:00
parent fd1b946ec5
commit 0e4377e151
2 changed files with 21 additions and 5 deletions

View File

@ -1,3 +1,9 @@
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> 2005-10-09 Joel Brobecker <brobecker@adacore.com>
* ada-valprint.c (print_optional_low_bound): Handle properly * ada-valprint.c (print_optional_low_bound): Handle properly

View File

@ -1424,9 +1424,9 @@ static const char *valid_conventions[] =
}; };
static const char *struct_convention = default_struct_convention; static const char *struct_convention = default_struct_convention;
/* Return non-zero if TYPE, which is assumed to be a structure or /* Return non-zero if TYPE, which is assumed to be a structure,
union type, should be returned in registers for architecture a union type, or an array type, should be returned in registers
GDBARCH. */ for architecture GDBARCH. */
static int static int
i386_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type) 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); enum type_code code = TYPE_CODE (type);
int len = TYPE_LENGTH (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 if (struct_convention == pcc_struct_convention
|| (struct_convention == default_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); 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)) && !i386_reg_struct_return_p (gdbarch, type))
{ {
/* The System V ABI says that: /* 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 So the ABI guarantees that we can always find the return
value just after the function has returned. */ 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) if (readbuf)
{ {
ULONGEST addr; ULONGEST addr;