Patch from David Mosberger.
[deliverable/binutils-gdb.git] / gdb / arm-tdep.c
index 169564f4186c05c40d2f2addf96f83138edf655a..7ff473f2de97d4476b3d441c3ec2208a37c7a6dc 100644 (file)
@@ -291,14 +291,14 @@ arm_frameless_function_invocation (struct frame_info *fi)
 static CORE_ADDR
 arm_frame_args_address (struct frame_info *fi)
 {
-  return fi->frame;
+  return get_frame_base (fi);
 }
 
 /* The address of the local variables in the frame.  */
 static CORE_ADDR
 arm_frame_locals_address (struct frame_info *fi)
 {
-  return fi->frame;
+  return get_frame_base (fi);
 }
 
 /* The number of arguments being passed in the frame.  */
@@ -568,7 +568,7 @@ thumb_scan_prologue (struct frame_info *fi)
      frame pointer, adjust the stack pointer, and save registers.
      Do this until all basic prolog instructions are found.  */
 
-  fi->extra_info->framesize = 0;
+  get_frame_extra_info (fi)->framesize = 0;
   for (current_pc = prologue_start;
        (current_pc < prologue_end) && ((findmask & 7) != 7);
        current_pc += 2)
@@ -591,9 +591,9 @@ thumb_scan_prologue (struct frame_info *fi)
          for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
            if (mask & (1 << regno))
              {
-               fi->extra_info->framesize += 4;
+               get_frame_extra_info (fi)->framesize += 4;
                get_frame_saved_regs (fi)[saved_reg[regno]] =
-                 -(fi->extra_info->framesize);
+                 -(get_frame_extra_info (fi)->framesize);
                /* Reset saved register map.  */
                saved_reg[regno] = regno;
              }
@@ -609,23 +609,23 @@ thumb_scan_prologue (struct frame_info *fi)
          offset = (insn & 0x7f) << 2;          /* get scaled offset */
          if (insn & 0x80)              /* is it signed? (==subtracting) */
            {
-             fi->extra_info->frameoffset += offset;
+             get_frame_extra_info (fi)->frameoffset += offset;
              offset = -offset;
            }
-         fi->extra_info->framesize -= offset;
+         get_frame_extra_info (fi)->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_frame_extra_info (fi)->framereg = THUMB_FP_REGNUM;
          /* get scaled offset */
-         fi->extra_info->frameoffset = (insn & 0xff) << 2;
+         get_frame_extra_info (fi)->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;
+         get_frame_extra_info (fi)->framereg = THUMB_FP_REGNUM;
+         get_frame_extra_info (fi)->frameoffset = 0;
          saved_reg[THUMB_FP_REGNUM] = ARM_SP_REGNUM;
        }
       else if ((insn & 0xffc0) == 0x4640)      /* mov r0-r7, r8-r15 */
@@ -667,9 +667,9 @@ check_prologue_cache (struct frame_info *fi)
 
   if (get_frame_pc (fi) == get_frame_pc (prologue_cache))
     {
-      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;
+      get_frame_extra_info (fi)->framereg = get_frame_extra_info (prologue_cache)->framereg;
+      get_frame_extra_info (fi)->framesize = get_frame_extra_info (prologue_cache)->framesize;
+      get_frame_extra_info (fi)->frameoffset = get_frame_extra_info (prologue_cache)->frameoffset;
       for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
        get_frame_saved_regs (fi)[i] = get_frame_saved_regs (prologue_cache)[i];
       return 1;
@@ -687,9 +687,9 @@ save_prologue_cache (struct frame_info *fi)
   int i;
 
   deprecated_update_frame_pc_hack (prologue_cache, get_frame_pc (fi));
-  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;
+  get_frame_extra_info (prologue_cache)->framereg = get_frame_extra_info (fi)->framereg;
+  get_frame_extra_info (prologue_cache)->framesize = get_frame_extra_info (fi)->framesize;
+  get_frame_extra_info (prologue_cache)->frameoffset = get_frame_extra_info (fi)->frameoffset;
 
   for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
     get_frame_saved_regs (prologue_cache)[i] = get_frame_saved_regs (fi)[i];
@@ -775,9 +775,9 @@ arm_scan_prologue (struct frame_info *fi)
     return;
 
   /* Assume there is no frame until proven otherwise.  */
-  fi->extra_info->framereg = ARM_SP_REGNUM;
-  fi->extra_info->framesize = 0;
-  fi->extra_info->frameoffset = 0;
+  get_frame_extra_info (fi)->framereg = ARM_SP_REGNUM;
+  get_frame_extra_info (fi)->framesize = 0;
+  get_frame_extra_info (fi)->frameoffset = 0;
 
   /* Check for Thumb prologue.  */
   if (arm_pc_is_thumb (get_frame_pc (fi)))
@@ -832,7 +832,7 @@ arm_scan_prologue (struct frame_info *fi)
     {
       /* Get address of the stmfd in the prologue of the callee; 
          the saved PC is the address of the stmfd + 8.  */
-      if (!safe_read_memory_integer (fi->frame, 4,  &return_value))
+      if (!safe_read_memory_integer (get_frame_base (fi), 4,  &return_value))
         return;
       else
         {
@@ -914,7 +914,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->extra_info->framereg = ARM_FP_REGNUM;
+         get_frame_extra_info (fi)->framereg = ARM_FP_REGNUM;
        }
       else if ((insn & 0xfffff000) == 0xe24dd000)      /* sub sp, sp #n */
        {
@@ -970,11 +970,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->extra_info->framesize = -sp_offset;
-  if (fi->extra_info->framereg == ARM_FP_REGNUM)
-    fi->extra_info->frameoffset = fp_offset - sp_offset;
+  get_frame_extra_info (fi)->framesize = -sp_offset;
+  if (get_frame_extra_info (fi)->framereg == ARM_FP_REGNUM)
+    get_frame_extra_info (fi)->frameoffset = fp_offset - sp_offset;
   else
-    fi->extra_info->frameoffset = 0;
+    get_frame_extra_info (fi)->frameoffset = 0;
 
   save_prologue_cache (fi);
 }
@@ -992,11 +992,12 @@ arm_find_callers_reg (struct frame_info *fi, int regnum)
   /* NOTE: cagney/2002-05-03: This function really shouldn't be
      needed.  Instead the (still being written) register unwind
      function could be called directly.  */
-  for (; fi; fi = fi->next)
+  for (; fi; fi = get_next_frame (fi))
     {
       if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), 0, 0))
        {
-         return deprecated_read_register_dummy (get_frame_pc (fi), fi->frame, regnum);
+         return deprecated_read_register_dummy (get_frame_pc (fi),
+                                                get_frame_base (fi), regnum);
        }
       else if (get_frame_saved_regs (fi)[regnum] != 0)
        {
@@ -1021,11 +1022,11 @@ static CORE_ADDR
 arm_frame_chain (struct frame_info *fi)
 {
   CORE_ADDR caller_pc;
-  int framereg = fi->extra_info->framereg;
+  int framereg = get_frame_extra_info (fi)->framereg;
 
   if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), 0, 0))
     /* A generic call dummy's frame is the same as caller's.  */
-    return fi->frame;
+    return get_frame_base (fi);
 
   if (get_frame_pc (fi) < LOWEST_PC)
     return 0;
@@ -1049,7 +1050,7 @@ arm_frame_chain (struct frame_info *fi)
       /* Now, scan the prologue and obtain the frame register.  */
       deprecated_update_frame_pc_hack (caller_fi, caller_pc);
       arm_scan_prologue (caller_fi);
-      framereg = caller_fi->extra_info->framereg;
+      framereg = get_frame_extra_info (caller_fi)->framereg;
 
       /* Deallocate the storage associated with the temporary frame
         created above.  */
@@ -1061,7 +1062,7 @@ arm_frame_chain (struct frame_info *fi)
   if (framereg == ARM_FP_REGNUM || framereg == THUMB_FP_REGNUM)
     return arm_find_callers_reg (fi, framereg);
   else
-    return fi->frame + fi->extra_info->framesize;
+    return get_frame_base (fi) + get_frame_extra_info (fi)->framesize;
 }
 
 /* This function actually figures out the frame address for a given pc
@@ -1084,27 +1085,29 @@ arm_init_extra_frame_info (int fromleaf, struct frame_info *fi)
 
   frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
 
-  fi->extra_info->framesize = 0;
-  fi->extra_info->frameoffset = 0;
-  fi->extra_info->framereg = 0;
+  get_frame_extra_info (fi)->framesize = 0;
+  get_frame_extra_info (fi)->frameoffset = 0;
+  get_frame_extra_info (fi)->framereg = 0;
 
-  if (fi->next)
-    deprecated_update_frame_pc_hack (fi, FRAME_SAVED_PC (fi->next));
+  if (get_next_frame (fi))
+    deprecated_update_frame_pc_hack (fi, FRAME_SAVED_PC (get_next_frame (fi)));
 
   memset (get_frame_saved_regs (fi), '\000', sizeof get_frame_saved_regs (fi));
 
   /* Compute stack pointer for this frame.  We use this value for both
      the sigtramp and call dummy cases.  */
-  if (!fi->next)
+  if (!get_next_frame (fi))
     sp = read_sp();
-  else if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi->next), 0, 0))
+  else if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (get_next_frame (fi)), 0, 0))
     /* For generic dummy frames, pull the value direct from the frame.
        Having an unwind function to do this would be nice.  */
-    sp = deprecated_read_register_dummy (get_frame_pc (fi->next), fi->next->frame,
+    sp = deprecated_read_register_dummy (get_frame_pc (get_next_frame (fi)),
+                                        get_frame_base (get_next_frame (fi)),
                                         ARM_SP_REGNUM);
   else
-    sp = (fi->next->frame - fi->next->extra_info->frameoffset
-         + fi->next->extra_info->framesize);
+    sp = (get_frame_base (get_next_frame (fi))
+         - get_frame_extra_info (get_next_frame (fi))->frameoffset
+         + get_frame_extra_info (get_next_frame (fi))->framesize);
 
   /* Determine whether or not we're in a sigtramp frame.
      Unfortunately, it isn't sufficient to test (get_frame_type (fi)
@@ -1130,30 +1133,30 @@ arm_init_extra_frame_info (int fromleaf, struct frame_info *fi)
        get_frame_saved_regs (fi)[reg] = SIGCONTEXT_REGISTER_ADDRESS (sp, get_frame_pc (fi), reg);
 
       /* FIXME: What about thumb mode?  */
-      fi->extra_info->framereg = ARM_SP_REGNUM;
-      deprecated_update_frame_base_hack (fi, read_memory_integer (get_frame_saved_regs (fi)[fi->extra_info->framereg], REGISTER_RAW_SIZE (fi->extra_info->framereg)));
-      fi->extra_info->framesize = 0;
-      fi->extra_info->frameoffset = 0;
+      get_frame_extra_info (fi)->framereg = ARM_SP_REGNUM;
+      deprecated_update_frame_base_hack (fi, read_memory_integer (get_frame_saved_regs (fi)[get_frame_extra_info (fi)->framereg], REGISTER_RAW_SIZE (get_frame_extra_info (fi)->framereg)));
+      get_frame_extra_info (fi)->framesize = 0;
+      get_frame_extra_info (fi)->frameoffset = 0;
 
     }
   else
     {
       arm_scan_prologue (fi);
 
-      if (!fi->next)
+      if (!get_next_frame (fi))
        /* This is the innermost frame?  */
-       deprecated_update_frame_base_hack (fi, read_register (fi->extra_info->framereg));
-      else if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi->next), 0, 0))
+       deprecated_update_frame_base_hack (fi, read_register (get_frame_extra_info (fi)->framereg));
+      else if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (get_next_frame (fi)), 0, 0))
        /* Next inner most frame is a dummy, just grab its frame.
            Dummy frames always have the same FP as their caller.  */
-       deprecated_update_frame_base_hack (fi, fi->next->frame);
-      else if (fi->extra_info->framereg == ARM_FP_REGNUM
-              || fi->extra_info->framereg == THUMB_FP_REGNUM)
+       deprecated_update_frame_base_hack (fi, get_frame_base (get_next_frame (fi)));
+      else if (get_frame_extra_info (fi)->framereg == ARM_FP_REGNUM
+              || get_frame_extra_info (fi)->framereg == THUMB_FP_REGNUM)
        {
          /* not the innermost frame */
          /* If we have an FP, the callee saved it.  */
-         if (get_frame_saved_regs (get_next_frame (fi))[fi->extra_info->framereg] != 0)
-           deprecated_update_frame_base_hack (fi, read_memory_integer (get_frame_saved_regs (get_next_frame (fi))[fi->extra_info->framereg], 4));
+         if (get_frame_saved_regs (get_next_frame (fi))[get_frame_extra_info (fi)->framereg] != 0)
+           deprecated_update_frame_base_hack (fi, read_memory_integer (get_frame_saved_regs (get_next_frame (fi))[get_frame_extra_info (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...  */
@@ -1164,8 +1167,10 @@ arm_init_extra_frame_info (int fromleaf, struct frame_info *fi)
          determined by arm_scan_prologue.  */
       for (reg = 0; reg < NUM_REGS; reg++)
        if (get_frame_saved_regs (fi)[reg] != 0)
-         get_frame_saved_regs (fi)[reg] += (fi->frame + fi->extra_info->framesize
-                                            - fi->extra_info->frameoffset);
+         get_frame_saved_regs (fi)[reg]
+           += (get_frame_base (fi)
+               + get_frame_extra_info (fi)->framesize
+               - get_frame_extra_info (fi)->frameoffset);
     }
 }
 
@@ -1183,10 +1188,13 @@ arm_frame_saved_pc (struct frame_info *fi)
 {
   /* If a dummy frame, pull the PC out of the frame's register buffer.  */
   if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), 0, 0))
-    return deprecated_read_register_dummy (get_frame_pc (fi), fi->frame, ARM_PC_REGNUM);
+    return deprecated_read_register_dummy (get_frame_pc (fi),
+                                          get_frame_base (fi), ARM_PC_REGNUM);
 
-  if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), fi->frame - fi->extra_info->frameoffset,
-                       fi->frame))
+  if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi),
+                                  (get_frame_base (fi)
+                                   - get_frame_extra_info (fi)->frameoffset),
+                                  get_frame_base (fi)))
     {
       return read_memory_integer (get_frame_saved_regs (fi)[ARM_PC_REGNUM],
                                  REGISTER_RAW_SIZE (ARM_PC_REGNUM));
@@ -1508,10 +1516,13 @@ arm_pop_frame (void)
 {
   int regnum;
   struct frame_info *frame = get_current_frame ();
-  CORE_ADDR old_SP = (frame->frame - frame->extra_info->frameoffset
-                     + frame->extra_info->framesize);
+  CORE_ADDR old_SP = (get_frame_base (frame)
+                     - get_frame_extra_info (frame)->frameoffset
+                     + get_frame_extra_info (frame)->framesize);
 
-  if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), frame->frame, frame->frame))
+  if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
+                                  get_frame_base (frame),
+                                  get_frame_base (frame)))
     {
       generic_pop_dummy_frame ();
       flush_cached_frames ();
@@ -3018,10 +3029,12 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* We can't use NUM_REGS nor NUM_PSEUDO_REGS here, since that still
      references the old architecture vector, not the one we are
      building here.  */
-  prologue_cache->saved_regs = (CORE_ADDR *)
-    xcalloc (1, (sizeof (CORE_ADDR)
-                * (gdbarch_num_regs (gdbarch)
-                   + gdbarch_num_pseudo_regs (gdbarch))));
+  {
+    CORE_ADDR *saved_regs = xcalloc (1, (sizeof (CORE_ADDR)
+                                        * (gdbarch_num_regs (gdbarch)
+                                           + gdbarch_num_pseudo_regs (gdbarch))));
+    deprecated_set_frame_saved_regs_hack (prologue_cache, saved_regs);
+  }
 
   return gdbarch;
 }
This page took 0.029924 seconds and 4 git commands to generate.