[ARM/FDPIC v6 07/24] [ARM] FDPIC: Avoid saving/restoring r9 on stack since it is read-only

2019-09-10  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	gcc/
	* config/arm/arm.h (PIC_REGISTER_MAY_NEED_SAVING): New helper.
	* config/arm/arm.c (arm_compute_save_reg0_reg12_mask): Handle
	FDPIC.


Co-Authored-By: Mickaël Guêné <mickael.guene@st.com>

From-SVN: r275569
This commit is contained in:
Christophe Lyon 2019-09-10 09:49:20 +02:00 committed by Christophe Lyon
parent 5d727a4b20
commit 4997c9aed4
3 changed files with 16 additions and 6 deletions

View file

@ -1,3 +1,10 @@
2019-09-10 Christophe Lyon <christophe.lyon@st.com>
Mickaël Guêné <mickael.guene@st.com>
* config/arm/arm.h (PIC_REGISTER_MAY_NEED_SAVING): New helper.
* config/arm/arm.c (arm_compute_save_reg0_reg12_mask): Handle
FDPIC.
2019-09-10 Christophe Lyon <christophe.lyon@st.com>
Mickaël Guêné <mickael.guene@st.com>

View file

@ -19571,9 +19571,7 @@ arm_compute_save_reg0_reg12_mask (void)
save_reg_mask |= (1 << reg);
/* Also save the pic base register if necessary. */
if (flag_pic
&& !TARGET_SINGLE_PIC_BASE
&& arm_pic_register != INVALID_REGNUM
if (PIC_REGISTER_MAY_NEED_SAVING
&& crtl->uses_pic_offset_table)
save_reg_mask |= 1 << PIC_OFFSET_TABLE_REGNUM;
}
@ -19605,9 +19603,7 @@ arm_compute_save_reg0_reg12_mask (void)
/* If we aren't loading the PIC register,
don't stack it even though it may be live. */
if (flag_pic
&& !TARGET_SINGLE_PIC_BASE
&& arm_pic_register != INVALID_REGNUM
if (PIC_REGISTER_MAY_NEED_SAVING
&& (df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM)
|| crtl->uses_pic_offset_table))
save_reg_mask |= 1 << PIC_OFFSET_TABLE_REGNUM;

View file

@ -1960,6 +1960,13 @@ extern unsigned arm_pic_register;
|| label_mentioned_p (get_pool_constant (X))))) \
|| tls_mentioned_p (X))
/* We may want to save the PIC register if it is a dedicated one. */
#define PIC_REGISTER_MAY_NEED_SAVING \
(flag_pic \
&& !TARGET_SINGLE_PIC_BASE \
&& !TARGET_FDPIC \
&& arm_pic_register != INVALID_REGNUM)
/* We need to know when we are making a constant pool; this determines
whether data needs to be in the GOT or can be referenced via a GOT
offset. */