Commit Graph

1634 Commits

Author SHA1 Message Date
Rafael Espindola fb4f2fedd1 Be sure to always increment the Versym pointer.
It was getting out of sync if we had undefined symbols at the start of
the symbol table.

llvm-svn: 268077
2016-04-29 17:46:07 +00:00
Rafael Espindola eaaec4a4c8 Fix the alignment of the version info.
llvm-svn: 268070
2016-04-29 17:19:45 +00:00
Rafael Espindola 18da0e589a Fix producing undefined reference to __progname.
We were not producing them if the library had version info.

llvm-svn: 268060
2016-04-29 16:23:31 +00:00
Rui Ueyama fb6d499ed7 ELF: Add -O0 (produce output as fast as possible) mode.
This patch redefines the default optimization level as 1 and adds
new level 0. In the command line, it is -O0. The flag disables
costly but optional features so that the linker produces semantically
correct but larger output quickly. Currently it only disables
section merging.

This flag is not intended to be used for final production linking.
It is intended to be used in compile-link-test cycle.

Time to link clang with debug info is about 2x faster with the flag.

  Head:
  13.24 seconds
  Output size: 1227189664 bytes

  With this patch:
  7.41 seconds
  Output size: 2490281784 bytes

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

llvm-svn: 268056
2016-04-29 16:12:29 +00:00
George Rimar 9fc5908674 [ELF] Fixed warning. NFC.
SymbolTable.cpp:298:36: warning: enumeral and non-enumeral type in conditional expression [-Wextra]
     Sym->Binding = New->isShared() ? STB_GLOBAL : New->Binding;
                                    ^

llvm-svn: 268040
2016-04-29 13:32:30 +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
Rui Ueyama 890ce0c188 Do not produce broken debug info.
r267917 produces corrupted debug info because it didn't apply
relocations to right offsets.

llvm-svn: 267979
2016-04-29 03:21:08 +00:00
Rafael Espindola 0de48c393d Delete dead variable.
llvm-svn: 267935
2016-04-28 20:29:12 +00:00
Rafael Espindola 156f4ee1c0 Use a single context for lto.
Using multiple context used to be a really big memory saving because we
could free memory from each file while the linker proceeded with the
symbol resolution. We are getting lazier about reading data from the
bitcode, so I was curious if this was still a good tradeoff.

One thing that is a bit annoying is that we still have to copy the
symbol names. The problem is that the names are stored in the Module and
get freed when we move the module bits during linking.

Long term I think the solution is to add a symbol table to the bitcode.
That way IRObject file will not need to use a Module or a Context and we
can drop it while still keeping a StringRef to the names.

This patch is still be an interesting medium term improvement.

When linking llvm-as without debug info this patch is a small speedup:

master: 29.861877513 seconds
patch: 29.814533787 seconds

With debug info the numbers are

master: 34.765181469 seconds
patch: 34.563351584 seconds

The peak memory usage when linking llvm-as with debug info was

master: 599.10MB
patch: 600.13MB
llvm-svn: 267921
2016-04-28 19:30:41 +00:00
Rui Ueyama 2b6fb80384 Skip scanRelocs for non-alloc sections.
Relocations against sections with no SHF_ALLOC bit are R_ABS relocations.
Currently we are creating Relocations vector for them, but that is wasteful.
This patch is to skip vector construction and to directly apply relocations
in place.

This patch seems to be pretty effective for large executables with debug info.
r266158 (Rafael's patch to change the way how we apply relocations) caused a
temporary performance degradation for such executables, but this patch makes
it even faster than before.

Time to link clang with debug info (output size is 1070 MB):

  before r266158: 15.312 seconds (0%)
  r266158:        17.301 seconds (+13.0%)
  Head:           16.484 seconds (+7.7%)
  w/patch:        13.166 seconds (-14.0%)

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

llvm-svn: 267917
2016-04-28 18:42:04 +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
George Rimar 959d180fa6 Fixed mistype in comment. NFC.
llvm-svn: 267878
2016-04-28 13:38:10 +00:00
Rui Ueyama e5c1ec4716 Add comment.
llvm-svn: 267847
2016-04-28 03:04:15 +00:00
Rui Ueyama 5d7a3d011d Do not call hasArg and getLastArg for the same option.
llvm-svn: 267839
2016-04-28 02:08:54 +00:00
Rui Ueyama 62ee16faa8 Remove Size from Undefined symbol.
There seems to be no reason to keep st_size of undefined symbols.
This patch removes the member for it. This patch will change outputs
in cases that undefined symbols are copied to output, but I think
this is unimportant.

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

llvm-svn: 267826
2016-04-28 00:26:54 +00:00
Rui Ueyama 1b70d666ae Do not lookup the symbol table twice for each --wrap.
llvm-svn: 267822
2016-04-28 00:03:38 +00:00
Rafael Espindola 9fdd071d01 Sort includes. NFC.
llvm-svn: 267821
2016-04-27 23:54:04 +00:00
Davide Italiano 575ad8c2e1 [ELF] -R is an alias for -rpath.
perl-5 uses the former, so provide an alias. Found while linking
the whole set of FreeBSD ports with lld.

llvm-svn: 267801
2016-04-27 21:56:53 +00:00
Peter Collingbourne 21a12fc69a ELF: Create .gnu.version and .gnu.version_r sections when linking against versioned DSOs.
Differential Revision: http://reviews.llvm.org/D19464

llvm-svn: 267775
2016-04-27 20:22:31 +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
George Rimar 22a95121b9 Removed dead code. NFC.
llvm-svn: 267685
2016-04-27 09:24:03 +00:00
George Rimar 5f85732738 [ELF] - Align sections file offsets correctly.
System V ABI 4.1 specifies that program header's p_vaddr should equal p_offset, modulo p_align. 
(https://docs.oracle.com/cd/E19683-01/816-1386/chapter6-83432/index.html).
It was possible to violate this using the linkerscript.
Patch fixes the issue.

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

llvm-svn: 267684
2016-04-27 09:16:28 +00:00
Simon Atanasyan 4ee2918e6e [ELF][MIPS] Remove getMipsGpAddr(). NFC
llvm-svn: 267673
2016-04-27 05:31:28 +00:00
Rui Ueyama 389aa8e91e Simplify. NFC.
llvm-svn: 267663
2016-04-27 03:04:56 +00:00
Peter Collingbourne 60976ed7c0 ELF: Merge UndefinedBitcode and UndefinedElf. NFC.
Differential Revision: http://reviews.llvm.org/D19566

llvm-svn: 267640
2016-04-27 00:05:06 +00:00
Peter Collingbourne 892d498017 ELF: Re-implement -u directly and remove CanKeepUndefined flag.
The semantics of the -u flag are to load the lazy symbol named by the flag. We
were previously relying on this behavior falling out of symbol resolution
against a synthetic undefined symbol, but that didn't quite give us the
correct behavior, so we needed a flag to mark symbols created with -u so
we could treat them specially in the writer. However, it's simpler and less
error prone to implement the required behavior directly and remove the flag.

This fixes an issue where symbols loaded with -u would receive hidden
visibility even when the definition in an object file had wider visibility.

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

llvm-svn: 267639
2016-04-27 00:05:03 +00:00
Peter Collingbourne 676c7cd1ed ELF: Move code to where it is used, and related cleanups. NFC.
Differential Revision: http://reviews.llvm.org/D19490

llvm-svn: 267637
2016-04-26 23:52:44 +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
Rafael Espindola 6c75238aca Call repl in getSymbolBody. NFC.
Every caller was doing it.

llvm-svn: 267603
2016-04-26 20:45:31 +00:00
Rui Ueyama cf0dd1ebf2 Move utility functions to DriverUtils.cpp.
llvm-svn: 267602
2016-04-26 20:41:32 +00:00
Rui Ueyama 673b609586 Handle Windows drive letters and ".." for --reproduce.
When --reproduce <path> is given, then we need to concatenate input
file paths to the given path to save input files to the directory.
Previously, path concatenation didn't handle Windows drive letters
so it could generate invalid paths such as "C:\D:\foo". It also didn't
handle ".." path components, so it could produce some bad paths
such as "foo/../../etc/passwd".

In this patch, Windows drive letters and ".." are removed before
concatenating paths.

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

llvm-svn: 267600
2016-04-26 20:36:46 +00:00
Rafael Espindola 1b65ad1725 Don't gc symbols that have to go in the dynamic symbol table.
We were only doing it for .so and --export-dynamic, but those are not
the only ways a symbol ends up in the dynamic symbol table.

Problem diagnostic and earlier patch version by Peter Collingbourne.

llvm-svn: 267568
2016-04-26 16:26:45 +00:00
Peter Collingbourne 5dd550a3ff ELF: Treat IFunc definitions in DSOs as functions.
Differential Revision: http://reviews.llvm.org/D19517

llvm-svn: 267566
2016-04-26 16:22:51 +00:00
Rafael Espindola 0baa73f317 Handle --as-needed with symbols, not relocations.
This matches the behavior of both gold and bfd.

llvm-svn: 267558
2016-04-26 13:56:26 +00:00
Rafael Espindola 9e32e4fe86 Store the binding in the Symbol.
This remove a fixme, cleans up the weak undef interaction with archives and
lets us keep weak undefs still weak if they resolve to shared.

llvm-svn: 267555
2016-04-26 13:50:46 +00:00
Davide Italiano e53e6e9f37 [ELF] Simplify. Pointed out by Rui Ueyama.
llvm-svn: 267523
2016-04-26 05:51:37 +00:00
Davide Italiano 034f58a9bd [ELF] Introduce --reproduce flag.
--reproduce dumps the object files in a directory chosen
(preserving the file system layout) and the linker invocation
so that people can create an archive and upload for debugging.

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

llvm-svn: 267497
2016-04-26 00:22:24 +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
Simon Atanasyan c245d84213 [ELF] Delete extra line. NFC
llvm-svn: 267391
2016-04-25 10:18:48 +00:00
George Rimar ab9390664f [ELF] - Implemented comparsion operators for linkerscript.
Patch adds support of <,>,!=,==,>=,<= operators.

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

llvm-svn: 267382
2016-04-25 08:14:41 +00:00
George Rimar 1a4f89ab0a [ELF] - Removed dead declarations. NFC.
llvm-svn: 267381
2016-04-25 08:08:54 +00:00
Davide Italiano bfccefd514 [ELF] Reinstate 'else' which was previously removed.
It turns out it's actually needed.

llvm-svn: 267358
2016-04-24 18:23:21 +00:00
Davide Italiano 7d32a4d27f [ELF] Simplify. Remove unneeded else. NFC.
llvm-svn: 267333
2016-04-24 07:19:32 +00:00
Peter Collingbourne dbe4187d11 ELF: Simplify preemption logic. Do not include weak undefined symbols in non-DSOs.
Add a test for -Bsymbolic + undefined symbols.

llvm-svn: 267323
2016-04-24 04:29:59 +00:00