summaryrefslogtreecommitdiffstats
path: root/lld/lib/Core
Commit message (Collapse)AuthorAgeFilesLines
* Add an ObjCPass to the MachO linker.Pete Cooper2016-01-191-0/+1
| | | | | | | | | This pass currently emits an objc image info section if one is required. This section contains the aggregated version and flags for all of the input files. llvm-svn: 258197
* Add File::kind's for all subclasses of File.Pete Cooper2016-01-142-4/+17
| | | | | | | | | | | | This is to enable isa<> support for any files which need it. It will be used in an upcoming patch to differentiate MachOFile from other implicitly generated files. Reviewed by Lang Hames. Differential Revision: http://reviews.llvm.org/D16103 llvm-svn: 257830
* Add handleLoadedFile hook to the context.Pete Cooper2016-01-141-22/+60
| | | | | | | | | | | | | | This is called from the resolver on each file we decide we actually want to use. Future commits will make use of this to extract useful information from the files and do error checking against the context. For example, ensure that files are the same arch as each other. Reviewed by Lang Hames. Differential Revision: http://reviews.llvm.org/D16093 llvm-svn: 257814
* Set CMake ADDITIONAL_HEADER_DIRS on libraries with headers in /include. NFC.Pete Cooper2016-01-071-0/+4
| | | | | | | | | | | In a UI such as XCode, it can group the headers for a library with that library. This is done in the CMakeLists.txt for the library itself by setting the path(s) as ADDITIONAL_HEADER_DIRS. LLVM already does this for all of its libraries, so just adding this to lld to make things easier. Should be NFC. llvm-svn: 257002
* Set the folder for libraries to 'lld libraries'. NFC.Pete Cooper2016-01-071-1/+1
| | | | | | | | | | | | In a UI such as XCode, LLVM source files are in 'libraries' while clang files are in 'clang libraries'. This change moves the lld source to 'lld libraries' to make code browsing easier. It should be NFC as the build itself is still the same, just the structure in a UI differs. llvm-svn: 257001
* Add more debugging output to MachO lld. NFC.Pete Cooper2015-12-161-5/+24
| | | | | | | In debug builds there's now a dump method on Section and improved printing of atoms. llvm-svn: 255826
* Added some DEBUG() prints to make it clearer what the mach-o passes are ↵Pete Cooper2015-12-161-2/+25
| | | | | | | | | | | | doing. NFC. We had some DEBUG prints these passes, but add more so that its clear where we are dumping things, and what state we are in when we do so. I'll be adding more and more DEBUG printing to try make it easier to observe whats going on without having to attach a debugger. llvm-svn: 255805
* [lld][Darwin] Add support for the -sectcreate option.Lang Hames2015-10-241-0/+1
| | | | llvm-svn: 251183
* Fix Clang-tidy misc-use-override warnings, other minor fixes.Rui Ueyama2015-09-101-3/+2
| | | | | | Patch from Eugene Zelenko! llvm-svn: 247323
* [LinkerScript] Process program header in PHDRS commandDenis Protivensky2015-08-121-0/+6
| | | | | | | | | | Add PT_PHDR segment depending on its availability in linker script's PHDRS command, fallback if no linker script is given. Handle FILEHDR, PHDRS and FLAGS attributes of program header. Differential Revision: http://reviews.llvm.org/D11589 llvm-svn: 244743
* [LinkerScript] Add matching of output sections to segmentsDenis Protivensky2015-06-151-0/+2
| | | | | | | | | | | Add method to query segments for specified output section name. Return error if the section is assigned to unknown segment. Check matching of sections to segments during layout on the subject of correctness. NOTE: no actual functionality of using custom segments is implemented. Differential Revision: http://reviews.llvm.org/D10359 llvm-svn: 239719
* [ARM] Move out .ARM.exidx related things to ARM backendDenis Protivensky2015-05-261-1/+0
| | | | llvm-svn: 238191
* [ARM] Generation of .ARM.exidx/.ARM.extab sectionsLeny Kholodov2015-05-081-0/+1
| | | | | | | | | | | | This patch provides generation of .ARM.exidx & .ARM.extab sections which are used for unwinding. The patch adds new content type typeARMExidx for atoms from .ARM.exidx section and integration of atoms with such type to the ELF ReaderWriter. exidx.test has been added with checking of contents of .ARM.exidx section and .ARM.extab section. Differential Revision: http://reviews.llvm.org/D9324 llvm-svn: 236873
* Use MemoryBufferRef instead of MemoryBuffer&. NFC.Rafael Espindola2015-04-241-1/+1
| | | | | | This just reduces the noise from another patch. llvm-svn: 235776
* Return ErrorOr<std::unique_ptr<File>>. NFC.Rafael Espindola2015-04-241-8/+3
| | | | llvm-svn: 235744
* Remove unused enum value. NFC.Rafael Espindola2015-04-241-2/+0
| | | | llvm-svn: 235742
* Return an ErrorOr<std::unique_ptr<File>>. NFC.Rafael Espindola2015-04-241-1/+4
| | | | llvm-svn: 235741
* Delete unnecessary generality in loadFile.Rafael Espindola2015-04-241-3/+2
| | | | | | | | | | | | | loadFile could load mulitple files just because yaml has a feature for putting multiple documents in one file. Designing a linker around what yaml can do seems like a bad idea to me. This patch changes it to read a single file. There are further improvements to be done to the api and they will follow shortly. llvm-svn: 235724
* Define make_dynamic_error_code(const char *).Rui Ueyama2015-04-141-0/+4
| | | | | | | | | | | | The function took either StringRef or Twine. Since string literals are ambiguous when resolving the overloading, many code calls used this function with explicit type conversion. That led awkward code like make_dynamic_error_code(Twine("Error occurred")). This patch adds a function definition for string literals, so that you can directly call the function with literals. llvm-svn: 234841
* Do s/_context/_ctx/g globally.Rui Ueyama2015-04-101-7/+6
| | | | | | | | I believe this patch eliminates all remaining uses of _context or _linkingContext variable names. Consistent naming improves readability. llvm-svn: 234645
* Remove the Native file format.Rui Ueyama2015-04-102-51/+0
| | | | | | | | | | | | | The Native file format was designed to be the fastest on-memory or on-disk file format for object files. The problem is that no one is working on that. No LLVM tools can produce object files in the Native, thus the feature of supporting the format is useless in the linker. This patch removes the Native file support. We can add it back if we really want it in future. llvm-svn: 234641
* Reapply r234378, with test fixed (by emaste).Davide Italiano2015-04-101-1/+1
| | | | | | Hopefully this time the build won't be broken. llvm-svn: 234553
* Rename atom_collection -> AtomVector.Rui Ueyama2015-04-081-4/+4
| | | | | | Type names should start with an uppercase letter in the LLVM coding style. llvm-svn: 234452
* Merge atom_collection_vector with atom_collection.Rui Ueyama2015-04-081-4/+4
| | | | | | | atom_collection_vector is the only derived class of atom_collection. This patch merges the two. llvm-svn: 234443
* Remove atom_collection_empty class.Rui Ueyama2015-04-081-4/+4
| | | | llvm-svn: 234442
* Revert "Allow undefined symbols in shared library by default."Rui Ueyama2015-04-081-1/+1
| | | | | | This reverts commit r234378 because it broke buildbots. llvm-svn: 234414
* Allow undefined symbols in shared library by default.Davide Italiano2015-04-081-1/+1
| | | | | | | | | | | | It's not our business to resolve those undefined symbols. We just trust the linker will load the library and its dependencies correctly, which is actually what happens, modulo bugs in the dynamic linker itself. PR: 23035 Differential Revision: http://reviews.llvm.org/D8886 llvm-svn: 234378
* Replace the `createImplicitFiles` method return type with `void`Simon Atanasyan2015-04-062-7/+3
| | | | | | | All instances of the `createImplicitFiles` always return `true` and this return value is used nowhere. llvm-svn: 234205
* Remove return after report_fatal_error which has noreturn attribute.Rui Ueyama2015-04-061-1/+0
| | | | llvm-svn: 234204
* Remove a parameter for file extension from canParse.Rui Ueyama2015-04-041-5/+2
| | | | | | | | canParse took three parameters -- file magic, filename extension and memory buffer. All but YAMLReader ignored the second parameter. This patch removes the parameter. llvm-svn: 234080
* Remove Makefiles.Rui Ueyama2015-03-261-13/+0
| | | | | | | | 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
* [LinkerScript] Implement linker script expression evaluationRafael Auler2015-03-091-0/+5
| | | | | | | | | | | 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
* Remove dead code.Rui Ueyama2015-03-091-1/+0
| | | | llvm-svn: 231688
* PECOFF: Create layout-afters instead of layout-befores.Rui Ueyama2015-03-091-1/+1
| | | | | | | | | | | | | | | | 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
* Revert r231552: Resolver: optimize fallback atoms.Rui Ueyama2015-03-081-4/+5
| | | | | | This patch broke a buildbot. llvm-svn: 231611
* Remove sectionPosition attribute.Rui Ueyama2015-03-081-5/+0
| | | | | | | | This code is simply dead. No one is using it. http://reviews.llvm.org/D8125 llvm-svn: 231583
* Resolver: optimize fallback atoms.Rui Ueyama2015-03-071-5/+4
| | | | | | | | | | | 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
* Resolver: Reduce number of SymbolTable::isDefined function calls.Rui Ueyama2015-03-071-1/+1
| | | | | | | | 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
* Resolver: Reduce number of hash function call.Rui Ueyama2015-03-071-2/+2
| | | | | | | | | | | | | | | | | 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
* Resolver: move code inside an assert.Rui Ueyama2015-03-061-4/+3
| | | | llvm-svn: 231518
* Remove unused function.Rui Ueyama2015-03-061-4/+0
| | | | llvm-svn: 231444
* Core: Make the resolver faster.Rui Ueyama2015-03-061-25/+29
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In the resolver, we maintain a list of undefined symbols, and when we visit an archive file, we check that file if undefined symbols can be resolved using files in the archive. The archive file class provides find() function to lookup a symbol. Previously, we call find() for each undefined symbols. Archive files may be visited multiple times if they are in a --start-group and --end-group. If we visit a file M times and if we have N undefined symbols, find() is called M*N times. I found that that is one of the most significant bottlenecks in LLD when linking a large executable. find() is not a very cheap operation because it looks up a hash table for a given string. And a string, or a symbol name, can be pretty long if you are dealing with C++ symbols. We can eliminate the bottleneck. Calling find() with the same symbol multiple times is a waste. If a result of looking up a symbol is "not found", it stays "not found" forever because the symbol simply doesn't exist in the archive. Thus, we should call find() only for newly-added undefined symbols. This optimization makes O(M*N) O(N). In this patch, all undefined symbols are added to a vector. For each archive/shared library file, we maintain a start position P. All symbols [0, P) are already searched. [P, end of the vector) are not searched yet. For each file, we scan the vector only once. This patch changes the order in which undefined symbols are looked for. Previously, we iterated over the result of _symbolTable.undefines(). Now we iterate over the new vector. This is a benign change but caused differences in output if remaining undefines exist. This is why some tests are updated. The performance improvement of this patch seems sometimes significant. Previously, linking chrome.dll on my workstation (Xeon 2.4GHz 8 cores) took about 70 seconds. Now it takes (only?) 30 seconds! http://reviews.llvm.org/D8091 llvm-svn: 231434
* Optimize resolver by using std::unordered_multimap.Rui Ueyama2015-03-061-2/+6
| | | | | | | | | | | | | | | | | _reverseRef is a multimap from atoms to atoms. The map contains reverse edges of "layout-before" and "group" edges for dead-stripping. The type of the variable was DenseMap<Atom *, DenseSet<Atom *>>. This patch changes that to std::unordered_multimap<Atom *, Atom *>. A DenseMap with a value type of DenseSet was not fast. Inserting 900k items to the map took about 1.6 seconds on my workstation. unordered_multimap on the other hand took only 0.6 seconds. Use of the map also got faster -- originally markLive took 1.3 seconds in the same test case, and it now took 1.0 seconds. In total we shove off 1.3 seconds out of 27 seconds in that test case. llvm-svn: 231432
* Early return. NFC.Rui Ueyama2015-03-051-31/+30
| | | | llvm-svn: 231403
* Resolver: Update preload map after File::beforeLink().Rui Ueyama2015-03-051-8/+17
| | | | | | | | | We maintain a map from symbols to archive files for the archive file pre-loading. That map is created at the beginning of the resolve() and is never updated. However, the input file list may be updated by File::beforeLink(). This is a patch to update the map after beforeLink. llvm-svn: 231395
* Remove dead code.Rui Ueyama2015-03-051-1/+0
| | | | | | This hook is called from one of the hottest loops in LLD and does nothing. llvm-svn: 231345
* Define DefinedAtom::sectionSize.Rui Ueyama2015-03-041-34/+4
| | | | | | | | | | | | | | | | | | | | | | | | Merge::mergeByLargestSection is half-baked since it's defined in terms of section size, there's no way to get the section size of an atom. Currently we work around the issue by traversing the layout edges to both directions and calculate the sum of all atoms reachable. I wrote that code but I knew it's hacky. It's even not guaranteed to work. If you add layout edges before the core linking, it miscalculates a size. Also it's of course slow. It's basically a linked list traversal. In this patch I added DefinedAtom::sectionSize so that we can use that for mergeByLargestSection. I'm not very happy to add a new field to DefinedAtom base class, but I think it's legitimate since mergeByLargestSection is defined for section size, and the section size is currently just missing. http://reviews.llvm.org/D7966 llvm-svn: 231290
* Make File non-const in the resolver.Rui Ueyama2015-03-041-7/+7
| | | | | | | | | | | | | | | File objects are not really const in the resolver. We set ordinals to them and call beforeLink hooks. Also, File's member functions marked as const are not really const. ArchiveFile never returns the same member file twice, so it remembers files returned before. find() has side effects. In order to deal with the inconsistencies, we sprinkled const_casts and marked member varaibles as mutable. This patch removes const from there to reflect the reality. llvm-svn: 231212
* Implement our own future and use that for FileArchive::preload().Rui Ueyama2015-03-031-2/+16
| | | | | | | | | | | | | | std::promise and std::future in old version of libstdc++ are buggy. I think that's the reason why LLD tests were flaky on Ubuntu 13 buildbots until we disabled file preloading. In this patch, I implemented very simple future and used that in FileArchive. Compared to std::promise and std::future, it lacks many features, but should serve our purpose. http://reviews.llvm.org/D8025 llvm-svn: 231153
* Do s/_context/_ctx/ to Resolver.cpp.Rui Ueyama2015-02-271-22/+21
| | | | llvm-svn: 230814
OpenPOWER on IntegriCloud