aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllen Martin <amartin@nvidia.com>2012-07-18 13:45:53 +0000
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>2012-10-04 14:19:04 +0200
commit0f20bb601f134540a3608a9da5a7b4155e477ece (patch)
tree3b0c645dd387c8d0cd700f81293b7baf8cd8e397
parent2051ff3450113f4eb6aad250a9a3fc8c4af149dc (diff)
downloadu-boot-linaro-stable-0f20bb601f134540a3608a9da5a7b4155e477ece.tar.gz
arm: work around assembler bug
Disable sibling call optimization based on binutils version. This is to work around a bug in the assember in binutils versions < 2.22. Branches to weak symbols can be incorrectly optimized in thumb mode to a short branch (b.n instruction) that won't reach when the symbol gets preempted. http://sourceware.org/bugzilla/show_bug.cgi?id=12532 Signed-off-by: Allen Martin <amartin@nvidia.com> Acked-by: Tom Rini <trini@ti.com>
-rw-r--r--arch/arm/config.mk18
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/arm/config.mk b/arch/arm/config.mk
index 3f4453a23..24b9d7c80 100644
--- a/arch/arm/config.mk
+++ b/arch/arm/config.mk
@@ -87,3 +87,21 @@ endif
ifndef CONFIG_NAND_SPL
LDFLAGS_u-boot += -pie
endif
+
+#
+# FIXME: binutils versions < 2.22 have a bug in the assembler where
+# branches to weak symbols can be incorrectly optimized in thumb mode
+# to a short branch (b.n instruction) that won't reach when the symbol
+# gets preempted
+#
+# http://sourceware.org/bugzilla/show_bug.cgi?id=12532
+#
+ifeq ($(CONFIG_SYS_THUMB_BUILD),y)
+ifeq ($(GAS_BUG_12532),)
+export GAS_BUG_12532:=$(shell if [ $(call binutils-version) -lt 0222 ] ; \
+ then echo y; else echo n; fi)
+endif
+ifeq ($(GAS_BUG_12532),y)
+PLATFORM_RELFLAGS += -fno-optimize-sibling-calls
+endif
+endif