61 lines
2.2 KiB
Diff
61 lines
2.2 KiB
Diff
2007-03-15 Andreas Schwab <schwab@suse.de>
|
|
|
|
* ppc-linux-tdep.c (ppc_linux_return_value): Vectors are returned
|
|
in general registers.
|
|
|
|
--- gdb/ppc-linux-tdep.c
|
|
+++ gdb/ppc-linux-tdep.c
|
|
@@ -484,17 +484,47 @@
|
|
/* For historic reasons, PPC 32 GNU/Linux follows PowerOpen rather
|
|
than the 32 bit SYSV R4 ABI structure return convention - all
|
|
structures, no matter their size, are put in memory. Vectors,
|
|
- which were added later, do get returned in a register though. */
|
|
+ which were added later, do get returned in a register, although
|
|
+ not in an AltiVec register. */
|
|
|
|
static enum return_value_convention
|
|
ppc_linux_return_value (struct gdbarch *gdbarch, struct type *valtype,
|
|
struct regcache *regcache, gdb_byte *readbuf,
|
|
const gdb_byte *writebuf)
|
|
{
|
|
- if ((TYPE_CODE (valtype) == TYPE_CODE_STRUCT
|
|
- || TYPE_CODE (valtype) == TYPE_CODE_UNION)
|
|
- && !((TYPE_LENGTH (valtype) == 16 || TYPE_LENGTH (valtype) == 8)
|
|
- && TYPE_VECTOR (valtype)))
|
|
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
+
|
|
+ if (TYPE_LENGTH (valtype) == 16
|
|
+ && TYPE_CODE (valtype) == TYPE_CODE_ARRAY
|
|
+ && TYPE_VECTOR (valtype))
|
|
+ {
|
|
+ /* Return value is in r3-r6. */
|
|
+ if (readbuf)
|
|
+ {
|
|
+ regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 3,
|
|
+ readbuf + 0);
|
|
+ regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 4,
|
|
+ readbuf + 4);
|
|
+ regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 5,
|
|
+ readbuf + 8);
|
|
+ regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 6,
|
|
+ readbuf + 12);
|
|
+ }
|
|
+ if (writebuf)
|
|
+ {
|
|
+ regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 3,
|
|
+ writebuf + 0);
|
|
+ regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 4,
|
|
+ writebuf + 4);
|
|
+ regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 5,
|
|
+ writebuf + 8);
|
|
+ regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 6,
|
|
+ writebuf + 12);
|
|
+ }
|
|
+ return RETURN_VALUE_REGISTER_CONVENTION;
|
|
+ }
|
|
+ else if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
|
|
+ || TYPE_CODE (valtype) == TYPE_CODE_UNION)
|
|
return RETURN_VALUE_STRUCT_CONVENTION;
|
|
else
|
|
return ppc_sysv_abi_return_value (gdbarch, valtype, regcache, readbuf,
|