[U-Boot] [PATCH 1/2] tools, config.mk: add binutils-version

Modeled after gcc-version, add function to get binutils version.
Signed-off-by: Allen Martin amartin@nvidia.com --- config.mk | 1 + tools/binutils-version.sh | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100755 tools/binutils-version.sh
diff --git a/config.mk b/config.mk index c239f23..fa5e626 100644 --- a/config.mk +++ b/config.mk @@ -128,6 +128,7 @@ endif # cc-version # Usage gcc-ver := $(call cc-version) cc-version = $(shell $(SHELL) $(SRCTREE)/tools/gcc-version.sh $(CC)) +binutils-version = $(shell $(SHELL) $(SRCTREE)/tools/binutils-version.sh $(AS))
# # Include the make variables (CC, etc...) diff --git a/tools/binutils-version.sh b/tools/binutils-version.sh new file mode 100755 index 0000000..d4d9eb4 --- /dev/null +++ b/tools/binutils-version.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# +# binutils-version [-p] gas-command +# +# Prints the binutils version of `gas-command' in a canonical 4-digit form +# such as `0222' for binutils 2.22 +# + +gas="$*" + +if [ ${#gas} -eq 0 ]; then + echo "Error: No assembler specified." + printf "Usage:\n\t$0 <gas-command>\n" + exit 1 +fi + +MAJOR=$($gas --version | head -1 | awk '{print $NF}' | cut -d . -f 1) +MINOR=$($gas --version | head -1 | awk '{print $NF}' | cut -d . -f 2) + +printf "%02d%02d\n" $MAJOR $MINOR

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) +ifeq ($(GAS_BUG_12532),yes) +$(warning *** disabling sibling call optimzation because binutils version < 2.22) +endif +endif +ifeq ($(GAS_BUG_12532),yes) +PLATFORM_RELFLAGS += -fno-optimize-sibling-calls +endif +endif

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'
+endif +endif +ifeq ($(GAS_BUG_12532),yes) +PLATFORM_RELFLAGS += -fno-optimize-sibling-calls +endif
+endif
1.7.9.5
Regards,
Graeme

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,
participants (3)
-
Albert ARIBAUD
-
Allen Martin
-
Graeme Russ