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

Graeme Russ graeme.russ at gmail.com
Tue Jul 10 07:13:47 CEST 2012


Hi Martin,

On Tue, Jul 10, 2012 at 3:08 PM, Allen Martin <amartin at 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 at 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


More information about the U-Boot mailing list