]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
builtins.c (expand_builtin): Remove.
authorRichard Henderson <rth@redhat.com>
Sun, 4 May 2003 22:29:15 +0000 (15:29 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sun, 4 May 2003 22:29:15 +0000 (15:29 -0700)
        * builtins.c (expand_builtin) <BUILT_IN_DWARF_FP_REGNUM>: Remove.
        <BUILT_IN_DWARF_SP_COLUMN>: New.
        * builtins.def (BUILT_IN_DWARF_FP_REGNUM): Remove.
        (BUILT_IN_DWARF_SP_COLUMN): New.
        * dwarf2out.c (expand_builtin_dwarf_fp_regnum): Remove.
        (expand_builtin_dwarf_sp_column): New.
        * except.h: Update to match.
        * unwind-dw2.c (execute_stack_op): Correct stack push typo.
        (execute_cfa_program): Record location expression address
        before extracting length.
        (uw_update_context_1): Install old CFA into stack pointer column.
        (uw_init_context_1): Set cfa_reg to stack pointer column.

From-SVN: r66470

gcc/ChangeLog
gcc/builtins.c
gcc/builtins.def
gcc/dwarf2out.c
gcc/except.h
gcc/unwind-dw2.c

index 49adc796b62f9ed0489637d71097dac5a1ab9354..8f149816dc39105a224cb266718867d88fdf0d0c 100644 (file)
@@ -1,3 +1,18 @@
+2003-05-03  Richard Henderson  <rth@redhat.com>
+
+        * builtins.c (expand_builtin) <BUILT_IN_DWARF_FP_REGNUM>: Remove.
+        <BUILT_IN_DWARF_SP_COLUMN>: New.
+        * builtins.def (BUILT_IN_DWARF_FP_REGNUM): Remove.
+        (BUILT_IN_DWARF_SP_COLUMN): New.
+        * dwarf2out.c (expand_builtin_dwarf_fp_regnum): Remove.
+        (expand_builtin_dwarf_sp_column): New.
+        * except.h: Update to match.
+        * unwind-dw2.c (execute_stack_op): Correct stack push typo.
+        (execute_cfa_program): Record location expression address
+        before extracting length.
+        (uw_update_context_1): Install old CFA into stack pointer column.
+        (uw_init_context_1): Set cfa_reg to stack pointer column.
+
 2003-04-29  Jason Merrill  <jason@redhat.com>
 
        PR middle-end/10336
index ca39c0bdce049a619bb1be1cde8569483c815334..dd61baf843c3cbdf1d2f840e42285d3d8bd975de 100644 (file)
@@ -3952,8 +3952,8 @@ expand_builtin (exp, target, subtarget, mode, ignore)
     case BUILT_IN_DWARF_CFA:
       return virtual_cfa_rtx;
 #ifdef DWARF2_UNWIND_INFO
-    case BUILT_IN_DWARF_FP_REGNUM:
-      return expand_builtin_dwarf_fp_regnum ();
+    case BUILT_IN_DWARF_SP_COLUMN:
+      return expand_builtin_dwarf_sp_column ();
     case BUILT_IN_INIT_DWARF_REG_SIZES:
       expand_builtin_init_dwarf_reg_sizes (TREE_VALUE (arglist));
       return const0_rtx;
index c6f6dc426f9c8334074c40ce484fdbf2bad9872e..af2f43e2e16bd3884cd362a217f28d3d3778ec95 100644 (file)
@@ -446,8 +446,8 @@ DEF_GCC_BUILTIN(BUILT_IN_UNWIND_INIT,
 DEF_GCC_BUILTIN(BUILT_IN_DWARF_CFA,
                "__builtin_dwarf_cfa",
                BT_FN_PTR)
-DEF_GCC_BUILTIN(BUILT_IN_DWARF_FP_REGNUM,
-               "__builtin_dwarf_fp_regnum",
+DEF_GCC_BUILTIN(BUILT_IN_DWARF_SP_COLUMN,
+               "__builtin_dwarf_sp_column",
                BT_FN_UNSIGNED)
 DEF_GCC_BUILTIN(BUILT_IN_INIT_DWARF_REG_SIZES,
                "__builtin_init_dwarf_reg_size_table",
index 8a3f613ee803ff8483d2bf186a1c53444c4c5845..bbeb5579ae16ed5312a11e709a38fa5cbf7ca3ae 100644 (file)
@@ -382,9 +382,9 @@ static void def_cfa_1                       PARAMS ((const char *,
 /* Hook used by __throw.  */
 
 rtx
-expand_builtin_dwarf_fp_regnum ()
+expand_builtin_dwarf_sp_column ()
 {
-  return GEN_INT (DWARF_FRAME_REGNUM (HARD_FRAME_POINTER_REGNUM));
+  return GEN_INT (DWARF_FRAME_REGNUM (STACK_POINTER_REGNUM));
 }
 
 /* Return a pointer to a copy of the section string name S with all
index 883a2b1865a08ff97a7d6780aa8fe2b354b04a6b..df4847773cb9aa259307333664f6dd4b0c7f02bf 100644 (file)
@@ -128,7 +128,7 @@ extern rtx expand_builtin_eh_return_data_regno      PARAMS ((tree));
 extern rtx expand_builtin_extract_return_addr  PARAMS ((tree));
 extern void expand_builtin_init_dwarf_reg_sizes PARAMS ((tree));
 extern rtx expand_builtin_frob_return_addr     PARAMS ((tree));
-extern rtx expand_builtin_dwarf_fp_regnum      PARAMS ((void));
+extern rtx expand_builtin_dwarf_sp_column      PARAMS ((void));
 extern void expand_builtin_eh_return           PARAMS ((tree, tree));
 extern void expand_eh_return                   PARAMS ((void));
 extern rtx get_exception_pointer               PARAMS ((struct function *));
index 8151d69c25b309dd3b6fb17e5333b7e63f812ce6..d4269dfcd928fe0e6c3b060fe922fd7d35b29af7 100644 (file)
@@ -679,7 +679,7 @@ execute_stack_op (const unsigned char *op_ptr, const unsigned char *op_end,
       /* Most things push a result value.  */
       if ((size_t) stack_elt >= sizeof(stack)/sizeof(*stack))
        abort ();
-      stack[++stack_elt] = result;
+      stack[stack_elt++] = result;
     no_push:;
     }
 
@@ -829,17 +829,17 @@ execute_cfa_program (const unsigned char *insn_ptr,
          break;
 
        case DW_CFA_def_cfa_expression:
-         insn_ptr = read_uleb128 (insn_ptr, &utmp);
          fs->cfa_exp = insn_ptr;
          fs->cfa_how = CFA_EXP;
+         insn_ptr = read_uleb128 (insn_ptr, &utmp);
          insn_ptr += utmp;
          break;
 
        case DW_CFA_expression:
          insn_ptr = read_uleb128 (insn_ptr, &reg);
-         insn_ptr = read_uleb128 (insn_ptr, &utmp);
          fs->regs.reg[reg].how = REG_SAVED_EXP;
          fs->regs.reg[reg].loc.exp = insn_ptr;
+         insn_ptr = read_uleb128 (insn_ptr, &utmp);
          insn_ptr += utmp;
          break;
 
@@ -1020,37 +1020,41 @@ static void
 uw_update_context_1 (struct _Unwind_Context *context, _Unwind_FrameState *fs)
 {
   struct _Unwind_Context orig_context = *context;
+  _Unwind_Word tmp_sp;
   void *cfa;
   long i;
 
+  /* Special handling here: Many machines do not use a frame pointer,
+     and track the CFA only through offsets from the stack pointer from
+     one frame to the next.  In this case, the stack pointer is never
+     stored, so it has no saved address in the context.  What we do
+     have is the CFA from the previous stack frame.
+
+     In very special situations (such as unwind info for signal return),
+     there may be location expressions that use the stack pointer as well.
+
+     Given that other unwind mechanisms generally won't work if you try
+     to represent stack pointer saves and restores directly, we don't
+     bother conditionalizing this at all.  */
+  tmp_sp = (_Unwind_Ptr) context->cfa;
+  orig_context.reg[__builtin_dwarf_sp_column ()] = &tmp_sp;
+
   /* Compute this frame's CFA.  */
   switch (fs->cfa_how)
     {
     case CFA_REG_OFFSET:
-      /* Special handling here: Many machines do not use a frame pointer,
-        and track the CFA only through offsets from the stack pointer from
-        one frame to the next.  In this case, the stack pointer is never
-        stored, so it has no saved address in the context.  What we do 
-        have is the CFA from the previous stack frame.  */
-      if (context->reg[fs->cfa_reg] == NULL)
-       cfa = context->cfa;
-      else
-       cfa = (void *) (_Unwind_Ptr) _Unwind_GetGR (context, fs->cfa_reg);
+      cfa = (void *) (_Unwind_Ptr) _Unwind_GetGR (&orig_context, fs->cfa_reg);
       cfa += fs->cfa_offset;
       break;
 
     case CFA_EXP:
-      /* ??? No way of knowing what register number is the stack pointer
-        to do the same sort of handling as above.  Assume that if the
-        CFA calculation is so complicated as to require a stack program
-        that this will not be a problem.  */
       {
        const unsigned char *exp = fs->cfa_exp;
        _Unwind_Word len;
 
        exp = read_uleb128 (exp, &len);
        cfa = (void *) (_Unwind_Ptr)
-         execute_stack_op (exp, exp + len, context, 0);
+         execute_stack_op (exp, exp + len, &orig_context, 0);
        break;
       }
 
@@ -1065,12 +1069,15 @@ uw_update_context_1 (struct _Unwind_Context *context, _Unwind_FrameState *fs)
       {
       case REG_UNSAVED:
        break;
+
       case REG_SAVED_OFFSET:
        context->reg[i] = cfa + fs->regs.reg[i].loc.offset;
        break;
+
       case REG_SAVED_REG:
        context->reg[i] = orig_context.reg[fs->regs.reg[i].loc.reg];
        break;
+
       case REG_SAVED_EXP:
        {
          const unsigned char *exp = fs->regs.reg[i].loc.exp;
@@ -1127,7 +1134,7 @@ uw_init_context_1 (struct _Unwind_Context *context,
   /* Force the frame state to use the known cfa value.  */
   context->cfa = outer_cfa;
   fs.cfa_how = CFA_REG_OFFSET;
-  fs.cfa_reg = 0;
+  fs.cfa_reg = __builtin_dwarf_sp_column ();
   fs.cfa_offset = 0;
 
   uw_update_context_1 (context, &fs);