summaryrefslogtreecommitdiffstats
path: root/lld/ELF/OutputSections.cpp
Commit message (Collapse)AuthorAgeFilesLines
...
* Don't store an Elf_Sym for most symbols.Rafael Espindola2016-04-041-21/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Our symbol representation was redundant, and some times would get out of sync. It had an Elf_Sym, but some fields were copied to SymbolBody. Different parts of the code were checking the bits in SymbolBody and others were checking Elf_Sym. There are two general approaches to fix this: * Copy the required information and don't store and Elf_Sym. * Don't copy the information and always use the Elf_Smy. The second way sounds tempting, but has a big problem: we would have to template SymbolBody. I started doing it, but it requires templeting *everything* and creates a bit chicken and egg problem at the driver where we have to find ELFT before we can create an ArchiveFile for example. As much as possible I compared the test differences with what gold and bfd produce to make sure they are still valid. In most cases we are just adding hidden visibility to a local symbol, which is harmless. In most tests this is a small speedup. The only slowdown was scylla (1.006X). The largest speedup was clang with no --build-id, -O3 or --gc-sections (i.e.: focus on the relocations): 1.019X. llvm-svn: 265293
* Simplify. NFC.Rui Ueyama2016-04-021-5/+2
| | | | llvm-svn: 265242
* Remove DefinedElf class.Rui Ueyama2016-04-021-11/+2
| | | | | | | | | | | | | | | | | | DefinedElf was a superclass of DefinedRegular and SharedSymbol classes and represented the notion of defined symbols created for ELF symbols. It turned out that we didn't use that class often. We had only two occurrences of dyn_cast'ing to DefinedElf, and both were easily rewritten without it. The class was also a bit confusing. The concept of "created for ELF symbol" is orthogonal to defined/undefined types. However, we had two distinct classes, DefinedElf and UndefinedElf. This patch simply removes the class. Now the class hierarchy is one level shallower. llvm-svn: 265234
* [ELF] Implement infrastructure for thunk code creationSimon Atanasyan2016-03-311-10/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Some targets might require creation of thunks. For example, MIPS targets require stubs to call PIC code from non-PIC one. The patch implements infrastructure for thunk code creation and provides support for MIPS LA25 stubs. Any MIPS PIC code function is invoked with its address in register $t9. So if we have a branch instruction from non-PIC code to the PIC one we cannot make the jump directly and need to create a small stub to save the target function address. See page 3-38 ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf - In relocation scanning phase we ask target about thunk creation necessity by calling `TagetInfo::needsThunk` method. The `InputSection` class maintains list of Symbols requires thunk creation. - Reassigning offsets performed for each input sections after relocation scanning complete because position of each section might change due thunk creation. - The patch introduces new dedicated value for DefinedSynthetic symbols DefinedSynthetic::SectionEnd. Synthetic symbol with that value always points to the end of the corresponding output section. That allows to escape updating synthetic symbols if output sections sizes changes after relocation scanning due thunk creation. - In the `InputSection::writeTo` method we write thunks after corresponding input section. Each thunk is written by calling `TargetInfo::writeThunk` method. - The patch supports the only type of thunk code for each target. For now, it is enough. Differential Revision: http://reviews.llvm.org/D17934 llvm-svn: 265059
* [ELF][MIPS] Reduce number of redundant entries in the local part of MIPS GOTSimon Atanasyan2016-03-291-9/+35
| | | | | | | | | | | | | | | | Local symbol which requires GOT entry initialized by "page" address. This address is high 16 bits of sum of the symbol value and the relocation addend. In the relocation scanning phase final values of symbols are unknown so to reduce number of allocated GOT entries do the following trick. Save all output sections referenced by GOT relocations during the relocation scanning phase. Then later in the `GotSection::finalize` method calculate number of "pages" required to cover all saved output sections and allocate appropriate number of GOT entries. We assume the worst case - each 64kb page of the output section has at least one GOT relocation against it. Differential Revision: http://reviews.llvm.org/D18349 llvm-svn: 264730
* Revert r264961. I didn't have asserts enable when testing.Davide Italiano2016-03-291-1/+1
| | | | llvm-svn: 264692
* [LTO] Include bitcode symbol name in unreachable messages.Davide Italiano2016-03-291-1/+1
| | | | llvm-svn: 264691
* [ELF][MIPS] Add comment with MIPS GOT relocations handling description. NFC.Simon Atanasyan2016-03-231-4/+28
| | | | llvm-svn: 264145
* [ELF][MIPS] Delete GotSection::addMipsLocalEntry methodSimon Atanasyan2016-03-221-4/+12
| | | | | | | | | | Now local symbols have SymbolBody so we can handle all kind of symbols in the GotSection::addEntry method. The patch moves the code from addMipsLocalEntry to addEntry. NFC. Differential Revision: http://reviews.llvm.org/D18302 llvm-svn: 264032
* Revert "bar"Rafael Espindola2016-03-181-2/+10
| | | | | | | This reverts commit r263799. It was a mistake. Sorry about that. llvm-svn: 263801
* barRafael Espindola2016-03-181-10/+2
| | | | llvm-svn: 263799
* [ELF] - Set the sh_entsize for mergable sectionsGeorge Rimar2016-03-181-0/+1
| | | | | | | | | | | Previously sh_entsize field was not set for MergeOutputSection. Patch fixes that. That should resolve the https://llvm.org/bugs/show_bug.cgi?id=26975 Differential revision: http://reviews.llvm.org/D18248 llvm-svn: 263780
* Use ELFT instead of ELFFile<ELFT>.Rui Ueyama2016-03-141-7/+5
| | | | llvm-svn: 263510
* ELF: Add `Rela` member variable to Config.Rui Ueyama2016-03-131-8/+8
| | | | | | | The member is true if we want to create relocatin sections with RELA instead of REL. llvm-svn: 263387
* ELF: Redefine canBeDefined as a member function of SymbolBody.Rui Ueyama2016-03-131-32/+1
| | | | | | | | | We want to make SymbolBody the central place to query symbol information. This patch also renames canBePreempted to isPreemptible because I feel that the latter is slightly better (the former is three words and the latter is two words.) llvm-svn: 263386
* Cosmetic change. NFC.Rui Ueyama2016-03-131-1/+2
| | | | llvm-svn: 263376
* Move an OutputSectionBase member function to the top.Rui Ueyama2016-03-131-5/+5
| | | | llvm-svn: 263375
* Simplify. NFC.Rui Ueyama2016-03-131-10/+3
| | | | llvm-svn: 263373
* Use RelTy instead of Elf_Rel_Impl<ELFT, isRela> for readability.Rui Ueyama2016-03-131-4/+3
| | | | llvm-svn: 263368
* Recommit of r263252, [ELF] - Change all messages to lowercase to be consistent.George Rimar2016-03-121-4/+4
| | | | | | | | | | | | | | | | | | | | | which was reverted because included unrelative changes by mistake. Original commit message: [ELF] - Change all messages to lowercase to be consistent. That is directly opposite to http://reviews.llvm.org/D18045, which was reverted. This patch changes all messages to start from lowercase letter if they were not before. That is done to be consistent with clang. Differential revision: http://reviews.llvm.org/D18085 llvm-svn: 263337
* ELF: Implement --build-id.Rui Ueyama2016-03-111-0/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch implements --build-id. After the linker creates an output file in the memory buffer, it computes the FNV1 hash of the resulting file and set the hash to the .note section as a build-id. GNU ld and gold have the same feature, but their default choice of the hash function is different. Their default is SHA1. We made a deliberate choice to not use a secure hash function for the sake of performance. Computing a secure hash is slow -- for example, MD5 throughput is usually 400 MB/s or so. SHA1 is slower than that. As a result, if you pass --build-id to gold, then the linker becomes about 10% slower than that without the option. We observed a similar degradation in an experimental implementation of build-id for LLD. On the other hand, we observed only 1-2% performance degradation with the FNV hash. Since build-id is not for digital certificate or anything, we think that a very small probability of collision is acceptable. We considered using other signals such as using input file timestamps as inputs to a secure hash function. But such signals would have an issue with build reproducibility (if you build a binary from the same source tree using the same toolchain, the build id should become the same.) GNU linkers accepts --build-id=<style> option where style is one of "MD5", "SHA1", or an arbitrary hex string. That option is out of scope of this patch. http://reviews.llvm.org/D18091 llvm-svn: 263292
* Revert r263252: "[ELF] - Change all messages to lowercase to be consistent."Rui Ueyama2016-03-111-4/+4
| | | | | | This reverts commit r263252 because the change contained unrelated changes. llvm-svn: 263272
* [ELF] - Change all messages to lowercase to be consistent.George Rimar2016-03-111-4/+4
| | | | | | | | | | | | | | That is directly opposite to http://reviews.llvm.org/D18045, which was reverted. This patch changes all messages to start from lowercase letter if they were not before. That is done to be consistent with clang. Differential revision: http://reviews.llvm.org/D18085 llvm-svn: 263252
* This reverts the r263125George Rimar2016-03-111-8/+8
| | | | | | | | | | | | | | | | | | | | It was discussed to make all messages be lowercase to be consistent with clang. (also reverts the r263128 which fixed build bot fail after r263125) Original commit message: [ELF] - Consistent spelling for error/warning messages Previously error and warnings were not consistent in lld. Some of them started from lowercase letter, others from uppercase. Also there was one or two which had a dot at the end. This patch changes all messages to start from uppercase letter if they were not before. Differential revision: http://reviews.llvm.org/D18045 llvm-svn: 263240
* Represent local symbols with DefinedRegular.Rafael Espindola2016-03-111-3/+1
| | | | llvm-svn: 263237
* Compute value of local symbol with getVA.Rafael Espindola2016-03-111-15/+6
| | | | llvm-svn: 263225
* Remember the input section of locals.Rafael Espindola2016-03-111-6/+14
| | | | | | This is already a simplification, but will allow much more. llvm-svn: 263224
* Create a SymbolBody for locals.Rafael Espindola2016-03-111-26/+29
| | | | | | pr26878 shows a case where locals have to be in the got. llvm-svn: 263222
* ELF: Add --thread option and partially parallelize writeTo().Rui Ueyama2016-03-111-2/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch adds --thread option and use parallel_for_each to write sections in regular OutputSections. This is the first patch to use more than one threads. Note that --thread is off by default because it is experimental. At this moment I still want to focus on single thread performance because multi-threading is not a magic wand to fix performance problems after all. It is generally very hard to make a slow program faster by threads. Therefore, I want to make the linker as efficient as possible first and then look for opportunity to make it even faster using more than one core. Here are some numbers to link programs with and without --threads and using GNU gold. Numbers are in seconds. Clang w/o --threads 0.697 w --threads 0.528 gold 1.643 Scylla w/o --threads 5.032 w --threads 4.935 gold 6.791 GNU gold w/o --threads 0.550 w --threads 0.551 gold 0.737 I limited the number of cores these processes can use to 4 using perf command, so although my machine has 20 physical cores, the performance gain I observed should be reproducible with a machine which is not as beefy as mine. llvm-svn: 263190
* Move getLocalRelTarget to the file where it is used.Rafael Espindola2016-03-101-67/+0
| | | | llvm-svn: 263152
* [ELF] - Consistent spelling for error/warning messagesGeorge Rimar2016-03-101-8/+8
| | | | | | | | | | | | Previously error and warnings were not consistent in lld. Some of them started from lowercase letter, others from uppercase. Also there was one or two which had a dot at the end. This patch changes all messages to start from uppercase letter if they were not before. Differential revision: http://reviews.llvm.org/D18045 llvm-svn: 263125
* ELF: Remove non-standard ELF features from AMDGPU target.Rafael Espindola2016-03-091-7/+1
| | | | | | Patch by Tom Stellard! llvm-svn: 263063
* Remove an unnecessary hack.Rafael Espindola2016-03-081-9/+2
| | | | | | | It doesn't look like anything is depending on using local dynamic tls relocations with preemptable symbols. llvm-svn: 262957
* Delete isTlsDynRel.Rafael Espindola2016-03-081-2/+9
| | | | | | | | | | | | It was a badly specified hack for when a tls relocation should be propagated to the dynamic relocation table. This replaces it with a not as bad hack of saying that a local dynamic tls relocation is never preempted. I will try to remove even that second hack in the next patch. llvm-svn: 262955
* [ELF] - Simplify a SymbolBody class interface a bit.George Rimar2016-03-061-1/+1
| | | | | | | | | Get rid of few accessors in that class, and replace them with direct fields access. Differential revision: http://reviews.llvm.org/D17879 llvm-svn: 262796
* [ELF] Be slightly more consistent, use uint8_t instead of unsigned char.Davide Italiano2016-03-031-1/+1
| | | | llvm-svn: 262660
* [ELF] Fix reading of PC values of FDEsSimon Atanasyan2016-03-021-15/+23
| | | | | | | | | | | | | | | | | | | | | | The patch fixes two related problems: - If CIE augmentation string has 'L' token the CIE contains a byte defines LSDA encoding. We should skip this byte in `getFdeEncoding` routine. Before this fix we do not skip it and if the next token is 'R' treat this byte as FDE encoding. - FDE encoding format has separate flags e.g. DW_EH_PE_pcrel for definition of relative pointers. We should add .eh_frame address to the PC value iif the DW_EH_PE_pcrel is specified. http://www.airs.com/blog/archives/460 There is one more not fixed problem in this code. If PC value is encoded using signed relative format e.g. DW_EH_PE_sdata4 | DW_EH_PE_pcrel we should sign extend result of read32 to perform calculation correctly. I am going to fix that in a separate patch. Differential Revision: http://reviews.llvm.org/D17733 llvm-svn: 262461
* Rename elf2 to elf.Rafael Espindola2016-02-281-7/+7
| | | | llvm-svn: 262159
* Simplify. NFC.Rui Ueyama2016-02-261-3/+2
| | | | llvm-svn: 262027
* Add comment on AMDGPU that the difference has no obvious reason.Rui Ueyama2016-02-261-2/+5
| | | | llvm-svn: 262026
* [ELF] - Implemented linkerscript sections padding.George Rimar2016-02-261-0/+11
| | | | | | | | | | | | | | | BSD linker scripts contain special cases to add NOP padding to code sections. Syntax is next: .init: { KEEP (*(.init)) } =0x90909090 (0x90 is NOP) This patch implements that functionality. llvm-svn: 262020
* Fix some confusion about what can be preempted.Rafael Espindola2016-02-261-22/+10
| | | | | | | | | | | For shared libraries we allow any weak undefined symbol to eventually be resolved, even if we never see a definition in another .so. This matches the behavior when handling other undefined symbols in a shared library. For executables, we require seeing a definition in a .so or resolve it to zero. This is also similar to how non weak symbols are handled. llvm-svn: 262017
* [ELF][MIPS] Remove redundant namespace qualifier. NFCSimon Atanasyan2016-02-251-1/+1
| | | | llvm-svn: 261928
* ELF: Implement ICF.Rui Ueyama2016-02-251-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch implements the same algorithm as LLD/COFF's ICF. I'm not going to repeat the same description about how it works, so you want to read the comment in ICF.cpp in this patch if you want to know the details. This algorithm should be more powerful than the ICF algorithm implemented in GNU gold. It can even merge mutually-recursive functions (which is harder than one might think). ICF is a fairly effective size optimization. Here are some examples. LLD: 37.14 MB -> 35.80 MB (-3.6%) Clang: 59.41 MB -> 57.80 MB (-2.7%) The lacking feature is "safe" version of ICF. This merges all identical sections. That is not compatible with a C/C++ language requirement that two distinct functions must have distinct addresses. But as long as your program do not rely on the pointer equality (which is in many cases true), your program should work with the feature. LLD works fine for example. GNU gold implements so-called "safe ICF" that identifies functions that are safe to merge by heuristics -- for example, gold thinks that constructors are safe to merge because there is no way to take an address of a constructor in C++. We have a different idea which David Majnemer suggested that we add NOPs at beginning of merged functions so that two or more pointers can have distinct values. We can do whichever we want, but this patch does not include neither. http://reviews.llvm.org/D17529 llvm-svn: 261912
* [ELF][MIPS] Add STO_MIPS_PLT flag to the symbols require pointer equalitySimon Atanasyan2016-02-251-0/+8
| | | | | | | | | | | | On MIPS we need to mark symbol which has a PLT entry and requires pointer equality by STO_MIPS_PLT flag. That is necessary to help dynamic linker distinguish such symbols and MIPS lazy-binding stubs. https://sourceware.org/ml/binutils/2008-07/txt00000.txt Differential Revision: http://reviews.llvm.org/D17593 llvm-svn: 261879
* [ELF] - Referencing __start or __stop should keep the section from GC.George Rimar2016-02-251-0/+13
| | | | | | | | | | | | This fixes the https://llvm.org/bugs/show_bug.cgi?id=22906 bug. In GNU Binutils, a reference to start or stop is sufficient to prevent the section from being garbage collected. Patch implements the same behavior for lld. Differential revision: http://reviews.llvm.org/D17502 llvm-svn: 261840
* [ELF2] - Basic implementation of -r/--relocatableGeorge Rimar2016-02-251-3/+25
| | | | | | | | | | | | | -r, -relocatable - Generate relocatable output Currently does not have support for files containing relocation sections with entries that refer to local symbols (like rel[a].eh_frame which refer to sections and not to symbols) Differential revision: http://reviews.llvm.org/D14382 llvm-svn: 261838
* ELF: Do not instantiate InputSectionBase::Discarded.Rui Ueyama2016-02-241-2/+2
| | | | | | | | | | | | | "Discarded" section is a marker for discarded sections, and we do not use the instance except for checking its identity. In that sense, it is just another type of a "null" pointer for InputSectionBase. So, it doesn't have to be a real instance of InputSectionBase class. In this patch, we no longer instantiate Discarded section but instead use -1 as a pointer value. This eliminates a global variable which needed initialization at startup. llvm-svn: 261761
* ELF: Remove InputSectionBase::getAlign and instead add Align member.Rui Ueyama2016-02-241-6/+5
| | | | | | | | | This is a preparation for ICF. If we merge two sections, we want to align the merged section at the largest alignment requirement. That means we want to update the alignment value, which was impossible before this patch because Header is a const value. llvm-svn: 261712
* ELF: Remove InputSectionBase::isLive and use Live member instead. NFC.Rui Ueyama2016-02-241-2/+2
| | | | | | This is also a preparation for ICF. llvm-svn: 261711
OpenPOWER on IntegriCloud