summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorvapier <vapier@138bc75d-0d04-0410-961f-82ee72b054a4>2013-04-30 04:07:23 +0000
committervapier <vapier@138bc75d-0d04-0410-961f-82ee72b054a4>2013-04-30 04:07:23 +0000
commit2090f4f01dec1647e39695611d3b4f4b64bb5620 (patch)
treef21ee9c2aa4e009fc4843bffb10b136117b8784e /gcc
parent7eb23f214ea86eabd8c9c3a5e4e2b93abc265a0a (diff)
downloadgcc-2090f4f01dec1647e39695611d3b4f4b64bb5620.tar.gz
gcc: arm: linux-eabi: fix handling of armv4 bx fixups when linking
The bpabi.h header already sets up defines to automatically use the --fix-v4bx flag with the assembler & linker as needed, and creates a default assembly & linker spec which uses those. Unfortunately, the linux-eabi.h header clobbers the LINK_SPEC define and doesn't include the v4bx define when setting up its own. So while the assembler spec is retained and works fine to generate the right relocs, building for armv4 targets doesn't invoke the linker correctly so all the relocs get processed as if we had an armv4t target. You can see this with -dumpspecs when configuring gcc for an armv4 target and using --with-arch=armv4: $ armv4l-unknown-linux-gnueabi-gcc -dumpspecs |& grep -B 1 fix-v4bx *subtarget_extra_asm_spec: .... %{mcpu=arm8|mcpu=arm810|mcpu=strongarm*|march=armv4|mcpu=fa526|mcpu=fa626:--fix-v4bx} ... With this fix in place, we also get the link spec: $ armv4l-unknown-linux-gnueabi-gcc -dumpspecs |& grep -B 1 fix-v4bx *link: ... %{mcpu=arm8|mcpu=arm810|mcpu=strongarm*|march=armv4|mcpu=fa526|mcpu=fa626:--fix-v4bx} ... And all my hello world tests / glibc builds automatically turn the bx insn into the 'mov pc, lr' insn and all is right in the world. Signed-off-by: Mike Frysinger <vapier@gentoo.org> git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@198438 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/arm/bpabi.h6
-rw-r--r--gcc/config/arm/linux-eabi.h2
3 files changed, 14 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a6eb15a2dc5..ed8f7197604 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2013-04-29 Mike Frysinger <vapier@gentoo.org>
+
+ * config/arm/bpabi.h (EABI_LINK_SPEC): Define.
+ (BPABI_LINK_SPEC): Use new EABI_LINK_SPEC.
+ * config/arm/linux-eabi.h (LINK_SPEC): Replace BE8_LINK_SPEC
+ with EABI_LINK_SPEC.
+
2013-04-29 Uros Bizjak <ubizjak@gmail.com>
PR target/44578
@@ -7,7 +14,7 @@
2013-04-29 Vladimir Makarov <vmakarov@redhat.com>
PR target/57097
- * lra-constraints.c (process_alt_operands): Discourage a bit more
+ * lra-constraints.c (process_alt_operands): Discourage a bit more
using memory for pseudos. Print cost dump for alternatives.
Modify cost values for conflicts with early clobbers.
(curr_insn_transform): Spill pseudos reassigned to NO_REGS.
diff --git a/gcc/config/arm/bpabi.h b/gcc/config/arm/bpabi.h
index 8e6683b3b23..ff89633d788 100644
--- a/gcc/config/arm/bpabi.h
+++ b/gcc/config/arm/bpabi.h
@@ -91,11 +91,15 @@
#define SUBTARGET_EXTRA_LINK_SPEC ""
#endif
+/* Split out the EABI common values so other targets can use it. */
+#define EABI_LINK_SPEC \
+ TARGET_FIX_V4BX_SPEC BE8_LINK_SPEC
+
/* The generic link spec in elf.h does not support shared libraries. */
#define BPABI_LINK_SPEC \
"%{mbig-endian:-EB} %{mlittle-endian:-EL} " \
"%{static:-Bstatic} %{shared:-shared} %{symbolic:-Bsymbolic} " \
- "-X" SUBTARGET_EXTRA_LINK_SPEC TARGET_FIX_V4BX_SPEC BE8_LINK_SPEC
+ "-X" SUBTARGET_EXTRA_LINK_SPEC EABI_LINK_SPEC
#undef LINK_SPEC
#define LINK_SPEC BPABI_LINK_SPEC
diff --git a/gcc/config/arm/linux-eabi.h b/gcc/config/arm/linux-eabi.h
index 4a425c87247..23671a788c2 100644
--- a/gcc/config/arm/linux-eabi.h
+++ b/gcc/config/arm/linux-eabi.h
@@ -80,7 +80,7 @@
/* At this point, bpabi.h will have clobbered LINK_SPEC. We want to
use the GNU/Linux version, not the generic BPABI version. */
#undef LINK_SPEC
-#define LINK_SPEC BE8_LINK_SPEC \
+#define LINK_SPEC EABI_LINK_SPEC \
LINUX_OR_ANDROID_LD (LINUX_TARGET_LINK_SPEC, \
LINUX_TARGET_LINK_SPEC " " ANDROID_LINK_SPEC)