From: Andrew Cagney Date: Thu, 11 Sep 2003 19:27:25 +0000 (+0000) Subject: 2003-09-11 Andrew Cagney X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=33a7c2fc4d40cc53f649c9bbb3780826dd56fe1b;p=binutils-gdb.git 2003-09-11 Andrew Cagney * rs6000-tdep.c (rs6000_push_dummy_call): Use regcache_raw_write_signed to set SP_REGNUM, move the operation to near the function's end. (rs6000_gdbarch_init): Do not set "deprecated_dummy_write_sp". * ppc-sysv-tdep.c (ppc_sysv_abi_push_dummy_call): Use regcache_raw_write_signed to set SP_REGNUM. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 56898d19b99..642ec3a67cb 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2003-09-11 Andrew Cagney + + * rs6000-tdep.c (rs6000_push_dummy_call): Use + regcache_raw_write_signed to set SP_REGNUM, move the operation to + near the function's end. + (rs6000_gdbarch_init): Do not set "deprecated_dummy_write_sp". + * ppc-sysv-tdep.c (ppc_sysv_abi_push_dummy_call): Use + regcache_raw_write_signed to set SP_REGNUM. + 2003-09-11 Elena Zannoni * symfile.c (symbol_file_add_with_addrs_or_offsets): Make sure diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c index 954800770ef..2f13e2981c6 100644 --- a/gdb/ppc-sysv-tdep.c +++ b/gdb/ppc-sysv-tdep.c @@ -189,8 +189,8 @@ ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr, /* Make sure that we maintain 16 byte alignment */ sp &= ~0x0f; - /* Update %sp before proceeding any further */ - write_register (SP_REGNUM, sp); + /* Update %sp before proceeding any further. */ + regcache_raw_write_signed (regcache, SP_REGNUM, sp); /* write the backchain */ store_unsigned_integer (old_sp_buf, 4, saved_sp); diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index abed029e072..6d348db8480 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -1246,14 +1246,6 @@ ran_out_of_registers_for_arguments: space = (space + 15) & -16; sp -= space; - /* This is another instance we need to be concerned about - securing our stack space. If we write anything underneath %sp - (r1), we might conflict with the kernel who thinks he is free - to use this area. So, update %sp first before doing anything - else. */ - - write_register (SP_REGNUM, sp); - /* If the last argument copied into the registers didn't fit there completely, push the rest of it into stack. */ @@ -1294,14 +1286,17 @@ ran_out_of_registers_for_arguments: ii += ((len + 3) & -4) / 4; } } - else - /* Secure stack areas first, before doing anything else. */ - write_register (SP_REGNUM, sp); /* set back chain properly */ store_unsigned_integer (tmp_buffer, 4, saved_sp); write_memory (sp, tmp_buffer, 4); + /* Set the stack pointer. According to the ABI, the SP is ment to + be set _before_ the corresponding stack space is used. No need + for that here though - the target has been completly stopped - it + isn't possible for an exception handler to stomp on the stack. */ + regcache_raw_write_signed (regcache, SP_REGNUM, sp); + /* Point the inferior function call's return address at the dummy's breakpoint. */ regcache_raw_write_signed (regcache, tdep->ppc_lr_regnum, bp_addr); @@ -2896,7 +2891,6 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_print_insn (gdbarch, gdb_print_insn_powerpc); set_gdbarch_write_pc (gdbarch, generic_target_write_pc); - set_gdbarch_deprecated_dummy_write_sp (gdbarch, deprecated_write_sp); set_gdbarch_num_regs (gdbarch, v->nregs); set_gdbarch_num_pseudo_regs (gdbarch, v->npregs);