aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2011-07-05 10:08:52 -0700
committerRichard Henderson <rth@gcc.gnu.org>2011-07-05 10:08:52 -0700
commit5f7409731ea5a9ffecfb27527adeae31fb2353a0 (patch)
tree3365e8fcc1131c939c3e2b950c3d6669eca6b9ab
parenta18801474ab1eaccefe977859bc8b1764dbd0312 (diff)
downloadgcc-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/ChangeLog4
-rw-r--r--gcc/config/ia64/ia64.c17
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)