aboutsummaryrefslogtreecommitdiff
path: root/gdb/mn10300-tdep.c
diff options
context:
space:
mode:
authorJim Blandy <jimb@codesourcery.com>2001-05-09 02:22:35 +0000
committerJim Blandy <jimb@codesourcery.com>2001-05-09 02:22:35 +0000
commitee9f9641e044af38cd83b957504141a2d558bfa8 (patch)
tree19489288acfa7215d8cb6a7176869fc32d108f45 /gdb/mn10300-tdep.c
parent2ac51b362bd65205d1fa119ca6b8f372a6b0aeee (diff)
downloadgdb-ee9f9641e044af38cd83b957504141a2d558bfa8.zip
gdb-ee9f9641e044af38cd83b957504141a2d558bfa8.tar.gz
gdb-ee9f9641e044af38cd83b957504141a2d558bfa8.tar.bz2
* mn10300-tdep.c (mn10300_pop_frame): Split the mn10300-specific
stuff out into mn10300_pop_frame_regular, and use generic_pop_current_frame. This lets us share code, and also makes this function's prototype match that expected by gdbarch. Make this function static. (mn10300_pop_frame_regular): New function. (mn10300_gdbarch_init): Register mn10300_pop_frame as the gdbarch's pop_frame method. * config/mn10300/tm-mn10300.h (POP_FRAME): Delete definition. (mn10300_pop_frame): Delete declaration.
Diffstat (limited to 'gdb/mn10300-tdep.c')
-rw-r--r--gdb/mn10300-tdep.c54
1 files changed, 29 insertions, 25 deletions
diff --git a/gdb/mn10300-tdep.c b/gdb/mn10300-tdep.c
index 7fad2e2..49dcf05 100644
--- a/gdb/mn10300-tdep.c
+++ b/gdb/mn10300-tdep.c
@@ -592,38 +592,41 @@ mn10300_skip_prologue (CORE_ADDR pc)
return mn10300_analyze_prologue (NULL, pc);
}
-
-/* Function: pop_frame
- This routine gets called when either the user uses the `return'
- command, or the call dummy breakpoint gets hit. */
-
-void
-mn10300_pop_frame (struct frame_info *frame)
+/* generic_pop_current_frame calls this function if the current
+ frame isn't a dummy frame. */
+static void
+mn10300_pop_frame_regular (struct frame_info *frame)
{
int regnum;
- if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
- generic_pop_dummy_frame ();
- else
- {
- write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
+ write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
- /* Restore any saved registers. */
- for (regnum = 0; regnum < NUM_REGS; regnum++)
- if (frame->saved_regs[regnum] != 0)
- {
- ULONGEST value;
+ /* Restore any saved registers. */
+ for (regnum = 0; regnum < NUM_REGS; regnum++)
+ if (frame->saved_regs[regnum] != 0)
+ {
+ ULONGEST value;
- value = read_memory_unsigned_integer (frame->saved_regs[regnum],
- REGISTER_RAW_SIZE (regnum));
- write_register (regnum, value);
- }
+ value = read_memory_unsigned_integer (frame->saved_regs[regnum],
+ REGISTER_RAW_SIZE (regnum));
+ write_register (regnum, value);
+ }
- /* Actually cut back the stack. */
- write_register (SP_REGNUM, FRAME_FP (frame));
+ /* Actually cut back the stack. */
+ write_register (SP_REGNUM, FRAME_FP (frame));
- /* Don't we need to set the PC?!? XXX FIXME. */
- }
+ /* Don't we need to set the PC?!? XXX FIXME. */
+}
+
+/* Function: pop_frame
+ This routine gets called when either the user uses the `return'
+ command, or the call dummy breakpoint gets hit. */
+static void
+mn10300_pop_frame (void)
+{
+ /* This function checks for and handles generic dummy frames, and
+ calls back to our function for ordinary frames. */
+ generic_pop_current_frame (mn10300_pop_frame_regular);
/* Throw away any cached frame information. */
flush_cached_frames ();
@@ -1025,6 +1028,7 @@ mn10300_gdbarch_init (struct gdbarch_info info,
(gdbarch, mn10300_extract_struct_value_address);
set_gdbarch_store_return_value (gdbarch, mn10300_store_return_value);
set_gdbarch_store_struct_return (gdbarch, mn10300_store_struct_return);
+ set_gdbarch_pop_frame (gdbarch, mn10300_pop_frame);
set_gdbarch_skip_prologue (gdbarch, mn10300_skip_prologue);
set_gdbarch_frame_args_skip (gdbarch, 0);
set_gdbarch_frame_args_address (gdbarch, default_frame_address);