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] ARM: Eliminate EXTRA_FRAME_INFO & FRAME_FIND_SAVED_REGS



This patch eliminates the deprecated macros EXTRA_FRAME_INFO & 
FRAME_FIND_SAVED_REGS from the arm target support files and replaces them 
with the new methods for doing this.  Tested on arm-netbsd and arm-linux 
with no regressions.

Most of the patch is mechanical replacement of 

	Replace			with	
	fip->fsr.regs 		fip->saved_regs
	fip->framereg		fip->extra_info->framereg
	fip->framesize		fip->extra_info->framesize
	fip->frameoffset	fip->extra_info->framesize

R.

	Convert arm targets to new FRAME interface.
	* arm-tdep.c (struct frame_extra_info): Remove fsr.
	(arm_frame_find_save_regs): Delete.
	(arm_frame_init_saved_regs): New.
	(arm_init_extra_frame_info): Alloacte saved_regs as required.
	Allocate extra_info as required.  Convert all uses of fsr.regs
	to use saved_regs, similarly all uses of EXTRA_FRAME_INFO fields
	to use extra_info.
	(thumb_scan_prologue, arm_scan_prologue, arm_find_callers_reg)
	(arm_frame_chain, arm_frame_saved_pc, arm_pop_frame): Likewise.
	(check_prologue_cache): Likewise.  Also ensure prologue_cache is
	correctly set up on first use.
	(save_prologue_cache): Likewise.
	* config/arm/tm-arm.h (EXTRA_FRAME_INFO): Delete.
	(FRAME_FIND_SAVED_REGS): Delete.
	(arm_frame_find_saved_regs): Delete prototype.
	(arm_frame_init_saved_regs): New prototype.
	(FRAME_INIT_SAVED_REGS): Define.


Index: arm-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/arm-tdep.c,v
retrieving revision 1.26
diff -p -r1.26 arm-tdep.c
*** arm-tdep.c	2002/01/09 18:07:48	1.26
--- arm-tdep.c	2002/01/11 20:53:07
*************** static void convert_from_extended (void 
*** 107,118 ****
     we're still in the prologue of a function with a frame) */
  
  struct frame_extra_info
!   {
!     struct frame_saved_regs fsr;
!     int framesize;
!     int frameoffset;
!     int framereg;
!   };
  
  /* Addresses for calling Thumb functions have the bit 0 set.
     Here are some macros to test, set, or clear bit 0 of addresses.  */
--- 107,117 ----
     we're still in the prologue of a function with a frame) */
  
  struct frame_extra_info
! {
!   int framesize;
!   int frameoffset;
!   int framereg;
! };
  
  /* Addresses for calling Thumb functions have the bit 0 set.
     Here are some macros to test, set, or clear bit 0 of addresses.  */
*************** thumb_scan_prologue (struct frame_info *
*** 534,540 ****
       frame pointer, adjust the stack pointer, and save registers.
       Do this until all basic prolog instructions are found.  */
  
!   fi->framesize = 0;
    for (current_pc = prologue_start;
         (current_pc < prologue_end) && ((findmask & 7) != 7);
         current_pc += 2)
--- 533,539 ----
       frame pointer, adjust the stack pointer, and save registers.
       Do this until all basic prolog instructions are found.  */
  
!   fi->extra_info->framesize = 0;
    for (current_pc = prologue_start;
         (current_pc < prologue_end) && ((findmask & 7) != 7);
         current_pc += 2)
*************** thumb_scan_prologue (struct frame_info *
*** 557,564 ****
  	  for (regno = LR_REGNUM; regno >= 0; regno--)
  	    if (mask & (1 << regno))
  	      {
! 		fi->framesize += 4;
! 		fi->fsr.regs[saved_reg[regno]] = -(fi->framesize);
  		saved_reg[regno] = regno;	/* reset saved register map */
  	      }
  	}
--- 556,564 ----
  	  for (regno = LR_REGNUM; regno >= 0; regno--)
  	    if (mask & (1 << regno))
  	      {
! 		fi->extra_info->framesize += 4;
! 		fi->saved_regs[saved_reg[regno]] =
! 		  -(fi->extra_info->framesize);
  		saved_reg[regno] = regno;	/* reset saved register map */
  	      }
  	}
*************** thumb_scan_prologue (struct frame_info *
*** 572,593 ****
  	  offset = (insn & 0x7f) << 2;	/* get scaled offset */
  	  if (insn & 0x80)	/* is it signed? (==subtracting) */
  	    {
! 	      fi->frameoffset += offset;
  	      offset = -offset;
  	    }
! 	  fi->framesize -= offset;
  	}
        else if ((insn & 0xff00) == 0xaf00)	/* add r7, sp, #imm */
  	{
  	  findmask |= 2;  /* setting of r7 found */
! 	  fi->framereg = THUMB_FP_REGNUM;
! 	  fi->frameoffset = (insn & 0xff) << 2;		/* get scaled offset */
  	}
        else if (insn == 0x466f)			/* mov r7, sp */
  	{
  	  findmask |= 2;  /* setting of r7 found */
! 	  fi->framereg = THUMB_FP_REGNUM;
! 	  fi->frameoffset = 0;
  	  saved_reg[THUMB_FP_REGNUM] = SP_REGNUM;
  	}
        else if ((insn & 0xffc0) == 0x4640)	/* mov r0-r7, r8-r15 */
--- 572,594 ----
  	  offset = (insn & 0x7f) << 2;	/* get scaled offset */
  	  if (insn & 0x80)	/* is it signed? (==subtracting) */
  	    {
! 	      fi->extra_info->frameoffset += offset;
  	      offset = -offset;
  	    }
! 	  fi->extra_info->framesize -= offset;
  	}
        else if ((insn & 0xff00) == 0xaf00)	/* add r7, sp, #imm */
  	{
  	  findmask |= 2;  /* setting of r7 found */
! 	  fi->extra_info->framereg = THUMB_FP_REGNUM;
! 	  /* get scaled offset */
! 	  fi->extra_info->frameoffset = (insn & 0xff) << 2;
  	}
        else if (insn == 0x466f)			/* mov r7, sp */
  	{
  	  findmask |= 2;  /* setting of r7 found */
! 	  fi->extra_info->framereg = THUMB_FP_REGNUM;
! 	  fi->extra_info->frameoffset = 0;
  	  saved_reg[THUMB_FP_REGNUM] = SP_REGNUM;
  	}
        else if ((insn & 0xffc0) == 0x4640)	/* mov r0-r7, r8-r15 */
*************** check_prologue_cache (struct frame_info 
*** 625,637 ****
  {
    int i;
  
    if (fi->pc == prologue_cache.pc)
      {
!       fi->framereg = prologue_cache.framereg;
!       fi->framesize = prologue_cache.framesize;
!       fi->frameoffset = prologue_cache.frameoffset;
!       for (i = 0; i < NUM_REGS; i++)
! 	fi->fsr.regs[i] = prologue_cache.fsr.regs[i];
        return 1;
      }
    else
--- 626,646 ----
  {
    int i;
  
+   if (prologue_cache.extra_info == NULL)
+     {
+       prologue_cache.extra_info = (struct frame_extra_info *)
+ 	xcalloc (1, sizeof (struct frame_extra_info));
+       prologue_cache.saved_regs = (CORE_ADDR *)
+ 	xcalloc (1, SIZEOF_FRAME_SAVED_REGS);
+     }
+ 
    if (fi->pc == prologue_cache.pc)
      {
!       fi->extra_info->framereg = prologue_cache.extra_info->framereg;
!       fi->extra_info->framesize = prologue_cache.extra_info->framesize;
!       fi->extra_info->frameoffset = prologue_cache.extra_info->frameoffset;
!       for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
! 	fi->saved_regs[i] = prologue_cache.saved_regs[i];
        return 1;
      }
    else
*************** save_prologue_cache (struct frame_info *
*** 646,658 ****
  {
    int i;
  
    prologue_cache.pc = fi->pc;
!   prologue_cache.framereg = fi->framereg;
!   prologue_cache.framesize = fi->framesize;
!   prologue_cache.frameoffset = fi->frameoffset;
  
!   for (i = 0; i < NUM_REGS; i++)
!     prologue_cache.fsr.regs[i] = fi->fsr.regs[i];
  }
  
  
--- 655,675 ----
  {
    int i;
  
+   if (prologue_cache.extra_info == NULL)
+     {
+       prologue_cache.extra_info = (struct frame_extra_info *)
+ 	xcalloc (1, sizeof (struct frame_extra_info));
+       prologue_cache.saved_regs = (CORE_ADDR *)
+ 	xcalloc (1, SIZEOF_FRAME_SAVED_REGS);
+     }
+ 
    prologue_cache.pc = fi->pc;
!   prologue_cache.extra_info->framereg = fi->extra_info->framereg;
!   prologue_cache.extra_info->framesize = fi->extra_info->framesize;
!   prologue_cache.extra_info->frameoffset = fi->extra_info->frameoffset;
  
!   for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
!     prologue_cache.saved_regs[i] = fi->saved_regs[i];
  }
  
  
*************** arm_scan_prologue (struct frame_info *fi
*** 735,743 ****
      return;
  
    /* Assume there is no frame until proven otherwise.  */
!   fi->framereg = SP_REGNUM;
!   fi->framesize = 0;
!   fi->frameoffset = 0;
  
    /* Check for Thumb prologue.  */
    if (arm_pc_is_thumb (fi->pc))
--- 752,760 ----
      return;
  
    /* Assume there is no frame until proven otherwise.  */
!   fi->extra_info->framereg = SP_REGNUM;
!   fi->extra_info->framesize = 0;
!   fi->extra_info->frameoffset = 0;
  
    /* Check for Thumb prologue.  */
    if (arm_pc_is_thumb (fi->pc))
*************** arm_scan_prologue (struct frame_info *fi
*** 840,846 ****
  	    if (mask & (1 << regno))
  	      {
  		sp_offset -= 4;
! 		fi->fsr.regs[regno] = sp_offset;
  	      }
  	}
        else if ((insn & 0xfffff000) == 0xe24cb000)	/* sub fp, ip #n */
--- 857,863 ----
  	    if (mask & (1 << regno))
  	      {
  		sp_offset -= 4;
! 		fi->saved_regs[regno] = sp_offset;
  	      }
  	}
        else if ((insn & 0xfffff000) == 0xe24cb000)	/* sub fp, ip #n */
*************** arm_scan_prologue (struct frame_info *fi
*** 849,855 ****
  	  unsigned rot = (insn & 0xf00) >> 7;	/* rotate amount */
  	  imm = (imm >> rot) | (imm << (32 - rot));
  	  fp_offset = -imm;
! 	  fi->framereg = FP_REGNUM;
  	}
        else if ((insn & 0xfffff000) == 0xe24dd000)	/* sub sp, sp #n */
  	{
--- 866,872 ----
  	  unsigned rot = (insn & 0xf00) >> 7;	/* rotate amount */
  	  imm = (imm >> rot) | (imm << (32 - rot));
  	  fp_offset = -imm;
! 	  fi->extra_info->framereg = FP_REGNUM;
  	}
        else if ((insn & 0xfffff000) == 0xe24dd000)	/* sub sp, sp #n */
  	{
*************** arm_scan_prologue (struct frame_info *fi
*** 862,868 ****
  	{
  	  sp_offset -= 12;
  	  regno = F0_REGNUM + ((insn >> 12) & 0x07);
! 	  fi->fsr.regs[regno] = sp_offset;
  	}
        else if ((insn & 0xffbf0fff) == 0xec2d0200)	/* sfmfd f0, 4, [sp!] */
  	{
--- 879,885 ----
  	{
  	  sp_offset -= 12;
  	  regno = F0_REGNUM + ((insn >> 12) & 0x07);
! 	  fi->saved_regs[regno] = sp_offset;
  	}
        else if ((insn & 0xffbf0fff) == 0xec2d0200)	/* sfmfd f0, 4, [sp!] */
  	{
*************** arm_scan_prologue (struct frame_info *fi
*** 889,895 ****
  	  for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
  	    {
  	      sp_offset -= 12;
! 	      fi->fsr.regs[fp_start_reg++] = sp_offset;
  	    }
  	}
        else if ((insn & 0xf0000000) != 0xe0000000)
--- 906,912 ----
  	  for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
  	    {
  	      sp_offset -= 12;
! 	      fi->saved_regs[fp_start_reg++] = sp_offset;
  	    }
  	}
        else if ((insn & 0xf0000000) != 0xe0000000)
*************** arm_scan_prologue (struct frame_info *fi
*** 905,915 ****
    /* The frame size is just the negative of the offset (from the original SP)
       of the last thing thing we pushed on the stack.  The frame offset is
       [new FP] - [new SP].  */
!   fi->framesize = -sp_offset;
!   if (fi->framereg == FP_REGNUM)
!     fi->frameoffset = fp_offset - sp_offset;
    else
!     fi->frameoffset = 0;
  
    save_prologue_cache (fi);
  }
--- 922,932 ----
    /* The frame size is just the negative of the offset (from the original SP)
       of the last thing thing we pushed on the stack.  The frame offset is
       [new FP] - [new SP].  */
!   fi->extra_info->framesize = -sp_offset;
!   if (fi->extra_info->framereg == FP_REGNUM)
!     fi->extra_info->frameoffset = fp_offset - sp_offset;
    else
!     fi->extra_info->frameoffset = 0;
  
    save_prologue_cache (fi);
  }
*************** arm_find_callers_reg (struct frame_info 
*** 931,938 ****
        return generic_read_register_dummy (fi->pc, fi->frame, regnum);
      else
  #endif
!     if (fi->fsr.regs[regnum] != 0)
!       return read_memory_integer (fi->fsr.regs[regnum],
  				  REGISTER_RAW_SIZE (regnum));
    return read_register (regnum);
  }
--- 948,955 ----
        return generic_read_register_dummy (fi->pc, fi->frame, regnum);
      else
  #endif
!     if (fi->saved_regs[regnum] != 0)
!       return read_memory_integer (fi->saved_regs[regnum],
  				  REGISTER_RAW_SIZE (regnum));
    return read_register (regnum);
  }
*************** arm_frame_chain (struct frame_info *fi)
*** 975,982 ****
        return 0;			/* in _start fn, don't chain further */
  #endif
    CORE_ADDR caller_pc, fn_start;
!   struct frame_info caller_fi;
!   int framereg = fi->framereg;
  
    if (fi->pc < LOWEST_PC)
      return 0;
--- 992,998 ----
        return 0;			/* in _start fn, don't chain further */
  #endif
    CORE_ADDR caller_pc, fn_start;
!   int framereg = fi->extra_info->framereg;
  
    if (fi->pc < LOWEST_PC)
      return 0;
*************** arm_frame_chain (struct frame_info *fi)
*** 991,1002 ****
       the frame register of the caller is different from ours.
       So we must scan the prologue of the caller to determine its
       frame register number. */
    if (arm_pc_is_thumb (caller_pc) != arm_pc_is_thumb (fi->pc))
      {
        memset (&caller_fi, 0, sizeof (caller_fi));
        caller_fi.pc = caller_pc;
        arm_scan_prologue (&caller_fi);
!       framereg = caller_fi.framereg;
      }
  
    /* If the caller used a frame register, return its value.
--- 1007,1030 ----
       the frame register of the caller is different from ours.
       So we must scan the prologue of the caller to determine its
       frame register number. */
+   /* XXX Fixme, we should try to do this without creating a temporary
+      caller_fi.  */
    if (arm_pc_is_thumb (caller_pc) != arm_pc_is_thumb (fi->pc))
      {
+       struct frame_info caller_fi;
+ 
        memset (&caller_fi, 0, sizeof (caller_fi));
+       caller_fi.extra_info = (struct frame_extra_info *)
+ 	xcalloc (1, sizeof (struct frame_extra_info));
+       caller_fi.saved_regs = (CORE_ADDR *)
+ 	xcalloc (1, SIZEOF_FRAME_SAVED_REGS);
+ 
        caller_fi.pc = caller_pc;
        arm_scan_prologue (&caller_fi);
!       framereg = caller_fi.extra_info->framereg;
! 
!       xfree(caller_fi.extra_info);
!       xfree(caller_fi.saved_regs);
      }
  
    /* If the caller used a frame register, return its value.
*************** arm_frame_chain (struct frame_info *fi)
*** 1004,1010 ****
    if (framereg == FP_REGNUM || framereg == THUMB_FP_REGNUM)
      return arm_find_callers_reg (fi, framereg);
    else
!     return fi->frame + fi->framesize;
  }
  
  /* This function actually figures out the frame address for a given pc
--- 1032,1038 ----
    if (framereg == FP_REGNUM || framereg == THUMB_FP_REGNUM)
      return arm_find_callers_reg (fi, framereg);
    else
!     return fi->frame + fi->extra_info->framesize;
  }
  
  /* This function actually figures out the frame address for a given pc
*************** arm_init_extra_frame_info (int fromleaf,
*** 1022,1031 ****
    int reg;
    CORE_ADDR sp;
  
    if (fi->next)
      fi->pc = FRAME_SAVED_PC (fi->next);
  
!   memset (fi->fsr.regs, '\000', sizeof fi->fsr.regs);
  
  #if 0				/* FIXME: enable this code if we convert to new call dummy scheme.  */
    if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
--- 1050,1069 ----
    int reg;
    CORE_ADDR sp;
  
+   if (fi->saved_regs == NULL)
+     frame_saved_regs_zalloc (fi);
+ 
+   fi->extra_info = (struct frame_extra_info *)
+     frame_obstack_alloc (sizeof (struct frame_extra_info));
+ 
+   fi->extra_info->framesize = 0;
+   fi->extra_info->frameoffset = 0;
+   fi->extra_info->framereg = 0;
+ 
    if (fi->next)
      fi->pc = FRAME_SAVED_PC (fi->next);
  
!   memset (fi->saved_regs, '\000', sizeof fi->saved_regs);
  
  #if 0				/* FIXME: enable this code if we convert to new call dummy scheme.  */
    if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
*************** arm_init_extra_frame_info (int fromleaf,
*** 1033,1040 ****
        /* We need to setup fi->frame here because run_stack_dummy gets it wrong
           by assuming it's always FP.  */
        fi->frame = generic_read_register_dummy (fi->pc, fi->frame, SP_REGNUM);
!       fi->framesize = 0;
!       fi->frameoffset = 0;
        return;
      }
    else
--- 1071,1078 ----
        /* We need to setup fi->frame here because run_stack_dummy gets it wrong
           by assuming it's always FP.  */
        fi->frame = generic_read_register_dummy (fi->pc, fi->frame, SP_REGNUM);
!       fi->extra_info->framesize = 0;
!       fi->extra_info->frameoffset = 0;
        return;
      }
    else
*************** arm_init_extra_frame_info (int fromleaf,
*** 1045,1051 ****
    if (!fi->next)
      sp = read_sp();
    else
!     sp = fi->next->frame - fi->next->frameoffset + fi->next->framesize;
  
    /* Determine whether or not we're in a sigtramp frame. 
       Unfortunately, it isn't sufficient to test
--- 1083,1090 ----
    if (!fi->next)
      sp = read_sp();
    else
!     sp = (fi->next->frame - fi->next->extra_info->frameoffset
! 	  + fi->next->extra_info->framesize);
  
    /* Determine whether or not we're in a sigtramp frame. 
       Unfortunately, it isn't sufficient to test
*************** arm_init_extra_frame_info (int fromleaf,
*** 1063,1076 ****
        && (fi->signal_handler_caller || IN_SIGTRAMP (fi->pc, (char *)0)))
      {
        for (reg = 0; reg < NUM_REGS; reg++)
! 	fi->fsr.regs[reg] = SIGCONTEXT_REGISTER_ADDRESS (sp, fi->pc, reg);
  
        /* FIXME: What about thumb mode? */
!       fi->framereg = SP_REGNUM;
!       fi->frame = read_memory_integer (fi->fsr.regs[fi->framereg],
!                                        REGISTER_RAW_SIZE (fi->framereg));
!       fi->framesize = 0;
!       fi->frameoffset = 0;
  
      }
    else if (PC_IN_CALL_DUMMY (fi->pc, sp, fi->frame))
--- 1102,1116 ----
        && (fi->signal_handler_caller || IN_SIGTRAMP (fi->pc, (char *)0)))
      {
        for (reg = 0; reg < NUM_REGS; reg++)
! 	fi->saved_regs[reg] = SIGCONTEXT_REGISTER_ADDRESS (sp, fi->pc, reg);
  
        /* FIXME: What about thumb mode? */
!       fi->extra_info->framereg = SP_REGNUM;
!       fi->frame =
! 	read_memory_integer (fi->saved_regs[fi->extra_info->framereg],
! 			     REGISTER_RAW_SIZE (fi->extra_info->framereg));
!       fi->extra_info->framesize = 0;
!       fi->extra_info->frameoffset = 0;
  
      }
    else if (PC_IN_CALL_DUMMY (fi->pc, sp, fi->frame))
*************** arm_init_extra_frame_info (int fromleaf,
*** 1082,1100 ****
        rp = fi->frame - REGISTER_SIZE;
  
        /* Fill in addresses of saved registers.  */
!       fi->fsr.regs[PS_REGNUM] = rp;
        rp -= REGISTER_RAW_SIZE (PS_REGNUM);
        for (reg = PC_REGNUM; reg >= 0; reg--)
  	{
! 	  fi->fsr.regs[reg] = rp;
  	  rp -= REGISTER_RAW_SIZE (reg);
  	}
  
!       callers_sp = read_memory_integer (fi->fsr.regs[SP_REGNUM],
                                          REGISTER_RAW_SIZE (SP_REGNUM));
!       fi->framereg = FP_REGNUM;
!       fi->framesize = callers_sp - sp;
!       fi->frameoffset = fi->frame - sp;
      }
    else
      {
--- 1122,1140 ----
        rp = fi->frame - REGISTER_SIZE;
  
        /* Fill in addresses of saved registers.  */
!       fi->saved_regs[PS_REGNUM] = rp;
        rp -= REGISTER_RAW_SIZE (PS_REGNUM);
        for (reg = PC_REGNUM; reg >= 0; reg--)
  	{
! 	  fi->saved_regs[reg] = rp;
  	  rp -= REGISTER_RAW_SIZE (reg);
  	}
  
!       callers_sp = read_memory_integer (fi->saved_regs[SP_REGNUM],
                                          REGISTER_RAW_SIZE (SP_REGNUM));
!       fi->extra_info->framereg = FP_REGNUM;
!       fi->extra_info->framesize = callers_sp - sp;
!       fi->extra_info->frameoffset = fi->frame - sp;
      }
    else
      {
*************** arm_init_extra_frame_info (int fromleaf,
*** 1102,1115 ****
  
        if (!fi->next)
  	/* this is the innermost frame? */
! 	fi->frame = read_register (fi->framereg);
!       else if (fi->framereg == FP_REGNUM || fi->framereg == THUMB_FP_REGNUM)
  	{
  	  /* not the innermost frame */
  	  /* If we have an FP, the callee saved it. */
! 	  if (fi->next->fsr.regs[fi->framereg] != 0)
  	    fi->frame =
! 	      read_memory_integer (fi->next->fsr.regs[fi->framereg], 4);
  	  else if (fromleaf)
  	    /* If we were called by a frameless fn.  then our frame is
  	       still in the frame pointer register on the board... */
--- 1142,1157 ----
  
        if (!fi->next)
  	/* this is the innermost frame? */
! 	fi->frame = read_register (fi->extra_info->framereg);
!       else if (fi->extra_info->framereg == FP_REGNUM
! 	       || fi->extra_info->framereg == THUMB_FP_REGNUM)
  	{
  	  /* not the innermost frame */
  	  /* If we have an FP, the callee saved it. */
! 	  if (fi->next->saved_regs[fi->extra_info->framereg] != 0)
  	    fi->frame =
! 	      read_memory_integer (fi->next
! 				   ->saved_regs[fi->extra_info->framereg], 4);
  	  else if (fromleaf)
  	    /* If we were called by a frameless fn.  then our frame is
  	       still in the frame pointer register on the board... */
*************** arm_init_extra_frame_info (int fromleaf,
*** 1119,1126 ****
        /* Calculate actual addresses of saved registers using offsets
           determined by arm_scan_prologue.  */
        for (reg = 0; reg < NUM_REGS; reg++)
! 	if (fi->fsr.regs[reg] != 0)
! 	  fi->fsr.regs[reg] += fi->frame + fi->framesize - fi->frameoffset;
      }
  }
  
--- 1161,1169 ----
        /* Calculate actual addresses of saved registers using offsets
           determined by arm_scan_prologue.  */
        for (reg = 0; reg < NUM_REGS; reg++)
! 	if (fi->saved_regs[reg] != 0)
! 	  fi->saved_regs[reg] += (fi->frame + fi->extra_info->framesize
! 				  - fi->extra_info->frameoffset);
      }
  }
  
*************** arm_frame_saved_pc (struct frame_info *f
*** 1141,1149 ****
      return generic_read_register_dummy (fi->pc, fi->frame, PC_REGNUM);
    else
  #endif
!   if (PC_IN_CALL_DUMMY (fi->pc, fi->frame - fi->frameoffset, fi->frame))
      {
!       return read_memory_integer (fi->fsr.regs[PC_REGNUM], REGISTER_RAW_SIZE (PC_REGNUM));
      }
    else
      {
--- 1184,1194 ----
      return generic_read_register_dummy (fi->pc, fi->frame, PC_REGNUM);
    else
  #endif
!   if (PC_IN_CALL_DUMMY (fi->pc, fi->frame - fi->extra_info->frameoffset,
! 			fi->frame))
      {
!       return read_memory_integer (fi->saved_regs[PC_REGNUM],
! 				  REGISTER_RAW_SIZE (PC_REGNUM));
      }
    else
      {
*************** arm_target_read_fp (void)
*** 1167,1176 ****
  /* Calculate the frame offsets of the saved registers (ARM version).  */
  
  void
! arm_frame_find_saved_regs (struct frame_info *fi,
! 			   struct frame_saved_regs *regaddr)
  {
!   memcpy (regaddr, &fi->fsr, sizeof (struct frame_saved_regs));
  }
  
  void
--- 1212,1224 ----
  /* Calculate the frame offsets of the saved registers (ARM version).  */
  
  void
! arm_frame_init_saved_regs (struct frame_info *fip)
  {
! 
!   if (fip->saved_regs)
!     return;
! 
!   arm_init_extra_frame_info (0, fip);
  }
  
  void
*************** arm_pop_frame (void)
*** 1424,1435 ****
  {
    int regnum;
    struct frame_info *frame = get_current_frame ();
!   CORE_ADDR old_SP = frame->frame - frame->frameoffset + frame->framesize;
  
    for (regnum = 0; regnum < NUM_REGS; regnum++)
!     if (frame->fsr.regs[regnum] != 0)
        write_register (regnum,
! 		  read_memory_integer (frame->fsr.regs[regnum],
  				       REGISTER_RAW_SIZE (regnum)));
  
    write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
--- 1472,1484 ----
  {
    int regnum;
    struct frame_info *frame = get_current_frame ();
!   CORE_ADDR old_SP = (frame->frame - frame->extra_info->frameoffset
! 		      + frame->extra_info->framesize);
  
    for (regnum = 0; regnum < NUM_REGS; regnum++)
!     if (frame->saved_regs[regnum] != 0)
        write_register (regnum,
! 		  read_memory_integer (frame->saved_regs[regnum],
  				       REGISTER_RAW_SIZE (regnum)));
  
    write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
Index: config/arm/tm-arm.h
===================================================================
RCS file: /cvs/src/src/gdb/config/arm/tm-arm.h,v
retrieving revision 1.13
diff -p -r1.13 tm-arm.h
*** tm-arm.h	2002/01/09 18:39:37	1.13
--- tm-arm.h	2002/01/11 20:53:11
*************** extern void convert_to_extended (void *d
*** 318,335 ****
  #define VARIABLES_INSIDE_BLOCK(desc, gcc_p) (!(gcc_p))
  
  
- /* Define other aspects of the stack frame.  We keep the offsets of
-    all saved registers, 'cause we need 'em a lot!  We also keep the
-    current size of the stack frame, and the offset of the frame
-    pointer from the stack pointer (for frameless functions, and when
-    we're still in the prologue of a function with a frame) */
- 
- #define EXTRA_FRAME_INFO  	\
-   struct frame_saved_regs fsr;	\
-   int framesize;		\
-   int frameoffset;		\
-   int framereg;
- 
  extern void arm_init_extra_frame_info (int fromleaf, struct frame_info * fi);
  #define INIT_EXTRA_FRAME_INFO(fromleaf, fi) \
  	arm_init_extra_frame_info ((fromleaf), (fi))
--- 318,323 ----
*************** extern CORE_ADDR arm_frame_saved_pc (str
*** 399,412 ****
     This includes special registers such as pc and fp saved in special
     ways in the stack frame.  sp is even more special: the address we
     return for it IS the sp for the next frame.  */
- 
- struct frame_saved_regs;
- struct frame_info;
- void arm_frame_find_saved_regs (struct frame_info * fi,
- 				struct frame_saved_regs * fsr);
  
! #define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \
! 	arm_frame_find_saved_regs (frame_info, &(frame_saved_regs));
  
  /* Things needed for making the inferior call functions.  */
  
--- 387,396 ----
     This includes special registers such as pc and fp saved in special
     ways in the stack frame.  sp is even more special: the address we
     return for it IS the sp for the next frame.  */
  
! void arm_frame_init_saved_regs (struct frame_info *);
! #define FRAME_INIT_SAVED_REGS(frame_info) \
! 	arm_frame_init_saved_regs (frame_info);
  
  /* Things needed for making the inferior call functions.  */
  

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