summaryrefslogtreecommitdiffstats
path: root/lld/ELF/Writer.cpp
Commit message (Collapse)AuthorAgeFilesLines
...
* [ELF] Fix problems with fabricateDefaultCommands() and --section-startPeter Smith2017-05-031-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | The --section-start <name>=<address> needs to be translated into equivalent linker script commands. There are a couple of problems with the existing implementation: - The --section-start with the lowest address is assumed to be at the start of the map. This assumption is incorrect, we have to iterate through the SectionStartMap to find the lowest address. - The addresses in --section-start were being over-aligned when the sections were marked as PageAlign. This is inconsistent with the use of SectionStartMap in fixHeaders(), and can cause problems when the PageAlign causes an "unable to move location counter backward" error when the --section-start with PageAlign is aligned to an address higher than the next --section-start. The ld.bfd and ld.gold seem to be more consistent with this approach but this is not a well specified area. This change fixes the problems above and also corrects a typo in which fabricateDefaultCommands() is called with the wrong parameter, it should be called with AllocateHeader not Config->MaxPageSize. Differential Revision: https://reviews.llvm.org/D32749 llvm-svn: 302007
* Bring back r301678.Rafael Espindola2017-04-291-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | This version uses a set to speed up the synchronize method. Original message: Remove LinkerScript::flush. This patch replaces flush with a last ditch attempt at synchronizing the section list with the linker script "AST". The synchronization is a bit of a hack and should in time be avoided by creating the AST earlier so that modifications can be made directly to it instead of modifying the section list and synchronizing it back. This is the main step for fixing https://bugs.llvm.org/show_bug.cgi?id=32816. With this in place I think the only missing thing would be to have processCommands assign section indexes as dummy offsets so that the sort in OutputSection::finalize works. With this LinkerScript::assignAddresses becomes much simpler, which should help with the thunk work. llvm-svn: 301745
* Revert r301678: Remove LinkerScript::flush.Rui Ueyama2017-04-281-2/+0
| | | | | | | | This reverts commit r301678 since that change significantly slowed down the linker. Before this patch, LLD could link clang in 8 seconds, but with this patch it took 40 seconds. llvm-svn: 301709
* Remove LinkerScript::flush.Rafael Espindola2017-04-281-0/+2
| | | | | | | | | | | | | | | | | | | | This patch replaces flush with a last ditch attempt at synchronizing the section list with the linker script "AST". The synchronization is a bit of a hack and should in time be avoided by creating the AST earlier so that modifications can be made directly to it instead of modifying the section list and synchronizing it back. This is the main step for fixing https://bugs.llvm.org/show_bug.cgi?id=32816. With this in place I think the only missing thing would be to have processCommands assign section indexes as dummy offsets so that the sort in OutputSection::finalize works. With this LinkerScript::assignAddresses becomes much simpler, which should help with the thunk work. llvm-svn: 301678
* Remove needless type conversions.Rui Ueyama2017-04-271-2/+2
| | | | llvm-svn: 301513
* Define __tls_get_addr as a hidden symbol even for ARM or MIPS.Rui Ueyama2017-04-251-5/+2
| | | | | | | | | | addIgnored defines a given symbol even if there is no existing symbol with the same name. So, even if libc provides __tls_get_addr, we should still be able to call addIgnored. Differential Revision: https://reviews.llvm.org/D32053 llvm-svn: 301290
* [ELF] Always use Script::assignAddresses()Peter Smith2017-04-191-37/+3
| | | | | | | | | | | | | | | | | | | This change fabricates linker script commands for the case where there is no linker script SECTIONS to control address assignment. This permits us to have a single Script->assignAddresses() function. There is a small change in user-visible-behavior with respect to the handling of .tbss SHT_NOBITS, SHF_TLS as the Script->assignAddresses() requires setDot() to be called with monotically increasing addresses. The tls-offset.s test has been updated so that the script and non-script results match. This change should make the non-script behavior of lld closer to an equivalent linker script. Differential Revision: https://reviews.llvm.org/D31888 llvm-svn: 300687
* Update comment.Rui Ueyama2017-04-191-2/+3
| | | | llvm-svn: 300676
* [ELF] - Implemented --compress-debug-sections option.George Rimar2017-04-171-0/+6
| | | | | | | | | | | | | | Patch implements --compress-debug-sections=zlib. In compare with D20211 (a year old patch, abandoned), it implementation uses streaming and fully reimplemented, does not support zlib-gnu for simplification. This is PR32308. Differential revision: https://reviews.llvm.org/D31941 llvm-svn: 300444
* Add "1" suffix if there's varaible ends with "2".Rui Ueyama2017-04-131-9/+9
| | | | | | | If we knew that we'd add End2, Edata2 and Etext2, we'd name their original symbols with "1". This patch does it. llvm-svn: 300263
* Replace a clever lambda helper with a simpler one.Rui Ueyama2017-04-131-12/+9
| | | | llvm-svn: 300259
* Add comments for the RELRO segment.Rui Ueyama2017-04-131-2/+40
| | | | | | | | | | | | | | RELRO is a feature to make segments read-only after dynamic relocations are applied. It is different from read-only segments because RELRO is initially writable. And of course RELRO is different from writable segments. RELRO is not a very well known feature. We have a series of checks to make a decision whether a section should be in a RELRO segment or not, but we didn't describe why. This patch adds comments to explain how that decision is made. llvm-svn: 300176
* [ELF] Recommit r299635 to pad x86 executable sections with 0xccJames Henderson2017-04-071-1/+1
| | | | | | This follows r299748 which fixed a latent bug the original commit exposed. llvm-svn: 299755
* Revert r299635 because it exposed a latent bug.James Henderson2017-04-061-1/+1
| | | | llvm-svn: 299655
* [ELF] Remove unnecessary cast and fix comments. NFC.James Henderson2017-04-061-7/+7
| | | | llvm-svn: 299636
* [ELF] Pad x86 executable sections with 0xcc int3 instructionsJames Henderson2017-04-061-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Executable sections should not be padded with zero by default. On some architectures, 0x00 is the start of a valid instruction sequence, so can confuse disassembly between InputSections (and indeed the start of the next InputSection in some situations). Further, in the case of misjumps into padding, padding may start to be executed silently. On x86, the "0xcc" byte represents the int3 trap instruction. It is a single byte long so can serve well as padding. This change switches x86 (and x86_64) to use this value for padding in executable sections, if no linker script directive overrides it. It also puts the behaviour into place making it easy to change the behaviour of other targets when desired. I do not know the relevant instruction sequences for trap instructions on other targets however, so somebody should add this separately. Because the old behaviour simply wrote padding in the whole section before overwriting most of it, this change also modifies the padding algorithm to write padding only where needed. This in turn has caused a small behaviour change with regards to what values are written via Fill commands in linker scripts, bringing it into line with ld.bfd. The fill value is now written starting from the end of the previous block, which means that it always starts from the first byte of the fill, whereas the old behaviour meant that the padding sometimes started mid-way through the fill value. See the test changes for more details. Reviewed by: ruiu Differential Revision: https://reviews.llvm.org/D30886 Bugzilla: http://bugs.llvm.org/show_bug.cgi?id=32227 llvm-svn: 299635
* Remove unused typedefs.Rui Ueyama2017-04-051-3/+1
| | | | llvm-svn: 299594
* Inline a small function. NFC.Rui Ueyama2017-04-051-5/+1
| | | | llvm-svn: 299593
* Use uint64_t to keep file size even on 32-bit machines.Rui Ueyama2017-04-051-48/+48
| | | | | | If an output file is too large for 32-bit, we should report an error. llvm-svn: 299592
* Inline a small function. NFC.Rui Ueyama2017-04-051-8/+2
| | | | llvm-svn: 299590
* [ELF] Make createThunks a class [NFC]Peter Smith2017-04-051-1/+2
| | | | | | | | | | | For range extension thunks we will need to repeatedly call createThunks() until no more thunks are created. We will need to retain the state of Thunks that we have created so far to avoid recreating them on later passes. This change does not change the functionality of createThunks(). Differential Revision: https://reviews.llvm.org/D31654 llvm-svn: 299530
* [ELF] - Define __bss_start symbol.George Rimar2017-04-051-0/+7
| | | | | | | | | | | | | | | | | | | | GNU linkers define __bss_start symbol. Patch teaches LLD to do that. This is PR32051. Below is part of standart ld.bfd script: .data1 : { *(.data1) } _edata = .; PROVIDE (edata = .); . = .; __bss_start = .; .bss : { Currently LLD can emit up to 3 .bss* sections as one of testcase shows. Implementation inserts this symbol before first .bss* output section. Differential revision: https://reviews.llvm.org/D30419 llvm-svn: 299528
* Update comments.Rui Ueyama2017-03-241-3/+2
| | | | llvm-svn: 298669
* Move a few functions to a new file Filesystem.{cpp,h}.Rui Ueyama2017-03-241-37/+1
| | | | llvm-svn: 298667
* Make elf::ScriptConfig a LinkerScript class member variable.Rui Ueyama2017-03-211-6/+6
| | | | | | | | | | | | LinkerScript used to be a template class, so we couldn't instantiate that class in elf::link. We instantiated ScriptConfig class earlier instead so that the linker script parser can store configurations to the object. Now that LinkerScript is not a template, it doesn't make sense to separate ScriptConfig from LinkerScript. This patch merges them. llvm-svn: 298457
* [ELF] - Detemplate ARMExidxSentinelSection. NFC.George Rimar2017-03-211-1/+1
| | | | llvm-svn: 298350
* [ELF] - Detemplate GdbIndexSection.George Rimar2017-03-211-1/+1
| | | | | | | | | | | Patch moves Sections array to InputFile (root class for input files). That allows to detemplate GdbIndexSection. Differential revision: https://reviews.llvm.org/D30976 llvm-svn: 298345
* [ELF][MIPS] Calculate relocations agains _gp_disp / __gnu_local_gp using ↵Simon Atanasyan2017-03-201-7/+1
| | | | | | | | | | | | | | | | | | | | | | | dedicated 'expressions' The patch introduces two new relocations expressions R_MIPS_GOT_GP and R_MIPS_GOT_GP_PC. The first one represents a current value of `_gp` pointer and used to calculate relocations against the `__gnu_local_gp` symbol. The second one represents the offset between the beginning of the function and the `_gp` pointer's value. There are two motivations for introducing new expressions: - It's better to keep all non-trivial relocation calculations in the single place - `getRelocTargetVA` function. - Relocations against both `_gp_disp` and `__gnu_local_gp` symbols depend on the `_gp` value. It's a magical value points to the "middle" of GOT. Now all relocations use a common `_gp` value. But in fact, under some conditions each input file might require its own `_gp` value. I'm going to implement it in the future patches. So it's better to make `MipsGotSection` responsible for calculation of the `_gp` value. llvm-svn: 298306
* [ELF] - Detemplate MipsGotSection<ELFT>George Rimar2017-03-201-1/+1
| | | | | | | | | | | | | This continues detemplation process. Detemplating MipsGotSection<ELFT> is helpfull because can help to detemplate getRelocTargetVA. (one more change is required) It opens road to detemplation of GotSection<ELFT> and probably something else after that. Differential revision: https://reviews.llvm.org/D31090 llvm-svn: 298272
* [ELF] - Detemplate BuildIdSection section.George Rimar2017-03-201-1/+1
| | | | | | | | | | Does not introduce anything new, just performs detemplate, using methods we already have. Differential revision: https://reviews.llvm.org/D30935 llvm-svn: 298269
* [ELF] - Combine LinkerScriptBase and LinkerScript<ELFT>George Rimar2017-03-201-18/+16
| | | | | | | | | | | | Patch removes templated linkerscript class. Unfortunately that required 2 additional static methods findSymbol() and addRegularSymbol() because code depends on Symtab<ELFT>::X Differential revision: https://reviews.llvm.org/D30982 llvm-svn: 298241
* Compute Config member function return values only once.Rui Ueyama2017-03-171-10/+9
| | | | | | | | | | | We had a few Config member functions that returns configuration values. For example, we had is64() which returns true if the target is 64-bit. The return values of these functions are constant and never change. This patch is to compute them only once to make it clear that they'll never change. llvm-svn: 298168
* [ELF] - Recommit r298078 "[ELF] - Simplify logic of creating "COMMON" section."George Rimar2017-03-171-5/+3
| | | | | | | | | | | | | | With fix of next warning: Writer.cpp:361:3: warning: suggest parentheses around assignment used as truth value [-Wparentheses] Original commit message: Patch reuses BssSection section to simplify creation of COMMON section. Differential revision: https://reviews.llvm.org/D30690 llvm-svn: 298086
* [ELF] - Revert r298078 and 298082George Rimar2017-03-171-2/+5
| | | | | | It segfaults. llvm-svn: 298084
* [ELF] - Fix warning.George Rimar2017-03-171-2/+2
| | | | | | Writer.cpp:361:3: warning: suggest parentheses around assignment used as truth value [-Wparentheses] llvm-svn: 298082
* [ELF] - Simplify logic of creating "COMMON" section.George Rimar2017-03-171-5/+2
| | | | | | | | | Patch reuses BssSection section to simplify creation of COMMON section. Differential revision: https://reviews.llvm.org/D30690 llvm-svn: 298078
* [ELF] - Detemplate SymbolBody::getVA and SymbolBody::getPltVA. NFC.George Rimar2017-03-171-1/+1
| | | | llvm-svn: 298071
* [ELF] - Detemplate PltSection. NFC.George Rimar2017-03-171-2/+2
| | | | | | | Alternative approach can be remove templated method either, like D31028 do. llvm-svn: 298065
* [ELF] - Recommit "[ELF] - Make Bss and BssRelRo sections to be synthetic (#3)."George Rimar2017-03-171-26/+17
| | | | | | | | | | | | | | | | | | Was fixed, details on review page. Original commit message: That removes CopyRelSection class completely, making Bss/BssRelRo to be just regular synthetics. This is splitted from D30541 and polished. Difference from D30541 that all logic of SharedSymbol converting to DefinedRegular was removed for now and probably will be posted as separate patch. Differential revision: https://reviews.llvm.org/D30892 llvm-svn: 298062
* [ELF] - Removed unused templates #4. NFC.George Rimar2017-03-161-15/+12
| | | | llvm-svn: 297944
* [ELF] - Removed unused template #1. NFCGeorge Rimar2017-03-161-17/+15
| | | | llvm-svn: 297938
* [ELF] - Detemplate OutputSection::assignOffsets. NFC.George Rimar2017-03-161-3/+3
| | | | llvm-svn: 297937
* Revert r297813 "[ELF] - Make Bss and BssRelRo sections to be synthetic (#3)."George Rimar2017-03-161-17/+26
| | | | | | | | | I suppose it is the reason of BB fail: http://lab.llvm.org:8011/builders/clang-cmake-aarch64-lld/builds/921 https://bugs.llvm.org/show_bug.cgi?id=32167 llvm-svn: 297933
* simplify. NFCRafael Espindola2017-03-151-4/+1
| | | | llvm-svn: 297829
* [ELF] - Detemplate MipsRldMapSection. NFC.George Rimar2017-03-151-1/+1
| | | | | | | | | After introducing Config->is64Bit() and recent changes in LinkerScriptBase, some sections can be detemplated trivially. This is one of such cases. llvm-svn: 297825
* [ELF] - Detemplate StringTableSection.George Rimar2017-03-151-3/+3
| | | | | | | | | | | | | | | | | StringTableSection was <ELFT> templated previously, It disallow to de-template code that uses it, for example LinkerScript<ELFT>::discard uses it as: if (S == In<ELFT>::ShStrTab) error("discarding .shstrtab section is not allowed"); It seems we can try to detemplate some of synthetic sections and somehow make them available for non-templated calls. (move out of In<ELFT> struct probably). Differential revision: https://reviews.llvm.org/D30933 llvm-svn: 297815
* [ELF] - Make Bss and BssRelRo sections to be synthetic (#3).George Rimar2017-03-151-25/+17
| | | | | | | | | | | | | | That removes CopyRelSection class completely, making Bss/BssRelRo to be just regular synthetics. This is splitted from D30541 and polished. Difference from D30541 that all logic of SharedSymbol converting to DefinedRegular was removed for now and probably will be posted as separate patch. Differential revision: https://reviews.llvm.org/D30892 llvm-svn: 297814
* [ELF] - Detemplate GotPltSection and IgotPltSection sections.George Rimar2017-03-151-2/+2
| | | | | | | | | Patch introduces Config->is64Bit() and with help of that detemplates GotPltSection and IgotPltSection sections Differential revision: https://reviews.llvm.org/D30944 llvm-svn: 297813
* Support ABSOLUTE on the right hand side in linker scriptsPetr Hosek2017-03-151-0/+1
| | | | | | | | | | | | This also requires postponing the assignment the assignment of symbols defined in input linker scripts since those can refer to output sections and in case we don't have a SECTIONS command, we need to wait until all output sections have been created and assigned addresses. Differential Revision: https://reviews.llvm.org/D30851 llvm-svn: 297802
* [ELF] - Remove unnecessary template #4. NFC.George Rimar2017-03-141-1/+1
| | | | | | OutputSectionFactory has no ELFT templates anymore. llvm-svn: 297720
OpenPOWER on IntegriCloud