From eb6566712ec19a9bbc1a32da37a093cda907f554 Mon Sep 17 00:00:00 2001 From: rth Date: Mon, 25 Jul 2011 03:10:42 +0000 Subject: [PATCH] dwarf2cfi: Reset args_size properly across abnormal edges. * dwarf2cfi.c (maybe_record_trace_start): Add abnormal parameter. Zero args_size for abnormal edges. Adjust all callers. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@176727 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/dwarf2cfi.c | 21 +++++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b9a21ba55d8..ab089e504b4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2011-07-24 Richard Henderson + * dwarf2cfi.c (maybe_record_trace_start): Add abnormal parameter. + Zero args_size for abnormal edges. Adjust all callers. + +2011-07-24 Richard Henderson + PR debug/49825 * dwarf2cfi.c (cfi_row_equal_p): Don't compare args_size. diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c index f715e079e7c..fd5f680f682 100644 --- a/gcc/dwarf2cfi.c +++ b/gcc/dwarf2cfi.c @@ -2396,7 +2396,7 @@ add_cfis_to_fde (void) trace from CUR_TRACE and CUR_ROW. */ static void -maybe_record_trace_start (rtx start, rtx origin) +maybe_record_trace_start (rtx start, rtx origin, bool abnormal) { dw_trace_info *ti; @@ -2421,6 +2421,11 @@ maybe_record_trace_start (rtx start, rtx origin) /* This is the first time we've encountered this trace. Propagate state across the edge and push the trace onto the work list. */ ti->beg_row = copy_cfi_row (cur_row); + /* On all abnormal edges, especially EH and non-local-goto, we take + care to free the pushed arguments. */ + if (abnormal) + ti->beg_row->args_size = 0; + ti->cfa_store = cur_trace->cfa_store; ti->cfa_temp = cur_trace->cfa_temp; ti->regs_saved_in_regs = VEC_copy (reg_saved_in_data, heap, @@ -2465,13 +2470,13 @@ create_trace_edges (rtx insn) for (i = 0; i < n; ++i) { lab = XEXP (RTVEC_ELT (vec, i), 0); - maybe_record_trace_start (lab, insn); + maybe_record_trace_start (lab, insn, false); } } else if (computed_jump_p (insn)) { for (lab = forced_labels; lab; lab = XEXP (lab, 1)) - maybe_record_trace_start (XEXP (lab, 0), insn); + maybe_record_trace_start (XEXP (lab, 0), insn, true); } else if (returnjump_p (insn)) ; @@ -2481,14 +2486,14 @@ create_trace_edges (rtx insn) for (i = 0; i < n; ++i) { lab = XEXP (ASM_OPERANDS_LABEL (tmp, i), 0); - maybe_record_trace_start (lab, insn); + maybe_record_trace_start (lab, insn, true); } } else { lab = JUMP_LABEL (insn); gcc_assert (lab != NULL); - maybe_record_trace_start (lab, insn); + maybe_record_trace_start (lab, insn, false); } } else if (CALL_P (insn)) @@ -2500,7 +2505,7 @@ create_trace_edges (rtx insn) /* Process non-local goto edges. */ if (can_nonlocal_goto (insn)) for (lab = nonlocal_goto_handler_labels; lab; lab = XEXP (lab, 1)) - maybe_record_trace_start (XEXP (lab, 0), insn); + maybe_record_trace_start (XEXP (lab, 0), insn, true); } /* Process EH edges. */ @@ -2508,7 +2513,7 @@ create_trace_edges (rtx insn) { eh_landing_pad lp = get_eh_landing_pad_from_rtx (insn); if (lp) - maybe_record_trace_start (lp->landing_pad, insn); + maybe_record_trace_start (lp->landing_pad, insn, true); } } @@ -2545,7 +2550,7 @@ scan_trace (dw_trace_info *trace) /* Propagate across fallthru edges. */ if (!BARRIER_P (insn)) - maybe_record_trace_start (insn, NULL); + maybe_record_trace_start (insn, NULL, false); break; } -- 2.11.0