diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 8 | ||||
-rw-r--r-- | gcc/dwarfout.c | 7 | ||||
-rw-r--r-- | gcc/flow.c | 15 |
4 files changed, 35 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bd83930..d4c2758 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 5ee5535..ae38b20 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -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 diff --git a/gcc/dwarfout.c b/gcc/dwarfout.c index 691348a..388c4a4 100644 --- a/gcc/dwarfout.c +++ b/gcc/dwarfout.c @@ -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]; @@ -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; } |