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

login
register
mail settings
Submitter Allen Martin
Date July 10, 2012, 7:05 p.m.
Message ID <1341947131-29342-2-git-send-email-amartin@nvidia.com>
Download mbox | patch
Permalink /patch/170263/
State Superseded
Delegated to: Albert ARIBAUD
Headers show

Comments

Allen Martin - July 10, 2012, 7:05 p.m.
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>
---
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(+)

Patch

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