aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorChristophe Lyon <christophe.lyon@st.com>2019-09-10 09:49:20 +0200
committerChristophe Lyon <clyon@gcc.gnu.org>2019-09-10 09:49:20 +0200
commit4997c9aed45b4439474005c4c71fac65151d1719 (patch)
tree15890a51cbc79b3ea6f3535c8a36b6a91707994e /gcc
parent5d727a4b20257275df59182b00f3bf240772cd0d (diff)
downloadgcc-4997c9aed45b4439474005c4c71fac65151d1719.zip
gcc-4997c9aed45b4439474005c4c71fac65151d1719.tar.gz
gcc-4997c9aed45b4439474005c4c71fac65151d1719.tar.bz2
[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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/arm/arm.c8
-rw-r--r--gcc/config/arm/arm.h7
3 files changed, 16 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a212eb3..7b061d1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,6 +1,13 @@
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>
+
* ginclude/unwind-arm-common.h (unwinder_cache): Add reserved5
field.
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index c34aab8..6ff3001 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -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;
diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index e404e2c..490d22d 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -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. */