OSDN Git Service

* gcc/unwind-dw2.h: Move cfa-related variables into
authorfroydnj <froydnj@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Oct 2006 19:31:09 +0000 (19:31 +0000)
committerfroydnj <froydnj@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Oct 2006 19:31:09 +0000 (19:31 +0000)
struct frame_state_reg_info to ensure that the CFA is properly
handled when executing DW_CFA_{remember,restore}_state.
* gcc/unwind-dw2.c, gcc/config/alpha/linux-unwind.h,
gcc/config/alpha/vms-unwind.h, gcc/config/s390/tpf-unwind.h
gcc/config/s390/linux-unwind.h, gcc/config/sparc/linux-unwind.h
gcc/config/i386/linux-unwind.h, gcc/config/sh/linux-unwind.h
gcc/config/rs6000/linux-unwind.h,
gcc/config/rs6000/darwin-fallback.c, gcc/config/pa/linux-unwind.h,
gcc/config/pa/hpux-unwind.h, gcc/config/mips/linux-unwind.h:
Modify to use new cfa_* fields.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118068 138bc75d-0d04-0410-961f-82ee72b054a4

15 files changed:
gcc/ChangeLog
gcc/config/alpha/linux-unwind.h
gcc/config/alpha/vms-unwind.h
gcc/config/i386/linux-unwind.h
gcc/config/mips/linux-unwind.h
gcc/config/pa/hpux-unwind.h
gcc/config/pa/linux-unwind.h
gcc/config/rs6000/darwin-fallback.c
gcc/config/rs6000/linux-unwind.h
gcc/config/s390/linux-unwind.h
gcc/config/s390/tpf-unwind.h
gcc/config/sh/linux-unwind.h
gcc/config/sparc/linux-unwind.h
gcc/unwind-dw2.c
gcc/unwind-dw2.h

index 554a22c..e6897b4 100644 (file)
@@ -1,3 +1,17 @@
+2006-10-26  Nathan Froyd <froydnj@codesourcery.com>
+
+       * gcc/unwind-dw2.h: Move cfa-related variables into
+       struct frame_state_reg_info to ensure that the CFA is properly
+       handled when executing DW_CFA_{remember,restore}_state.
+       * gcc/unwind-dw2.c, gcc/config/alpha/linux-unwind.h,
+       gcc/config/alpha/vms-unwind.h, gcc/config/s390/tpf-unwind.h
+       gcc/config/s390/linux-unwind.h, gcc/config/sparc/linux-unwind.h
+       gcc/config/i386/linux-unwind.h, gcc/config/sh/linux-unwind.h
+       gcc/config/rs6000/linux-unwind.h,
+       gcc/config/rs6000/darwin-fallback.c, gcc/config/pa/linux-unwind.h,
+       gcc/config/pa/hpux-unwind.h, gcc/config/mips/linux-unwind.h:
+       Modify to use new cfa_* fields.
+
 2006-10-26  Andreas Krebbel  <krebbel1@de.ibm.com>
 
        * config/s390/s390.c (s390_init_frame_layout): Check positive
index 1f1c2af..23151ad 100644 (file)
@@ -60,9 +60,9 @@ alpha_fallback_frame_state (struct _Unwind_Context *context,
   else
     return _URC_END_OF_STACK;
   new_cfa = sc->sc_regs[30];
-  fs->cfa_how = CFA_REG_OFFSET;
-  fs->cfa_reg = 30;
-  fs->cfa_offset = new_cfa - (long) context->cfa;
+  fs->regs.cfa_how = CFA_REG_OFFSET;
+  fs->regs.cfa_reg = 30;
+  fs->regs.cfa_offset = new_cfa - (long) context->cfa;
   for (i = 0; i < 30; ++i)
     {
       fs->regs.reg[i].how = REG_SAVED_OFFSET;
index 4fb6a19..1ecad03 100644 (file)
@@ -35,10 +35,10 @@ alpha_fallback_frame_state (struct _Unwind_Context *context,
     {
       int i, j;
 
-      fs->cfa_offset = pv->pdsc$l_size;
-      fs->cfa_reg = pv->pdsc$w_flags & PDSC$M_BASE_REG_IS_FP ? 29 : 30;
+      fs->regs.cfa_offset = pv->pdsc$l_size;
+      fs->regs.cfa_reg = pv->pdsc$w_flags & PDSC$M_BASE_REG_IS_FP ? 29 : 30;
       fs->retaddr_column = 26;
-      fs->cfa_how = CFA_REG_OFFSET;
+      fs->regs.cfa_how = CFA_REG_OFFSET;
       fs->regs.reg[27].loc.offset = -pv->pdsc$l_size;
       fs->regs.reg[27].how = REG_SAVED_OFFSET;
       fs->regs.reg[26].loc.offset
@@ -57,10 +57,10 @@ alpha_fallback_frame_state (struct _Unwind_Context *context,
     }
   else if (pv && ((pv->pdsc$w_flags & 0xf) == PDSC$K_KIND_FP_REGISTER))
     {
-      fs->cfa_offset = pv->pdsc$l_size;
-      fs->cfa_reg = pv->pdsc$w_flags & PDSC$M_BASE_REG_IS_FP ? 29 : 30;
+      fs->regs.cfa_offset = pv->pdsc$l_size;
+      fs->regs.cfa_reg = pv->pdsc$w_flags & PDSC$M_BASE_REG_IS_FP ? 29 : 30;
       fs->retaddr_column = 26;
-      fs->cfa_how = CFA_REG_OFFSET;
+      fs->regs.cfa_how = CFA_REG_OFFSET;
       fs->regs.reg[26].loc.reg = pv->pdsc$b_save_ra;
       fs->regs.reg[26].how = REG_SAVED_REG;
       fs->regs.reg[29].loc.reg = pv->pdsc$b_save_fp;
index 07979d3..58eb733 100644 (file)
@@ -61,10 +61,10 @@ x86_64_fallback_frame_state (struct _Unwind_Context *context,
     return _URC_END_OF_STACK;
 
   new_cfa = sc->rsp;
-  fs->cfa_how = CFA_REG_OFFSET;
+  fs->regs.cfa_how = CFA_REG_OFFSET;
   /* Register 7 is rsp  */
-  fs->cfa_reg = 7;
-  fs->cfa_offset = new_cfa - (long) context->cfa;
+  fs->regs.cfa_reg = 7;
+  fs->regs.cfa_offset = new_cfa - (long) context->cfa;
 
   /* The SVR4 register numbering macros aren't usable in libgcc.  */
   fs->regs.reg[0].how = REG_SAVED_OFFSET;
@@ -151,9 +151,9 @@ x86_fallback_frame_state (struct _Unwind_Context *context,
     return _URC_END_OF_STACK;
 
   new_cfa = sc->REG_NAME(esp);
-  fs->cfa_how = CFA_REG_OFFSET;
-  fs->cfa_reg = 4;
-  fs->cfa_offset = new_cfa - (long) context->cfa;
+  fs->regs.cfa_how = CFA_REG_OFFSET;
+  fs->regs.cfa_reg = 4;
+  fs->regs.cfa_offset = new_cfa - (long) context->cfa;
 
   /* The SVR4 register numbering macros aren't usable in libgcc.  */
   fs->regs.reg[0].how = REG_SAVED_OFFSET;
index 4f96e95..bbb2445 100644 (file)
@@ -86,9 +86,9 @@ mips_fallback_frame_state (struct _Unwind_Context *context,
     return _URC_END_OF_STACK;
 
   new_cfa = (_Unwind_Ptr)sc;
-  fs->cfa_how = CFA_REG_OFFSET;
-  fs->cfa_reg = STACK_POINTER_REGNUM;
-  fs->cfa_offset = new_cfa - (_Unwind_Ptr) context->cfa;
+  fs->regs.cfa_how = CFA_REG_OFFSET;
+  fs->regs.cfa_reg = STACK_POINTER_REGNUM;
+  fs->regs.cfa_offset = new_cfa - (_Unwind_Ptr) context->cfa;
 
 #if _MIPS_SIM == _ABIO32 && defined __MIPSEB__
   /* On o32 Linux, the register save slots in the sigcontext are
index d521498..1082a34 100644 (file)
@@ -147,9 +147,9 @@ pa_fallback_frame_state (struct _Unwind_Context *context,
        && *(pc + 0) == 0x4bc23fd1              /* ldw -18(sp),rp */
        && *(pc + 1) == 0xe840d002))            /* bve,n (rp) */
     {
-      fs->cfa_how    = CFA_REG_OFFSET;
-      fs->cfa_reg    = 30;
-      fs->cfa_offset = 0;
+      fs->regs.cfa_how    = CFA_REG_OFFSET;
+      fs->regs.cfa_reg    = 30;
+      fs->regs.cfa_offset = 0;
 
       fs->retaddr_column = 0;
       fs->regs.reg[0].how = REG_SAVED_OFFSET;
@@ -167,9 +167,9 @@ pa_fallback_frame_state (struct _Unwind_Context *context,
           && (*(pc + 1) == 0xe840c002          /* bv,n r0(rp) */
               || *(pc + 1) == 0xe840d002))     /* bve,n (rp) */
     {
-      fs->cfa_how    = CFA_REG_OFFSET;
-      fs->cfa_reg    = 30;
-      fs->cfa_offset = 0;
+      fs->regs.cfa_how    = CFA_REG_OFFSET;
+      fs->regs.cfa_reg    = 30;
+      fs->regs.cfa_offset = 0;
 
       fs->retaddr_column = 0;
       fs->regs.reg[0].how = REG_SAVED_OFFSET;
@@ -239,9 +239,9 @@ pa_fallback_frame_state (struct _Unwind_Context *context,
 
       long new_cfa = GetSSReg (mc, ss_sp);
 
-      fs->cfa_how = CFA_REG_OFFSET;
-      fs->cfa_reg = 30;
-      fs->cfa_offset = new_cfa - (long) context->cfa;
+      fs->regs.cfa_how = CFA_REG_OFFSET;
+      fs->regs.cfa_reg = 30;
+      fs->regs.cfa_offset = new_cfa - (long) context->cfa;
 
       UPDATE_FS_FOR_GR (fs, 1, 1);
       UPDATE_FS_FOR_GR (fs, 2, 2);
index 36b9b38..467d952 100644 (file)
@@ -111,9 +111,9 @@ pa32_fallback_frame_state (struct _Unwind_Context *context,
   sc = &frame->uc.uc_mcontext;
 
   new_cfa = sc->sc_gr[30];
-  fs->cfa_how = CFA_REG_OFFSET;
-  fs->cfa_reg = 30;
-  fs->cfa_offset = new_cfa - (long) context->cfa;
+  fs->regs.cfa_how = CFA_REG_OFFSET;
+  fs->regs.cfa_reg = 30;
+  fs->regs.cfa_offset = new_cfa - (long) context->cfa;
   for (i = 1; i <= 31; i++)
     {
       fs->regs.reg[i].how = REG_SAVED_OFFSET;
index 5d3de32..c3a59c3 100644 (file)
@@ -421,9 +421,9 @@ handle_syscall (_Unwind_FrameState *fs, const reg_unit gprs[32],
        return_addr = m->srr0;
     }
 
-  fs->cfa_how = CFA_REG_OFFSET;
-  fs->cfa_reg = STACK_POINTER_REGNUM;
-  fs->cfa_offset = new_cfa - old_cfa;;
+  fs->regs.cfa_how = CFA_REG_OFFSET;
+  fs->regs.cfa_reg = STACK_POINTER_REGNUM;
+  fs->regs.cfa_offset = new_cfa - old_cfa;;
   
   /* The choice of column for the return address is somewhat tricky.
      Fortunately, the actual choice is private to this file, and
index da3bc8e..2758cbc 100644 (file)
@@ -232,9 +232,9 @@ ppc_fallback_frame_state (struct _Unwind_Context *context,
     return _URC_END_OF_STACK;
 
   new_cfa = regs->gpr[STACK_POINTER_REGNUM];
-  fs->cfa_how = CFA_REG_OFFSET;
-  fs->cfa_reg = STACK_POINTER_REGNUM;
-  fs->cfa_offset = new_cfa - (long) context->cfa;
+  fs->regs.cfa_how = CFA_REG_OFFSET;
+  fs->regs.cfa_reg = STACK_POINTER_REGNUM;
+  fs->regs.cfa_offset = new_cfa - (long) context->cfa;
 
   for (i = 0; i < 32; i++)
     if (i != STACK_POINTER_REGNUM)
index 221a5d4..5ff880e 100644 (file)
@@ -101,9 +101,9 @@ s390_fallback_frame_state (struct _Unwind_Context *context,
     }
 
   new_cfa = regs->gprs[15] + 16*sizeof(long) + 32;
-  fs->cfa_how = CFA_REG_OFFSET;
-  fs->cfa_reg = 15;
-  fs->cfa_offset =
+  fs->regs.cfa_how = CFA_REG_OFFSET;
+  fs->regs.cfa_reg = 15;
+  fs->regs.cfa_offset =
     new_cfa - (long) context->cfa + 16*sizeof(long) + 32;
 
   for (i = 0; i < 16; i++)
index 87b6892..eabd51e 100644 (file)
@@ -76,9 +76,9 @@ s390_fallback_frame_state (struct _Unwind_Context *context,
          return _URC_END_OF_STACK;
 
       /* No stack frame.  */
-      fs->cfa_how = CFA_REG_OFFSET;
-      fs->cfa_reg = 15;
-      fs->cfa_offset = STACK_POINTER_OFFSET;
+      fs->regs.cfa_how = CFA_REG_OFFSET;
+      fs->regs.cfa_reg = 15;
+      fs->regs.cfa_offset = STACK_POINTER_OFFSET;
 
       /* All registers remain unchanged ...  */
       for (i = 0; i < 32; i++)
@@ -100,9 +100,9 @@ s390_fallback_frame_state (struct _Unwind_Context *context,
         (((unsigned long int) context->cfa) - STACK_POINTER_OFFSET));
   new_cfa = regs + STACK_POINTER_OFFSET;
 
-  fs->cfa_how = CFA_REG_OFFSET;
-  fs->cfa_reg = 15;
-  fs->cfa_offset = new_cfa -
+  fs->regs.cfa_how = CFA_REG_OFFSET;
+  fs->regs.cfa_reg = 15;
+  fs->regs.cfa_offset = new_cfa -
         (unsigned long int) context->cfa + STACK_POINTER_OFFSET;
 
   for (i = 0; i < 16; i++)
index de84a77..5374f8a 100644 (file)
@@ -94,9 +94,9 @@ shmedia_fallback_frame_state (struct _Unwind_Context *context,
     return _URC_END_OF_STACK;
 
   new_cfa = sc->sc_regs[15];
-  fs->cfa_how = CFA_REG_OFFSET;
-  fs->cfa_reg = 15;
-  fs->cfa_offset = new_cfa - (long) context->cfa;
+  fs->regs.cfa_how = CFA_REG_OFFSET;
+  fs->regs.cfa_reg = 15;
+  fs->regs.cfa_offset = new_cfa - (long) context->cfa;
 
   for (i = 0; i < 63; i++)
     {
@@ -191,9 +191,9 @@ sh_fallback_frame_state (struct _Unwind_Context *context,
     return _URC_END_OF_STACK;
 
   new_cfa = sc->sc_regs[15];
-  fs->cfa_how = CFA_REG_OFFSET;
-  fs->cfa_reg = 15;
-  fs->cfa_offset = new_cfa - (long) context->cfa;
+  fs->regs.cfa_how = CFA_REG_OFFSET;
+  fs->regs.cfa_reg = 15;
+  fs->regs.cfa_offset = new_cfa - (long) context->cfa;
 
   for (i = 0; i < 15; i++)
     {
index 958cb2d..f8a3819 100644 (file)
@@ -53,9 +53,9 @@ sparc64_fallback_frame_state (struct _Unwind_Context *context,
   new_cfa = *(long *)((context->cfa) + (regs_off + (14 * 8)));
   new_cfa += 2047; /* Stack bias */
   fpu_save = *(long *)((this_cfa) + (fpu_save_off));
-  fs->cfa_how = CFA_REG_OFFSET;
-  fs->cfa_reg = 14;
-  fs->cfa_offset = new_cfa - (long) context->cfa;
+  fs->regs.cfa_how = CFA_REG_OFFSET;
+  fs->regs.cfa_reg = 14;
+  fs->regs.cfa_offset = new_cfa - (long) context->cfa;
   for (i = 1; i < 16; ++i)
     {
       fs->regs.reg[i].how = REG_SAVED_OFFSET;
@@ -122,9 +122,9 @@ sparc_fallback_frame_state (struct _Unwind_Context *context,
   this_cfa = (int) context->cfa;
   new_cfa = *(int *)((context->cfa) + (regs_off+(4*4)+(14 * 4)));
   fpu_save = *(int *)((this_cfa) + (fpu_save_off));
-  fs->cfa_how = CFA_REG_OFFSET;
-  fs->cfa_reg = 14;
-  fs->cfa_offset = new_cfa - (int) context->cfa;
+  fs->regs.cfa_how = CFA_REG_OFFSET;
+  fs->regs.cfa_reg = 14;
+  fs->regs.cfa_offset = new_cfa - (int) context->cfa;
   for (i = 1; i < 16; ++i)
     {
       if (i == 14)
index d205122..a3fd9e0 100644 (file)
@@ -932,26 +932,26 @@ execute_cfa_program (const unsigned char *insn_ptr,
          break;
 
        case DW_CFA_def_cfa:
-         insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg);
+         insn_ptr = read_uleb128 (insn_ptr, &fs->regs.cfa_reg);
          insn_ptr = read_uleb128 (insn_ptr, &utmp);
-         fs->cfa_offset = utmp;
-         fs->cfa_how = CFA_REG_OFFSET;
+         fs->regs.cfa_offset = utmp;
+         fs->regs.cfa_how = CFA_REG_OFFSET;
          break;
 
        case DW_CFA_def_cfa_register:
-         insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg);
-         fs->cfa_how = CFA_REG_OFFSET;
+         insn_ptr = read_uleb128 (insn_ptr, &fs->regs.cfa_reg);
+         fs->regs.cfa_how = CFA_REG_OFFSET;
          break;
 
        case DW_CFA_def_cfa_offset:
          insn_ptr = read_uleb128 (insn_ptr, &utmp);
-         fs->cfa_offset = utmp;
+         fs->regs.cfa_offset = utmp;
          /* cfa_how deliberately not set.  */
          break;
 
        case DW_CFA_def_cfa_expression:
-         fs->cfa_exp = insn_ptr;
-         fs->cfa_how = CFA_EXP;
+         fs->regs.cfa_exp = insn_ptr;
+         fs->regs.cfa_how = CFA_EXP;
          insn_ptr = read_uleb128 (insn_ptr, &utmp);
          insn_ptr += utmp;
          break;
@@ -975,15 +975,15 @@ execute_cfa_program (const unsigned char *insn_ptr,
          break;
 
        case DW_CFA_def_cfa_sf:
-         insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg);
-         insn_ptr = read_sleb128 (insn_ptr, &fs->cfa_offset);
-         fs->cfa_how = CFA_REG_OFFSET;
-         fs->cfa_offset *= fs->data_align;
+         insn_ptr = read_uleb128 (insn_ptr, &fs->regs.cfa_reg);
+         insn_ptr = read_sleb128 (insn_ptr, &fs->regs.cfa_offset);
+         fs->regs.cfa_how = CFA_REG_OFFSET;
+         fs->regs.cfa_offset *= fs->data_align;
          break;
 
        case DW_CFA_def_cfa_offset_sf:
-         insn_ptr = read_sleb128 (insn_ptr, &fs->cfa_offset);
-         fs->cfa_offset *= fs->data_align;
+         insn_ptr = read_sleb128 (insn_ptr, &fs->regs.cfa_offset);
+         fs->regs.cfa_offset *= fs->data_align;
          /* cfa_how deliberately not set.  */
          break;
 
@@ -1149,7 +1149,7 @@ __frame_state_for (void *pc_target, struct frame_state *state_in)
 
   /* We have no way to pass a location expression for the CFA to our
      caller.  It wouldn't understand it anyway.  */
-  if (fs.cfa_how == CFA_EXP)
+  if (fs.regs.cfa_how == CFA_EXP)
     return 0;
 
   for (reg = 0; reg < PRE_GCC3_DWARF_FRAME_REGISTERS + 1; reg++)
@@ -1169,8 +1169,8 @@ __frame_state_for (void *pc_target, struct frame_state *state_in)
        }
     }
 
-  state_in->cfa_offset = fs.cfa_offset;
-  state_in->cfa_reg = fs.cfa_reg;
+  state_in->cfa_offset = fs.regs.cfa_offset;
+  state_in->cfa_reg = fs.regs.cfa_reg;
   state_in->retaddr_column = fs.retaddr_column;
   state_in->args_size = context.args_size;
   state_in->eh_ptr = fs.eh_ptr;
@@ -1227,16 +1227,16 @@ uw_update_context_1 (struct _Unwind_Context *context, _Unwind_FrameState *fs)
 #endif
 
   /* Compute this frame's CFA.  */
-  switch (fs->cfa_how)
+  switch (fs->regs.cfa_how)
     {
     case CFA_REG_OFFSET:
-      cfa = _Unwind_GetPtr (&orig_context, fs->cfa_reg);
-      cfa += fs->cfa_offset;
+      cfa = _Unwind_GetPtr (&orig_context, fs->regs.cfa_reg);
+      cfa += fs->regs.cfa_offset;
       break;
 
     case CFA_EXP:
       {
-       const unsigned char *exp = fs->cfa_exp;
+       const unsigned char *exp = fs->regs.cfa_exp;
        _Unwind_Word len;
 
        exp = read_uleb128 (exp, &len);
@@ -1384,9 +1384,9 @@ uw_init_context_1 (struct _Unwind_Context *context,
 
   /* Force the frame state to use the known cfa value.  */
   _Unwind_SetSpColumn (context, outer_cfa, &sp_slot);
-  fs.cfa_how = CFA_REG_OFFSET;
-  fs.cfa_reg = __builtin_dwarf_sp_column ();
-  fs.cfa_offset = 0;
+  fs.regs.cfa_how = CFA_REG_OFFSET;
+  fs.regs.cfa_reg = __builtin_dwarf_sp_column ();
+  fs.regs.cfa_offset = 0;
 
   uw_update_context_1 (context, &fs);
 
index 34a378b..db3a1ab 100644 (file)
@@ -61,18 +61,18 @@ typedef struct
 
     /* Used to implement DW_CFA_remember_state.  */
     struct frame_state_reg_info *prev;
-  } regs;
 
-  /* The CFA can be described in terms of a reg+offset or a
-     location expression.  */
-  _Unwind_Sword cfa_offset;
-  _Unwind_Word cfa_reg;
-  const unsigned char *cfa_exp;
-  enum {
-    CFA_UNSET,
-    CFA_REG_OFFSET,
-    CFA_EXP
-  } cfa_how;
+    /* The CFA can be described in terms of a reg+offset or a
+       location expression.  */
+    _Unwind_Sword cfa_offset;
+    _Unwind_Word cfa_reg;
+    const unsigned char *cfa_exp;
+    enum {
+      CFA_UNSET,
+      CFA_REG_OFFSET,
+      CFA_EXP
+    } cfa_how;
+  } regs;
 
   /* The PC described by the current frame state.  */
   void *pc;