ia64: Use pc_rtx to save the return address.
authorRichard Henderson <rth@redhat.com>
Tue, 5 Jul 2011 17:08:52 +0000 (10:08 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 5 Jul 2011 17:08:52 +0000 (10:08 -0700)
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

gcc/ChangeLog
gcc/config/ia64/ia64.c

index 1dbd9261139fddc894bb729a560d1c327c5570a0..87515bad37e30ac82e6bf2dbf95b0ac2ff9c656a 100644 (file)
@@ -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.
 
index bb3fc4d7e92b5661bc6e3c9a17890441f2b9ece9..b37919c957404c0e3b76a9af7c5d34b3fd72c7bc 100644 (file)
@@ -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)