diff options
author | Jim Blandy <jimb@codesourcery.com> | 2001-11-13 17:38:49 +0000 |
---|---|---|
committer | Jim Blandy <jimb@codesourcery.com> | 2001-11-13 17:38:49 +0000 |
commit | 4c8287ac0c35ad2f431dd694fd0305dbf697dc7e (patch) | |
tree | 2388eaad3c41311a1be14eb440395c6dc38bc441 | |
parent | 0adb2abaa621ef0ef840d2a5605e3fb76dc1770c (diff) | |
download | gdb-4c8287ac0c35ad2f431dd694fd0305dbf697dc7e.zip gdb-4c8287ac0c35ad2f431dd694fd0305dbf697dc7e.tar.gz gdb-4c8287ac0c35ad2f431dd694fd0305dbf697dc7e.tar.bz2 |
* s390-tdep.c (s390_pop_frame): Call generic_pop_current_frame, to
interact correctly with generic dummy frames.
(s390_pop_frame_regular): Move the guts of the frame-popping code
to here, to be called by generic_pop_current_frame. Use the
frame's saved_regs array; this works for `return' as well as
inferior function calls.
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/s390-tdep.c | 44 |
2 files changed, 42 insertions, 9 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5e7641c..e6bdf29 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2001-11-13 Jim Blandy <jimb@redhat.com> + * s390-tdep.c (s390_pop_frame): Call generic_pop_current_frame, to + interact correctly with generic dummy frames. + (s390_pop_frame_regular): Move the guts of the frame-popping code + to here, to be called by generic_pop_current_frame. Use the + frame's saved_regs array; this works for `return' as well as + inferior function calls. + * s390-tdep.c (s390_gdbarch_init): Register the function `standard_coerce_float_to_double', since GCC for the S/390 follows the standard rules for passing floats. diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c index e682880..32e5ef1 100644 --- a/gdb/s390-tdep.c +++ b/gdb/s390-tdep.c @@ -1159,20 +1159,46 @@ s390_push_dummy_frame () write_register (S390_SP_REGNUM, new_sp); } -/* pop the innermost frame, go back to the caller. - Used in `call_function_by_hand' to remove an artificial stack - frame. */ -void -s390_pop_frame () + +static void +s390_pop_frame_regular (struct frame_info *frame) { - CORE_ADDR new_sp = read_register (S390_SP_REGNUM), orig_sp; - void *saved_regs = alloca (REGISTER_BYTES); + int regnum; + + write_register (S390_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; + + value = read_memory_unsigned_integer (frame->saved_regs[regnum], + REGISTER_RAW_SIZE (regnum)); + write_register (regnum, value); + } + /* Actually cut back the stack. */ + write_register (S390_SP_REGNUM, FRAME_FP (frame)); - read_memory (new_sp + S390_GPR_SIZE, (char *) saved_regs, REGISTER_BYTES); - write_register_bytes (0, (char *) &saved_regs, REGISTER_BYTES); + /* Throw away any cached frame information. */ + flush_cached_frames (); } + +/* Destroy the innermost (Top-Of-Stack) stack frame, restoring the + machine state that was in effect before the frame was created. + Used in the contexts of the "return" command, and of + target function calls from the debugger. */ +void +s390_pop_frame () +{ + /* This function checks for and handles generic dummy frames, and + calls back to our function for ordinary frames. */ + generic_pop_current_frame (s390_pop_frame_regular); +} + + /* used by call function by hand struct_return indicates that this function returns a structure & therefore gpr2 stores a pointer to the structure to be returned as |