they are deleted.
From-SVN: r25883
+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
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
{
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];
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
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;
notes. */
insn = b->head;
+
if (GET_CODE (insn) == CODE_LABEL)
{
rtx x, *prev = &exception_handler_labels;
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;
}