diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-07-25 03:35:05 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-07-25 03:35:05 +0000 |
commit | c247c822d1d40f209a82ad501dbb2081c9fcbee7 (patch) | |
tree | edaac187ab7ab954523b81582bcb347e7ba52515 /gcc/dwarf2cfi.c | |
parent | afde4c944e5baf1997a775b90322618c04dfcea9 (diff) | |
download | gcc-c247c822d1d40f209a82ad501dbb2081c9fcbee7.tar.gz |
PR debug/49831
* dwarf2cfi.c (connect_traces): Allow unvisited traces. Skip
them entirely.
Constant pools are emitted in such a way as to be indistinguishable
from regular instructions, and these constant pools are, naturally,
not reachable as code.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@176730 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/dwarf2cfi.c')
-rw-r--r-- | gcc/dwarf2cfi.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c index de19d06a08e..57fe566baf9 100644 --- a/gcc/dwarf2cfi.c +++ b/gcc/dwarf2cfi.c @@ -2641,14 +2641,22 @@ connect_traces (void) prev_ti = VEC_index (dw_trace_info, trace_info, 0); - for (i = 1; i < n; ++i, prev_ti = ti) + for (i = 1; i < n; ++i) { dw_cfi_row *old_row; ti = VEC_index (dw_trace_info, trace_info, i); - /* We must have both queued and processed every trace. */ - gcc_assert (ti->beg_row && ti->end_row); + /* ??? Ideally, we should have both queued and processed. However + the current representation of constant pools on various targets + is indistinguishable from unreachable code. Assume for the + moment that we can simply skip over such traces. */ + /* ??? Consider creating a DATA_INSN rtx code to indicate that + these are not "real" instructions, and should not be considered. + This could be generically useful for tablejump data as well. */ + if (ti->beg_row == NULL) + continue; + gcc_assert (ti->end_row != NULL); /* In dwarf2out_switch_text_section, we'll begin a new FDE for the portion of the function in the alternate text @@ -2677,6 +2685,8 @@ connect_traces (void) } while (note != add_cfi_insn); } + + prev_ti = ti; } } |