Commit Graph

325 Commits

Author SHA1 Message Date
Rafael Espindola
e502751c42 Fix typo.
llvm-svn: 269072
2016-05-10 16:23:46 +00:00
Rafael Espindola
4ee6cb3a70 Document and test the first few .got.plt entries.
llvm-svn: 268945
2016-05-09 18:12:15 +00:00
Simon Atanasyan
8c8a5b5f81 [ELF][MIPS] Handling 'packed' N64 ABI relocations
MIPS N64 ABI packs multiple relocations into the single relocation
record. In general, all up to three relocations can have arbitrary types.
In fact, Clang and GCC uses only a few combinations. For now, we support
two of them. That is allow to pass at least all LLVM test suite cases.

<any relocation> / R_MIPS_SUB / R_MIPS_HI16 | R_MIPS_LO16
<any relocation> / R_MIPS_64 / R_MIPS_NONE

The first relocation is a 'real' relocation which is calculated using
the corresponding symbol's value. The second and the third relocations
used to modify result of the first one: extend it to 64-bit, extract
high or low part etc. For details, see part 2.9 'Relocation' at
https://dmz-portal.mips.com/mw/images/8/82/007-4658-001.pdf

llvm-svn: 268876
2016-05-08 14:08:40 +00:00
Simon Atanasyan
10296c2344 [ELF][MIPS] Remove redundant local variable. NFC
llvm-svn: 268852
2016-05-07 07:36:47 +00:00
Simon Atanasyan
5b9ac41c13 [ELF][MIPS] Reduce code duplication. NFC
llvm-svn: 268743
2016-05-06 15:02:54 +00:00
Simon Atanasyan
9ac819860f [ELF][MIPS] Reduce all MIPS R_GOTREL addends by MipsGPOffset in the single place. NFC
llvm-svn: 268742
2016-05-06 15:02:50 +00:00
Simon Atanasyan
da83bbc1a1 [ELF][MIPS] Create combined dynamic relocation type R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE
MIPS N64 ABI packs multiple relocations into the single relocation
record. Particularly it requires to represent dynamic relative
relocation as a combination of R_MIPS_REL32 and R_MIPS_64 relocations.

llvm-svn: 268565
2016-05-04 22:39:40 +00:00
Rafael Espindola
de17d28a32 Don't produce relative relocs to ro segments.
We were already checking for non relative relocations.

If we ever decide to add support for rw text segments this means we will
have a single spot to add the flag.

llvm-svn: 268558
2016-05-04 21:40:07 +00:00
Simon Atanasyan
be804559f8 [ELF][MIPS] R_MIPS_GOT_DISP, R_MIPS_GOT_PAGE, R_MIPS_GOT_OFST relocations support
These relocations introduced by MIPS N64 ABI. R_MIPS_GOT_DISP references
GOT entry with full symbol's address, R_MIPS_GOT_PAGE creates GOT entry
with address of memory page which includes symbol's address,
R_MIPS_GOT_OFST used together with R_MIPS_GOT_PAGE. This relocation
calculates offset from beginning of memory page to the symbol address.

llvm-svn: 268525
2016-05-04 17:47:11 +00:00
Rafael Espindola
38bd217d0c Delete getTlsGotRel.
It was an old hack to avoid duplicating expression computation, but that
is not needed with getExprRel.

llvm-svn: 268515
2016-05-04 15:51:23 +00:00
Rafael Espindola
ebb04b9eb6 Simplify handling of hint relocations.
llvm-svn: 268501
2016-05-04 14:44:22 +00:00
Simon Atanasyan
ae77ab71d8 [ELF][MIPS] Accept MIPS 64-bit binaries
LLD accepts MIPS 64-bit binaries, supports corresponding eulation (-m)
arguments and emits 64-bit specific ELF flags.

llvm-svn: 268024
2016-04-29 10:39:17 +00:00
Rafael Espindola
b8ff59ac12 Rename isRelRelative
It was never a particularly good name and is now completely out of date.

llvm-svn: 267886
2016-04-28 14:34:39 +00:00
Rafael Espindola
7ac9628648 Reduce usage of isRelRelative.
It is now used only for relocations that only set the low bits inside a
page. Everything else is handled by getRelExpr.

I will send a another review renaming and better documenting
isRelRelative.

llvm-svn: 267705
2016-04-27 12:47:30 +00:00
Rafael Espindola
15cec298e6 Represent TOC relative relocations as GOTREL.
That way we only need to subtract the offset is relocateOne.

llvm-svn: 267702
2016-04-27 12:25:22 +00:00
Rafael Espindola
520ed3a621 Create a .got when PPC64 uses a TOC.
This simplifies the logic for computing the value of the toc base.

llvm-svn: 267701
2016-04-27 12:21:27 +00:00
Rafael Espindola
365e5f69c9 Simplify handling of R_PPC64_TOC. NFC.
llvm-svn: 267698
2016-04-27 11:54:07 +00:00
Simon Atanasyan
4ee2918e6e [ELF][MIPS] Remove getMipsGpAddr(). NFC
llvm-svn: 267673
2016-04-27 05:31:28 +00:00
Rafael Espindola
1763dc44b9 Return R_GOTREL for R_MIPS_GPREL*.
This lets Writer.cpp know that they are got relative, which will allow
further simplifications.

llvm-svn: 267613
2016-04-26 22:00:04 +00:00
Simon Atanasyan
1ef1bf87dc [ELF][MIPS] Move MIPS GOT header generation to the GotSection
MIPS is the only target requires GOT header. We already have MIPS
specific code in the `GotSection` class, so move MIPS GOT header
generation there and delete redundant stuff like `GotHeaderEntriesNum`
field and `writeGotHeader` method.

Differential Revision: http://reviews.llvm.org/D19465

llvm-svn: 267460
2016-04-25 20:25:05 +00:00
Rafael Espindola
926bff8c3e Add support for R_X86_64_PC64.
llvm-svn: 267409
2016-04-25 14:05:44 +00:00
Rafael Espindola
d79073dc2a Simplify. NFC.
llvm-svn: 267396
2016-04-25 12:32:19 +00:00
Rafael Espindola
a6c4d2f197 Delete needsCopyRelImpl. It is redundant with getRelExpr.
llvm-svn: 267394
2016-04-25 12:05:56 +00:00
Rui Ueyama
55274e3fcb Add a file comment about the Ulrich's document and don't repeat it in other comments.
llvm-svn: 267261
2016-04-23 01:10:15 +00:00
Rafael Espindola
e26b50e71a Reduce templating. NFC.
llvm-svn: 267018
2016-04-21 17:37:11 +00:00
Rafael Espindola
b312a740ae Delete the needsPlt target hook.
It can be made redundant with getRelExpr.

llvm-svn: 267012
2016-04-21 17:30:24 +00:00
Rafael Espindola
0c869a752e Moves needsPlt to Writer.cpp.
It was only used there.

llvm-svn: 267002
2016-04-21 16:57:32 +00:00
Simon Atanasyan
98a4ba54df [ELF][MIPS] Treat R_MIPS_TLS_{D}TPREL_HI16/LO16 as relative relocations
These relocations are calculated as S + A - DTPREL or S + A - TPREL,
where DTPREL = TlsVA - 0x8000, TPREL = TlsVA - 0x7000. So the result
is relative to the TLS output section and is not an absolut value
The fix allows to escape creation of unnecessary dynamic relocations
in case of DSO linking.

llvm-svn: 266923
2016-04-20 21:57:51 +00:00
Rafael Espindola
c6b17bdc29 Delete refersToGotEntry.
It can be computed from the expression.

llvm-svn: 266890
2016-04-20 17:30:22 +00:00
Rafael Espindola
cc36a63f0b Move canRelaxTls to Writer.cpp. NFC.
llvm-svn: 266878
2016-04-20 14:41:55 +00:00
Rafael Espindola
6eda85ac1f Delete needsDynRelative.
It is now redundant. Writer.cpp can reason that 2 dynamic relocations
are needed: one to find the final got entry address and one to fill the
got entry.

llvm-svn: 266876
2016-04-20 14:36:24 +00:00
Rafael Espindola
58cd5db4ef Simplify mips got handling.
This avoids computing the address of a position in the got just to then
subtract got->getva().

llvm-svn: 266831
2016-04-19 22:46:03 +00:00
Rafael Espindola
f350d25942 Fix pr27420.
Return the right expression for R_X86_64_GOTPCRELX and
R_X86_64_REX_GOTPCRELX.

llvm-svn: 266810
2016-04-19 20:18:52 +00:00
Rafael Espindola
f4c1cd4006 Fix handling of R_X86_64_GOT32.
It computes the offset to the end of .got.

llvm-svn: 266610
2016-04-18 12:58:59 +00:00
Rafael Espindola
ece62b962e Simplify handling of R_X86_64_TPOFF32. NFC.
llvm-svn: 266609
2016-04-18 12:44:33 +00:00
Rafael Espindola
5bf59728e2 Remove isGotRelative.
It is now redundant with the expression. While at it, handle both "X -
Got" and "Got - PC".

llvm-svn: 266607
2016-04-18 12:31:37 +00:00
Rafael Espindola
3f5d634c73 Have getRelExpr handle all cases on x86.
This requires adding a few more expression types, but is already a small
simplification. Having Writer.cpp know the exact expression will also
allow further simplifications.

llvm-svn: 266604
2016-04-18 12:07:13 +00:00
Rafael Espindola
3c20fb4e5d Merge duplicated cases. NFC.
llvm-svn: 266601
2016-04-18 11:53:42 +00:00
Rafael Espindola
99c224787b Delete the now redundant pointsToLocalDynamicGotEntry.
llvm-svn: 266584
2016-04-18 01:34:20 +00:00
Rafael Espindola
df17277d72 Have getRelExpr return the final values for tls gd.
llvm-svn: 266583
2016-04-18 01:29:15 +00:00
Rafael Espindola
c4d56970dc Change getRelExpr to return the final value for TLSLD. NFC.
llvm-svn: 266580
2016-04-18 00:28:57 +00:00
Rafael Espindola
5628ee7631 Simplify got handling.
Each getRelExpr is now expected to return the correct got expression
instead of having Writer patch it up with needsGot.

llvm-svn: 266466
2016-04-15 19:14:18 +00:00
Rafael Espindola
7dd20563a2 Merge duplicated cases. NFC.
llvm-svn: 266459
2016-04-15 17:57:27 +00:00
Simon Atanasyan
1ca263c890 [ELF][MIPS] Make R_MIPS_LO16 a relative relocation if it references _gp_disp symbol
The _gp_disp symbol designates offset between start of function and 'gp'
pointer into GOT. The following code is a typical MIPS function preamble
used to setup $gp register:

lui    $gp, %hi(_gp_disp)
addi   $gp, $gp, %lo(_gp_disp)

To calculate R_MIPS_HI16 / R_MIPS_LO16 relocations results we use
the following formulas:

%hi(_gp - P + A)
%lo(_gp - P + A + 4),
where _gp is a value of _gp symbol, A is addend, and P current address.

The R_MIPS_LO16 relocation references _gp_disp symbol is always the second
instruction. That is why we need four byte adjustments. The patch assigns
R_PC type for R_MIPS_LO16 relocation and adjusts its addend by 4. That fix
R_MIPS_LO16 calculation.

For details see p. 4-19 at ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf

Differential Revision: http://reviews.llvm.org/D19115

llvm-svn: 266368
2016-04-14 21:10:05 +00:00
Rafael Espindola
3151d89595 Simplify handling of size relocations. NFC.
llvm-svn: 266355
2016-04-14 18:39:44 +00:00
Rafael Espindola
e149b488af Remove the only case where we would relocate a R_386_TLS_TPOFF.
llvm-svn: 266330
2016-04-14 16:05:42 +00:00
Rafael Espindola
c1c14a227e Merge duplicated cases. NFC.
llvm-svn: 266328
2016-04-14 15:56:14 +00:00
Rafael Espindola
22ef956a45 Change how we apply relocations.
With this patch we use the first scan over the relocations to remember
the information we found about them: will them be relaxed, will a plt be
used, etc.

With that the actual relocation application becomes much simpler. That
is particularly true for the interfaces in Target.h.

This unfortunately means that we now do two passes over relocations for
non SHF_ALLOC sections. I think this can be solved by factoring out the
code that scans a single relocation. It can then be used both as a scan
that record info and for a dedicated direct relocation of non SHF_ALLOC
sections.

I also think it is possible to reduce the number of enum values by
representing a target with just an OutputSection and an offset (which
can be from the start or end).

This should unblock adding features like relocation optimizations.

llvm-svn: 266158
2016-04-13 01:40:19 +00:00
Rafael Espindola
6f92e14ce2 Use DefinedSynthetic for _gp* symbols.
The test changes to put _gp* in the .got section matches what both bfd
and gold do.

llvm-svn: 266067
2016-04-12 13:26:51 +00:00
Rafael Espindola
3a72cc0083 Simplify now that we always have a .got.
llvm-svn: 266064
2016-04-12 13:23:27 +00:00