diff options
author | Paul Gilliam <pgilliam@us.ibm.com> | 2005-11-07 20:37:58 +0000 |
---|---|---|
committer | Paul Gilliam <pgilliam@us.ibm.com> | 2005-11-07 20:37:58 +0000 |
commit | 3d8476bc1ba3a811fbc51dccd6a79adca193a197 (patch) | |
tree | d9b6235b9f48a561a33aeab378a1bb24d6f763d5 /gdb | |
parent | 8973a37d31b14d0b90cd0046c1091e0e578dd16d (diff) | |
download | gdb-3d8476bc1ba3a811fbc51dccd6a79adca193a197.zip gdb-3d8476bc1ba3a811fbc51dccd6a79adca193a197.tar.gz gdb-3d8476bc1ba3a811fbc51dccd6a79adca193a197.tar.bz2 |
2005-10-24 Paul Gilliam <pgilliam@us.ibm.com
* ppc-sysv-tdep.c (ppc64_sysv_abi_return_value): Copy code from
ppc_sysv_abi_return_value() to handle a vector return value.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/ppc-sysv-tdep.c | 43 |
2 files changed, 33 insertions, 15 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5446a2a..c596ed1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2005-11-07 Paul Gilliam <pgilliam@us.ibm.com + + * ppc-sysv-tdep.c (ppc64_sysv_abi_return_value): Copy code from + ppc_sysv_abi_return_value() to handle a vector return value. + 2005-11-07 Andrew Stubbs <andrew.stubbs@st.com> * main.h (return_child_result, return_child_result_value): Declare. diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c index 4285077..ea3b1c7 100644 --- a/gdb/ppc-sysv-tdep.c +++ b/gdb/ppc-sysv-tdep.c @@ -906,11 +906,11 @@ ppc64_sysv_abi_return_value (struct gdbarch *gdbarch, struct type *valtype, } return RETURN_VALUE_REGISTER_CONVENTION; } + /* Integers in r3. */ if ((TYPE_CODE (valtype) == TYPE_CODE_INT || TYPE_CODE (valtype) == TYPE_CODE_ENUM) && TYPE_LENGTH (valtype) <= 8) { - /* Integers in r3. */ if (writebuf != NULL) { /* Be careful to sign extend the value. */ @@ -938,24 +938,37 @@ ppc64_sysv_abi_return_value (struct gdbarch *gdbarch, struct type *valtype, regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 3, readbuf); return RETURN_VALUE_REGISTER_CONVENTION; } - if (TYPE_CODE (valtype) == TYPE_CODE_ARRAY - && TYPE_LENGTH (valtype) <= 8 - && TYPE_CODE (TYPE_TARGET_TYPE (valtype)) == TYPE_CODE_INT - && TYPE_LENGTH (TYPE_TARGET_TYPE (valtype)) == 1) + /* Array type has more than one use. */ + if (TYPE_CODE (valtype) == TYPE_CODE_ARRAY) { /* Small character arrays are returned, right justified, in r3. */ - int offset = (register_size (gdbarch, tdep->ppc_gp0_regnum + 3) - - TYPE_LENGTH (valtype)); - if (writebuf != NULL) - regcache_cooked_write_part (regcache, tdep->ppc_gp0_regnum + 3, - offset, TYPE_LENGTH (valtype), writebuf); - if (readbuf != NULL) - regcache_cooked_read_part (regcache, tdep->ppc_gp0_regnum + 3, - offset, TYPE_LENGTH (valtype), readbuf); - return RETURN_VALUE_REGISTER_CONVENTION; + if (TYPE_LENGTH (valtype) <= 8 + && TYPE_CODE (TYPE_TARGET_TYPE (valtype)) == TYPE_CODE_INT + && TYPE_LENGTH (TYPE_TARGET_TYPE (valtype)) == 1) + { + int offset = (register_size (gdbarch, tdep->ppc_gp0_regnum + 3) + - TYPE_LENGTH (valtype)); + if (writebuf != NULL) + regcache_cooked_write_part (regcache, tdep->ppc_gp0_regnum + 3, + offset, TYPE_LENGTH (valtype), writebuf); + if (readbuf != NULL) + regcache_cooked_read_part (regcache, tdep->ppc_gp0_regnum + 3, + offset, TYPE_LENGTH (valtype), readbuf); + return RETURN_VALUE_REGISTER_CONVENTION; + } + /* A VMX vector is returned in v2. */ + if (TYPE_CODE (valtype) == TYPE_CODE_ARRAY + && TYPE_VECTOR (valtype) && tdep->ppc_vr0_regnum >= 0) + { + if (readbuf) + regcache_cooked_read (regcache, tdep->ppc_vr0_regnum + 2, readbuf); + if (writebuf) + regcache_cooked_write (regcache, tdep->ppc_vr0_regnum + 2, writebuf); + return RETURN_VALUE_REGISTER_CONVENTION; + } } /* Big floating point values get stored in adjacent floating - point registers. */ + point registers, starting with F1. */ if (TYPE_CODE (valtype) == TYPE_CODE_FLT && (TYPE_LENGTH (valtype) == 16 || TYPE_LENGTH (valtype) == 32)) { |