Commit c24a6738 by Richard Henderson Committed by Richard Henderson

re PR debug/49841 (AIX bootstrap failure in dwarf2cfi.c:maybe_record_trace_start)

PR debug/49841
	* config/rs6000/rs6000.c (rs6000_frame_related): Return the insn.
	(emit_frame_save): Likewise.
	(rs6000_emit_prologue): Move the FRAME_RELATED_EXPR from the save
	insn onto a dummy blockage insn after the join label.

From-SVN: r176773
parent 200e10dc
2011-07-25 Richard Henderson <rth@redhat.com> 2011-07-25 Richard Henderson <rth@redhat.com>
PR debug/49841
* config/rs6000/rs6000.c (rs6000_frame_related): Return the insn.
(emit_frame_save): Likewise.
(rs6000_emit_prologue): Move the FRAME_RELATED_EXPR from the save
insn onto a dummy blockage insn after the join label.
2011-07-25 Richard Henderson <rth@redhat.com>
* dwarf2cfi.c (dw_trace_info): Add ID member. * dwarf2cfi.c (dw_trace_info): Add ID member.
(get_trace_index): Remove. Change users to use ID member. (get_trace_index): Remove. Change users to use ID member.
(before_next_cfi_note): New. (before_next_cfi_note): New.
......
...@@ -872,10 +872,7 @@ static bool rs6000_legitimate_address_p (enum machine_mode, rtx, bool); ...@@ -872,10 +872,7 @@ static bool rs6000_legitimate_address_p (enum machine_mode, rtx, bool);
static bool rs6000_debug_legitimate_address_p (enum machine_mode, rtx, bool); static bool rs6000_debug_legitimate_address_p (enum machine_mode, rtx, bool);
static rtx rs6000_generate_compare (rtx, enum machine_mode); static rtx rs6000_generate_compare (rtx, enum machine_mode);
static void rs6000_emit_stack_tie (void); static void rs6000_emit_stack_tie (void);
static void rs6000_frame_related (rtx, rtx, HOST_WIDE_INT, rtx, rtx);
static bool spe_func_has_64bit_regs_p (void); static bool spe_func_has_64bit_regs_p (void);
static void emit_frame_save (rtx, rtx, enum machine_mode, unsigned int,
int, HOST_WIDE_INT);
static rtx gen_frame_mem_offset (enum machine_mode, rtx, int); static rtx gen_frame_mem_offset (enum machine_mode, rtx, int);
static unsigned rs6000_hash_constant (rtx); static unsigned rs6000_hash_constant (rtx);
static unsigned toc_hash_function (const void *); static unsigned toc_hash_function (const void *);
...@@ -19317,7 +19314,7 @@ output_probe_stack_range (rtx reg1, rtx reg2) ...@@ -19317,7 +19314,7 @@ output_probe_stack_range (rtx reg1, rtx reg2)
deduce these equivalences by itself so it wasn't necessary to hold deduce these equivalences by itself so it wasn't necessary to hold
its hand so much. */ its hand so much. */
static void static rtx
rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val, rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
rtx reg2, rtx rreg) rtx reg2, rtx rreg)
{ {
...@@ -19390,6 +19387,8 @@ rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val, ...@@ -19390,6 +19387,8 @@ rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
RTX_FRAME_RELATED_P (insn) = 1; RTX_FRAME_RELATED_P (insn) = 1;
add_reg_note (insn, REG_FRAME_RELATED_EXPR, real); add_reg_note (insn, REG_FRAME_RELATED_EXPR, real);
return insn;
} }
/* Returns an insn that has a vrsave set operation with the /* Returns an insn that has a vrsave set operation with the
...@@ -19454,7 +19453,7 @@ generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep) ...@@ -19454,7 +19453,7 @@ generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
/* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes. /* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
Save REGNO into [FRAME_REG + OFFSET] in mode MODE. */ Save REGNO into [FRAME_REG + OFFSET] in mode MODE. */
static void static rtx
emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode, emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode,
unsigned int regno, int offset, HOST_WIDE_INT total_size) unsigned int regno, int offset, HOST_WIDE_INT total_size)
{ {
...@@ -19492,7 +19491,7 @@ emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode, ...@@ -19492,7 +19491,7 @@ emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode,
insn = emit_move_insn (mem, reg); insn = emit_move_insn (mem, reg);
rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb); return rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
} }
/* Emit an offset memory reference suitable for a frame store, while /* Emit an offset memory reference suitable for a frame store, while
...@@ -20288,6 +20287,7 @@ rs6000_emit_prologue (void) ...@@ -20288,6 +20287,7 @@ rs6000_emit_prologue (void)
if (TARGET_AIX && crtl->calls_eh_return) if (TARGET_AIX && crtl->calls_eh_return)
{ {
rtx tmp_reg, tmp_reg_si, hi, lo, compare_result, toc_save_done, jump; rtx tmp_reg, tmp_reg_si, hi, lo, compare_result, toc_save_done, jump;
rtx save_insn, join_insn, note;
long toc_restore_insn; long toc_restore_insn;
gcc_assert (frame_reg_rtx == frame_ptr_rtx gcc_assert (frame_reg_rtx == frame_ptr_rtx
...@@ -20322,9 +20322,29 @@ rs6000_emit_prologue (void) ...@@ -20322,9 +20322,29 @@ rs6000_emit_prologue (void)
JUMP_LABEL (jump) = toc_save_done; JUMP_LABEL (jump) = toc_save_done;
LABEL_NUSES (toc_save_done) += 1; LABEL_NUSES (toc_save_done) += 1;
emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, TOC_REGNUM, save_insn = emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode,
sp_offset + 5 * reg_size, info->total_size); TOC_REGNUM, sp_offset + 5 * reg_size,
info->total_size);
emit_label (toc_save_done); emit_label (toc_save_done);
/* ??? If we leave SAVE_INSN as marked as saving R2, then we'll
have a CFG that has different saves along different paths.
Move the note to a dummy blockage insn, which describes that
R2 is unconditionally saved after the label. */
/* ??? An alternate representation might be a special insn pattern
containing both the branch and the store. That might let the
code that minimizes the number of DW_CFA_advance opcodes better
freedom in placing the annotations. */
note = find_reg_note (save_insn, REG_FRAME_RELATED_EXPR, NULL);
gcc_assert (note);
remove_note (save_insn, note);
RTX_FRAME_RELATED_P (save_insn) = 0;
join_insn = emit_insn (gen_blockage ());
REG_NOTES (join_insn) = note;
RTX_FRAME_RELATED_P (join_insn) = 1;
if (using_static_chain_p) if (using_static_chain_p)
emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, 0)); emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, 0));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment