This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: S/390: pop generic dummy frames and normal frames correctly



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.

Index: gdb/s390-tdep.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gdb/s390-tdep.c,v
retrieving revision 2.10
diff -c -r2.10 s390-tdep.c
*** gdb/s390-tdep.c	2001/11/13 17:25:17	2.10
--- gdb/s390-tdep.c	2001/11/13 17:33:48
***************
*** 1159,1177 ****
    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 ()
  {
!   CORE_ADDR new_sp = read_register (S390_SP_REGNUM), orig_sp;
!   void *saved_regs = alloca (REGISTER_BYTES);
  
  
!   read_memory (new_sp + S390_GPR_SIZE, (char *) saved_regs, REGISTER_BYTES);
!   write_register_bytes (0, (char *) &saved_regs, REGISTER_BYTES);
  }
  
  /* used by call function by hand
    struct_return indicates that this function returns a structure &
--- 1159,1203 ----
    write_register (S390_SP_REGNUM, new_sp);
  }
  
! 
! static void
! s390_pop_frame_regular (struct frame_info *frame)
  {
!   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));
! 
!   /* 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 &


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]