pa.md (call, call_value): Always save the PIC register before a call.
* pa.md (call, call_value): Always save the PIC register before a call. From-SVN: r8836
This commit is contained in:
parent
8e6c802b46
commit
da6f15cdef
@ -3426,13 +3426,19 @@
|
|||||||
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), pic_offset_table_rtx);
|
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), pic_offset_table_rtx);
|
||||||
|
|
||||||
if (!hppa_save_pic_table_rtx)
|
if (!hppa_save_pic_table_rtx)
|
||||||
{
|
|
||||||
hppa_save_pic_table_rtx = gen_reg_rtx (Pmode);
|
hppa_save_pic_table_rtx = gen_reg_rtx (Pmode);
|
||||||
|
|
||||||
|
/* We must save and restore the PIC register around every call
|
||||||
|
since we don't have flow information to determine if this save
|
||||||
|
is redundant with a previous save. The old code assumed once
|
||||||
|
the register was saved it never needs to be saved again, but
|
||||||
|
the save could have been on a path which doesn't always
|
||||||
|
execute; a call site physically later in the program would
|
||||||
|
then attempt a restore from an uninitialized register! */
|
||||||
emit_insn_before (gen_rtx (SET, VOIDmode,
|
emit_insn_before (gen_rtx (SET, VOIDmode,
|
||||||
hppa_save_pic_table_rtx,
|
hppa_save_pic_table_rtx,
|
||||||
pic_offset_table_rtx),
|
pic_offset_table_rtx),
|
||||||
call_insn);
|
call_insn);
|
||||||
}
|
|
||||||
|
|
||||||
emit_insn (gen_rtx (SET, VOIDmode, pic_offset_table_rtx,
|
emit_insn (gen_rtx (SET, VOIDmode, pic_offset_table_rtx,
|
||||||
hppa_save_pic_table_rtx));
|
hppa_save_pic_table_rtx));
|
||||||
@ -3522,13 +3528,19 @@
|
|||||||
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), pic_offset_table_rtx);
|
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), pic_offset_table_rtx);
|
||||||
|
|
||||||
if (!hppa_save_pic_table_rtx)
|
if (!hppa_save_pic_table_rtx)
|
||||||
{
|
|
||||||
hppa_save_pic_table_rtx = gen_reg_rtx (Pmode);
|
hppa_save_pic_table_rtx = gen_reg_rtx (Pmode);
|
||||||
|
|
||||||
|
/* We must save and restore the PIC register around every call
|
||||||
|
since we don't have flow information to determine if this save
|
||||||
|
is redundant with a previous save. The old code assumed once
|
||||||
|
the register was saved it never needs to be saved again, but
|
||||||
|
the save could have been on a path which doesn't always
|
||||||
|
execute; a call site physically later in the program would
|
||||||
|
then attempt a restore from an uninitialized register! */
|
||||||
emit_insn_before (gen_rtx (SET, VOIDmode,
|
emit_insn_before (gen_rtx (SET, VOIDmode,
|
||||||
hppa_save_pic_table_rtx,
|
hppa_save_pic_table_rtx,
|
||||||
pic_offset_table_rtx),
|
pic_offset_table_rtx),
|
||||||
call_insn);
|
call_insn);
|
||||||
}
|
|
||||||
|
|
||||||
emit_insn (gen_rtx (SET, VOIDmode, pic_offset_table_rtx,
|
emit_insn (gen_rtx (SET, VOIDmode, pic_offset_table_rtx,
|
||||||
hppa_save_pic_table_rtx));
|
hppa_save_pic_table_rtx));
|
||||||
|
Loading…
Reference in New Issue
Block a user