Commit Graph

2418 Commits

Author SHA1 Message Date
Simon Atanasyan 1b2a089951 [Mips] Remove redundant #include
No functional changes.

llvm-svn: 233692
2015-03-31 13:04:08 +00:00
Simon Atanasyan cb576ef415 [Mips] Move the `Elf_RegInfo` structure declaration to the separate file
No functional changes.

llvm-svn: 233618
2015-03-30 22:36:07 +00:00
Simon Atanasyan 2693b5a36c [ELF] Change type of `OutputSection::setType()` argument to int64_t
Type of `OutputSection::_type` field is int64_t. This change makes
the field's and the argument's types consistent and allows to assign
full range of values to the `OutputSection::_type` field.

llvm-svn: 233617
2015-03-30 22:36:01 +00:00
Simon Atanasyan d484653fed [Mips] clang-format the code
No functional changes.

llvm-svn: 233616
2015-03-30 22:35:56 +00:00
Simon Atanasyan 8d08bb2154 [ELF] Use override keyword instead of virtual
No functional changes.

llvm-svn: 233550
2015-03-30 15:07:16 +00:00
Simon Atanasyan 6dec97f2c3 [Mips] Do not use llvm::Optional for GP0 value and TLS section address
Use of llvm::Optional is redundant here. Initializing by default value 0
is enough.

No functional changes.

llvm-svn: 233549
2015-03-30 15:07:11 +00:00
Simon Atanasyan a341e38e39 [Mips] Rename class method merge => mergeHeaderFlags
No functional changes.

llvm-svn: 233548
2015-03-30 15:07:05 +00:00
Simon Atanasyan f9db164355 [Mips] Fix writing R_MIPS_REL32 relocation addendum
If input relocation records have RELA format while output dynamic
relocations have REL format the only way to transfer a dynamic
relocation addendum is to save it into the location modified by
the dynamic relocation.

llvm-svn: 233532
2015-03-30 11:39:02 +00:00
Rui Ueyama 4757f3210c ELF: Use C++11 non-member initialization.
Setting _alignment member varaible to 0 look suspicious since
the minimum alignment value is 1. I'm not going to change that
number in this patch, though.

llvm-svn: 233472
2015-03-28 04:17:41 +00:00
Rui Ueyama aedd1117e9 ELF: Add a comment about the sysroot path.
llvm-svn: 233461
2015-03-28 00:59:37 +00:00
Rui Ueyama 483f05f49b ELF: Do less if HAVE_CXXABI_H is not defined.
If HAVE_CXXABI_H is not defined, this function is the identity function.
Because HAVE_CXXABI_H did not protect the entire function, it did
extra stuffs before returning the argument.

The new code calls fewer functions. This should help developers understand
this piece of code.

llvm-svn: 233460
2015-03-28 00:47:13 +00:00
Rui Ueyama fa3e8979a5 ELF: make code concise using "using".
llvm-svn: 233458
2015-03-28 00:34:09 +00:00
Rui Ueyama 034f627838 Use cast instead of dyn_cast in combination with llvm_unreachable.
llvm-svn: 233456
2015-03-28 00:09:26 +00:00
Rui Ueyama 6fab3c73b8 Use lambda for std::find_if.
llvm-svn: 233454
2015-03-28 00:00:09 +00:00
Rui Ueyama 286494717f Remove else after return.
llvm-svn: 233453
2015-03-27 23:50:09 +00:00
Rui Ueyama ccaaa21bc9 Use lambda instead of defining a class with operator().
llvm-svn: 233452
2015-03-27 23:47:01 +00:00
Rui Ueyama cefe5d678d ELF: make scopes of error code varaibles narrower.
llvm-svn: 233450
2015-03-27 23:30:38 +00:00
Rui Ueyama 5332ba8bea ELF: Simplify SymbolFile.
llvm-svn: 233449
2015-03-27 23:26:39 +00:00
Rui Ueyama b531fe33d5 ELF: Use C++11 non-member initialization.
llvm-svn: 233434
2015-03-27 22:10:29 +00:00
Rui Ueyama 89616adb0c Use override keyword instead of virtual.
llvm-svn: 233424
2015-03-27 21:39:15 +00:00
Rui Ueyama 988355c3ae Remove empty constructors.
llvm-svn: 233423
2015-03-27 21:39:13 +00:00
Rui Ueyama 96278ff759 Fix formatting.
llvm-svn: 233418
2015-03-27 20:50:56 +00:00
Rui Ueyama 194c21209f Remove dead code.
I actually spend my time to understand this piece of code
and then realized that this is all dead.

llvm-svn: 233417
2015-03-27 20:50:54 +00:00
Rui Ueyama 7b57cef5b0 ELF: Add override.
Some virtual member functions in ELF directory don't have
virtual type specifier. Add override to them.

llvm-svn: 233406
2015-03-27 20:15:46 +00:00
Rui Ueyama 674aaaa367 ELF: Remove blank doPreFlight and finalize member functions.
Make these functions non-pure and define the default implementations.

llvm-svn: 233405
2015-03-27 20:15:44 +00:00
Rui Ueyama 52cd43e187 Fix formatting.
llvm-svn: 233402
2015-03-27 19:46:52 +00:00
Rui Ueyama 395b21e192 Rename all caps class names.
We have GOTAtom and PLTAtom classes because GOT or PLT are acronyms.
"Dynamic offset table" or "dynamic" are not acronyms.

llvm-svn: 233401
2015-03-27 19:33:05 +00:00
Rui Ueyama 4f694c873a Remove this->.
llvm-svn: 233400
2015-03-27 19:33:02 +00:00
Denis Protivensky 7eda022521 [ARM] Handle GOT relocations
This includes relocs needed to link against glibc:
R_ARM_BASE_PREL
R_ARM_GOT_BREL

Every reloc is accompanied with a test case.

llvm-svn: 233383
2015-03-27 16:29:08 +00:00
Denis Protivensky 4bdaefdcbe [ARM] Simplify IFUNC code by removing useless handler
llvm-svn: 233374
2015-03-27 12:41:36 +00:00
Denis Protivensky a6e7516ad9 [ARM] Add more IFUNC handlers
llvm-svn: 233372
2015-03-27 12:19:33 +00:00
Rui Ueyama c9ee4de6ca Rename ELFLinkingContext instances "ctx" intead of "context".
llvm-svn: 233344
2015-03-27 01:36:17 +00:00
Rui Ueyama 8b95afa095 Use llvm::make_unique.
llvm-svn: 233319
2015-03-26 21:16:26 +00:00
Rui Ueyama d97b9d8999 Remove duplicate code and empty classes.
llvm-svn: 233316
2015-03-26 21:01:13 +00:00
Rui Ueyama 24f2d2a9d5 Remove Makefiles.
Most developers prefer to not have them, and we agreed to
remove them from LLD.
http://lists.cs.uiuc.edu/pipermail/llvmdev/2015-March/083368.html

llvm-svn: 233313
2015-03-26 20:09:47 +00:00
Leny Kholodov 28074d6e9b [ARM] Implementation of PLT: handling of IFUNC calls (gnu_indirect_function)
This diff includes implementation of linking calls to ifunc functions.
It provides ifunc entries in PLT and corresponding relocations (R_ARM_ALU_PC_G0_NC,
R_ARM_ALU_PC_G1_NC, R_ARM_LDR_PC_G2 for link-time and R_ARM_IRELATIVE for run-time).

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

llvm-svn: 233277
2015-03-26 14:57:50 +00:00
Leny Kholodov 4fdbf55730 Revert blank line after test commit
llvm-svn: 233268
2015-03-26 10:44:14 +00:00
Leny Kholodov 1d01cc7c1b Commit access verification: blank line has been added
llvm-svn: 233267
2015-03-26 10:37:53 +00:00
Denis Protivensky 9e473d0929 [ARM] Handle mapping symbols
Mapping symbols should have their own code models,
and in some places must be treated in a specific way.
Make $t denote Thumb code, and $a and $d denote ARM code.
Set size, binding and type of mapping symbols to what the specification says.

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

llvm-svn: 233259
2015-03-26 07:47:16 +00:00
Rui Ueyama da74d57edb Rename align2 -> align.
I believe "2" stands for log2. Just "align" would be appropriate now.

llvm-svn: 233248
2015-03-26 02:23:45 +00:00
Rui Ueyama 39eb6db9a5 Store non-log2 values to Native files.
llvm-svn: 233247
2015-03-26 02:23:42 +00:00
Rui Ueyama 629f964d50 Use arithmetic type to represent alignments (not in log2) everywhere.
This is the final step of conversion. Now log2 numbers are removed
from everywhere!

llvm-svn: 233246
2015-03-26 02:20:25 +00:00
Rui Ueyama f217ef0d75 Use alignment values everywhere instead of log2.
This patch defines implicit conversion between integers and PowerOf2
instances, so uses of the classes is now implicit and look like
regular integers. Now we are ready to remove the scaffolding.

llvm-svn: 233245
2015-03-26 02:03:44 +00:00
Rui Ueyama f006f4d62c Define an implicit constructor which takes actual alignment value to PowerOf2.
The new constructor's type is the same, but this one takes not a log2
value but an alignment value itself, so the meaning is totally differnet.

llvm-svn: 233244
2015-03-26 01:44:01 +00:00
Rui Ueyama 48865ca64d Make PowerOf2's constructor private.
Ban conversion from integers to PowerOf2 even if explicit
to make all places we create PowerOf2 instances visible.

llvm-svn: 233243
2015-03-26 01:29:06 +00:00
Rui Ueyama c3d18f5120 Remove implicit constructor and operator int from PowerOf2.
This patch is to make instantiation and conversion to an integer explicit,
so that we can mechanically replace all occurrences of the class with
integer in the next step.

Now get() returns an alignment value rather than its log2 value.

llvm-svn: 233242
2015-03-26 01:12:32 +00:00
Rui Ueyama d2c1bf638b Add a scaffolding to merge alignment representations.
We are using log2 values and values themselves to represent alignments.
For example, alignment 8 is sometimes represented as 3 (8 == 2^3).
We want to stop using log2 values.

Because both types are regular arithmetic types, we cannot get help from
a compiler to find places we mix two representations. That makes this
merging work surprisingly hard because if I make a mistake, I'll just get
wrong results at runtime (Yay types!). In this patch, I introduced
a class to represents power-of-two values, which is basically an alias
for an integer type.

Once the migration is done, the class will be removed.

llvm-svn: 233232
2015-03-26 00:10:50 +00:00
Rui Ueyama 533849c615 YAML: Do not use 2^x notation to represent alignments.
llvm-svn: 233222
2015-03-25 22:06:04 +00:00
Rui Ueyama 2977772f54 Use llvm::isPowerOf2. NFC.
llvm-svn: 233219
2015-03-25 21:21:57 +00:00
Rui Ueyama aa9cd48e2b Inherit constructors. No functionality change.
We cannot use "using" to inherit constructors because the feature
is not supported by MSVC 2013.

llvm-svn: 233218
2015-03-25 21:20:11 +00:00
Simon Atanasyan 235838e1b8 [Mips] Factor out the code that extracts a relocation 'tag' into
the separate function

That keeps "extracting" logic into the single place and removes a VC++
compilation warning.

llvm-svn: 233186
2015-03-25 13:12:59 +00:00
Rui Ueyama c756b2dfac PECOFF: Reduce import table size.
Import Lookup Table in Import Directory Table has the same contents
as Hint/Name Table. Symbol names imported from DLLs are pointed by
both Import Directory Table and Hint/Name Table. We had duplicate
strings there.

This patch eliminates that duplication to make the table smaller.
This should reduce binary size by the sum of lengths of imported
symbols.

llvm-svn: 233128
2015-03-24 22:43:58 +00:00
Simon Atanasyan d13587f671 [Mips] Suppress "right shift by too large amount" warning
Visual C++ shows the "right shift by too large amount" warning if
`MipsELFReference` is instantiated for 32-bit target and `Elf_Rel_Impl::getType`
method has `unsigned char` return type. We can freely suppress the warning in
that case because MIPS 32-bit ABI does not pack multiple relocation types into
the single field `r_type` and the `MipsELFReference::_tag` should be always
zero in that case.

No functional changes.

llvm-svn: 233088
2015-03-24 15:49:59 +00:00
Simon Atanasyan 396ce8fbe0 [Mips] Do not use inheriting constructor due build problem on Windows
No functional changes.

llvm-svn: 233058
2015-03-24 10:25:21 +00:00
Simon Atanasyan 623d3b0043 [Mips] Support MIPS N64 relocation record format
N64 ABI relocation record r_info field in fact consists of five subfields:
* r_sym   - symbol index
* r_ssym  - special symbol
* r_type3 - third relocation type
* r_type2 - second relocation type
* r_type  - first relocation type

Up to three these relocations applied one by one. The first relocation
uses an addendum from the relocation record. Each subsequent relocation
takes as its addend the result of the previous operation. Only the final
operation actually modifies the location relocated. The first relocation
uses as a reference symbol specified by the `r_sym` field. The third
relocation assumes NULL symbol.

The patch represents these data using LLD model and takes in account
additional relocation types during a relocation calculation.

Additional relocations do not introduce any new relations between two
atoms and just specify operations need to be done during a relocation
calculation. The first relocation type (`r_type`) stored in the
`Reference::_kindValue`. The rest of relocations and `r_ssym` value are
stored in the new `Reference::_tag` field "as-is". I decided to do not
"decode" these data on the core LLD level to prevent pollution of the
core LLD model by very target specific data.

Also I have to override writing of relocation records in the `RelocationTable`
class to convert MIPS N64 ABI relocation information from the `Reference`
class back to the ELF relocation record.

http://reviews.llvm.org/D8533

llvm-svn: 233057
2015-03-24 09:57:05 +00:00
Simon Atanasyan 25122a3c57 [Mips] Fix typo in the error message
llvm-svn: 233054
2015-03-24 09:05:35 +00:00
Davide Italiano 20f3da11e8 [ELF/X86_64] Fix handling of R_X86_64_GOTTPOFF relocation.
The aforementioned relocation generate a GOT entry with a
R_X86_64_TPOFF64. The new relocation is processed at startup
time by the loader. lld didn't generate the outstanding relocation,
now it does. This bug was found while trying to link ls(1) on FreeBSD.

Simplified repro:
#include <stdio.h>
#include <wchar.h>
#include <wctype.h>

int
main(void)
{
    wchar_t wc = 98;
    if (!iswprint(wc))
        printf("blah\n");
    else
        printf("foo\n");
    return (0);
}

which incorrectly outputs "blah" when linked with lld before this patch.

llvm-svn: 233051
2015-03-24 06:22:45 +00:00
Rafael Auler 515fd61692 [ELF] Remove extraneous semicolon in DefaultLayout
llvm-svn: 232985
2015-03-23 18:39:37 +00:00
Benjamin Kramer e13f47e8aa Fix the CMake shared build.
The ELF backends now depend on lld::script::Sema, which is in libReaderWriter.
Link it explicitly.

llvm-svn: 232953
2015-03-23 15:55:00 +00:00
Denis Protivensky a2e5b2cea7 [ARM] Fix entry point for Thumb code
Test cases for both entry functions in ARM and Thumb
code are added.

llvm-svn: 232942
2015-03-23 11:38:24 +00:00
Simon Atanasyan 5d82380e82 [ELF] Add missing override keyword
No functional changes.

llvm-svn: 232938
2015-03-23 10:33:46 +00:00
Simon Atanasyan 283629a0f7 [Mips] Pass type of relocation and addendum to the `calculateRelocation`
separately

This change reduce difference between the trunk and upcoming patch and
simplify the future code review.

No functional changes.

llvm-svn: 232919
2015-03-22 16:35:08 +00:00
Simon Atanasyan 73fef59b20 [Mips] Rename template argument ELFType => ELFT
No functional changes.

llvm-svn: 232915
2015-03-22 15:41:16 +00:00
Simon Atanasyan 579fde1d83 [Mips] Use allocator from the base class
No functional changes.

llvm-svn: 232914
2015-03-22 15:41:10 +00:00
Shankar Easwaran 37d5add8a3 [ELF] GLOBAL_OFFSET_TABLE is a hidden symbol
llvm-svn: 232868
2015-03-20 23:47:08 +00:00
Shankar Easwaran 14726cd11b [ELF] Dont add local symbols for dynamic lookup.
Unable to add a unit test for this, as there is only one local undefined
symbol in regular shared libraries without a name.

llvm-svn: 232867
2015-03-20 23:47:05 +00:00
Shankar Easwaran 07f6ce0b83 [ELF] OrderPass : Order atoms only by ordinals.
Move the init array/fini array sorting to the Output ELF writer.

AFAIK, this is only needed by the X86_64/ARM ABI.

This shaves time taken to self host lld by 0.2 seconds.

Before patch
----------------
4791.062059 task-clock                #    1.634 CPUs utilized            ( +-  0.28% )
     61,107 context-switches          #    0.013 M/sec                    ( +-  0.56% )
2.932902671 seconds time elapsed                                          ( +-  0.84% )

After patch
-------------
4608.417248 task-clock                #    1.669 CPUs utilized            ( +-  0.30% )
     61,616 context-switches          #    0.013 M/sec                    ( +-  0.63% )
2.761012703 seconds time elapsed                                          ( +-  0.63% )

llvm-svn: 232866
2015-03-20 23:47:03 +00:00
Shankar Easwaran 33c979d685 [ELF][X86_64] Use anonymous namespace only for class declarations
llvm-svn: 232865
2015-03-20 23:47:01 +00:00
Shankar Easwaran b9c3bacb3b [ELF] Use unordered_map for AdditionalSegments
Fix a leftover class during implementation.

llvm-svn: 232864
2015-03-20 23:47:00 +00:00
Shankar Easwaran 1f869d0e1a [ELF] Use MapVector.
Order is still deterministic and we dont need a sorted order.

llvm-svn: 232863
2015-03-20 23:46:58 +00:00
Shankar Easwaran 208ac3d6e5 [ELF][X86_64] Remove relative references to include files
llvm-svn: 232862
2015-03-20 23:46:56 +00:00
Shankar Easwaran f65b60e806 [ELF][X86_64] Sort includes
llvm-svn: 232861
2015-03-20 23:46:54 +00:00
Simon Atanasyan 12e9f8cd11 [Mips] Create special PLT entry in case of MIPS R6 ABI
llvm-svn: 232806
2015-03-20 11:28:22 +00:00
Simon Atanasyan c823c9523c [Mips] Add comments to the relocation calculation functions
No functional changes.

llvm-svn: 232761
2015-03-19 20:56:34 +00:00
Simon Atanasyan caadcc3f27 [Mips] Implement R_MIPS_PCHI16 / R_MIPS_PCLO16 relocations handling
llvm-svn: 232757
2015-03-19 19:59:17 +00:00
Simon Atanasyan 48e088f354 [Mips] Implement R_MIPS_PC18_S3 relocation handling
llvm-svn: 232756
2015-03-19 19:59:06 +00:00
Simon Atanasyan 5472ea1270 [Mips] Implement R_MIPS_PC19_S2 / R_MIPS_PC26_S2 relocations handling
llvm-svn: 232755
2015-03-19 19:58:58 +00:00
Denis Protivensky 91141e87b1 [ARM] Implement static (initial exec) TLS model
This includes handling of R_ARM_TLS_IE32 and R_ARM_TLS_LE32 relocs.

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

llvm-svn: 232708
2015-03-19 06:47:44 +00:00
Simon Atanasyan 14afb83952 [Mips] Implement R_MIPS_PC21_S2 relocation handling
llvm-svn: 232707
2015-03-19 05:44:22 +00:00
Simon Atanasyan 14b5217cc6 [Mips] Recognize and check compatibility MIPS32R6 / MIPS64R6 ISA's
llvm-svn: 232706
2015-03-19 05:44:13 +00:00
Simon Atanasyan 8343c2c9ec [Mips] Replace "hand-made" function by the `llvm::SignExtend32()` routine
No functional changes.

llvm-svn: 232705
2015-03-19 05:44:04 +00:00
Rui Ueyama ddf77ce2bf PECOFF: Do not copy all undefined symbols to a set. NFC.
llvm-svn: 232646
2015-03-18 16:28:33 +00:00
Rui Ueyama 8cc20307e1 Remove unused parameter.
llvm-svn: 232639
2015-03-18 15:12:55 +00:00
Shankar Easwaran f06086a912 [ELF][ARM] Place gotSymbol in an anonymous namespace
Address comments from Espindola.

llvm-svn: 232497
2015-03-17 16:40:14 +00:00
Denis Protivensky 5a106191fa [ARM] Read initial addend for REL32 and PREL31 relocs
llvm-svn: 232474
2015-03-17 13:51:32 +00:00
Denis Protivensky e458ab4577 [ARM] Implement relocations: R_ARM_REL32, R_ARM_THM_JUMP11, R_ARM_PREL31
Test case for every relocation is added.

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

llvm-svn: 232464
2015-03-17 09:18:24 +00:00
Shankar Easwaran baf1aaaf1f [ELF] Use parallel_for_each for writing.
This changes improves performance of lld, when self-hosting lld, when compared
with the bfd linker. BFD linker on average takes 8 seconds in elapsed time.
lld takes 3 seconds elapased time average. Without this change, lld takes ~5
seconds average. The runtime comparisons were done on a release build and
measured by running linking thrice.

lld self-host without the change
----------------------------------
real    0m3.196s
user    0m4.580s
sys     0m0.832s

lld self-host with lld
-----------------------
user    0m3.024s
user    0m3.252s
sys     0m0.796s

time taken to build lld with bfd
--------------------------------
real    0m8.419s
user    0m7.748s
sys     0m0.632s

llvm-svn: 232460
2015-03-17 03:29:32 +00:00
Rui Ueyama cc6b381651 Make it compile with MSVC 2013.
MSVC 2013 cannot compile this code because of C1001 "internal error".
Stop using initializer list without type name.

llvm-svn: 232448
2015-03-17 01:10:12 +00:00
Rui Ueyama 3c2e306a5c PECOFF: Make FileCOFF:findAtomAt from O(n) to O(1).
I knew I cut corners when I wrote this. Turned out that it is
actually slow when a file being read has many symbols. This patch
is to stop doing linear search and instead do map lookup.

llvm-svn: 232436
2015-03-16 23:43:11 +00:00
Simon Atanasyan 4b4706b601 [ELF] Use pcrel format for eh_frame_ptr field encoding
The `eh_frame_ptr` field in the `.eh_frame_hdr` section contains an address
of the `.eh_frame` section. Using an absolute 32-bit format for encoding
of this field does not work for 64-bit targets. It is better to use a
relative format because it covers both 32-bit and 64-bit cases. Sure
this work if a distance between `.eh_frame_hdr` and `.eh_frame` sections
is less than 4 Gb but it is a rather correct assumption.

http://reviews.llvm.org/D8352

llvm-svn: 232414
2015-03-16 21:07:46 +00:00
Rafael Auler 01d73c9678 [LinkerScript] Handle symbols defined in linker scripts
Puts symbols defined in linker script expressions in a runtime file that is
added as input to the resolver, making the input object files see symbols
defined in linker scripts.

http://reviews.llvm.org/D8263

llvm-svn: 232409
2015-03-16 20:39:07 +00:00
Rafael Auler 9a7e211e8f [LinkerScript] Implement semantics for simple sections mappings
This commit implements the behaviour of the SECTIONS linker script directive,
used to not only define a custom mapping between input and output sections, but
also order input sections in the output file. To do this, we modify
DefaultLayout with hooks at important places that allow us to re-order input
sections according to a custom order. We also add a hook in SegmentChunk to
allow us to calculate linker script expressions while assigning virtual
addresses to the input sections that live in a segment.

Not all SECTIONS constructs are currently supported, but only the ones that do
not use special sort orders. It adds two LIT test as practical examples of
which sections directives are currently supported.

In terms of high-level changes, it creates a new class "script::Sema" that owns
all linker script ASTs and the logic for linker script semantics as well.
ELFLinkingContext owns a single copy of Sema, which will be used throughout
the object file writing process (to layout sections as proposed by the linker
script).

Other high-level change is that the writer no longer uses a "const" copy of
the linking context. This happens because linker script expressions must be
calculated *while* calculating final virtual addresses, which is a very late
step in object file writing. While calculating these expressions, we need to
update the linker script symbol table (inside the semantics object), and, thus,
we are "modifying our context" as we prepare to write the file.

http://reviews.llvm.org/D8157

llvm-svn: 232402
2015-03-16 19:55:15 +00:00
Simon Atanasyan 3c1818c8c0 [Mips] clang-format the code
No functional changes.

llvm-svn: 232364
2015-03-16 09:14:47 +00:00
Simon Atanasyan a1abb2e2c7 [Mips] Do not check the relocation type twice
No functional changes.

llvm-svn: 232363
2015-03-16 09:14:40 +00:00
Simon Atanasyan 622a4bc83b [Mips] Add `const` qualifier to some member functions
No functional changes.

llvm-svn: 232362
2015-03-16 09:14:34 +00:00
Simon Atanasyan 44e9b094e0 [Mips] Implement R_MIPS_TLS_xxx relocation handling in case of N64 ABI
llvm-svn: 232361
2015-03-16 09:14:28 +00:00
Simon Atanasyan 256407d9e2 [Mips] Implement R_MIPS_GOT_DISP/PAGE/OFST relocations handling
llvm-svn: 232360
2015-03-16 09:14:17 +00:00
Simon Atanasyan 08b19d67fa [Mips] Group some cases in the switch statement
No functional changes.

llvm-svn: 232359
2015-03-16 09:14:06 +00:00
Shankar Easwaran 9fdb81d09b [ELF][ARM] Make gotSymbol a member.
The gotSymbol need not be a global static variable. Apart from this reason, This
variable was creating an issue with self hosting lld, as there seems to be an
issue running global initializers, when initializing the guard for this static
variable.

Program received signal SIGTRAP, Trace/breakpoint trap.

llvm-svn: 232341
2015-03-16 00:54:03 +00:00
Davide Italiano de42c18889 Use setVisibility() rather than assigning the value directly.
We don't want to risk to override wrong st_other bits, and when
we need to zero, we can do that explictly.

llvm-svn: 232282
2015-03-14 21:57:15 +00:00
Shankar Easwaran 5d34ad79b4 Revert "[ELF] Change few static functions."
This reverts commit r232253.

Fix comments from dblaikie. Since these functions dont access member state, its ok to be static.

llvm-svn: 232271
2015-03-14 19:41:24 +00:00
Denis Protivensky cd61715564 [ELF] Ability to resolve undefined symbols lazily
Handle resolution of symbols coming from linked object files lazily.
Add implementation of handling _GLOBAL_OFFSET_TABLE_ and __exidx_start/_end symbols for ARM platform.

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

llvm-svn: 232261
2015-03-14 10:34:43 +00:00
Shankar Easwaran 6d812fa9ca [ELF] Change few static functions.
Functions hasOutputSegment/maybeGetSOName doesnot need not be static.

llvm-svn: 232253
2015-03-14 05:27:01 +00:00
Shankar Easwaran 48578e7124 [ELF] Rename .got.dyn to .got
Gnu doesnot creates only a .got section.

llvm-svn: 232252
2015-03-14 05:26:58 +00:00
Shankar Easwaran c1e146e024 [ELF] Fix DenseMapInfo for StringRef
llvm-svn: 232251
2015-03-14 05:26:55 +00:00
Shankar Easwaran 9f9f2ddb86 [ELF] Remove ambiguity
Fix ambiguous finalize function.

llvm-svn: 232250
2015-03-14 05:26:53 +00:00
Shankar Easwaran 729a79a1c4 [ELF] Simplify appending chunks to segments.
The Segment Chunk had two functions one to append a section and one to append a
chunk. A section is a subclass of a chunk and clearly this can be merged into
one single function.

llvm-svn: 232249
2015-03-14 05:26:50 +00:00
Meador Inge 84f613532f LinkerScript: Add -T <scriptfile> option
GNU LD has an option named -T/--script which allows a user to specify
a linker script to be used [1].  LLD already accepts linker scripts
without this option, but the option is widely used.  Therefore it is
best to support it in LLD as well.

[1] https://sourceware.org/binutils/docs/ld/Options.html#Options

llvm-svn: 232183
2015-03-13 18:15:01 +00:00
Meador Inge 28dac858cd LinkerScript: Add evaluation of the EXTERN command
This patch implements evaluation of the GNU ld EXTERN command.

llvm-svn: 232111
2015-03-12 21:55:55 +00:00
Meador Inge 748a71b8de LinkerScript: Add parsing of the EXTERN command
This patch implements parsing of the GNU ld EXTERN command [1].
Evaluation will be added at a later point in time.

[1] https://sourceware.org/binutils/docs/ld/Miscellaneous-Commands.html#Miscellaneous-Commands

llvm-svn: 232110
2015-03-12 21:55:50 +00:00
David Blaikie 72da9ae924 Rephrase find loop to use std::find_if
Avoids the need for an assert-only variable, among other benefits.

llvm-svn: 232088
2015-03-12 19:46:21 +00:00
Simon Atanasyan 9a0263aad7 [Mips] Make `readAddend` a virtual member function to escape explicit
template class instantiation

No functional changes.

llvm-svn: 232081
2015-03-12 18:53:06 +00:00
Iain Sandoe 832472a2ad Fix configure & make build by adding support for the ExampleSubTarget.
llvm-svn: 232030
2015-03-12 11:47:51 +00:00
Justin Bogner 14d34ef050 Avoid an unused variable warning when assertions are off
Patch by Mike Edwards. Thanks!

llvm-svn: 232015
2015-03-12 06:50:54 +00:00
Chandler Carruth c9cdc502f3 Fix a comparison function to actually be a SWO so that it conforms to
the spec required by std::sort and friends.

Ordering things this way also dramatically simplifies the code as
short-circuit ensures we can skip all of the negative tests.

I've left one FIXME where we're establishing a fairly arbitrary
ordering. Previously, the function compared all types as equal except
for the ones it explicitly handled, but it didn't delegate correctly to
the atomflags when doing so, and so it would fail to be a SWO. The two
possible fixes are to stop comparing the atom flags entirely, or to
establish some arbitrary ordering of the types.

Since it was pure luck which ordering of unequal types we ended up with
previously (the caller was std::sort, not std::stable_sort) I chose to
make the ordering explicit and guaranteed. This seems like the best
conservative approach as I suspect we would want to switch to
stable_sort otherwise in order to have deterministic output.

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

llvm-svn: 231968
2015-03-11 21:34:33 +00:00
Meador Inge 2ce1ea86d0 LinkerScript: Add parsing of the MEMORY command
This patch implements parsing of the GNU ld MEMORY command [1].
The command and the memory block definitions are parsed as
specified (including the slightly strange "o" and "l" keywords).
Evaluation will be added at a later point in time.

[1] https://sourceware.org/binutils/docs-2.25/ld/MEMORY.html

llvm-svn: 231928
2015-03-11 15:34:44 +00:00
Davide Italiano 243e03d819 Garbage collect an unused class in Atoms.h
This will be replaced by a more generic class to handle
all the default symbols in an executable, e.g. __init_array.

Differential Revision:	 http://reviews.llvm.org/D8234
Reviewed by:	shankare

llvm-svn: 231906
2015-03-11 05:31:07 +00:00
Chandler Carruth 1bdbf48fff Fix the local variable naming I used in r231765 to follow the LLD coding
conventions. Sorry for missing this before I committed the patch!

llvm-svn: 231766
2015-03-10 07:54:34 +00:00
Chandler Carruth b952e2287b Fix a bug where the code would use subscript a std::vector with the size
of the vector. For a vector 'v', '&v[v.size()]' isn't a valid way to
compute a pointer one-past-the-end of the vector. Instead, write the
loop in terms of iterators and save the beginning iterator. Once we have
that we can compute the beginning pointer from the beginning iterator,
and compute the distance which we should increment the beginning pointer
by subtracting the iterators.

What might be simpler would be to convert the function accepting a raw
pointer for begin and end to accept iterators or a range or some other
construct, but I wanted to keep this to a minimal bug-fix change.

This fixes a crash on any debug STL implementation which checks for
indexing out of bounds.

llvm-svn: 231765
2015-03-10 07:53:02 +00:00
Rui Ueyama 81ad639ed3 Use template aliases.
We dropped Visual Studio 2012 support, so we can use template aliases.

llvm-svn: 231756
2015-03-10 05:14:24 +00:00
Rui Ueyama 4a8821d48d Add SimpleAbsoluteAtom which is analogous to other Simple* atoms.
llvm-svn: 231718
2015-03-09 22:34:59 +00:00
Rui Ueyama bf3ac0b878 Remove COFFReference and use SimpleReference instead.
SimpleReference, which is defined in Core, provides the same functionality
as COFFReference does, so we don't need a custom class.

llvm-svn: 231715
2015-03-09 22:18:51 +00:00
Rafael Auler ad11d4c196 [LinkerScript] Implement linker script expression evaluation
The expression evaluation is needed when interpreting linker scripts, in order
to calculate the value for new symbols or to determine a new position to load
sections in memory. This commit extends Expression nodes from the linker script
AST with evaluation functions, and also contains a unit test.

http://reviews.llvm.org/D8156

llvm-svn: 231707
2015-03-09 21:43:35 +00:00
Rui Ueyama 6a3167d35a Remove dead code.
llvm-svn: 231688
2015-03-09 18:59:55 +00:00
Simon Atanasyan b9a1443576 [Mips] Remove unused include
No functional changes.

llvm-svn: 231646
2015-03-09 10:54:11 +00:00
Simon Atanasyan 01396035a2 [Mips] Remove redundant namespace qualifiers
No functional changes.

llvm-svn: 231645
2015-03-09 10:54:05 +00:00
Simon Atanasyan 45354087b1 [Mips] Rename local variables
No functional changes.

llvm-svn: 231644
2015-03-09 10:53:58 +00:00
Simon Atanasyan d3388cc9b6 [Mips] Implement R_MIPS_SUB relocation handling
llvm-svn: 231643
2015-03-09 10:53:50 +00:00
Simon Atanasyan 1397f520d4 [Mips] Implement R_MIPS_64 relocation handling
llvm-svn: 231642
2015-03-09 10:53:41 +00:00
Simon Atanasyan cc0ed289b4 [Mips] Refactoring of relocation handling functions
1. Move relocation addendum reading code to the MipsRelocationHandler
class to reduce code duplication.
2. Factor out the relocations calculation code into the separate
function to be ready to handle MIPS N64 ABI relocation chains.

No functional changes.

llvm-svn: 231641
2015-03-09 10:53:32 +00:00
Simon Atanasyan e604e8f970 [Mips] Show error message and stop linking in case of cross mode jump errors
llvm-svn: 231640
2015-03-09 10:53:24 +00:00
Simon Atanasyan 9af798f5e4 [Mips] Fix incorrect handling of cross mode jumps
We should not take in account a type of "source" symbol. Cross mode jump
adjustment is requred when target symbol and relocation belong to
different (regular/microMIPS) instruction sets.

llvm-svn: 231639
2015-03-09 10:53:15 +00:00
Davide Italiano 7b68b90c15 [MachO] Use setter for globalsAreDeadStripRoots. NFC intended.
llvm-svn: 231629
2015-03-09 06:05:42 +00:00
Rui Ueyama d18a97cb7a PECOFF: Create layout-afters instead of layout-befores.
All readers except PE/COFF reader create layout-after edges to preserve
the original symbol order. PE/COFF uses layout-before edges as primary
edges for no reason.

This patch makes PE/COFF reader to create layout-after edges.
Resolver is updated to recognize reverse edges of layout-after edges
in the garbage collection pass.

Now we can retire layout-before edges. I don't do that in this patch
because if I do, I would have updated many tests to replace all
occurrrences of "layout-before" with "layout-after". So that's a TODO.

llvm-svn: 231615
2015-03-09 00:06:07 +00:00
Rui Ueyama f46b190465 PECOFF: Define and use BaseReloc type instead of std::pair.
"first" and "second" are not easy to memorize.
Define a type to use meaningful names.

llvm-svn: 231614
2015-03-08 22:49:27 +00:00
Rui Ueyama 803150c9d0 Revert r231552: Resolver: optimize fallback atoms.
This patch broke a buildbot.

llvm-svn: 231611
2015-03-08 21:31:38 +00:00
Rui Ueyama 04597ac258 Re-commit r231545: PECOFF: Do not add extraneous symbols to the dead strip root
That commit was reverted in r231582 as it was a culprit for
buildbot breakage. Turned out it's not.

llvm-svn: 231610
2015-03-08 21:31:36 +00:00
Rui Ueyama 47d101e613 PECOFF: Fix off-by-one error.
We accidentally skipped the last base relocation entry for each block.

llvm-svn: 231586
2015-03-08 03:23:43 +00:00
Rui Ueyama 31777ce9a1 PECOFF: Parallelize base relocation creation.
If an output is large, its base relocation section can be also large.
For example, chrome.dll is almost 300 MB, and it has about 9 million
base relocations. Creating the section took 1.5 seconds on my machine.

This patch changes the way to create the section so that we can use
parallel_sort to group base relocations by high bits. This change
makes the linker almost 4% faster for the above test case on my machine.
If I replace parallel_sort with std::sort, performance remains the same,
so single thread performance should remain the same.

This has no functionality change. The output should be identical as
before.

llvm-svn: 231585
2015-03-08 02:44:53 +00:00
Rui Ueyama 0536677ad6 Remove sectionPosition attribute.
This code is simply dead. No one is using it.

http://reviews.llvm.org/D8125

llvm-svn: 231583
2015-03-08 01:01:40 +00:00
Rui Ueyama 316d64ea1d Revert r231545 to unbreak buildbot.
This patch reverts r231545 "PECOFF: Do not add extraneous symbols
to the dead strip root." CrWinClangLLD buildbot is currently broken.
Since I can't reproduce the issue locally, I'm reverting the most
relevant change.

llvm-svn: 231582
2015-03-08 00:26:53 +00:00
Rui Ueyama c6bf34418a Remove duplicate code. NFC.
llvm-svn: 231570
2015-03-07 16:49:14 +00:00
Chandler Carruth 9244582b8d Update makefile to reflect that the Passes directory is gone here.
llvm-svn: 231557
2015-03-07 09:03:17 +00:00
Rui Ueyama 9b21ded6c8 Resolver: optimize fallback atoms.
Atoms with fallback atoms are never be added to the symbol table.
However, we added such atoms to _undefines array. We had to call
isCoalescedAway to identify and skip them. We should just stop
adding them in the first place.

This seems to make the linker ~1% faster in my test case.

llvm-svn: 231552
2015-03-07 04:23:46 +00:00
Rui Ueyama abd39f0549 Resolver: Reduce number of SymbolTable::isDefined function calls.
If an undefined symbol is added to the symbol table by the previous
call of SymbolTable::add, SymbolTable::isDefined will always return
false for the same symbol.

llvm-svn: 231551
2015-03-07 03:55:32 +00:00
Rui Ueyama 923147b954 Resolver: Reduce number of hash function call.
This is yet another optimization patch. Previously we called
SymbolTable::isDefined() and SymbolTable::findByName() from a very
frequently executed function. Because isDefined calls findByName,
findByName is called twice on each iteration.

findByName is not a cheap function. It computes a hash value for a
given symbol name. When linking C++ programs, it can be expensive
because of C++ mangled long symbols.

This patch reduces the number of call from 2 to 1. Performance
improvements by this patch was larger than I expected. Linking time
of chrome.dll gets almost 5% shorter.

llvm-svn: 231549
2015-03-07 03:22:37 +00:00
Rui Ueyama e9d646d448 PECOFF: Do not add extraneous symbols to the dead strip root.
Previously we added all undefined symbols found in object files to
the dead strip root. This patch makes the linker to stop doing that.
Undefined symbols would be resolved anyway, so this patch doesn't
change the linker behavior. It should slightly improve performance
but it's really marginal. This is a cleanup.

llvm-svn: 231545
2015-03-07 01:35:50 +00:00
Rui Ueyama d4dc7d5739 Remove unused typedefs.
llvm-svn: 231543
2015-03-07 01:04:40 +00:00
Rui Ueyama 48c134ecd9 Use multimap<T, U> instead of map<T, set<U>>. NFC.
llvm-svn: 231542
2015-03-07 01:00:44 +00:00
Rui Ueyama 2039fc1f42 Resolver: move code inside an assert.
llvm-svn: 231518
2015-03-06 21:15:06 +00:00