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]

Re: [PATCH RFA] Zap EXTRA_FRAME_INFO for ARM target


> The patch below represents a small step on the way to multiarching the
> ARM target.  It eliminates the use of the deprecated EXTRA_FRAME_INFO
> macro for describing a frame.  Instead, it now uses the ``extra_info''
> and ``saved_regs'' members in the frame_info struct.


Kevin, Richard, Fernando, Scott,

Jason Thorpe (I assume unintentionally) set a precident by treating as 
obvious the patch transforming EXTRA_FRAME_INFO as part of multi-arching 
the alpha.

Thinking about it Jason was correct in taking this aproach (I suspect 
I've done this with other targets).  A patch making the single 
independant change of eliminating EXTRA_FRAME_INFO is mechanical, and as 
such, can be treated as obvious.  Clearly it is assumed that the person 
committing the change is performing before/after testing to ensure no 
regressions occure.  A person looking to commit such a change is also, 
obviously, strongly advised, to not try and make the change somehow 
dependant on other changes, doing that will just bog down the process.

If GDB doesn't take this approach it is very quickly going to find that 
the multi-arch task gets bogged down waiting on approval of trivial changes.

With that in mind I think either Kevin's or Richard's EXTRA_FRAME_INFO 
patch (minus any dependencies) should be committed.  The only proviso 
being that they are before/after tested and show no regressions.

enjoy,
Andrew


> 	* tm-arm.h (EXTRA_FRAME_INFO): Delete definition.
> 	(arm_frame_init_saved_regs): Declare.
> 	(FRAME_INIT_SAVED_REGS): Define.
> 	(arm_frame_find_saved_regs): Delete declaration.
> 	(FRAME_FIND_SAVED_REGS): Delete definition.
> 	* arm-tdep.c (gdb_assert.h): Include.
> 	(struct frame_extra_info): Delete fsr member.
> 	(thumb_scan_prologue, check_prologue_cache, save_prologue_cache)
> 	(arm_scan_prologue, arm_find_callers_reg, arm_frame_chain)
> 	(arm_init_extra_frame_info, arm_push_dummy_frame): Use
> 	``saved_regs'' in place of ``fsr.regs''.  Use
> 	``extra_info->framesize'' in place of just ``framesize''.
> 	Likewise for ``frameoffset'' and ``framereg''.
> 	(arm_frame_init_saved_regs): New function.
> 	(arm_frame_find_saved_regs): Delete.
> 	(_initialize_arm_tdep): Allocate ``extra_info'' and ``saved_regs''
> 	structs for the prologue cache.
> 	(arm_frame_chain): Likewise for the hand created caller's
> 	frame_info struct.
> 	(arm_init_extra_frame_info): Likewise for the frame_info struct
> 	undergoing initialization.
> 
> diff -upr ../../../sourceware-arm1+2/src/gdb/arm-tdep.c ./arm-tdep.c
> --- ../../../sourceware-arm1+2/src/gdb/arm-tdep.c	Sat Dec 15 00:13:02 2001
> +++ ./arm-tdep.c	Sat Dec 15 00:30:34 2001
> @@ -33,6 +33,7 @@
>  #include "doublest.h"
>  #include "value.h"
>  #include "solib-svr4.h"
> +#include "gdb_assert.h"
>  
>  /* Each OS has a different mechanism for accessing the various
>     registers stored in the sigcontext structure.
> @@ -108,7 +109,6 @@ static void convert_from_extended (void 
>  
>  struct frame_extra_info
>    {
> -    struct frame_saved_regs fsr;
>      int framesize;
>      int frameoffset;
>      int framereg;
> @@ -534,7 +534,7 @@ thumb_scan_prologue (struct frame_info *
>       frame pointer, adjust the stack pointer, and save registers.
>       Do this until all basic prolog instructions are found.  */
>  
> -  fi->framesize = 0;
> +  fi->extra_info->framesize = 0;
>    for (current_pc = prologue_start;
>         (current_pc < prologue_end) && ((findmask & 7) != 7);
>         current_pc += 2)
> @@ -557,8 +557,8 @@ thumb_scan_prologue (struct frame_info *
>  	  for (regno = LR_REGNUM; regno >= 0; regno--)
>  	    if (mask & (1 << regno))
>  	      {
> -		fi->framesize += 4;
> -		fi->fsr.regs[saved_reg[regno]] = -(fi->framesize);
> +		fi->extra_info->framesize += 4;
> +		fi->saved_regs[saved_reg[regno]] = -(fi->extra_info->framesize);
>  		saved_reg[regno] = regno;	/* reset saved register map */
>  	      }
>  	}
> @@ -572,22 +572,22 @@ thumb_scan_prologue (struct frame_info *
>  	  offset = (insn & 0x7f) << 2;	/* get scaled offset */
>  	  if (insn & 0x80)	/* is it signed? (==subtracting) */
>  	    {
> -	      fi->frameoffset += offset;
> +	      fi->extra_info->frameoffset += offset;
>  	      offset = -offset;
>  	    }
> -	  fi->framesize -= offset;
> +	  fi->extra_info->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 */
> +	  fi->extra_info->framereg = THUMB_FP_REGNUM;
> +	  fi->extra_info->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;
> +	  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 */
> @@ -627,11 +627,11 @@ check_prologue_cache (struct frame_info 
>  
>    if (fi->pc == prologue_cache.pc)
>      {
> -      fi->framereg = prologue_cache.framereg;
> -      fi->framesize = prologue_cache.framesize;
> -      fi->frameoffset = prologue_cache.frameoffset;
> +      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; i++)
> -	fi->fsr.regs[i] = prologue_cache.fsr.regs[i];
> +	fi->saved_regs[i] = prologue_cache.saved_regs[i];
>        return 1;
>      }
>    else
> @@ -647,12 +647,12 @@ save_prologue_cache (struct frame_info *
>    int i;
>  
>    prologue_cache.pc = fi->pc;
> -  prologue_cache.framereg = fi->framereg;
> -  prologue_cache.framesize = fi->framesize;
> -  prologue_cache.frameoffset = fi->frameoffset;
> +  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; i++)
> -    prologue_cache.fsr.regs[i] = fi->fsr.regs[i];
> +    prologue_cache.saved_regs[i] = fi->saved_regs[i];
>  }
>  
>  
> @@ -734,9 +734,9 @@ arm_scan_prologue (struct frame_info *fi
>      return;
>  
>    /* Assume there is no frame until proven otherwise.  */
> -  fi->framereg = SP_REGNUM;
> -  fi->framesize = 0;
> -  fi->frameoffset = 0;
> +  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))
> @@ -835,7 +835,7 @@ arm_scan_prologue (struct frame_info *fi
>  	    if (mask & (1 << regno))
>  	      {
>  		sp_offset -= 4;
> -		fi->fsr.regs[regno] = sp_offset;
> +		fi->saved_regs[regno] = sp_offset;
>  	      }
>  	}
>        else if ((insn & 0xfffff000) == 0xe24cb000)	/* sub fp, ip #n */
> @@ -844,7 +844,7 @@ arm_scan_prologue (struct frame_info *fi
>  	  unsigned rot = (insn & 0xf00) >> 7;	/* rotate amount */
>  	  imm = (imm >> rot) | (imm << (32 - rot));
>  	  fp_offset = -imm;
> -	  fi->framereg = FP_REGNUM;
> +	  fi->extra_info->framereg = FP_REGNUM;
>  	}
>        else if ((insn & 0xfffff000) == 0xe24dd000)	/* sub sp, sp #n */
>  	{
> @@ -857,7 +857,7 @@ arm_scan_prologue (struct frame_info *fi
>  	{
>  	  sp_offset -= 12;
>  	  regno = F0_REGNUM + ((insn >> 12) & 0x07);
> -	  fi->fsr.regs[regno] = sp_offset;
> +	  fi->saved_regs[regno] = sp_offset;
>  	}
>        else if ((insn & 0xffbf0fff) == 0xec2d0200)	/* sfmfd f0, 4, [sp!] */
>  	{
> @@ -884,7 +884,7 @@ arm_scan_prologue (struct frame_info *fi
>  	  for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
>  	    {
>  	      sp_offset -= 12;
> -	      fi->fsr.regs[fp_start_reg++] = sp_offset;
> +	      fi->saved_regs[fp_start_reg++] = sp_offset;
>  	    }
>  	}
>        else if ((insn & 0xf0000000) != 0xe0000000)
> @@ -900,11 +900,11 @@ arm_scan_prologue (struct frame_info *fi
>    /* 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;
> +  fi->extra_info->framesize = -sp_offset;
> +  if (fi->extra_info->framereg == FP_REGNUM)
> +    fi->extra_info->frameoffset = fp_offset - sp_offset;
>    else
> -    fi->frameoffset = 0;
> +    fi->extra_info->frameoffset = 0;
>  
>    save_prologue_cache (fi);
>  }
> @@ -926,8 +926,8 @@ arm_find_callers_reg (struct frame_info 
>        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],
> +    if (fi->saved_regs[regnum] != 0)
> +      return read_memory_integer (fi->saved_regs[regnum],
>  				  REGISTER_RAW_SIZE (regnum));
>    return read_register (regnum);
>  }
> @@ -970,8 +970,7 @@ arm_frame_chain (struct frame_info *fi)
>        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;
> +  int framereg = fi->extra_info->framereg;
>  
>    if (fi->pc < LOWEST_PC)
>      return 0;
> @@ -988,10 +987,25 @@ arm_frame_chain (struct frame_info *fi)
>       frame register number. */
>    if (arm_pc_is_thumb (caller_pc) != arm_pc_is_thumb (fi->pc))
>      {
> +      struct frame_info caller_fi;
> +      struct cleanup *old_chain;
> +
> +      /* Create a temporary frame suitable for scanning the caller's
> +         prologue.  (Ugh.)  */
>        memset (&caller_fi, 0, sizeof (caller_fi));
> +      caller_fi.saved_regs = (CORE_ADDR *) xcalloc (1, SIZEOF_FRAME_SAVED_REGS);
> +      old_chain = make_cleanup (xfree, caller_fi.saved_regs);
> +      caller_fi.extra_info = xcalloc (1, sizeof (struct frame_extra_info));
> +      make_cleanup (xfree, caller_fi.extra_info);
> +
> +      /* Now, scan the prologue and obtain the frame register.  */
>        caller_fi.pc = caller_pc;
>        arm_scan_prologue (&caller_fi);
> -      framereg = caller_fi.framereg;
> +      framereg = caller_fi.extra_info->framereg;
> +
> +      /* Deallocate the storage associated with the temporary frame
> +         created above.  */
> +      do_cleanups (old_chain);
>      }
>  
>    /* If the caller used a frame register, return its value.
> @@ -999,7 +1013,7 @@ arm_frame_chain (struct frame_info *fi)
>    if (framereg == FP_REGNUM || framereg == THUMB_FP_REGNUM)
>      return arm_find_callers_reg (fi, framereg);
>    else
> -    return fi->frame + fi->framesize;
> +    return fi->frame + fi->extra_info->framesize;
>  }
>  
>  /* This function actually figures out the frame address for a given pc
> @@ -1017,19 +1031,22 @@ arm_init_extra_frame_info (int fromleaf,
>    int reg;
>    CORE_ADDR sp;
>  
> +  fi->extra_info = (struct frame_extra_info *)
> +    frame_obstack_alloc (sizeof (struct frame_extra_info));
> +
> +  frame_saved_regs_zalloc (fi);
> +
>    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))
>      {
>        /* 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;
> +      fi->extra_info->framesize = 0;
> +      fi->extra_info->frameoffset = 0;
>        return;
>      }
>    else
> @@ -1040,7 +1057,7 @@ arm_init_extra_frame_info (int fromleaf,
>    if (!fi->next)
>      sp = read_sp();
>    else
> -    sp = fi->next->frame - fi->next->frameoffset + fi->next->framesize;
> +    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
> @@ -1058,14 +1075,14 @@ arm_init_extra_frame_info (int fromleaf,
>        && (fi->signal_handler_caller || IN_SIGTRAMP (fi->pc, 0)))
>      {
>        for (reg = 0; reg < NUM_REGS; reg++)
> -	fi->fsr.regs[reg] = SIGCONTEXT_REGISTER_ADDRESS (sp, fi->pc, reg);
> +	fi->saved_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;
> +      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))
> @@ -1077,19 +1094,19 @@ arm_init_extra_frame_info (int fromleaf,
>        rp = fi->frame - REGISTER_SIZE;
>  
>        /* Fill in addresses of saved registers.  */
> -      fi->fsr.regs[PS_REGNUM] = rp;
> +      fi->saved_regs[PS_REGNUM] = rp;
>        rp -= REGISTER_RAW_SIZE (PS_REGNUM);
>        for (reg = PC_REGNUM; reg >= 0; reg--)
>  	{
> -	  fi->fsr.regs[reg] = rp;
> +	  fi->saved_regs[reg] = rp;
>  	  rp -= REGISTER_RAW_SIZE (reg);
>  	}
>  
> -      callers_sp = read_memory_integer (fi->fsr.regs[SP_REGNUM],
> +      callers_sp = read_memory_integer (fi->saved_regs[SP_REGNUM],
>                                          REGISTER_RAW_SIZE (SP_REGNUM));
> -      fi->framereg = FP_REGNUM;
> -      fi->framesize = callers_sp - sp;
> -      fi->frameoffset = fi->frame - sp;
> +      fi->extra_info->framereg = FP_REGNUM;
> +      fi->extra_info->framesize = callers_sp - sp;
> +      fi->extra_info->frameoffset = fi->frame - sp;
>      }
>    else
>      {
> @@ -1097,14 +1114,14 @@ arm_init_extra_frame_info (int fromleaf,
>  
>        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)
> +	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->fsr.regs[fi->framereg] != 0)
> +	  if (fi->next->saved_regs[fi->extra_info->framereg] != 0)
>  	    fi->frame =
> -	      read_memory_integer (fi->next->fsr.regs[fi->framereg], 4);
> +	      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... */
> @@ -1114,11 +1131,19 @@ arm_init_extra_frame_info (int fromleaf,
>        /* 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;
> +	if (fi->saved_regs[reg] != 0)
> +	  fi->saved_regs[reg] += fi->frame + fi->extra_info->framesize - fi->extra_info->frameoffset;
>      }
>  }
>  
> +/* Initialize the saved register addresses.  There's nothing to do
> +   here since these addresses were already computed by
> +   arm_init_extra_frame_info().  */
> +void
> +arm_frame_init_saved_regs (struct frame_info *fi)
> +{
> +  gdb_assert (fi->extra_info != NULL && fi->saved_regs != NULL);
> +}
>  
>  /* Find the caller of this frame.  We do this by seeing if LR_REGNUM
>     is saved in the stack anywhere, otherwise we get it from the
> @@ -1136,9 +1161,9 @@ arm_frame_saved_pc (struct frame_info *f
>      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))
> +  if (PC_IN_CALL_DUMMY (fi->pc, fi->frame - fi->extra_info->frameoffset, fi->frame))
>      {
> -      return read_memory_integer (fi->fsr.regs[PC_REGNUM], REGISTER_RAW_SIZE (PC_REGNUM));
> +      return read_memory_integer (fi->saved_regs[PC_REGNUM], REGISTER_RAW_SIZE (PC_REGNUM));
>      }
>    else
>      {
> @@ -1159,15 +1184,6 @@ arm_target_read_fp (void)
>      return read_register (FP_REGNUM);	/* R11 if ARM */
>  }
>  
> -/* 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
>  arm_push_dummy_frame (void)
>  {
> @@ -1419,12 +1435,12 @@ arm_pop_frame (void)
>  {
>    int regnum;
>    struct frame_info *frame = get_current_frame ();
> -  CORE_ADDR old_SP = frame->frame - frame->frameoffset + frame->framesize;
> +  CORE_ADDR old_SP = frame->frame - frame->extra_info->frameoffset + frame->extra_info->framesize;
>  
>    for (regnum = 0; regnum < NUM_REGS; regnum++)
> -    if (frame->fsr.regs[regnum] != 0)
> +    if (frame->saved_regs[regnum] != 0)
>        write_register (regnum,
> -		  read_memory_integer (frame->fsr.regs[regnum],
> +		  read_memory_integer (frame->saved_regs[regnum],
>  				       REGISTER_RAW_SIZE (regnum)));
>  
>    write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
> @@ -2209,6 +2225,10 @@ The valid values are:\n");
>  
>    add_com ("othernames", class_obscure, arm_othernames,
>  	   "Switch to the next set of register names.");
> +
> +  /* Allocate extra_info and saved_regs fields in the prologue cache.  */
> +  prologue_cache.extra_info = xcalloc (1, sizeof (struct frame_extra_info));
> +  prologue_cache.saved_regs = xcalloc (1, SIZEOF_FRAME_SAVED_REGS);
>  }
>  
>  /* Test whether the coff symbol specific value corresponds to a Thumb
> diff -upr ../../../sourceware-arm1+2/src/gdb/config/arm/tm-arm.h ./config/arm/tm-arm.h
> --- ../../../sourceware-arm1+2/src/gdb/config/arm/tm-arm.h	Fri Nov 16 10:03:27 2001
> +++ ./config/arm/tm-arm.h	Sat Dec 15 00:30:34 2001
> @@ -318,22 +318,13 @@ extern void convert_to_extended (void *d
>  #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))
>  
> +extern void arm_frame_init_saved_regs (struct frame_info *fi);
> +#define FRAME_INIT_SAVED_REGS(fi) arm_frame_init_saved_regs (fi)
> +
>  /* Return the frame address.  On ARM, it is R11; on Thumb it is R7.  */
>  CORE_ADDR arm_target_read_fp (void);
>  #define TARGET_READ_FP() arm_target_read_fp ()
> @@ -393,20 +384,6 @@ extern CORE_ADDR arm_frame_saved_pc (str
>  /* Return number of bytes at start of arglist that are not really args. */
>  
>  #define FRAME_ARGS_SKIP 0
> -
> -/* Put here the code to store, into a struct frame_saved_regs, the
> -   addresses of the saved registers of frame described by FRAME_INFO.
> -   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.  */
>  
> 
> 
> 



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