diff options
author | Richard Henderson <rth@redhat.com> | 2011-07-05 10:08:52 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2011-07-05 10:08:52 -0700 |
commit | 5f7409731ea5a9ffecfb27527adeae31fb2353a0 (patch) | |
tree | 3365e8fcc1131c939c3e2b950c3d6669eca6b9ab | |
parent | a18801474ab1eaccefe977859bc8b1764dbd0312 (diff) | |
download | gcc-5f7409731ea5a9ffecfb27527adeae31fb2353a0.zip gcc-5f7409731ea5a9ffecfb27527adeae31fb2353a0.tar.gz gcc-5f7409731ea5a9ffecfb27527adeae31fb2353a0.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.c | 17 |
2 files changed, 14 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1dbd926..87515ba 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 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. (process_cfa_adjust_cfa, ia64_asm_unwind_emit): Don't call it. diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index bb3fc4d..b37919c 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -3444,7 +3444,8 @@ ia64_expand_prologue (void) reg_emitted (reg_save_b0); insn = emit_move_insn (alt_reg, reg); 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 need to save the register so that EH works. */ @@ -9737,20 +9738,22 @@ process_cfa_register (FILE *asm_out_file, rtx pat, bool unwind) { rtx dest = SET_DEST (pat); rtx src = SET_SRC (pat); - 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. */ - gcc_assert (dest_regno == current_frame_info.r[reg_save_b0]); if (unwind) fprintf (asm_out_file, "\t.save rp, r%d\n", ia64_dbx_register_number (dest_regno)); - break; + return; + } + + src_regno = REGNO (src); + switch (src_regno) + { case PR_REG (0): gcc_assert (dest_regno == current_frame_info.r[reg_save_pr]); if (unwind) |