From: Richard Henderson Date: Mon, 11 Jun 2012 18:04:25 +0000 (-0700) Subject: * dwarf2cfi.c (scan_trace): Handle annulled branch-taken delay slots. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bf27c43e07631d497b33c39c1bb6f26fd886bafd;p=gcc.git * dwarf2cfi.c (scan_trace): Handle annulled branch-taken delay slots. From-SVN: r188391 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 76541d8141a..96cbe07f3bd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2012-06-11 Richard Henderson + + * dwarf2cfi.c (scan_trace): Handle annulled branch-taken delay slots. + 2012-06-11 Olivier Hainque * Makefile.in (GNATLIBCFLAGS_FOR_C): Remove $(PIC_FLAG_FOR_TARGET). diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c index bf2d802ffae..3edb6e1250a 100644 --- a/gcc/dwarf2cfi.c +++ b/gcc/dwarf2cfi.c @@ -2429,18 +2429,20 @@ scan_trace (dw_trace_info *trace) elt = XVECEXP (pat, 0, 1); - /* If ELT is an instruction from target of an annulled branch, - the effects are for the target only and so the args_size - and CFA along the current path shouldn't change. */ if (INSN_FROM_TARGET_P (elt)) { HOST_WIDE_INT restore_args_size; cfi_vec save_row_reg_save; + /* If ELT is an instruction from target of an annulled + branch, the effects are for the target only and so + the args_size and CFA along the current path + shouldn't change. */ add_cfi_insn = NULL; restore_args_size = cur_trace->end_true_args_size; cur_cfa = &cur_row->cfa; - save_row_reg_save = VEC_copy (dw_cfi_ref, gc, cur_row->reg_save); + save_row_reg_save + = VEC_copy (dw_cfi_ref, gc, cur_row->reg_save); scan_insn_after (elt); @@ -2453,8 +2455,20 @@ scan_trace (dw_trace_info *trace) cur_row->cfa = this_cfa; cur_row->reg_save = save_row_reg_save; cur_cfa = &this_cfa; - continue; } + else + { + /* If ELT is a annulled branch-taken instruction (i.e. + executed only when branch is not taken), the args_size + and CFA should not change through the jump. */ + create_trace_edges (control); + + /* Update and continue with the trace. */ + add_cfi_insn = insn; + scan_insn_after (elt); + def_cfa_1 (&this_cfa); + } + continue; } /* The insns in the delay slot should all be considered to happen