gdb/ * ppc-sysv-tdep.c (do_ppc_sysv_return_value): Handle return small struct whose size is not 4 or 8. --- gdb/ppc-sysv-tdep.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c index afe3bd2..48afc7a 100644 --- a/gdb/ppc-sysv-tdep.c +++ b/gdb/ppc-sysv-tdep.c @@ -795,12 +795,18 @@ do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct value *function, /* The value is right-padded to 8 bytes and then loaded, as two "words", into r3/r4. */ gdb_byte regvals[MAX_REGISTER_SIZE * 2]; + int offset = (2 * tdep->wordsize - TYPE_LENGTH (type)) % tdep->wordsize; + regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 3, regvals + 0 * tdep->wordsize); if (TYPE_LENGTH (type) > tdep->wordsize) regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 4, regvals + 1 * tdep->wordsize); - memcpy (readbuf, regvals, TYPE_LENGTH (type)); + + if (byte_order == BFD_ENDIAN_BIG) + memcpy (readbuf, regvals + offset, TYPE_LENGTH (type)); + else + memcpy (readbuf, regvals, TYPE_LENGTH (type)); } if (writebuf) { @@ -808,8 +814,14 @@ do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct value *function, /* The value is padded out to 8 bytes and then loaded, as two "words" into r3/r4. */ gdb_byte regvals[MAX_REGISTER_SIZE * 2]; + int offset = (2 * tdep->wordsize - TYPE_LENGTH (type)) % tdep->wordsize; + memset (regvals, 0, sizeof regvals); - memcpy (regvals, writebuf, TYPE_LENGTH (type)); + if (byte_order == BFD_ENDIAN_BIG) + memcpy (regvals + offset, writebuf, TYPE_LENGTH (type)); + else + memcpy (regvals, writebuf, TYPE_LENGTH (type)); + regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 3, regvals + 0 * tdep->wordsize); if (TYPE_LENGTH (type) > tdep->wordsize) -- 1.7.0.4