
Hi Graeme and Allen,
On Tue, 10 Jul 2012 15:13:47 +1000, Graeme Russ graeme.russ@gmail.com wrote:
Hi Martin,
On Tue, Jul 10, 2012 at 3:08 PM, Allen Martin amartin@nvidia.com wrote:
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
arch/arm/config.mk | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/arch/arm/config.mk b/arch/arm/config.mk index 3f4453a..1ba9d75 100644 --- a/arch/arm/config.mk +++ b/arch/arm/config.mk @@ -87,3 +87,23 @@ 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 yes; else echo no; fi)
y instead of yes
+ifeq ($(GAS_BUG_12532),yes)
So:
ifeq ($(GAS_BUG_12532),y)
is more consistent
+$(warning *** disabling sibling call optimzation because binutils version < 2.22)
Maybe add 'code size will be (slightly) larger'
"could be" rather than "will be" ?
+endif +endif +ifeq ($(GAS_BUG_12532),yes) +PLATFORM_RELFLAGS += -fno-optimize-sibling-calls +endif
+endif
1.7.9.5
If a new patch version is out and Tested-by: soon, I am willing to take this in.
Regards,
Graeme
Amicalement,