2007-03-15 Andreas Schwab * 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,