Commit Graph

5028 Commits

Author SHA1 Message Date
Rui Ueyama 1ebc8ed78a ELF: Add wildcard pattern matching to SECTIONS linker script command.
Each rule in SECTIONS commands is something like ".foo *(.baz.*)",
which instructs the linker to collect all sections whose name matches
".baz.*" from all files and put them into .foo section.

Previously, we didn't recognize the wildcard character. This patch
adds that feature.

Performance impact is a bit concerning because a linker script can
contain hundreds of SECTIONS rules, and doing pattern matching against
each rule would be too expensive. We could merge all patterns into
single DFA so that it takes O(n) to the input size. However, it is
probably too much at this moment -- we don't know whether the
performance of pattern matching matters or not. So I chose to
implement the simplest algorithm in this patch. I hope this simple
pattern matcher is sufficient.

llvm-svn: 260745
2016-02-12 21:47:28 +00:00
Rafael Espindola ac458405bf Trying to fix the MSVC build.
llvm-svn: 260743
2016-02-12 21:36:59 +00:00
Rafael Espindola f1d598c2f6 Try to fix the build in some bots.
llvm-svn: 260736
2016-02-12 21:17:10 +00:00
Rafael Espindola 9f77ef0c08 Add initial LTO support.
llvm-svn: 260726
2016-02-12 20:54:57 +00:00
Rui Ueyama e9c5806593 ELF: Remove use of MapVector from LinkerScript.
We don't have to use a MapVector here. Instead, just std::vector suffices.

llvm-svn: 260724
2016-02-12 20:41:43 +00:00
Rafael Espindola 852860e920 make needsPlt a pure predicate.
llvm-svn: 260685
2016-02-12 15:47:37 +00:00
Adhemerval Zanella 74bcf03f87 [lld] [ELF/AArch64] Add support to some GD/LE/IS TLS relocations
This patch adds some TLS relocations and relaxations for AArch64.
Some Global-Dynamic relocation are handled by optimizing them to
Local-Exec (Initial-Exec is not yet supported). They are:

 - R_AARCH64_TLSDESC_ADR_PAGE21
 - R_AARCH64_TLSDESC_LD64_LO12_NC
 - R_AARCH64_TLSDESC_ADD_LO12_NC
 - R_AARCH64_TLSDESC_CALL

Also some Init-Exec is optimized to Local-Exec if possible. They are:

 - R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21
 - R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC

Finally some Local-Exec relocation are handled in relocateOne:

 - R_AARCH64_TLSLE_ADD_TPREL_HI12
 - R_AARCH64_TLSLE_ADD_TPREL_LO12_NC

This work is mainly for compiler bootstrap, where static binaries is
showing good progress (although shared object still lacking support
from both TLS aarch64 backend and some other issues).

llvm-svn: 260677
2016-02-12 13:43:03 +00:00
Rui Ueyama 24b794e8aa Make compCtors strict weak ordering.
Previously, if both A and B are ".ctors", both compCtors(A, B) and
compCtors(B, A) are true, which is a violation of the strict weak
ordering because such function is not antisymmetric.

llvm-svn: 260633
2016-02-12 00:38:46 +00:00
Rui Ueyama 5af8368f8b ELF: Implement the correct semantics of .[cd]tors.
As I noted in the comment, the sorting order of .[cd]tors are
different from .{init,fini}_array's.

http://reviews.llvm.org/D17120

llvm-svn: 260620
2016-02-11 23:41:38 +00:00
Rui Ueyama f9de0d6904 ELF: Remove readLinkerScript and define LinkerScript::read instead.
llvm-svn: 260598
2016-02-11 21:38:55 +00:00
Rui Ueyama c1c282a04e ELF: Release Target at end of link().
Previously, Target held a value until a new value is assigned to the
variable. That was a benign leak -- that was not an unbounded leak
and didn't grab any resources except a small amount of memory. But
it is better to fix than leaving as is.

llvm-svn: 260592
2016-02-11 21:18:01 +00:00
Rui Ueyama 717677af35 ELF: Create LinkerScript class to move code out of Writer.
Previously, we had code for linker scripts in Writer. This patch
separates that as LinkerScript class. The class provides a few
functions to query linker scripts and is also a container of some
linker-script-specific information.

Hopefully, Writer will only implement the default behavior and let
the new class handle gotchas regarding linker scripts.

llvm-svn: 260591
2016-02-11 21:17:59 +00:00
Rafael Espindola 9d13d04138 Sort includes. NFC.
llvm-svn: 260528
2016-02-11 15:24:48 +00:00
George Rimar 2960c9867a [ELF] - Remove R_X86_64_GOTTPOFF from static relocation processing
R_X86_64_TPOFF64 is a dynamic relocation,
it should not appear in static relocation processing.
Patch fixes it.

Differential revision: http://reviews.llvm.org/D16880

llvm-svn: 260508
2016-02-11 11:14:46 +00:00
Rui Ueyama 6f46de21e1 ELF: Sort .[cd]tors by priority as we do for .{init,fini}_array.
llvm-svn: 260477
2016-02-11 01:07:19 +00:00
Rui Ueyama c2dca5d76e Reduce code repetition. NFC.
llvm-svn: 260476
2016-02-11 01:07:18 +00:00
Rui Ueyama 704da023cc Reorder code to improve readability. NFC.
llvm-svn: 260467
2016-02-10 23:43:16 +00:00
Rafael Espindola ef762f2639 Don't include NOBITS TLS in PT_LOAD.
They don't count for the memory or file size, so this is mostly just a
simplification.

The only noticeable difference should be fewer empty program headers.

llvm-svn: 260465
2016-02-10 23:29:38 +00:00
Rui Ueyama 2625882ebb ELF: Use stable sort to sort .{init,fini}_array sections.
Global constructors and destructors are guaranteed to be called
in the order as they appear in a translation unit. So we don't want
to mess up the order if they have the same priority.

llvm-svn: 260463
2016-02-10 23:26:27 +00:00
Rui Ueyama c418570db5 ELF: Implement __attribute__((init_priority(N)) support.
llvm-svn: 260460
2016-02-10 23:20:42 +00:00
Rafael Espindola 4fc6044a5e Split the creation of program headers in a few steps.
IMHO this makes the code easier to read and should help with linker
scripts.

This is strongly based on D16575. The main differences are:

We record a range of sections, not every section in a program header.

scanHeaders takes case of deciding what goes in every program header,
including PT_GNU_RELRO

We create dummy sections for the start of the file

With this, program header creation has 3 isolated stages:

Map sections to program headers.
Assign addresses to *sections*
Looking at sections find the address and size of each program header.

Thanks to George Rimar for the initial version.

llvm-svn: 260453
2016-02-10 22:43:13 +00:00
Rui Ueyama d41cb95621 ELF: Combine cases that has the same code.
llvm-svn: 260444
2016-02-10 22:00:21 +00:00
Pete Cooper 1de14dd6f2 Use ArrayRef instead of deep copies of CompactUnwindEntries. NFC.
We have a vector of all of the compact unwind entries anyway, and
its live as long as we need it to be.  So instead of copying from that
vector to another, just take references to the range of the original vector
we need for each compact unwind page.

llvm-svn: 260437
2016-02-10 21:32:24 +00:00
Simon Atanasyan 2287dc3bf8 [ELF][MIPS] Add lazy relocation support for MIPS
The patch adds lazy relocation support for MIPS and R_MIPS_26 relocation
handing.

R_MIPS_26 relocation might require PLT entry creation. In that case it
is fully supported by the patch. But if the relocation target is a local
symbol we need to use a different expression to calculate the relocation
result. This case is not implemented yet because there is no method to
get know the kind of relocation target in the `relocateOne` routine.

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

llvm-svn: 260424
2016-02-10 19:57:19 +00:00
Reid Kleckner 257102e63d Silence MSVC warning about falling off the end of a function after a fully covered switch
llvm-svn: 260417
2016-02-10 19:28:13 +00:00
Rafael Espindola 96449907a5 Add support for R_X86_64_DTPOFF64.
It is used by clang to produce debug info for tls variables.

llvm-svn: 260384
2016-02-10 16:26:31 +00:00
Rafael Espindola 156ed8ddd7 Use a SymbolBody to represent the personality.
NFC, just more in line with the rest of lld.

Thanks to Rui for the suggestion.

llvm-svn: 260380
2016-02-10 13:19:32 +00:00
Simon Atanasyan eae66c019b [ELF][MIPS] Group and sort initialization of MipsTargetInfo class fields. NFC
llvm-svn: 260365
2016-02-10 10:08:39 +00:00
Simon Atanasyan 6231391fa7 [ELF][MIPS] Rename MipsTargetInfo::relocateOne argument SA to S
MIPS 32-bit ABI uses REL relocation record format. We read addends from
relocation destinations right in the MipsTargetInfo::relocateOne
function.

llvm-svn: 260364
2016-02-10 10:08:35 +00:00
Rui Ueyama d3bd97a97d Rangefy, and replace a switch with `if`s. NFC.
llvm-svn: 260320
2016-02-09 23:11:21 +00:00
Rafael Espindola 9e072d30e5 Fix inverted comparison.
llvm-svn: 260310
2016-02-09 22:47:34 +00:00
Rui Ueyama dbcfedb330 ELF: Add 'using namespace llvm::dwarf'.
Most constants defined in llvm::dwarf namespace start with "DW_".
We don't have to worry about name conflicts.

llvm-svn: 260297
2016-02-09 21:46:11 +00:00
Rui Ueyama 6448f8ae5d ELF: Add .eh_frame 'P', 'R' and 'L' augmentation characters.
This basically reverts commit r260073 because it is found that
augmentation strings don't always start with "zR". It is reported
as https://llvm.org/bugs/show_bug.cgi?id=26541.

llvm-svn: 260294
2016-02-09 21:41:01 +00:00
Pete Cooper e8d9df4ea5 Use __nl_symbol_ptr instead of __got in the stubs pass on x86 archs.
The non lazy atoms generated in the stubs pass use an image cache to
hold all of the pointers.  On arm archs, this is the __got section,
but on x86 archs it should be __nl_symbol_ptr.

rdar://problem/24572729

llvm-svn: 260271
2016-02-09 20:11:17 +00:00
Pete Cooper 35c3318edc Aligned __stub_helper section to 4-bytes.
ld64 aligns most of the stub's to 2 byte alignment, expect for
the stub helper common atoms which are 4 byte aligned.

This adds a new field to StubInfo which tracks this alignment
and ensures that this is the alignment we get in the final image.

rdar://problem/24570220

llvm-svn: 260248
2016-02-09 18:56:37 +00:00
Rafael Espindola a0a65f973a Use the plt entry as the address of some symbols.
This is the function equivalent of a copy relocation.

Since functions are expected to change sizes, we cannot use copy
relocations. In situations where one would be needed, what is done
instead is:
* Create a plt entry
* Output an undefined symbol whose addr is the plt entry.

The dynamic linker makes sure any shared library uses the plt entry as
the function address.

llvm-svn: 260224
2016-02-09 15:11:01 +00:00
NAKAMURA Takumi 3725978b10 lld/test/mach-o/dependency_info.yaml: Forgot to remove XFAIL:win32.
llvm-svn: 260209
2016-02-09 07:44:10 +00:00
NAKAMURA Takumi 9eee62f558 lld/test/mach-o/dependency_info.yaml: Tweak for dos path.
llvm-svn: 260208
2016-02-09 07:30:24 +00:00
NAKAMURA Takumi 127295492d check-lld: Introduce %python.
llvm-svn: 260207
2016-02-09 07:30:18 +00:00
NAKAMURA Takumi c96ae0c8a8 Introduce the feature 'demangler' in check-lld. Mark lld/test/old-elf/X86_64/demangle.test as REQUIRES:demangler.
llvm-svn: 260206
2016-02-09 07:30:11 +00:00
NAKAMURA Takumi f01d3e59b9 Disable lld/test/old-elf/group-cmd-search.test on win32. "XFAIL:win32" was insufficient.
llvm-svn: 260205
2016-02-09 07:30:04 +00:00
Pete Cooper 9b28a4559e Add cmdline options for LC_DATA_IN_CODE load command.
Also added the defaults for whether to generate this load command, which
the cmdline options are able to override.

There was also a difference to ld64 which is fixed here in that ld64 will
generate an empty data in code command if requested.

rdar://problem/24472630

llvm-svn: 260191
2016-02-09 02:10:39 +00:00
Pete Cooper 41f3e8e408 Generate LC_FUNCTION_STARTS load command.
This load command generates data in the LINKEDIT section which
is a list of ULEB128 delta's to all of the functions in the __text section.

It is then 0 terminated and pointer aligned to pad.

ld64 exposes the -function-starts and no-function-starts cmdline options
to override behaviour from the defaults based on file types.

rdar://problem/24472630

llvm-svn: 260188
2016-02-09 01:38:13 +00:00
Pete Cooper 841a978d22 We should never dead strip mach header symbols.
This was a bug in our handling of these symbols compared to ld64.

Turns out that ld64 always marks these symbols as being not dead stripped.

llvm-svn: 260185
2016-02-09 01:34:13 +00:00
Pete Cooper cea565593f Reorder enum entry as its used for atom sorting.
The atom content type enum is used as a tie breaker to sort atoms.
In that case, we want MachHeader to be before typeCode as it really will
be before the code in the final executable.

Test case to follow in the next commit or two.

llvm-svn: 260184
2016-02-09 01:27:30 +00:00
Pete Cooper d75b7181df Move includes inside guards. NFC.
These includes were before the #ifndef/#define guards.  Moving them to
where they should be.

llvm-svn: 260153
2016-02-08 21:50:45 +00:00
Rafael Espindola a64f7d1148 Fix the alignment of PT_PHDR.
We were claiming it was aligned to 8 bytes even on 32 bit files, which
is not the case.

llvm-svn: 260102
2016-02-08 15:33:53 +00:00
Simon Atanasyan e1bfc2e793 [ELF][MIPS] Support R_MIPS_COPY relocation
Generate R_MIPS_COPY relocation for 'static' relocations against object
symbols defined in a shared libraries.

llvm-svn: 260083
2016-02-08 10:05:13 +00:00
Rui Ueyama be748c2033 ELF: Simplify getFdeEncoding.
I found that the handling of 'L' character in an augmentation string is
wrong because 'L' means that the next byte is the length field. I could
have fixed that by just skipping the next byte, but I decided to take a
different approach.

Teaching the linker about all the types of CIE internal records just to
skip them is silly. And the code doing that is not actually executed now
(that's why the bug did not cause any issue.) It is because the 'R' field,
which we want to read, is always at beginning of the CIE. So I reduced
the code dramatically by assuming that that's always the case. I want to
see how it works in the wild. If it doesn't work, we can roll this back
(with a fix for 'L').

http://reviews.llvm.org/D16939

llvm-svn: 260073
2016-02-08 05:18:44 +00:00
Simon Atanasyan 8a611a858b [ELF][MIPS] Perform two checks using the single llvm-objdump / FileCheck run
NFC

llvm-svn: 260054
2016-02-07 20:36:40 +00:00