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

login
register
mail settings
Submitter Allen Martin
Date July 18, 2012, 11:45 p.m.
Message ID <1342655153-9023-2-git-send-email-amartin@nvidia.com>
Download mbox | patch
Permalink /patch/171856/
State Accepted
Delegated to: Albert ARIBAUD
Headers show

Comments

Allen Martin - July 18, 2012, 11:45 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 v4:
 -removed warning print
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 |   18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
Albert ARIBAUD - July 19, 2012, 6:06 a.m.
Hi Allen,

On Wed, 18 Jul 2012 16:45:53 -0700, 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>
> ---
> changes for v4:
>  -removed warning print
> 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 |   18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
> 
> diff --git a/arch/arm/config.mk b/arch/arm/config.mk
> index 3f4453a..24b9d7c 100644
> --- a/arch/arm/config.mk
> +++ b/arch/arm/config.mk
> @@ -87,3 +87,21 @@ endif
>  ifndef CONFIG_NAND_SPL
>  LDFLAGS_u-boot += -pie
>  endif
> +
> +#
> +# FIXME: 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)
> +endif
> +ifeq ($(GAS_BUG_12532),y)
> +PLATFORM_RELFLAGS += -fno-optimize-sibling-calls
> +endif
> +endif

Can previous reviewers ack or test this? I would like to have it in the ARM
master branch in time for 12.07.

Amicalement,
Tom Rini - July 19, 2012, 3:08 p.m.
On 07/18/2012 11:06 PM, Albert ARIBAUD wrote:
> Hi Allen,
> 
> On Wed, 18 Jul 2012 16:45:53 -0700, 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>
>> ---
>> changes for v4:
>>  -removed warning print
>> 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 |   18 ++++++++++++++++++
>>  1 file changed, 18 insertions(+)
>>
>> diff --git a/arch/arm/config.mk b/arch/arm/config.mk
>> index 3f4453a..24b9d7c 100644
>> --- a/arch/arm/config.mk
>> +++ b/arch/arm/config.mk
>> @@ -87,3 +87,21 @@ endif
>>  ifndef CONFIG_NAND_SPL
>>  LDFLAGS_u-boot += -pie
>>  endif
>> +
>> +#
>> +# FIXME: 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)
>> +endif
>> +ifeq ($(GAS_BUG_12532),y)
>> +PLATFORM_RELFLAGS += -fno-optimize-sibling-calls
>> +endif
>> +endif
> 
> Can previous reviewers ack or test this? I would like to have it in the ARM
> master branch in time for 12.07.

Acked-by: Tom Rini <trini@ti.com>
Allen Martin - Aug. 1, 2012, 5:34 p.m.
On Thu, Jul 19, 2012 at 08:08:31AM -0700, Tom Rini wrote:
> On 07/18/2012 11:06 PM, Albert ARIBAUD wrote:
> > Hi Allen,
> > 
> > On Wed, 18 Jul 2012 16:45:53 -0700, 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>


> > Can previous reviewers ack or test this? I would like to have it in the ARM
> > master branch in time for 12.07.
> 
> Acked-by: Tom Rini <trini@ti.com>

Hi Albert, just checking on the status of applying this to
u-boot-arm.  I have a patch series to enable thumb for tegra that
needs this.  I'll probably just keep a copy of this in that series
until it goes in.

thanks,
-Allen
Albert ARIBAUD - Oct. 4, 2012, 8:47 a.m.
Hi Allen,

On Wed, 18 Jul 2012 16:45:53 -0700, 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>
> ---
> changes for v4:
>  -removed warning print
> 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 |   18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
> 
> diff --git a/arch/arm/config.mk b/arch/arm/config.mk
> index 3f4453a..24b9d7c 100644
> --- a/arch/arm/config.mk
> +++ b/arch/arm/config.mk
> @@ -87,3 +87,21 @@ endif
>  ifndef CONFIG_NAND_SPL
>  LDFLAGS_u-boot += -pie
>  endif
> +
> +#
> +# FIXME: 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)
> +endif
> +ifeq ($(GAS_BUG_12532),y)
> +PLATFORM_RELFLAGS += -fno-optimize-sibling-calls
> +endif
> +endif

Applied to u-boot-arm/master, thanks!

Amicalement,

Patch

diff --git a/arch/arm/config.mk b/arch/arm/config.mk
index 3f4453a..24b9d7c 100644
--- a/arch/arm/config.mk
+++ b/arch/arm/config.mk
@@ -87,3 +87,21 @@  endif
 ifndef CONFIG_NAND_SPL
 LDFLAGS_u-boot += -pie
 endif
+
+#
+# FIXME: 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)
+endif
+ifeq ($(GAS_BUG_12532),y)
+PLATFORM_RELFLAGS += -fno-optimize-sibling-calls
+endif
+endif