* rs6000-tdep.c (rs6000_store_return_value): Use

regcache_cooked_write_part instead of
deprecated_write_register_bytes.
(rs6000_gdbarch_init): Register it for gdbarch_store_return_value,
not gdbarch_deprecated_store_return_value.
This commit is contained in:
Jim Blandy 2004-06-05 00:11:49 +00:00
parent 23cadb2867
commit a3c001cee0
2 changed files with 36 additions and 14 deletions

View File

@ -1,5 +1,11 @@
2004-06-04 Jim Blandy <jimb@redhat.com>
* rs6000-tdep.c (rs6000_store_return_value): Use
regcache_cooked_write_part instead of
deprecated_write_register_bytes.
(rs6000_gdbarch_init): Register it for gdbarch_store_return_value,
not gdbarch_deprecated_store_return_value.
* ppc-linux-nat.c (store_register, fetch_register): Remove
incorrect assertions. Simplify and generalize handling of
transfers whose sizes are not multiples of, or less than, sizeof

View File

@ -1894,38 +1894,54 @@ rs6000_dwarf2_reg_to_regnum (int num)
static void
rs6000_store_return_value (struct type *type, char *valbuf)
rs6000_store_return_value (struct type *type,
struct regcache *regcache,
const void *valbuf)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
struct gdbarch *gdbarch = get_regcache_arch (regcache);
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
int regnum = -1;
/* The calling convention this function implements assumes the
processor has floating-point registers. We shouldn't be using it
on PPC variants that lack them. */
gdb_assert (ppc_floating_point_unit_p (current_gdbarch));
gdb_assert (ppc_floating_point_unit_p (gdbarch));
if (TYPE_CODE (type) == TYPE_CODE_FLT)
/* Floating point values are returned starting from FPR1 and up.
Say a double_double_double type could be returned in
FPR1/FPR2/FPR3 triple. */
deprecated_write_register_bytes
(DEPRECATED_REGISTER_BYTE (tdep->ppc_fp0_regnum + 1),
valbuf,
TYPE_LENGTH (type));
regnum = tdep->ppc_fp0_regnum + 1;
else if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
{
if (TYPE_LENGTH (type) == 16
&& TYPE_VECTOR (type))
deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (tdep->ppc_vr0_regnum + 2),
valbuf, TYPE_LENGTH (type));
regnum = tdep->ppc_vr0_regnum + 2;
else
gdb_assert (0);
}
else
/* Everything else is returned in GPR3 and up. */
deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (gdbarch_tdep (current_gdbarch)->ppc_gp0_regnum + 3),
valbuf, TYPE_LENGTH (type));
regnum = tdep->ppc_gp0_regnum + 3;
{
size_t bytes_written = 0;
while (bytes_written < TYPE_LENGTH (type))
{
/* How much of this value can we write to this register? */
size_t bytes_to_write = min (TYPE_LENGTH (type) - bytes_written,
register_size (gdbarch, regnum));
regcache_cooked_write_part (regcache, regnum,
0, bytes_to_write,
(char *) valbuf + bytes_written);
regnum++;
bytes_written += bytes_to_write;
}
}
}
/* Extract from an array REGBUF containing the (raw) register state
the address in which a function should return its structure value,
as a CORE_ADDR (or an expression that can be used as one). */
@ -2885,7 +2901,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
else
{
set_gdbarch_deprecated_extract_return_value (gdbarch, rs6000_extract_return_value);
set_gdbarch_deprecated_store_return_value (gdbarch, rs6000_store_return_value);
set_gdbarch_store_return_value (gdbarch, rs6000_store_return_value);
}
/* Set lr_frame_offset. */