Preserve programmer specified labels, and emit debug info for them even if
authorNick Clifton <nickc@cygnus.com>
Sun, 21 Mar 1999 12:14:09 +0000 (12:14 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Sun, 21 Mar 1999 12:14:09 +0000 (12:14 +0000)
they are deleted.

From-SVN: r25883

gcc/ChangeLog
gcc/dwarf2out.c
gcc/dwarfout.c
gcc/flow.c

index bd839307b062631cd17347ca889316226b1d46aa..d4c2758038bc243c81591f26e453c8eaaa4f8ba5 100644 (file)
@@ -1,3 +1,12 @@
+Sun Mar 21 12:13:01 1999  Nick Clifton  <nickc@cygnus.com>
+
+       * flow.c (can_delete_label_p): Do not allow user specified
+       labels to be deleted.
+       * dwarf2out.c (gen_label_die): Generate addresses for deleted
+       (programmer specified) labels. 
+       * dwarfout.c (output_label_die): Generate addresses for deleted
+       (programmer specified) labels.
+
 1999-03-21  Manfred Hollstein  <manfred@s-direktnet.de>
 
        * Makefile.in (xgcc$(exeext)): Add intl.o to list of files to be
index 5ee5535a63970d1a3e532a1187b43c5292528492..ae38b2099a8a33c1c6fbc0aa0d84e205e2b12945 100644 (file)
@@ -8583,7 +8583,13 @@ gen_label_die (decl, context_die)
   else
     {
       insn = DECL_RTL (decl);
-      if (GET_CODE (insn) == CODE_LABEL)
+
+      /* Deleted labels are programmer specified labels which have been
+        eliminated because of various optimisations.  We still emit them
+        here so that it is possible to put breakpoints on them.  */
+      if (GET_CODE (insn) == CODE_LABEL
+         || ((GET_CODE (insn) == NOTE
+              && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED_LABEL)))
        {
          /* When optimization is enabled (via -O) some parts of the compiler 
             (e.g. jump.c and cse.c) may try to delete CODE_LABEL insns which 
index 691348aa3eaecad2c976cd00c64c360facc4d0a6..388c4a40081303d96453f1893ced5a8d7d8de6c6 100644 (file)
@@ -3519,7 +3519,12 @@ output_label_die (arg)
     {
       register rtx insn = DECL_RTL (decl);
 
-      if (GET_CODE (insn) == CODE_LABEL)
+      /* Deleted labels are programmer specified labels which have been
+        eliminated because of various optimisations.  We still emit them
+        here so that it is possible to put breakpoints on them.  */
+      if (GET_CODE (insn) == CODE_LABEL
+         || ((GET_CODE (insn) == NOTE
+              && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED_LABEL)))
        {
          char label[MAX_ARTIFICIAL_LABEL_BYTES];
 
index 1515d418de8bf1a7d9e868798a4fed706efb4f61..f60daa48eed8b4c6a2e52f09ae1368429fcf4630 100644 (file)
@@ -376,7 +376,7 @@ find_basic_blocks (f, nregs, file)
   bb_eh_end = (rtx *) alloca (n_basic_blocks * sizeof (rtx));
 
   label_value_list = find_basic_blocks_1 (f, bb_eh_end);
-
+  
   /* Record the block to which an insn belongs.  */
   /* ??? This should be done another way, by which (perhaps) a label is
      tagged directly with the basic block that it starts.  It is used for
@@ -1241,7 +1241,7 @@ split_edge (edge_in)
          pos = emit_jump_insn_after (gen_jump (old_succ->head), pos);
          jump_block->end = pos;
          emit_barrier_after (pos);
-
+         
          /* ... and clear fallthru on the outgoing edge.  */
          e->flags &= ~EDGE_FALLTHRU;
 
@@ -1649,6 +1649,7 @@ delete_block (b)
      notes.  */
 
   insn = b->head;
+  
   if (GET_CODE (insn) == CODE_LABEL)
     {
       rtx x, *prev = &exception_handler_labels;
@@ -1793,6 +1794,16 @@ can_delete_label_p (label)
     if (label == XEXP (x, 0))
       return 0;
 
+  /* User declared labels must be preserved, but we can
+     convert them into a NOTE instead. */
+  if (LABEL_NAME (label) != 0)
+    {
+      PUT_CODE (label, NOTE);
+      NOTE_LINE_NUMBER (label) = NOTE_INSN_DELETED_LABEL;
+      NOTE_SOURCE_FILE (label) = 0;
+      return 0;
+    }
+  
   return 1;
 }