]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
dwarf2out.c (last_var_location_insn): New variable.
authorJakub Jelinek <jakub@redhat.com>
Fri, 12 Jun 2009 07:01:25 +0000 (09:01 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 12 Jun 2009 07:01:25 +0000 (09:01 +0200)
* dwarf2out.c (last_var_location_insn): New variable.
(dwarf2out_end_epilogue): Clear last_var_location_insn.
(dwarf2out_var_location): Don't record anything after last real
insn.  Only change labels if there were any real instructions
in between last note and this one, or if changed sections.

From-SVN: r148415

gcc/ChangeLog
gcc/dwarf2out.c

index db12670498ec24d4404fc825597d60c35c83ec50..1f8312f54571132dcc6ae5829e22854543f9417b 100644 (file)
@@ -1,3 +1,11 @@
+2009-06-12  Jakub Jelinek  <jakub@redhat.com>
+
+       * dwarf2out.c (last_var_location_insn): New variable.
+       (dwarf2out_end_epilogue): Clear last_var_location_insn.
+       (dwarf2out_var_location): Don't record anything after last real
+       insn.  Only change labels if there were any real instructions
+       in between last note and this one, or if changed sections.
+
 2009-06-11  Richard Henderson  <rth@redhat.com>
 
         * alpha.c (alpha_expand_prologue): Add a REF_CFA_REGISTER
index c41f008863b1cf3326d1b673e09ddfdca4a7dc93..367bda86a7eb4bab66f115c617ef6fec30f84b1e 100644 (file)
@@ -92,6 +92,8 @@ along with GCC; see the file COPYING3.  If not see
 
 #ifdef DWARF2_DEBUGGING_INFO
 static void dwarf2out_source_line (unsigned int, const char *, int);
+
+static rtx last_var_location_insn;
 #endif
 
 #ifndef DWARF2_FRAME_INFO
@@ -3693,6 +3695,10 @@ dwarf2out_end_epilogue (unsigned int line ATTRIBUTE_UNUSED,
   dw_fde_ref fde;
   char label[MAX_ARTIFICIAL_LABEL_BYTES];
 
+#ifdef DWARF2_DEBUGGING_INFO
+  last_var_location_insn = NULL_RTX;
+#endif
+
   if (dwarf2out_do_cfi_asm ())
     fprintf (asm_out_file, "\t.cfi_endproc\n");
 
@@ -16202,6 +16208,7 @@ dwarf2out_set_name (tree decl, tree name)
   else
     add_name_attribute (die, dwarf2_name (name, 0));
 }
+
 /* Called by the final INSN scan whenever we see a var location.  We
    use it to drop labels in the right places, and throw the location in
    our lookup table.  */
@@ -16211,26 +16218,27 @@ dwarf2out_var_location (rtx loc_note)
 {
   char loclabel[MAX_ARTIFICIAL_LABEL_BYTES];
   struct var_loc_node *newloc;
-  rtx prev_insn;
-  static rtx last_insn;
+  rtx next_real;
   static const char *last_label;
+  static bool last_in_cold_section_p;
   tree decl;
 
   if (!DECL_P (NOTE_VAR_LOCATION_DECL (loc_note)))
     return;
-  prev_insn = PREV_INSN (loc_note);
+
+  next_real = next_real_insn (loc_note);
+  /* If there are no instructions which would be affected by this note,
+     don't do anything.  */
+  if (next_real == NULL_RTX)
+    return;
 
   newloc = GGC_CNEW (struct var_loc_node);
-  /* If the insn we processed last time is the previous insn
-     and it is also a var location note, use the label we emitted
-     last time.  */
-  if (last_insn != NULL_RTX
-      && last_insn == prev_insn
-      && NOTE_P (prev_insn)
-      && NOTE_KIND (prev_insn) == NOTE_INSN_VAR_LOCATION)
-    {
-      newloc->label = last_label;
-    }
+  /* If there were no real insns between note we processed last time
+     and this note, use the label we emitted last time.  */
+  if (last_var_location_insn != NULL_RTX
+      && last_var_location_insn == next_real
+      && last_in_cold_section_p == in_cold_section_p)
+    newloc->label = last_label;
   else
     {
       ASM_GENERATE_INTERNAL_LABEL (loclabel, "LVL", loclabel_num);
@@ -16246,8 +16254,9 @@ dwarf2out_var_location (rtx loc_note)
   else
     newloc->section_label = text_section_label;
 
-  last_insn = loc_note;
+  last_var_location_insn = next_real;
   last_label = newloc->label;
+  last_in_cold_section_p = in_cold_section_p;
   decl = NOTE_VAR_LOCATION_DECL (loc_note);
   add_var_loc_to_decl (decl, newloc);
 }