Commit 5f740973 by Richard Henderson Committed by Richard Henderson

ia64: Use pc_rtx to save the return address.

When actually emitting dwarf2, this now produces proper results.
When emitting ia64 unwind info, this removes a hard-coded assumption.

        * config/ia64/ia64.c (ia64_expand_prologue): Use pc_rtx to
        indicate the return address save.
        (process_cfa_register): Likewise.

From-SVN: r175873
parent a1880147
2011-07-05 Richard Henderson <rth@redhat.com> 2011-07-05 Richard Henderson <rth@redhat.com>
* config/ia64/ia64.c (ia64_expand_prologue): Use pc_rtx to
indicate the return address save.
(process_cfa_register): Likewise.
* config/ia64/ia64.c (ia64_dwarf2out_def_steady_cfa): Remove. * config/ia64/ia64.c (ia64_dwarf2out_def_steady_cfa): Remove.
(process_cfa_adjust_cfa, ia64_asm_unwind_emit): Don't call it. (process_cfa_adjust_cfa, ia64_asm_unwind_emit): Don't call it.
......
...@@ -3444,7 +3444,8 @@ ia64_expand_prologue (void) ...@@ -3444,7 +3444,8 @@ ia64_expand_prologue (void)
reg_emitted (reg_save_b0); reg_emitted (reg_save_b0);
insn = emit_move_insn (alt_reg, reg); insn = emit_move_insn (alt_reg, reg);
RTX_FRAME_RELATED_P (insn) = 1; RTX_FRAME_RELATED_P (insn) = 1;
add_reg_note (insn, REG_CFA_REGISTER, NULL_RTX); add_reg_note (insn, REG_CFA_REGISTER,
gen_rtx_SET (VOIDmode, alt_reg, pc_rtx));
/* Even if we're not going to generate an epilogue, we still /* Even if we're not going to generate an epilogue, we still
need to save the register so that EH works. */ need to save the register so that EH works. */
...@@ -9737,20 +9738,22 @@ process_cfa_register (FILE *asm_out_file, rtx pat, bool unwind) ...@@ -9737,20 +9738,22 @@ process_cfa_register (FILE *asm_out_file, rtx pat, bool unwind)
{ {
rtx dest = SET_DEST (pat); rtx dest = SET_DEST (pat);
rtx src = SET_SRC (pat); rtx src = SET_SRC (pat);
int dest_regno = REGNO (dest); int dest_regno = REGNO (dest);
int src_regno = REGNO (src); int src_regno;
switch (src_regno) if (src == pc_rtx)
{ {
case BR_REG (0):
/* Saving return address pointer. */ /* Saving return address pointer. */
gcc_assert (dest_regno == current_frame_info.r[reg_save_b0]);
if (unwind) if (unwind)
fprintf (asm_out_file, "\t.save rp, r%d\n", fprintf (asm_out_file, "\t.save rp, r%d\n",
ia64_dbx_register_number (dest_regno)); ia64_dbx_register_number (dest_regno));
break; return;
}
src_regno = REGNO (src);
switch (src_regno)
{
case PR_REG (0): case PR_REG (0):
gcc_assert (dest_regno == current_frame_info.r[reg_save_pr]); gcc_assert (dest_regno == current_frame_info.r[reg_save_pr]);
if (unwind) if (unwind)
......
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