diff --git a/lld/lib/ReaderWriter/ELF/ReaderELF.cpp b/lld/lib/ReaderWriter/ELF/ReaderELF.cpp index 0f2f31faca6c..fba6076187fa 100644 --- a/lld/lib/ReaderWriter/ELF/ReaderELF.cpp +++ b/lld/lib/ReaderWriter/ELF/ReaderELF.cpp @@ -46,10 +46,9 @@ using llvm::support::endianness; using namespace llvm::object; namespace { -// \brief Read a binary, find out based on the symbol table contents what kind -// of symbol it is and create corresponding atoms for it -template -class FileELF: public File { +/// \brief Read a binary, find out based on the symbol table contents what kind +/// of symbol it is and create corresponding atoms for it +template class FileELF : public File { typedef Elf_Sym_Impl Elf_Sym; typedef Elf_Shdr_Impl Elf_Shdr; typedef Elf_Rel_Impl Elf_Rel; @@ -57,7 +56,7 @@ class FileELF: public File { public: FileELF(std::unique_ptr MB, llvm::error_code &EC) - : File(MB->getBufferIdentifier()) { + : File(MB->getBufferIdentifier()) { llvm::OwningPtr binaryFile; EC = createBinary(MB.release(), binaryFile); if (EC) @@ -73,7 +72,7 @@ public: binaryFile.take(); - std::map< const Elf_Shdr *, std::vector> sectionSymbols; + std::map> sectionSymbols; // Handle: SHT_REL and SHT_RELA sections: // Increment over the sections, when REL/RELA section types are found add @@ -98,7 +97,7 @@ public: auto rae(_objFile->endELFRela(section)); auto &Ref = _relocationAddendRefences[sectionName]; - for (; rai != rae; rai++) { + for (; rai != rae; ++rai) { Ref.push_back(&*rai); } } @@ -115,7 +114,7 @@ public: auto re(_objFile->endELFRel(section)); auto &Ref = _relocationReferences[sectionName]; - for (; ri != re; ri++) { + for (; ri != re; ++ri) { Ref.push_back(&*ri); } } @@ -134,7 +133,7 @@ public: return; const Elf_Shdr *section = _objFile->getElfSection(sit); - const Elf_Sym *symbol = _objFile->getElfSymbol(it); + const Elf_Sym *symbol = _objFile->getElfSymbol(it); llvm::StringRef symbolName; if ((EC = _objFile->getSymbolName(section, symbol, symbolName))) @@ -142,34 +141,31 @@ public: if (symbol->st_shndx == llvm::ELF::SHN_ABS) { // Create an absolute atom. - auto *newAtom = new (_readerStorage.Allocate< - ELFAbsoluteAtom > ()) - ELFAbsoluteAtom( - *this, symbolName, symbol, symbol->st_value); + auto *newAtom = new (_readerStorage.Allocate>()) + ELFAbsoluteAtom(*this, symbolName, symbol, + symbol->st_value); _absoluteAtoms._atoms.push_back(newAtom); _symbolToAtomMapping.insert(std::make_pair(symbol, newAtom)); } else if (symbol->st_shndx == llvm::ELF::SHN_UNDEF) { // Create an undefined atom. - auto *newAtom = new (_readerStorage.Allocate< - ELFUndefinedAtom > ()) - ELFUndefinedAtom( - *this, symbolName, symbol); + auto *newAtom = new (_readerStorage.Allocate>()) + ELFUndefinedAtom(*this, symbolName, symbol); _undefinedAtoms._atoms.push_back(newAtom); _symbolToAtomMapping.insert(std::make_pair(symbol, newAtom)); } else { // This is actually a defined symbol. Add it to its section's list of // symbols. - if (symbol->getType() == llvm::ELF::STT_NOTYPE - || symbol->getType() == llvm::ELF::STT_OBJECT - || symbol->getType() == llvm::ELF::STT_FUNC - || symbol->getType() == llvm::ELF::STT_GNU_IFUNC - || symbol->getType() == llvm::ELF::STT_SECTION - || symbol->getType() == llvm::ELF::STT_FILE - || symbol->getType() == llvm::ELF::STT_TLS - || symbol->getType() == llvm::ELF::STT_COMMON - || symbol->st_shndx == llvm::ELF::SHN_COMMON) { + if (symbol->getType() == llvm::ELF::STT_NOTYPE || + symbol->getType() == llvm::ELF::STT_OBJECT || + symbol->getType() == llvm::ELF::STT_FUNC || + symbol->getType() == llvm::ELF::STT_GNU_IFUNC || + symbol->getType() == llvm::ELF::STT_SECTION || + symbol->getType() == llvm::ELF::STT_FILE || + symbol->getType() == llvm::ELF::STT_TLS || + symbol->getType() == llvm::ELF::STT_COMMON || + symbol->st_shndx == llvm::ELF::SHN_COMMON) { sectionSymbols[section].push_back(symbol); } else { llvm::errs() << "Unable to create atom for: " << symbolName << "\n"; @@ -208,14 +204,13 @@ public: uint64_t contentSize; if (si + 1 == se) { // if this is the last symbol, take up the remaining data. - contentSize = (isCommon) ? 0 - : ((i.first)->sh_size - (*si)->st_value); + contentSize = isCommon ? 0 + : i.first->sh_size - (*si)->st_value; } else { - contentSize = (isCommon) ? 0 - : (*(si + 1))->st_value - (*si)->st_value; + contentSize = isCommon ? 0 + : (*(si + 1))->st_value - (*si)->st_value; } - // Don't allocate content to a weak symbol, as they may be merged away. // Create an anonymous atom to hold the data. ELFDefinedAtom *anonAtom = nullptr; @@ -225,17 +220,18 @@ public: *sym = **si; sym->setBinding(llvm::ELF::STB_GLOBAL); anonAtom = createDefinedAtomAndAssignRelocations( - "", sectionName, sym, i.first, - ArrayRef( - (uint8_t *)sectionContents.data() + (*si)->st_value, contentSize)); + "", sectionName, sym, i.first, + ArrayRef((uint8_t *)sectionContents.data() + + (*si)->st_value, contentSize)); contentSize = 0; } ArrayRef symbolData = ArrayRef( - (uint8_t *)sectionContents.data() + (*si)->st_value, contentSize); + (uint8_t *)sectionContents.data() + + (*si)->st_value, contentSize); auto newAtom = createDefinedAtomAndAssignRelocations( - symbolName, sectionName, *si, i.first, symbolData); + symbolName, sectionName, *si, i.first, symbolData); _definedAtoms._atoms.push_back(newAtom); _symbolToAtomMapping.insert(std::make_pair((*si), newAtom)); @@ -273,12 +269,9 @@ public: } private: - ELFDefinedAtom * - createDefinedAtomAndAssignRelocations(StringRef symbolName, - StringRef sectionName, - const Elf_Sym *symbol, - const Elf_Shdr *section, - ArrayRef content) { + ELFDefinedAtom *createDefinedAtomAndAssignRelocations( + StringRef symbolName, StringRef sectionName, const Elf_Sym *symbol, + const Elf_Shdr *section, ArrayRef content) { unsigned int referenceStart = _references.size(); // Only relocations that are inside the domain of the atom are added. @@ -286,10 +279,11 @@ private: // Add Rela (those with r_addend) references: for (auto &rai : _relocationAddendRefences[sectionName]) { if (!((rai->r_offset >= symbol->st_value) && - (rai->r_offset < symbol->st_value + content.size()))) + (rai->r_offset < symbol->st_value + content.size()))) continue; - auto *ERef = new (_readerStorage.Allocate> ()) - ELFReference(rai, rai->r_offset - symbol->st_value, nullptr); + auto *ERef = new (_readerStorage.Allocate>()) + ELFReference(rai, rai->r_offset - symbol->st_value, + nullptr); _references.push_back(ERef); } @@ -298,52 +292,47 @@ private: if ((ri->r_offset >= symbol->st_value) && (ri->r_offset < symbol->st_value + content.size())) { auto *ERef = new (_readerStorage.Allocate>()) - ELFReference(ri, ri->r_offset - symbol->st_value, nullptr); + ELFReference(ri, ri->r_offset - symbol->st_value, + nullptr); _references.push_back(ERef); } } // Create the DefinedAtom and add it to the list of DefinedAtoms. return new (_readerStorage.Allocate>()) - ELFDefinedAtom(*this, - symbolName, - sectionName, - symbol, - section, - content, - referenceStart, - _references.size(), - _references); + ELFDefinedAtom(*this, symbolName, sectionName, symbol, section, + content, referenceStart, _references.size(), + _references); } - std::unique_ptr> _objFile; - atom_collection_vector _definedAtoms; - atom_collection_vector _undefinedAtoms; + std::unique_ptr> _objFile; + atom_collection_vector _definedAtoms; + atom_collection_vector _undefinedAtoms; atom_collection_vector _sharedLibraryAtoms; - atom_collection_vector _absoluteAtoms; + atom_collection_vector _absoluteAtoms; /// \brief _relocationAddendRefences and _relocationReferences contain the /// list of relocations references. In ELF, if a section named, ".text" has /// relocations will also have a section named ".rel.text" or ".rela.text" /// which will hold the entries. -- .rel or .rela is prepended to create /// the SHT_REL(A) section name. - std::map> - _relocationAddendRefences; - std::map> - _relocationReferences; + std::map> _relocationAddendRefences; + std::map> _relocationReferences; std::vector *> _references; llvm::DenseMap _symbolToAtomMapping; llvm::BumpPtrAllocator _readerStorage; }; -// \brief A reader object that will instantiate correct FileELF by examining the -// memory buffer for ELF class and bit width -class ReaderELF: public Reader { +/// \brief A reader object that will instantiate correct FileELF by examining the +/// memory buffer for ELF class and bit width +class ReaderELF : public Reader { public: ReaderELF(const ReaderOptionsELF &, ReaderOptionsArchive &readerOptionsArchive) - : _readerOptionsArchive(readerOptionsArchive) - , _readerArchive(_readerOptionsArchive) { + : _readerOptionsArchive(readerOptionsArchive), + _readerArchive(_readerOptionsArchive) { _readerOptionsArchive.setReader(this); } @@ -351,11 +340,11 @@ public: std::vector> &result) { using llvm::object::ELFType; llvm::sys::LLVMFileType fileType = - llvm::sys::IdentifyFileType(mb->getBufferStart(), - static_cast(mb->getBufferSize())); + llvm::sys::IdentifyFileType(mb->getBufferStart(), + static_cast(mb->getBufferSize())); std::size_t MaxAlignment = - 1ULL << llvm::CountTrailingZeros_64(uintptr_t(mb->getBufferStart())); + 1ULL << llvm::CountTrailingZeros_64(uintptr_t(mb->getBufferStart())); llvm::error_code ec; switch (fileType) { @@ -365,44 +354,44 @@ public: // Instantiate the correct FileELF template instance based on the Ident // pair. Once the File is created we push the file to the vector of files // already created during parser's life. - if (Ident.first == llvm::ELF::ELFCLASS32 && Ident.second - == llvm::ELF::ELFDATA2LSB) { + if (Ident.first == llvm::ELF::ELFCLASS32 && + Ident.second == llvm::ELF::ELFDATA2LSB) { if (MaxAlignment >= 4) f.reset(new FileELF>( - std::move(mb), ec)); + std::move(mb), ec)); else if (MaxAlignment >= 2) f.reset(new FileELF>( - std::move(mb), ec)); + std::move(mb), ec)); else llvm_unreachable("Invalid alignment for ELF file!"); - } else if (Ident.first == llvm::ELF::ELFCLASS32 && Ident.second - == llvm::ELF::ELFDATA2MSB) { + } else if (Ident.first == llvm::ELF::ELFCLASS32 && + Ident.second == llvm::ELF::ELFDATA2MSB) { if (MaxAlignment >= 4) f.reset(new FileELF>( - std::move(mb), ec)); + std::move(mb), ec)); else if (MaxAlignment >= 2) f.reset(new FileELF>( - std::move(mb), ec)); + std::move(mb), ec)); else llvm_unreachable("Invalid alignment for ELF file!"); - } else if (Ident.first == llvm::ELF::ELFCLASS64 && Ident.second - == llvm::ELF::ELFDATA2MSB) { + } else if (Ident.first == llvm::ELF::ELFCLASS64 && + Ident.second == llvm::ELF::ELFDATA2MSB) { if (MaxAlignment >= 8) f.reset(new FileELF>( - std::move(mb), ec)); + std::move(mb), ec)); else if (MaxAlignment >= 2) f.reset(new FileELF>( - std::move(mb), ec)); + std::move(mb), ec)); else llvm_unreachable("Invalid alignment for ELF file!"); - } else if (Ident.first == llvm::ELF::ELFCLASS64 && Ident.second - == llvm::ELF::ELFDATA2LSB) { + } else if (Ident.first == llvm::ELF::ELFCLASS64 && + Ident.second == llvm::ELF::ELFDATA2LSB) { if (MaxAlignment >= 8) f.reset(new FileELF>( - std::move(mb), ec)); + std::move(mb), ec)); else if (MaxAlignment >= 2) f.reset(new FileELF>( - std::move(mb), ec)); + std::move(mb), ec)); else llvm_unreachable("Invalid alignment for ELF file!"); } @@ -431,11 +420,9 @@ private: } // end anon namespace. namespace lld { -ReaderOptionsELF::ReaderOptionsELF() { -} +ReaderOptionsELF::ReaderOptionsELF() {} -ReaderOptionsELF::~ReaderOptionsELF() { -} +ReaderOptionsELF::~ReaderOptionsELF() {} Reader *createReaderELF(const ReaderOptionsELF &options, ReaderOptionsArchive &optionsArchive) {