From f994868b6503dbc2f6b006b459f6861e6ca3a5fa Mon Sep 17 00:00:00 2001 From: Shankar Easwaran Date: Wed, 19 Nov 2014 06:24:51 +0000 Subject: [PATCH] Revert "[ELF] Create input and output section names" This reverts commit r222311. Reverting because of failure in the darwin bot. llvm-svn: 222329 --- lld/lib/ReaderWriter/ELF/DefaultLayout.h | 35 ++++------------- .../ELF/Hexagon/HexagonTargetHandler.h | 6 +-- lld/lib/ReaderWriter/ELF/OutputELFWriter.h | 4 +- lld/lib/ReaderWriter/ELF/SectionChunks.h | 39 ++++++------------- lld/lib/ReaderWriter/ELF/SegmentChunks.h | 3 +- 5 files changed, 26 insertions(+), 61 deletions(-) diff --git a/lld/lib/ReaderWriter/ELF/DefaultLayout.h b/lld/lib/ReaderWriter/ELF/DefaultLayout.h index 1698ecf87843..5758bba71a2a 100644 --- a/lld/lib/ReaderWriter/ELF/DefaultLayout.h +++ b/lld/lib/ReaderWriter/ELF/DefaultLayout.h @@ -175,14 +175,8 @@ public: SectionOrder getSectionOrder(StringRef name, int32_t contentType, int32_t contentPermissions) override; - /// \brief Return the name of the input section by decoding the input - /// sectionChoice. - virtual StringRef getInputSectionName(const DefinedAtom *da) const; - - /// \brief Return the name of the output section from the input section and - /// path. - virtual StringRef getOutputSectionName(StringRef inputSectionName, - StringRef path) const; + /// \brief This maps the input sections to the output section names + virtual StringRef getSectionName(const DefinedAtom *da) const; /// \brief Gets or creates a section. AtomSection * @@ -408,8 +402,7 @@ Layout::SectionOrder DefaultLayout::getSectionOrder( /// \brief This maps the input sections to the output section names template -StringRef -DefaultLayout::getInputSectionName(const DefinedAtom *da) const { +StringRef DefaultLayout::getSectionName(const DefinedAtom *da) const { if (da->sectionChoice() == DefinedAtom::sectionBasedOnContent) { switch (da->contentType()) { case DefinedAtom::typeCode: @@ -428,15 +421,7 @@ DefaultLayout::getInputSectionName(const DefinedAtom *da) const { break; } } - return da->customSectionName(); -} - -/// \brief This maps the input sections to the output section names -template -StringRef -DefaultLayout::getOutputSectionName(StringRef inputSectionName, - StringRef /* path */) const { - return llvm::StringSwitch(inputSectionName) + return llvm::StringSwitch(da->customSectionName()) .StartsWith(".text", ".text") .StartsWith(".ctors", ".ctors") .StartsWith(".dtors", ".dtors") @@ -449,7 +434,7 @@ DefaultLayout::getOutputSectionName(StringRef inputSectionName, .StartsWith(".tbss", ".tbss") .StartsWith(".init_array", ".init_array") .StartsWith(".fini_array", ".fini_array") - .Default(inputSectionName); + .Default(da->customSectionName()); } /// \brief Gets the segment for a output section @@ -562,7 +547,6 @@ DefaultLayout::getSection(StringRef sectionName, int32_t contentType, getSectionOrder(sectionName, contentType, permissions); AtomSection *newSec = createSection(sectionName, contentType, permissions, sectionOrder); - newSec->setOutputSectionName(getOutputSectionName(sectionName, path)); newSec->setOrder(sectionOrder); _sections.push_back(newSec); _sectionMap.insert(std::make_pair(sectionKey, newSec)); @@ -581,7 +565,7 @@ ErrorOr DefaultLayout::addAtom(const Atom *atom) definedAtom->permissions(); const DefinedAtom::ContentType contentType = definedAtom->contentType(); - StringRef sectionName = getInputSectionName(definedAtom); + StringRef sectionName = getSectionName(definedAtom); AtomSection *section = getSection( sectionName, contentType, permissions, definedAtom->file().path()); @@ -628,18 +612,15 @@ template void DefaultLayout::createOutputSections() { OutputSection *outputSection; for (auto &si : _sections) { - Section *section = dyn_cast>(si); - if (!section) - continue; const std::pair *> currentOutputSection( - section->outputSectionName(), nullptr); + si->name(), nullptr); std::pair outputSectionInsert( _outputSectionMap.insert(currentOutputSection)); if (!outputSectionInsert.second) { outputSection = outputSectionInsert.first->second; } else { outputSection = new (_allocator.Allocate>()) - OutputSection(section->outputSectionName()); + OutputSection(si->name()); _outputSections.push_back(outputSection); outputSectionInsert.first->second = outputSection; } diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h index 8d53614142b6..eb3b46348688 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h @@ -46,8 +46,8 @@ public: contentPermissions); } - /// \brief Return the appropriate input section name. - virtual StringRef getInputSectionName(const DefinedAtom *da) const { + /// \brief This maps the input sections to the output section names + virtual StringRef getSectionName(const DefinedAtom *da) const { switch (da->contentType()) { case DefinedAtom::typeDataFast: case DefinedAtom::typeZeroFillFast: @@ -55,7 +55,7 @@ public: default: break; } - return DefaultLayout::getInputSectionName(da); + return DefaultLayout::getSectionName(da); } /// \brief Gets or creates a section. diff --git a/lld/lib/ReaderWriter/ELF/OutputELFWriter.h b/lld/lib/ReaderWriter/ELF/OutputELFWriter.h index 2e6a88159b00..440187e0a7ed 100644 --- a/lld/lib/ReaderWriter/ELF/OutputELFWriter.h +++ b/lld/lib/ReaderWriter/ELF/OutputELFWriter.h @@ -302,9 +302,7 @@ template void OutputELFWriter::createDefaultSections() { _layout.addSection(_shdrtab.get()); for (auto sec : _layout.sections()) { - // TODO: use findOutputSection - auto section = dyn_cast>(sec); - if (!section || section->outputSectionName() != ".eh_frame") + if (sec->name() != ".eh_frame") continue; _ehFrameHeader.reset(new (_alloc) EHFrameHeader( _context, ".eh_frame_hdr", _layout, diff --git a/lld/lib/ReaderWriter/ELF/SectionChunks.h b/lld/lib/ReaderWriter/ELF/SectionChunks.h index 20d3343dd7ae..8b9e8199dce2 100644 --- a/lld/lib/ReaderWriter/ELF/SectionChunks.h +++ b/lld/lib/ReaderWriter/ELF/SectionChunks.h @@ -38,13 +38,11 @@ template class Segment; /// \brief An ELF section. template class Section : public Chunk { public: - Section(const ELFLinkingContext &context, StringRef sectionName, - StringRef chunkName, + Section(const ELFLinkingContext &context, StringRef name, typename Chunk::Kind k = Chunk::Kind::ELFSection) - : Chunk(chunkName, k, context), _outputSection(nullptr), _flags(0), + : Chunk(name, k, context), _outputSection(nullptr), _flags(0), _entSize(0), _type(0), _link(0), _info(0), - _isFirstSectionInOutputSection(false), _segmentType(SHT_NULL), - _inputSectionName(sectionName), _outputSectionName(sectionName) {} + _isFirstSectionInOutputSection(false), _segmentType(SHT_NULL) {} /// \brief Modify the section contents before assigning virtual addresses // or assigning file offsets @@ -112,14 +110,6 @@ public: : this->_align2; } - virtual StringRef inputSectionName() const { return _inputSectionName; } - - virtual StringRef outputSectionName() const { return _outputSectionName; } - - virtual void setOutputSectionName(StringRef outputSectionName) { - _outputSectionName = outputSectionName; - } - protected: /// \brief OutputSection this Section is a member of, or nullptr. OutputSection *_outputSection; @@ -137,19 +127,14 @@ protected: bool _isFirstSectionInOutputSection; /// \brief the output ELF segment type of this section. Layout::SegmentType _segmentType; - /// \brief Input section name. - StringRef _inputSectionName; - /// \brief Output section name. - StringRef _outputSectionName; }; /// \brief A section containing atoms. template class AtomSection : public Section { public: - AtomSection(const ELFLinkingContext &context, StringRef sectionName, + AtomSection(const ELFLinkingContext &context, StringRef name, int32_t contentType, int32_t permissions, int32_t order) - : Section(context, sectionName, "AtomSection", - Chunk::Kind::AtomSection), + : Section(context, name, Chunk::Kind::AtomSection), _contentType(contentType), _contentPermissions(permissions), _isLoadedInMemory(true) { this->setOrder(order); @@ -570,7 +555,7 @@ private: template StringTable::StringTable(const ELFLinkingContext &context, const char *str, int32_t order, bool dynamic) - : Section(context, str, "StringTable") { + : Section(context, str) { // the string table has a NULL entry for which // add an empty string _strings.push_back(""); @@ -694,7 +679,7 @@ protected: template SymbolTable::SymbolTable(const ELFLinkingContext &context, const char *str, int32_t order) - : Section(context, str, "SymbolTable") { + : Section(context, str) { this->setOrder(order); Elf_Sym symbol; std::memset(&symbol, 0, sizeof(Elf_Sym)); @@ -926,7 +911,7 @@ public: RelocationTable(const ELFLinkingContext &context, StringRef str, int32_t order) - : Section(context, str, "RelocationTable"), _symbolTable(nullptr) { + : Section(context, str), _symbolTable(nullptr) { this->setOrder(order); this->_flags = SHF_ALLOC; // Set the alignment properly depending on the target architecture @@ -1042,7 +1027,7 @@ public: DynamicTable(const ELFLinkingContext &context, TargetLayout &layout, StringRef str, int32_t order) - : Section(context, str, "DynamicSection"), _layout(layout) { + : Section(context, str), _layout(layout) { this->setOrder(order); this->_entSize = sizeof(Elf_Dyn); this->_align2 = ELFT::Is64Bits ? 8 : 4; @@ -1225,7 +1210,7 @@ template class InterpSection : public Section { public: InterpSection(const ELFLinkingContext &context, StringRef str, int32_t order, StringRef interp) - : Section(context, str, "Dynamic:Interp"), _interp(interp) { + : Section(context, str), _interp(interp) { this->setOrder(order); this->_align2 = 1; // + 1 for null term. @@ -1274,7 +1259,7 @@ template class HashSection : public Section { public: HashSection(const ELFLinkingContext &context, StringRef name, int32_t order) - : Section(context, name, "Dynamic:Hash"), _symbolTable(nullptr) { + : Section(context, name), _symbolTable(nullptr) { this->setOrder(order); this->_entSize = 4; this->_type = SHT_HASH; @@ -1378,7 +1363,7 @@ template class EHFrameHeader : public Section { public: EHFrameHeader(const ELFLinkingContext &context, StringRef name, TargetLayout &layout, int32_t order) - : Section(context, name, "EHFrameHeader"), _layout(layout) { + : Section(context, name), _layout(layout) { this->setOrder(order); this->_entSize = 0; this->_type = SHT_PROGBITS; diff --git a/lld/lib/ReaderWriter/ELF/SegmentChunks.h b/lld/lib/ReaderWriter/ELF/SegmentChunks.h index 62677611f7ea..2317e8d1cb58 100644 --- a/lld/lib/ReaderWriter/ELF/SegmentChunks.h +++ b/lld/lib/ReaderWriter/ELF/SegmentChunks.h @@ -432,6 +432,7 @@ void Segment::assignFileOffsets(uint64_t startOffset) { isDataPageAlignedForNMagic = true; } else fileOffset = llvm::RoundUpToAlignment(fileOffset, section->align2()); + if (isFirstSection) { slice->setFileOffset(fileOffset); isFirstSection = false; @@ -523,7 +524,7 @@ template void Segment::assignVirtualAddress(uint64_t addr) { } uint64_t newAddr = llvm::RoundUpToAlignment(curAddr, (*si)->align2()); // If the newAddress computed is more than a page away, let's create - // a separate segment, so that memory is not used up while running. + // a separate segment, so that memory is not used up while running if (((newAddr - curAddr) > this->_context.getPageSize()) && (_outputMagic != ELFLinkingContext::OutputMagic::NMAGIC && _outputMagic != ELFLinkingContext::OutputMagic::OMAGIC)) {