[U-Boot] [PATCH v3 2/2] arm: work around assembler bug

Allen Martin amartin at nvidia.com
Tue Jul 10 21:05:31 CEST 2012


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 at nvidia.com>
---
changes for v3:
 -split shell line to improve readability
changes for v2:
 -changed GAS_BUG_12532 from yes/no to y/n to be consistent
 -added additional warning about code size increase
---
 arch/arm/config.mk |   22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/arch/arm/config.mk b/arch/arm/config.mk
index 3f4453a..afa6769 100644
--- a/arch/arm/config.mk
+++ b/arch/arm/config.mk
@@ -87,3 +87,25 @@ endif
 ifndef CONFIG_NAND_SPL
 LDFLAGS_u-boot += -pie
 endif
+
+#
+# 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)
+ifeq ($(GAS_BUG_12532),y)
+$(warning *** disabling sibling call optimzation because binutils version < 2.22)
+$(warning *** code size may be slightly larger)
+endif
+endif
+ifeq ($(GAS_BUG_12532),y)
+PLATFORM_RELFLAGS += -fno-optimize-sibling-calls
+endif
+endif
-- 
1.7.9.5



More information about the U-Boot mailing list