aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Mosberger <davidm@hpl.hp.com>2004-10-27 15:44:07 -0700
committerJim Wilson <wilson@gcc.gnu.org>2004-10-27 15:44:07 -0700
commita8f5224e01e17cc067d904eba3e2a757936ed9bc (patch)
tree062751f1daed5c6fd11575018f198b93137d3a53
parent09afda707e1b5869628246ce0d3df14b0007195a (diff)
downloadgcc-a8f5224e01e17cc067d904eba3e2a757936ed9bc.zip
gcc-a8f5224e01e17cc067d904eba3e2a757936ed9bc.tar.gz
gcc-a8f5224e01e17cc067d904eba3e2a757936ed9bc.tar.bz2
IA-64 sibcall unwind bug, PR target/13158
IA-64 sibcall unwind bug, PR target/13158 * config/ia64/ia64.c (ia64_expand_epilogue): Set RTX_FRAME_RELATED_P on sibcall alloc instruction. (process_set): Handle sibcall alloc instruction. From-SVN: r89714
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/ia64/ia64.c36
2 files changed, 32 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8713310..53d9fc9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-10-27 James E Wilson <wilson@specifixinc.com>
+
+ PR target/13158
+ * config/ia64/ia64.c (ia64_expand_epilogue): Set RTX_FRAME_RELATED_P on
+ sibcall alloc instruction.
+ (process_set): Handle sibcall alloc instruction.
+
2004-10-27 Geoffrey Keating <geoffk@apple.com>
* doc/tm.texi (USE_SELECT_SECTION_FOR_FUNCTIONS): Document.
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index 5eed721..39258f2 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -2604,10 +2604,13 @@ ia64_expand_epilogue (int sibcall_p)
preserve those input registers used as arguments to the sibling call.
It is unclear how to compute that number here. */
if (current_frame_info.n_input_regs != 0)
- emit_insn (gen_alloc (gen_rtx_REG (DImode, fp),
- const0_rtx, const0_rtx,
- GEN_INT (current_frame_info.n_input_regs),
- const0_rtx));
+ {
+ rtx n_inputs = GEN_INT (current_frame_info.n_input_regs);
+ insn = emit_insn (gen_alloc (gen_rtx_REG (DImode, fp),
+ const0_rtx, const0_rtx,
+ n_inputs, const0_rtx));
+ RTX_FRAME_RELATED_P (insn) = 1;
+ }
}
}
@@ -7290,13 +7293,24 @@ process_set (FILE *asm_out_file, rtx pat)
{
dest_regno = REGNO (dest);
- /* If this isn't the final destination for ar.pfs, the alloc
- shouldn't have been marked frame related. */
- if (dest_regno != current_frame_info.reg_save_ar_pfs)
- abort ();
-
- fprintf (asm_out_file, "\t.save ar.pfs, r%d\n",
- ia64_dbx_register_number (dest_regno));
+ /* If this is the final destination for ar.pfs, then this must
+ be the alloc in the prologue. */
+ if (dest_regno == current_frame_info.reg_save_ar_pfs)
+ fprintf (asm_out_file, "\t.save ar.pfs, r%d\n",
+ ia64_dbx_register_number (dest_regno));
+ else
+ {
+ /* This must be an alloc before a sibcall. We must drop the
+ old frame info. The easiest way to drop the old frame
+ info is to ensure we had a ".restore sp" directive
+ followed by a new prologue. If the procedure doesn't
+ have a memory-stack frame, we'll issue a dummy ".restore
+ sp" now. */
+ if (current_frame_info.total_size == 0)
+ /* if haven't done process_epilogue() yet, do it now */
+ process_epilogue ();
+ fprintf (asm_out_file, "\t.prologue\n");
+ }
return 1;
}