Commit 30ea98f1 by Michael Meissner

Check for whether GOT_TOC register was eliminated

From-SVN: r12429
parent 1ff7789b
...@@ -2153,46 +2153,61 @@ rs6000_replace_regno (x, from, reg) ...@@ -2153,46 +2153,61 @@ rs6000_replace_regno (x, from, reg)
void void
rs6000_finalize_pic () rs6000_finalize_pic ()
{ {
if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS) /* Loop through all of the insns, replacing the special GOT_TOC_REGNUM
with an appropriate pseduo register. If we find we need GOT/TOC,
add the appropriate init code. */
if (flag_pic && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS))
{ {
/* Loop through all of the insns, replacing the special GOT_TOC_REGNUM rtx insn = get_insns ();
with an appropriate pseduo register. If we find we need GOT/TOC, rtx reg = NULL_RTX;
add the appropriate init code. */ rtx first_insn;
if (flag_pic)
{
rtx insn = get_insns ();
rtx reg = NULL_RTX;
rtx first_insn;
if (GET_CODE (insn) == NOTE) if (GET_CODE (insn) == NOTE)
insn = next_nonnote_insn (insn); insn = next_nonnote_insn (insn);
first_insn = insn; first_insn = insn;
for ( ; insn != NULL_RTX; insn = NEXT_INSN (insn)) for ( ; insn != NULL_RTX; insn = NEXT_INSN (insn))
{
if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
{ {
if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') PATTERN (insn) = rs6000_replace_regno (PATTERN (insn),
{ GOT_TOC_REGNUM,
PATTERN (insn) = rs6000_replace_regno (PATTERN (insn), &reg);
if (REG_NOTES (insn))
REG_NOTES (insn) = rs6000_replace_regno (REG_NOTES (insn),
GOT_TOC_REGNUM, GOT_TOC_REGNUM,
&reg); &reg);
if (REG_NOTES (insn))
REG_NOTES (insn) = rs6000_replace_regno (REG_NOTES (insn),
GOT_TOC_REGNUM,
&reg);
}
} }
}
if (reg) if (reg)
{ {
rtx init = gen_init_v4_pic (reg); rtx init = gen_init_v4_pic (reg);
emit_insn_before (init, first_insn); emit_insn_before (init, first_insn);
}
} }
} }
} }
/* Search for any occurrance of the GOT_TOC register marker that should
have been eliminated, but may have crept back in. */
void
rs6000_reorg (insn)
rtx insn;
{
if (flag_pic && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS))
{
rtx got_reg = gen_rtx (REG, Pmode, GOT_TOC_REGNUM);
for ( ; insn != NULL_RTX; insn = NEXT_INSN (insn))
if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
&& reg_mentioned_p (got_reg, PATTERN (insn)))
fatal_insn ("GOT/TOC register marker not removed:", PATTERN (insn));
}
}
/* Define the structure for the machine field in struct function. */ /* Define the structure for the machine field in struct function. */
struct machine_function struct machine_function
{ {
......
...@@ -1954,6 +1954,16 @@ typedef struct rs6000_args ...@@ -1954,6 +1954,16 @@ typedef struct rs6000_args
/* #define LEGITIMATE_PIC_OPERAND_P (X) */ /* #define LEGITIMATE_PIC_OPERAND_P (X) */
/* In rare cases, correct code generation requires extra machine
dependent processing between the second jump optimization pass and
delayed branch scheduling. On those machines, define this macro
as a C statement to act on the code starting at INSN.
On the RS/6000, we use it to make sure the GOT_TOC register marker
that FINALIZE_PIC is supposed to remove actually got removed. */
#define MACHINE_DEPENDENT_REORG(INSN) rs6000_reorg (INSN)
/* Define this if some processing needs to be done immediately before /* Define this if some processing needs to be done immediately before
emitting code for an insn. */ emitting code for an insn. */
...@@ -3081,6 +3091,7 @@ extern int addrs_ok_for_quad_peep (); ...@@ -3081,6 +3091,7 @@ extern int addrs_ok_for_quad_peep ();
extern enum reg_class secondary_reload_class (); extern enum reg_class secondary_reload_class ();
extern int ccr_bit (); extern int ccr_bit ();
extern void rs6000_finalize_pic (); extern void rs6000_finalize_pic ();
extern void rs6000_reorg ();
extern void rs6000_save_machine_status (); extern void rs6000_save_machine_status ();
extern void rs6000_restore_machine_status (); extern void rs6000_restore_machine_status ();
extern void rs6000_init_expanders (); extern void rs6000_init_expanders ();
......
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