[ELF][MIPS] Put local GOT entries accessed via a 16-bit index first
authorSimon Atanasyan <simon@atanasyan.com>
Fri, 21 Oct 2016 07:22:30 +0000 (07:22 +0000)
committerSimon Atanasyan <simon@atanasyan.com>
Fri, 21 Oct 2016 07:22:30 +0000 (07:22 +0000)
commitbed04bf1df9d442f4a8e4d914d0dcd9155f2b931
tree57eed9ee55e416965099b4be23be081c3a8f03aa
parentc1db0db8647110c89924e6a29afe6455ed61a2a5
[ELF][MIPS] Put local GOT entries accessed via a 16-bit index first

Some MIPS relocations used to access GOT entries are able to manipulate
16-bit index. The other ones like R_MIPS_CALL_HI16/LO16 can handle
32-bit indexes. 16-bit relocations are generated by default. The 32-bit
relocations are generated by -mxgot flag passed to compiler. Usually
these relocation are not mixed in the same code but files like crt*.o
contain 16-bit relocations so even if all "user's" code compiled with
-mxgot flag a few 16-bit relocations might come to the linking phase.

Now LLD does not differentiate local GOT entries accessed via a 16-bit
and 32-bit indexes. That might lead to relocation's overflow if 16-bit
entries are allocated to far from the beginning of the GOT.

The patch introduces new "part" of MIPS GOT dedicated to the local GOT
entries accessed by 32-bit relocations. That allows to put local GOT
entries accessed via a 16-bit index first and escape relocation's overflow.

Differential revision: https://reviews.llvm.org/D25833

llvm-svn: 284809
lld/ELF/InputSection.cpp
lld/ELF/OutputSections.cpp
lld/ELF/OutputSections.h
lld/ELF/Relocations.cpp
lld/ELF/Relocations.h
lld/ELF/Symbols.cpp
lld/ELF/Symbols.h
lld/ELF/Target.cpp
lld/test/ELF/mips-xgot-order.s [new file with mode: 0644]