* m68hc11-tdep.c (m68hc11_push_dummy_call): New function adapted

from m68hc11_push_arguments.
	(m68hc11_push_arguments): Remove.
	(m68hc11_push_return_address): Remove.
	(m68hc11_gdbarch_init): Install the above; remove above deprecated
	handlers; remove deprecated_extra_stack_alignment_needed.
This commit is contained in:
Stephane Carrez 2003-07-27 20:27:29 +00:00
parent 222e5d1d25
commit 3dc990bfb6
2 changed files with 47 additions and 50 deletions

View file

@ -1,3 +1,12 @@
2003-07-27 Stephane Carrez <stcarrez@nerim.fr>
* m68hc11-tdep.c (m68hc11_push_dummy_call): New function adapted
from m68hc11_push_arguments.
(m68hc11_push_arguments): Remove.
(m68hc11_push_return_address): Remove.
(m68hc11_gdbarch_init): Install the above; remove above deprecated
handlers; remove deprecated_extra_stack_alignment_needed.
2003-07-27 Andrew Cagney <cagney@redhat.com> 2003-07-27 Andrew Cagney <cagney@redhat.com>
* config/pa/tm-hppa.h (init_frame_pc_default): Declare. * config/pa/tm-hppa.h (init_frame_pc_default): Declare.

View file

@ -1094,28 +1094,26 @@ m68hc11_stack_align (CORE_ADDR addr)
} }
static CORE_ADDR static CORE_ADDR
m68hc11_push_arguments (int nargs, m68hc11_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
struct value **args, struct regcache *regcache, CORE_ADDR bp_addr,
CORE_ADDR sp, int nargs, struct value **args, CORE_ADDR sp,
int struct_return, int struct_return, CORE_ADDR struct_addr)
CORE_ADDR struct_addr)
{ {
int stack_alloc;
int argnum; int argnum;
int first_stack_argnum; int first_stack_argnum;
int stack_offset;
struct type *type; struct type *type;
char *val; char *val;
int len; int len;
char buf[2];
stack_alloc = 0;
first_stack_argnum = 0; first_stack_argnum = 0;
if (struct_return) if (struct_return)
{ {
/* The struct is allocated on the stack and gdb used the stack /* The struct is allocated on the stack and gdb used the stack
pointer for the address of that struct. We must apply the pointer for the address of that struct. We must apply the
stack offset on the address. */ stack offset on the address. */
write_register (HARD_D_REGNUM, struct_addr + STACK_CORRECTION); regcache_cooked_write_unsigned (regcache, HARD_D_REGNUM,
struct_addr + STACK_CORRECTION);
} }
else if (nargs > 0) else if (nargs > 0)
{ {
@ -1125,41 +1123,52 @@ m68hc11_push_arguments (int nargs,
/* First argument is passed in D and X registers. */ /* First argument is passed in D and X registers. */
if (len <= 4) if (len <= 4)
{ {
LONGEST v = extract_unsigned_integer (VALUE_CONTENTS (args[0]), len); ULONGEST v;
v = extract_unsigned_integer (VALUE_CONTENTS (args[0]), len);
first_stack_argnum = 1; first_stack_argnum = 1;
write_register (HARD_D_REGNUM, v);
regcache_cooked_write_unsigned (regcache, HARD_D_REGNUM, v);
if (len > 2) if (len > 2)
{ {
v >>= 16; v >>= 16;
write_register (HARD_X_REGNUM, v); regcache_cooked_write_unsigned (regcache, HARD_X_REGNUM, v);
} }
} }
} }
for (argnum = first_stack_argnum; argnum < nargs; argnum++)
{
type = VALUE_TYPE (args[argnum]);
stack_alloc += (TYPE_LENGTH (type) + 1) & -2;
}
sp -= stack_alloc;
stack_offset = STACK_CORRECTION; for (argnum = nargs - 1; argnum >= first_stack_argnum; argnum--)
for (argnum = first_stack_argnum; argnum < nargs; argnum++)
{ {
type = VALUE_TYPE (args[argnum]); type = VALUE_TYPE (args[argnum]);
len = TYPE_LENGTH (type); len = TYPE_LENGTH (type);
val = (char*) VALUE_CONTENTS (args[argnum]);
write_memory (sp + stack_offset, val, len);
stack_offset += len;
if (len & 1) if (len & 1)
{ {
static char zero = 0; static char zero = 0;
write_memory (sp + stack_offset, &zero, 1); sp--;
stack_offset++; write_memory (sp, &zero, 1);
} }
val = (char*) VALUE_CONTENTS (args[argnum]);
sp -= len;
write_memory (sp, val, len);
} }
return sp;
/* Store return address. */
sp -= 2;
store_unsigned_integer (buf, 2, bp_addr);
write_memory (sp, buf, 2);
/* Finally, update the stack pointer... */
sp -= STACK_CORRECTION;
regcache_cooked_write_unsigned (regcache, HARD_SP_REGNUM, sp);
/* ...and fake a frame pointer. */
regcache_cooked_write_unsigned (regcache, SOFT_FP_REGNUM, sp);
/* DWARF2/GCC uses the stack address *before* the function call as a
frame's CFA. */
return sp + 2;
} }
@ -1281,22 +1290,6 @@ m68hc11_extract_struct_value_address (struct regcache *regcache)
return extract_unsigned_integer (buf, M68HC11_REG_SIZE); return extract_unsigned_integer (buf, M68HC11_REG_SIZE);
} }
/* Function: push_return_address (pc)
Set up the return address for the inferior function call.
Needed for targets where we don't actually execute a JSR/BSR instruction */
static CORE_ADDR
m68hc11_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
{
char valbuf[2];
pc = CALL_DUMMY_ADDRESS ();
sp -= 2;
store_unsigned_integer (valbuf, 2, pc);
write_memory (sp + STACK_CORRECTION, valbuf, 2);
return sp;
}
/* Test whether the ELF symbol corresponds to a function using rtc or /* Test whether the ELF symbol corresponds to a function using rtc or
rti to return. */ rti to return. */
@ -1385,8 +1378,6 @@ static struct gdbarch *
m68hc11_gdbarch_init (struct gdbarch_info info, m68hc11_gdbarch_init (struct gdbarch_info info,
struct gdbarch_list *arches) struct gdbarch_list *arches)
{ {
static LONGEST m68hc11_call_dummy_words[] =
{0};
struct gdbarch *gdbarch; struct gdbarch *gdbarch;
struct gdbarch_tdep *tdep; struct gdbarch_tdep *tdep;
int elf_flags; int elf_flags;
@ -1482,12 +1473,10 @@ m68hc11_gdbarch_init (struct gdbarch_info info,
set_gdbarch_pseudo_register_read (gdbarch, m68hc11_pseudo_register_read); set_gdbarch_pseudo_register_read (gdbarch, m68hc11_pseudo_register_read);
set_gdbarch_pseudo_register_write (gdbarch, m68hc11_pseudo_register_write); set_gdbarch_pseudo_register_write (gdbarch, m68hc11_pseudo_register_write);
set_gdbarch_deprecated_call_dummy_words (gdbarch, m68hc11_call_dummy_words); set_gdbarch_push_dummy_call (gdbarch, m68hc11_push_dummy_call);
set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, sizeof (m68hc11_call_dummy_words));
set_gdbarch_deprecated_get_saved_register (gdbarch, deprecated_generic_get_saved_register); set_gdbarch_deprecated_get_saved_register (gdbarch, deprecated_generic_get_saved_register);
set_gdbarch_extract_return_value (gdbarch, m68hc11_extract_return_value); set_gdbarch_extract_return_value (gdbarch, m68hc11_extract_return_value);
set_gdbarch_deprecated_push_arguments (gdbarch, m68hc11_push_arguments);
set_gdbarch_deprecated_push_return_address (gdbarch, m68hc11_push_return_address);
set_gdbarch_return_value_on_stack (gdbarch, m68hc11_return_value_on_stack); set_gdbarch_return_value_on_stack (gdbarch, m68hc11_return_value_on_stack);
set_gdbarch_deprecated_store_struct_return (gdbarch, m68hc11_store_struct_return); set_gdbarch_deprecated_store_struct_return (gdbarch, m68hc11_store_struct_return);
@ -1513,7 +1502,6 @@ m68hc11_gdbarch_init (struct gdbarch_info info,
set_gdbarch_function_start_offset (gdbarch, 0); set_gdbarch_function_start_offset (gdbarch, 0);
set_gdbarch_breakpoint_from_pc (gdbarch, m68hc11_breakpoint_from_pc); set_gdbarch_breakpoint_from_pc (gdbarch, m68hc11_breakpoint_from_pc);
set_gdbarch_stack_align (gdbarch, m68hc11_stack_align); set_gdbarch_stack_align (gdbarch, m68hc11_stack_align);
set_gdbarch_deprecated_extra_stack_alignment_needed (gdbarch, 1);
set_gdbarch_print_insn (gdbarch, gdb_print_insn_m68hc11); set_gdbarch_print_insn (gdbarch, gdb_print_insn_m68hc11);
m68hc11_add_reggroups (gdbarch); m68hc11_add_reggroups (gdbarch);