LLVM Bugzilla is read-only and represents the historical archive of all LLVM issues filled before November 26, 2021. Use github to submit LLVM bugs

Bug 22999 - We can emit unlinkable object files when compiling large modules on (at least) ARM
Summary: We can emit unlinkable object files when compiling large modules on (at least...
Status: RESOLVED FIXED
Alias: None
Product: libraries
Classification: Unclassified
Component: Backend: ARM (show other bugs)
Version: trunk
Hardware: PC Linux
: P normal
Assignee: Unassigned LLVM Bugs
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2015-03-23 13:06 PDT by Peter Collingbourne
Modified: 2017-11-28 15:48 PST (History)
7 users (show)

See Also:
Fixed By Commit(s):


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Peter Collingbourne 2015-03-23 13:06:58 PDT
On ARM, if the compiled size of the .text section exceeds 32MB (the maximum call displacement), the linker will not necessarily be able to resolve relocations for the calls. The below asm file illustrates the problem (it is also possible to reproduce in IR, but the reproduction is too large for here.)

$ cat call-range-l.s
.zero 100000000
.global foo
foo:
bl bar
.zero 100000000
.section        .text._Z1fv,"axG",%progbits,_Z1fv,comdat
.global bar
bar:
nop
$ ~/src/llvm-build-rel/bin/llvm-mc -filetype=obj -o call-range-l.o call-range-l.s -triple armv7
$ ~/src/binutils-gdb-inst-arm/bin/ld.bfd -m armelf_linux_eabi -e foo call-range-l.o
call-range-l.o: In function `foo':
(.text+0x5f5e100): relocation truncated to fit: R_ARM_CALL against symbol `bar' defined in .text._Z1fv[_Z1fv] section in call-range-l.o
$ ~/src/binutils-gdb-inst-arm/bin/ld.gold -m armelf_linux_eabi -e foo call-range-l.o
.../src/binutils-gdb-inst-arm/bin/ld.gold: internal error in arm_branch_common, at ../../binutils-gdb/gold/arm.cc:4014

This problem particularly comes up when using LTO.

An easy way to solve the problem would be to teach the LTO backend to use -function-sections on architectures where this matters (e.g. ARM), if we're comfortable with the assumption that only LTO can create objects with .text sections that large. It may also be possible for the backend to do something smarter based on the computed size of .text.
Comment 1 Rafael Ávila de Espíndola 2015-03-24 13:48:49 PDT
Having an option to use function-section and data-section with LTO would be good.

Not sure about making the default architecture dependent.
Comment 2 Peter Collingbourne 2016-03-24 13:03:14 PDT
I discovered that the lack of -function-sections was inhibiting ICF. Would there be any downside to enabling function sections unconditionally? Because if not, I'd rather just do that.
Comment 3 Mehdi Amini 2016-10-02 15:14:33 PDT
What is ICF?
Comment 4 Rafael Ávila de Espíndola 2016-10-02 15:18:56 PDT
(In reply to comment #3)
> What is ICF?

Identical code/comdat folding. See lld/ELF/ICF.cpp.
Comment 5 Florian Hahn 2017-06-27 08:02:03 PDT
I ran into this issue when bootraping Clang with LTO on ARM. Some discussion can be found here: https://reviews.llvm.org/D24644

Some concerns where raised about enabling -ffunction-sections by default as this could increase binary size and link time. I had a look and could not find a way to determine/guess the file size of the resulting, as the sections to place functions in is determined while emitting functions, so before the total size is known.
Comment 6 Davide Italiano 2017-07-25 08:32:31 PDT
(In reply to Florian Hahn from comment #5)
> I ran into this issue when bootraping Clang with LTO on ARM. Some discussion
> can be found here: https://reviews.llvm.org/D24644
> 
> Some concerns where raised about enabling -ffunction-sections by default as
> this could increase binary size and link time. I had a look and could not
> find a way to determine/guess the file size of the resulting, as the
> sections to place functions in is determined while emitting functions, so
> before the total size is known.

FWIW, lld + LTO now has function-sections/data-sections by default. 
I plan to do a similar change for the gold plugin and COFF in the next bit.
Comment 7 Gordon Keiser 2017-11-14 20:21:09 PST
I was under the impression that > 32MB text was simply not allowed on ARM and multiple text sections or shared libraries should be used to work around this.  -ffunction-sections could help with size reduction but the root issue of support is still there.  I believe iOS has this restriction as well.
Comment 8 Rafael Ávila de Espíndola 2017-11-28 15:44:24 PST
This was fixed by r309056, no?
Comment 9 Peter Collingbourne 2017-11-28 15:48:16 PST
Yes, I believe so.