diff options
Diffstat (limited to 'gdb/rs6000-tdep.c')
-rw-r--r-- | gdb/rs6000-tdep.c | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index 36741c5..37988a3 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -1478,14 +1478,11 @@ rs6000_push_dummy_call (struct gdbarch *gdbarch, struct value *function, There are 13 fpr's reserved for passing parameters. At this point there is no way we would run out of them. */ - if (len > 8) - printf_unfiltered ("Fatal Error: a floating point parameter " - "#%d with a size > 8 is found!\n", argno); - - memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE - (tdep->ppc_fp0_regnum + 1 + f_argno)], - VALUE_CONTENTS (arg), - len); + gdb_assert (len <= 8); + + regcache_cooked_write (regcache, + tdep->ppc_fp0_regnum + 1 + f_argno, + VALUE_CONTENTS (arg)); ++f_argno; } @@ -1495,12 +1492,15 @@ rs6000_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* Argument takes more than one register. */ while (argbytes < len) { - memset (&deprecated_registers[DEPRECATED_REGISTER_BYTE (ii + 3)], 0, - reg_size); - memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (ii + 3)], + char word[MAX_REGISTER_SIZE]; + memset (word, 0, reg_size); + memcpy (word, ((char *) VALUE_CONTENTS (arg)) + argbytes, (len - argbytes) > reg_size ? reg_size : len - argbytes); + regcache_cooked_write (regcache, + tdep->ppc_gp0_regnum + 3 + ii, + word); ++ii, argbytes += reg_size; if (ii >= 8) @@ -1513,9 +1513,11 @@ rs6000_push_dummy_call (struct gdbarch *gdbarch, struct value *function, { /* Argument can fit in one register. No problem. */ int adj = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? reg_size - len : 0; - memset (&deprecated_registers[DEPRECATED_REGISTER_BYTE (ii + 3)], 0, reg_size); - memcpy ((char *)&deprecated_registers[DEPRECATED_REGISTER_BYTE (ii + 3)] + adj, - VALUE_CONTENTS (arg), len); + char word[MAX_REGISTER_SIZE]; + + memset (word, 0, reg_size); + memcpy (word, VALUE_CONTENTS (arg), len); + regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 3 +ii, word); } ++argno; } @@ -1592,15 +1594,11 @@ ran_out_of_registers_for_arguments: if (TYPE_CODE (type) == TYPE_CODE_FLT && f_argno < 13) { - if (len > 8) - printf_unfiltered ("Fatal Error: a floating point parameter" - " #%d with a size > 8 is found!\n", argno); + gdb_assert (len <= 8); - memcpy (&(deprecated_registers - [DEPRECATED_REGISTER_BYTE - (tdep->ppc_fp0_regnum + 1 + f_argno)]), - VALUE_CONTENTS (arg), - len); + regcache_cooked_write (regcache, + tdep->ppc_fp0_regnum + 1 + f_argno, + VALUE_CONTENTS (arg)); ++f_argno; } |