The attached patch addes the architecture method push_dummy_call() as a successor for the deprecated PUSH_ARGUMENTS(). PUSH_ARGUMENTS() is usedn when doing an inferior function call. The new method takes two additional parameters:
regcache:
An explict destination for all those register stores.
dummy_addr:
The address of the call dummy (which contains the return breakpoint) allowing the function to set the return address.
In addition to pushing the arguments, this new method is expected set both the struct return and return addresses, and return the final aligned top-of-stack address.
By requiring this, much of the convoluted and largely sparc centric logic that sits between the old PUSH_ARGUMENTS() and SAVE_DUMMY_FRAME_TOS() calls can be eliminated. This opening the possability of eliminating the methods:
PUSH_RETURN_ADDRESS()
CALL_DUMMY_STACK_ADJUST
STORE_STRUCT_RETURN
write_sp
(expect more deprecating patches).
I'll look to commit this in a few days (it could take a bit to digest this one).
Andrew
PS: Looking at the comments, this one has been on the cards for ~7 years.
2003-03-23 Andrew Cagney <cagney at redhat dot com>
* gdbarch.sh (DEPRECATED_PUSH_ARGUMENTS): Rename PUSH_ARGUMENTS.
(push_dummy_call): New pure multi-arch replacement with gdbarch,
regcache and dummy_addr parameters.
* gdbarch.h, gdbarch.c: Re-generate.
* valops.c (hand_function_call): Use gdbarch_push_dummy_call when
available; assume it will handle stack alignment and return
address issues. Fall back to DEPRECATED_PUSH_ARGUMENTS and
legacy_push_arguments.
(legacy_push_arguments): Rename default_push_arguments.
* value.h (legacy_push_arguments): Rename default_push_arguments.
* i386-tdep.c (i386_push_arguments): Call legacy_push_arguments.
* config/sparc/tm-sparc.h (DEPRECATED_PUSH_ARGUMENTS): Update.
* config/sparc/tm-sp64.h (DEPRECATED_PUSH_ARGUMENTS): Update.
* config/pa/tm-hppa.h (DEPRECATED_PUSH_ARGUMENTS): Update.
* config/i386/tm-symmetry.h: Update.
* xstormy16-tdep.c (xstormy16_gdbarch_init): Update.
* x86-64-tdep.c (x86_64_init_abi): Update.
* v850-tdep.c (v850_gdbarch_init): Update.
* sparc-tdep.c (sparc_gdbarch_init): Update.
* sh-tdep.c (sh_gdbarch_init): Update.
* s390-tdep.c (s390_gdbarch_init): Update.
* rs6000-tdep.c (rs6000_gdbarch_init): Update.
* mn10300-tdep.c (mn10300_gdbarch_init): Update.
* mips-tdep.c (mips_gdbarch_init): Update.
* mcore-tdep.c (mcore_gdbarch_init): Update.
* m68hc11-tdep.c (m68hc11_gdbarch_init): Update.
* ia64-tdep.c (ia64_gdbarch_init): Update.
* i386-tdep.c (i386_gdbarch_init): Update.
* hppa-tdep.c (hppa_gdbarch_init): Update.
* h8300-tdep.c (h8300_gdbarch_init): Update.
* frv-tdep.c (frv_gdbarch_init): Update.
* d10v-tdep.c (d10v_gdbarch_init): Update.
* cris-tdep.c (cris_gdbarch_init): Update.
* avr-tdep.c (avr_gdbarch_init): Update.
* arm-tdep.c (arm_gdbarch_init): Update.
* arm-linux-tdep.c (arm_linux_init_abi): Update.
* alpha-tdep.c (alpha_gdbarch_init): Update.
Index: doc/ChangeLog
2003-03-23 Andrew Cagney <cagney at redhat dot com>
* gdbint.texinfo (Target Architecture Definition): Replace
PUSH_ARGUMENTS with push_dummy_call, add gdbarch, regcache and
dummy_addr parameters.