summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/Native/WriterNative.cpp
Commit message (Collapse)AuthorAgeFilesLines
* Remove the Native file format.Rui Ueyama2015-04-101-566/+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
* Store non-log2 values to Native files.Rui Ueyama2015-03-261-1/+1
| | | | llvm-svn: 233247
* Use alignment values everywhere instead of log2.Rui Ueyama2015-03-261-1/+1
| | | | | | | | 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
* Remove implicit constructor and operator int from PowerOf2.Rui Ueyama2015-03-261-1/+1
| | | | | | | | | | 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
* [Mips] Support MIPS N64 relocation record formatSimon Atanasyan2015-03-241-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* Remove sectionPosition attribute.Rui Ueyama2015-03-081-2/+1
| | | | | | | | This code is simply dead. No one is using it. http://reviews.llvm.org/D8125 llvm-svn: 231583
* Define DefinedAtom::sectionSize.Rui Ueyama2015-03-041-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | 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
* Remove unused parameter.Rui Ueyama2015-02-111-4/+2
| | | | llvm-svn: 228887
* path.data() may return a non null terminated stringJean-Daniel Dupas2015-01-261-1/+1
| | | | | | and raw_fd_ostream constructor expects a StringRef. llvm-svn: 227081
* Fix five of the shared library build targetsGreg Fitzgerald2015-01-211-1/+1
| | | | | | | | | | | | | | | | | | Before this patch there was a cyclic dependency between lldCore and lldReaderWriter. Only lldConfig could be built as a shared library. * Moved Reader and Writer base classes into lldCore. * The following shared libraries can now be built: lldCore lldYAML lldNative lldPasses lldReaderWriter Differential Revision: http://reviews.llvm.org/D7105 From: Greg Fitzgerald <garious@gmail.com> llvm-svn: 226732
* Clean up #include dependency.Rui Ueyama2014-12-141-0/+1
| | | | | | Core/File.h does not use LinkingContext.h, so remove that dependency. llvm-svn: 224214
* [ELF] Add CodeModel attribute to the DefinedAtom classSimon Atanasyan2014-11-131-0/+1
| | | | | | | | | | | | | | | | | | | | | | MIPS ELF symbols might contain some additional MIPS-specific flags in the st_other field besides visibility ones. These flags indicate code properties like microMIPS / MIPS16 encoding, position independent code etc. We need to transfer the flags from input objects to the output linked file to write them into the symbol table, adjust symbols addresses etc. I add new attribute CodeModel to the DefinedAtom class to hold target specific flag and to get over YAML/Native format conversion barrier. Other architectures/targets can extend CodeModel enumeration by their own flags. MIPS specific part of this patch adds support for STO_MIPS_MICROMIPS flag. This flag marks microMIPS symbols. Such symbol should: a) Has STO_MIPS_MICROMIPS in the corresponding .symtab record. b) Has adjusted (odd) address in the corresponding .symtab and .dynsym records. llvm-svn: 221864
* Update for LLVM api changeRafael Espindola2014-08-251-5/+4
| | | | llvm-svn: 216395
* include system_error directly.Rafael Espindola2014-06-121-1/+1
| | | | llvm-svn: 210801
* Run llvm/utils/sort_includes.py in a few files.Rafael Espindola2014-06-121-4/+1
| | | | | | This will reduce the noise in a followup patch. llvm-svn: 210800
* Don't import error_code into the lld namespace.Rafael Espindola2014-06-121-3/+3
| | | | llvm-svn: 210785
* Use error_code() instead of error_code::succes()Rafael Espindola2014-05-311-2/+2
| | | | | | | There is no std::error_code::success, so this removes much of the noise in transitioning to std::error_code. llvm-svn: 209948
* Re-submit r207884: Remove dead codeRui Ueyama2014-05-051-1/+0
| | | | | | Differential Revision: http://reviews.llvm.org/D3599 llvm-svn: 207989
* Revert "Remove dead code."Rui Ueyama2014-05-021-0/+1
| | | | | | This reverts commit r207884 which was prematurely committed by accident. llvm-svn: 207886
* Remove dead code.Rui Ueyama2014-05-021-1/+0
| | | | | | | | | | | | | | | isAlias always returns false and no one is using it. It was originally added Atom to query if an atom is an alias for another atom, assuming that alias atoms are different from normal atoms. We now support atom aliasing, but the way that's implemented is in a different way than what isAlias assumed. An alias atom is just a regular defined atom with no content, and it has a layout- before edge to alias-to atom so that they are layed out at the same location in the result. So this is dead code, and it doesn't make much sense to keep it. llvm-svn: 207884
* s/llvm::dyn_cast/dyn_cast/Rui Ueyama2014-04-021-2/+1
| | | | llvm-svn: 205404
* [core] support .gnu.linkonce sectionsShankar Easwaran2014-04-011-1/+1
| | | | | | | | | | | | | | | | | | .gnu.linkonce sections are similar to section groups. They were supported before section groups existed and provided a way to resolve COMDAT sections using a different design. There are few implementations that use .gnu.linkonce sections to store simple floating point constants which doesnot require complex section group support but need a way to store only one copy of the floating point constant in a binary. .gnu.linkonce based symbol resolution achieves that. Review : http://llvm-reviews.chandlerc.com/D3242 llvm-svn: 205280
* Revert "[core] support .gnu.linkonce sections"Shankar Easwaran2014-03-311-2/+1
| | | | | | | | | This reverts commit 5d5ca72a7876c3dd3dd1db83dc6a0d74be9e2cd1. Discuss on a better design to raise error when there is a similar group with Gnu linkonce sections and COMDAT sections. llvm-svn: 205224
* [core] support .gnu.linkonce sectionsShankar Easwaran2014-03-311-1/+2
| | | | | | | | | | | .gnu.linkonce sections are similar to section groups. They were supported before section groups existed and provided a way to resolve COMDAT sections using a different design. There are few implementations that use .gnu.linkonce sections to store simple floating point constants which doesnot require complex section group support but need a way to store only one copy of the floating point constant. .gnu.linkonce based symbol resolution achieves that. llvm-svn: 205163
* [core] add SectionGroup supportShankar Easwaran2014-03-261-0/+16
| | | | | | Review : http://llvm-reviews.chandlerc.com/D3182 llvm-svn: 204830
* Fix warning 'enumeral and non-enumeral type in conditional expression'.Simon Atanasyan2014-03-191-1/+1
| | | | llvm-svn: 204221
* Add "override" and remove "virtual" where appropriate.Rui Ueyama2014-03-061-1/+1
| | | | | | | For the record, I used clang-modernize to add "override" and perl to remove "virtual". llvm-svn: 203164
* Update for LLVM api change.Rafael Espindola2014-02-241-1/+1
| | | | llvm-svn: 202054
* [lld] Introduce registry and Reference kind tupleNick Kledzik2013-12-191-2/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The main changes are in: include/lld/Core/Reference.h include/lld/ReaderWriter/Reader.h Everything else is details to support the main change. 1) Registration based Readers Previously, lld had a tangled interdependency with all the Readers. It would have been impossible to make a streamlined linker (say for a JIT) which just supported one file format and one architecture (no yaml, no archives, etc). The old model also required a LinkingContext to read an object file, which would have made .o inspection tools awkward. The new model is that there is a global Registry object. You programmatically register the Readers you want with the registry object. Whenever you need to read/parse a file, you ask the registry to do it, and the registry tries each registered reader. For ease of use with the existing lld code base, there is one Registry object inside the LinkingContext object. 2) Changing kind value to be a tuple Beside Readers, the registry also keeps track of the mapping for Reference Kind values to and from strings. Along with that, this patch also fixes an ambiguity with the previous Reference::Kind values. The problem was that we wanted to reuse existing relocation type values as Reference::Kind values. But then how can the YAML write know how to convert a value to a string? The fix is to change the 32-bit Reference::Kind into a tuple with an 8-bit namespace (e.g. ELF, COFFF, etc), an 8-bit architecture (e.g. x86_64, PowerPC, etc), and a 16-bit value. This tuple system allows conversion to and from strings with no ambiguities. llvm-svn: 197727
* Use NativeReferenceIvarsV2 if necessary.Rui Ueyama2013-11-201-16/+60
| | | | | | | | | | | | | | | | | | | | NativeReferenceIvarsV1 cannot handle more than 65535 relocation targets because its field to point to the target table is of type uint16_t. Because of that limitation, the LLD couldn't link a file containing more than 65535 relocations. 65535 is not a big number - the LLD couldn't even link itself with V1. This patch solves the issue by adding NativeReferenceIvarsV2 support. The new structure has more bits for the target table, so it can handle a large number of relocatinos. V2 structure is larger than V1. In order to prevent file bloating, V2 format is used only when the resulting file cannot be represented in V1 format. The writer and the reader support both V1 and V2 formats. Differential Revision: http://llvm-reviews.chandlerc.com/D2217 llvm-svn: 195270
* Replace unnecessary vector copy with reference.Rui Ueyama2013-11-181-1/+1
| | | | llvm-svn: 194988
* Add an assert for NativeReferenceIvarsV1.Rui Ueyama2013-11-181-0/+2
| | | | | | | | | | | | | | The maximum number of references the file with NativeReferenceIvarsV1 can contain is 65534. If a file larger than that is converted to Native format, the conversion will fail without any error message. This caused a subtle bug that the LLD would produce a broken executable only when input files contain too many references. This issue exists since the RoundTripNativeTest is introduced in r193585. Since then, it seems that nobody have linked any program having more than 65534 relocations with the LLD. Otherwise we would have found it earlier. llvm-svn: 194987
* Use early continue.Rui Ueyama2013-11-161-27/+23
| | | | llvm-svn: 194911
* Simplify. No functionality change.Rui Ueyama2013-11-161-7/+3
| | | | llvm-svn: 194909
* Replace duplicate code with calls to getOrPushAttribute().Rui Ueyama2013-11-161-24/+20
| | | | llvm-svn: 194908
* Use range-based for loop.Rui Ueyama2013-11-151-21/+15
| | | | | | end() was evaluated every time through a loop. This patch eliminates it. llvm-svn: 194894
* Use llvm_unreachable() instead of assert() at where control should never get.Rui Ueyama2013-11-151-2/+1
| | | | llvm-svn: 194890
* Duplicate code removal.Rui Ueyama2013-11-151-70/+37
| | | | llvm-svn: 194887
* Replace magic number with sizeof(). No functionality change.Rui Ueyama2013-11-151-1/+2
| | | | llvm-svn: 194877
* Remove duplicate code.Rui Ueyama2013-11-151-57/+23
| | | | llvm-svn: 194866
* Add explictly exported atoms and export R_*_COPY'ed atoms.Michael J. Spencer2013-11-081-0/+1
| | | | llvm-svn: 194278
* [Native] Fix fallback atoms when writing to Native file.Shankar Easwaran2013-10-181-0/+3
| | | | | | | | There is no test as currently there is no call to the NativeWriter. Future commits will add calls to the NativeWriter. llvm-svn: 192944
* [Core] Add type and size to SharedLibraryAtom.Michael J. Spencer2013-09-261-0/+2
| | | | llvm-svn: 191466
* [lld] handle typeZeroFill atoms in ELF/Native/YAMLShankar Easwaran2013-08-231-2/+1
| | | | | | | | | | | | | BSS atoms dont take any file space in the Input file. They are associated with a contentType(typeZeroFill). Similiar zero fill types also exist which have the same meaning in terms of occupying file space in the Input. These atoms have to be handled seperately when writing to the lld's intermediate file or the lld test infrastructure. Also adds a test. llvm-svn: 189136
* Rename TargetInfo -> LinkingContext.Rui Ueyama2013-08-061-4/+4
| | | | | | | | | Also change some local variable names: "ti" -> "context" and "_targetInfo" -> "_context". Differential Revision: http://llvm-reviews.chandlerc.com/D1301 llvm-svn: 187823
* Update for llvm API change.Rafael Espindola2013-07-161-1/+1
| | | | llvm-svn: 186450
* Removed unnecessary "class" keyword.Rui Ueyama2013-06-211-8/+8
| | | | llvm-svn: 184589
* [ARM] Remove isThumb() as it's not used and it's not in the right place.Rui Ueyama2013-06-131-1/+0
| | | | | | | | | | | | | | Architecture specific code should reside in architecture specific directory not in Atom. Looks like there are no efforts being made at this moment to support ARM, so let's remove it for now. Reviewers: Bigcheese CC: llvm-commits Differential Revision: http://llvm-reviews.chandlerc.com/D959 llvm-svn: 183877
* [lld] remove trailing whitespaceShankar Easwaran2013-03-141-4/+4
| | | | llvm-svn: 177079
* [ELF][Hexagon]add typeZeroFillFastShankar Easwaran2013-02-241-1/+2
| | | | llvm-svn: 175983
OpenPOWER on IntegriCloud