From: Joel Brobecker Date: Mon, 10 Oct 2005 01:08:07 +0000 (+0000) Subject: * i386-tdep.c (i386_reg_struct_return_p): Allow array types as well. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0e4377e151dc56be7e941e52ebfda65f78da581c;p=binutils-gdb.git * i386-tdep.c (i386_reg_struct_return_p): Allow array types as well. (i386_return_value): Add handling for functions that return array types. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 666fd793c37..13a07170ef3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2005-10-09 Joel Brobecker + + * 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 * ada-valprint.c (print_optional_low_bound): Handle properly diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index b060a2250bd..c4016a8a575 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -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;