dwarf2cfi: Simplify re-initialization for each function.
authorRichard Henderson <rth@redhat.com>
Sat, 9 Jul 2011 20:30:07 +0000 (13:30 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sat, 9 Jul 2011 20:30:07 +0000 (13:30 -0700)
There's no point calling lookup_cfa to re-create the CFA
we initialized just a few lines above.

        * dwarf2cfi.c (lookup_cfa): Remove.
        (execute_dwarf2_frame): Assert queues are empty on entry.
        Setup initial cfa directly, not via lookup_cfa.
        Don't clear args_size state here.

From-SVN: r176098

gcc/ChangeLog
gcc/dwarf2cfi.c

index 3b8fdf86a32ccb4a2a9b366f1c3aa32c165029b3..d5fd40a2cbb6796a9a236bcc16a72e226ba47896 100644 (file)
@@ -1,3 +1,10 @@
+2011-07-09  Richard Henderson  <rth@redhat.com>
+
+       * dwarf2cfi.c (lookup_cfa): Remove.
+       (execute_dwarf2_frame): Assert queues are empty on entry.
+       Setup initial cfa directly, not via lookup_cfa.
+       Don't clear args_size state here.
+
 2011-07-09  Richard Henderson  <rth@redhat.com>
 
        * dwarf2cfi.c (add_cfi_vec): New.
index ca9b50397ae04a932b51ac4a029ee8f70a0ded1b..b4b035ddd56c113d5c735b97951abadb17d9978d 100644 (file)
@@ -405,7 +405,9 @@ get_cfa_from_loc_descr (dw_cfa_location *cfa, struct dw_loc_descr_struct *loc)
     }
 }
 
-/* Subroutine of lookup_cfa.  */
+/* Find the previous value for the CFA, iteratively.  CFI is the opcode
+   to interpret, *LOC will be updated as necessary, *REMEMBER is used for
+   one level of remember/restore state processing.  */
 
 void
 lookup_cfa_1 (dw_cfi_ref cfi, dw_cfa_location *loc, dw_cfa_location *remember)
@@ -444,29 +446,6 @@ lookup_cfa_1 (dw_cfi_ref cfi, dw_cfa_location *loc, dw_cfa_location *remember)
     }
 }
 
-/* Find the previous value for the CFA.  */
-
-static void
-lookup_cfa (dw_cfa_location *loc)
-{
-  int ix;
-  dw_cfi_ref cfi;
-  dw_fde_ref fde;
-  dw_cfa_location remember;
-
-  memset (loc, 0, sizeof (*loc));
-  loc->reg = INVALID_REGNUM;
-  remember = *loc;
-
-  FOR_EACH_VEC_ELT (dw_cfi_ref, cie_cfi_vec, ix, cfi)
-    lookup_cfa_1 (cfi, loc, &remember);
-
-  fde = cfun->fde;
-  if (fde)
-    FOR_EACH_VEC_ELT (dw_cfi_ref, fde->dw_fde_cfi, ix, cfi)
-      lookup_cfa_1 (cfi, loc, &remember);
-}
-
 /* The current rule for calculating the DWARF2 canonical frame address.  */
 static dw_cfa_location cfa;
 
@@ -2301,7 +2280,7 @@ dwarf2out_frame_debug (rtx insn, bool after_p)
 
 /* Examine CFI and return true if a cfi label and set_loc is needed
    beforehand.  Even when generating CFI assembler instructions, we
-   still have to add the cfi to the list so that lookup_cfa works
+   still have to add the cfi to the list so that lookup_cfa_1 works
    later on.  When -g2 and above we even need to force emitting of
    CFI labels and add to list a DW_CFA_set_loc for convert_cfa_to_fb_loc_list
    purposes.  If we're generating DWARF3 output we use DW_OP_call_frame_cfa
@@ -2596,15 +2575,18 @@ execute_dwarf2_frame (void)
     }
 
   /* Set up state for generating call frame debug info.  */
-  lookup_cfa (&cfa);
-  gcc_assert (cfa.reg
-             == (unsigned long)DWARF_FRAME_REGNUM (STACK_POINTER_REGNUM));
+  gcc_checking_assert (queued_reg_saves == NULL);
+  gcc_checking_assert (regs_saved_in_regs == NULL);
 
-  old_cfa = cfa;
+  memset (&cfa, 0, sizeof(cfa));
   cfa.reg = STACK_POINTER_REGNUM;
+  cfa.offset = INCOMING_FRAME_SP_OFFSET;
+
+  old_cfa = cfa;
   cfa_store = cfa;
-  cfa_temp.reg = -1;
-  cfa_temp.offset = 0;
+
+  memset (&cfa_temp, 0, sizeof(cfa_temp));
+  cfa_temp.reg = INVALID_REGNUM;
 
   dwarf2out_alloc_current_fde ();
 
@@ -2617,7 +2599,6 @@ execute_dwarf2_frame (void)
   barrier_args_size = NULL;
   regs_saved_in_regs = NULL;
   queued_reg_saves = NULL;
-  args_size = old_args_size = 0;
 
   return 0;
 }