All of lore.kernel.org
 help / color / mirror / Atom feed
From: Allen Martin <amartin@nvidia.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 2/7] HACK: rearrange link order for thumb
Date: Mon, 9 Jul 2012 17:45:35 -0700	[thread overview]
Message-ID: <20120710004535.GA2240@nvidia.com> (raw)
In-Reply-To: <20120707121536.4cdf7f35@lilith>

On Sat, Jul 07, 2012 at 03:15:36AM -0700, Albert ARIBAUD wrote:
> Hi Allen,
> 
> On Fri, 6 Jul 2012 16:17:19 -0700, Allen Martin <amartin@nvidia.com> wrote:
> > On Fri, Jul 06, 2012 at 01:44:32PM -0700, Stephen Warren wrote:
> > > On 07/06/2012 02:33 PM, Allen Martin wrote:
> > > > On Fri, Jul 06, 2012 at 12:09:43PM -0700, Stephen Warren wrote:
> > > >> On 07/06/2012 12:08 PM, Allen Martin wrote:
> > > >>> Rearrange the link order of libraries to avoid out of bound
> > > >>> relocations in thumb mode.  I have no idea how to fix this for real.
> > > >>
> > > >> Are the relocations branches or something else? It looks like
> > > >> unconditional jump range is +/-4MB for Thumb1 and +/-16MB for Thumb2, so
> > > >> I'm surprised we'd be exceeding that, considering the U-boot binary is
> > > >> on the order of 256KB on Tegra right now.
> > > > 
> > > > 
> > > > This is the relcation type:
> > > > 
> > > > arch/arm/lib/libarm.o: In function `__flush_dcache_all':
> > > > /home/arm/u-boot/arch/arm/lib/cache.c:52: relocation truncated to fit: R_ARM_THM_JUMP11 against symbol `flush_cache' defined in .text section in arch/arm/cpu/armv7/libarmv7.o
> > > > 
> > > > The instruction is a "b.n" not a "b", which is what is causing the problem.
> > > > 
> > > > I think because of the weak alias the compiler used a short jump to
> > > > the local function, but when it got linked it resolved to a function
> > > > that was too far away for the short jump:
> > > > 
> > > > 
> > > > void  flush_cache(unsigned long start, unsigned long size)
> > > >         __attribute__((weak, alias("__flush_cache")));
> > > > 
> > > > 00000002 <__flush_dcache_all>:
> > > >    2:   2000            movs    r0, #0
> > > >    4:   f04f 31ff       mov.w   r1, #4294967295 ; 0xffffffff
> > > >    8:   e7fe            b.n     0 <__flush_cache>
> > > 
> > > Ah, that explanation makes sense.
> > > 
> > > > It looks like there's a "-fno-optimize-sibling-calls" option to gcc to
> > > > avoid this problem.  Seems a shame to disable all short jumps for this
> > > > one case though.
> > > 
> > > It seems like a bug that the b-vs-b.n optimization is applied to a weak
> > > symbol, since the compiler can't possibly know the range of the jump.
> > > 
> > > Also, I've seen ld for some architectures rewrite the equivalent of b.n
> > > to plain b when needing to expand the branch target range; IIRC a
> > > process known as "relaxing"? Perhaps gcc is expecting ld to do that, but
> > > ld isn't?
> > 
> > And I forgot to mention, the code bloat from disabling the
> > optimization is about 400 bytes (185136 -> 185540), so it's not bad,
> > but it still seems a shame to disable all short branches because of
> > one misoptimized one.
> 
> Can this not be limited to compiling the object files which are known to be
> sensitive to the problem?
> 

I understand this issue fairly well now.  It's a known bug in the
assembler that has already been fixed:

http://sourceware.org/bugzilla/show_bug.cgi?id=12532

It only impacts preembtable symbols, and since u-boot doesn't have any
dynamic loadable objects it's only explictly defined weak symbols that
should trigger the bug.  

I built a new toolchain with binutils 2.22 and verified the bug is no
longer present there, and -fno-optimize-sibling-calls is the correct
workaround for toolchains that do have the bug, so conditionally
disabling the optimization for binutils < 2.22 seems like the right
fix.

I ran a quick scrub of the u-boot tree and there's 195 instances of
__attribute__((weak)) spread across 123 source files, so I think just
disabling optimization on the failing object files may be too fragile,
as code movement could cause others to crop up.

-Allen
-- 
nvpublic

  parent reply	other threads:[~2012-07-10  0:45 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-06 18:08 [U-Boot] [PATCH 0/7] tegra20: enable thumb Allen Martin
2012-07-06 18:08 ` [U-Boot] [PATCH 1/7] tegra20: remove inline assembly for u32 cast Allen Martin
2012-07-06 18:08 ` [U-Boot] [PATCH 2/7] HACK: rearrange link order for thumb Allen Martin
2012-07-06 19:09   ` Stephen Warren
2012-07-06 20:33     ` Allen Martin
2012-07-06 20:44       ` Stephen Warren
2012-07-06 21:32         ` Allen Martin
2012-07-06 23:04         ` Allen Martin
2012-07-06 23:17         ` Allen Martin
2012-07-07 10:15           ` Albert ARIBAUD
2012-07-07 18:42             ` Allen Martin
2012-07-10  0:45             ` Allen Martin [this message]
2012-07-10  0:57               ` Graeme Russ
2012-07-12 18:45                 ` Albert ARIBAUD
2012-07-17 19:26                   ` Allen Martin
2012-07-06 18:08 ` [U-Boot] [PATCH 3/7] tegra20: enable thumb build Allen Martin
2012-07-06 19:10   ` Stephen Warren
2012-07-06 20:34     ` Allen Martin
2012-07-06 18:08 ` [U-Boot] [PATCH 4/7] arm: add _thumb1_case_uqi to libgcc Allen Martin
2012-07-06 18:09 ` [U-Boot] [PATCH 5/7] arm: add thumb compatible return instructions Allen Martin
2012-07-06 18:09 ` [U-Boot] [PATCH 6/7] arm: use thumb compatible return in arm720t Allen Martin
2012-07-06 18:09 ` [U-Boot] [PATCH 7/7] arm: change arm720t to armv4t Allen Martin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120710004535.GA2240@nvidia.com \
    --to=amartin@nvidia.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.