Commit a8f5224e by David Mosberger Committed by Jim Wilson

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
parent 09afda70
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> 2004-10-27 Geoffrey Keating <geoffk@apple.com>
* doc/tm.texi (USE_SELECT_SECTION_FOR_FUNCTIONS): Document. * doc/tm.texi (USE_SELECT_SECTION_FOR_FUNCTIONS): Document.
......
...@@ -2604,10 +2604,13 @@ ia64_expand_epilogue (int sibcall_p) ...@@ -2604,10 +2604,13 @@ ia64_expand_epilogue (int sibcall_p)
preserve those input registers used as arguments to the sibling call. preserve those input registers used as arguments to the sibling call.
It is unclear how to compute that number here. */ It is unclear how to compute that number here. */
if (current_frame_info.n_input_regs != 0) if (current_frame_info.n_input_regs != 0)
emit_insn (gen_alloc (gen_rtx_REG (DImode, fp), {
const0_rtx, const0_rtx, rtx n_inputs = GEN_INT (current_frame_info.n_input_regs);
GEN_INT (current_frame_info.n_input_regs), insn = emit_insn (gen_alloc (gen_rtx_REG (DImode, fp),
const0_rtx)); 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) ...@@ -7290,13 +7293,24 @@ process_set (FILE *asm_out_file, rtx pat)
{ {
dest_regno = REGNO (dest); dest_regno = REGNO (dest);
/* If this isn't the final destination for ar.pfs, the alloc /* If this is the final destination for ar.pfs, then this must
shouldn't have been marked frame related. */ be the alloc in the prologue. */
if (dest_regno != current_frame_info.reg_save_ar_pfs) 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));
fprintf (asm_out_file, "\t.save ar.pfs, r%d\n", else
ia64_dbx_register_number (dest_regno)); {
/* 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; return 1;
} }
......
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