From: Shankar Easwaran Date: Sun, 30 Nov 2014 03:43:38 +0000 (+0000) Subject: [ELF] Create input and output section names X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=aa00539aa58207acab778a0e276725488d22e12f;p=platform%2Fupstream%2Fllvm.git [ELF] Create input and output section names No change in functionality. llvm-svn: 222973 --- diff --git a/lld/lib/ReaderWriter/ELF/DefaultLayout.h b/lld/lib/ReaderWriter/ELF/DefaultLayout.h index 94907f4..4e99808 100644 --- a/lld/lib/ReaderWriter/ELF/DefaultLayout.h +++ b/lld/lib/ReaderWriter/ELF/DefaultLayout.h @@ -173,8 +173,12 @@ public: SectionOrder getSectionOrder(StringRef name, int32_t contentType, int32_t contentPermissions) override; - /// \brief This maps the input sections to the output section names - virtual StringRef getSectionName(const DefinedAtom *da) const; + /// \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. + virtual StringRef getOutputSectionName(StringRef inputSectionName) const; /// \brief Gets or creates a section. AtomSection *getSection( @@ -399,7 +403,8 @@ Layout::SectionOrder DefaultLayout::getSectionOrder( /// \brief This maps the input sections to the output section names template -StringRef DefaultLayout::getSectionName(const DefinedAtom *da) const { +StringRef +DefaultLayout::getInputSectionName(const DefinedAtom *da) const { if (da->sectionChoice() == DefinedAtom::sectionBasedOnContent) { switch (da->contentType()) { case DefinedAtom::typeCode: @@ -418,7 +423,14 @@ StringRef DefaultLayout::getSectionName(const DefinedAtom *da) const { break; } } - return llvm::StringSwitch(da->customSectionName()) + return da->customSectionName(); +} + +/// \brief This maps the input sections to the output section names. +template +StringRef +DefaultLayout::getOutputSectionName(StringRef inputSectionName) const { + return llvm::StringSwitch(inputSectionName) .StartsWith(".text", ".text") .StartsWith(".ctors", ".ctors") .StartsWith(".dtors", ".dtors") @@ -431,7 +443,7 @@ StringRef DefaultLayout::getSectionName(const DefinedAtom *da) const { .StartsWith(".tbss", ".tbss") .StartsWith(".init_array", ".init_array") .StartsWith(".fini_array", ".fini_array") - .Default(da->customSectionName()); + .Default(inputSectionName); } /// \brief Gets the segment for a output section @@ -543,6 +555,7 @@ AtomSection *DefaultLayout::getSection( getSectionOrder(sectionName, contentType, permissions); AtomSection *newSec = createSection(sectionName, contentType, permissions, sectionOrder); + newSec->setOutputSectionName(getOutputSectionName(sectionName)); newSec->setOrder(sectionOrder); _sections.push_back(newSec); _sectionMap.insert(std::make_pair(sectionKey, newSec)); @@ -561,7 +574,7 @@ ErrorOr DefaultLayout::addAtom(const Atom *atom) definedAtom->permissions(); const DefinedAtom::ContentType contentType = definedAtom->contentType(); - StringRef sectionName = getSectionName(definedAtom); + StringRef sectionName = getInputSectionName(definedAtom); AtomSection *section = getSection(sectionName, contentType, permissions); @@ -608,15 +621,18 @@ template void DefaultLayout::createOutputSections() { OutputSection *outputSection; for (auto &si : _sections) { + Section *section = dyn_cast>(si); + if (!section) + continue; const std::pair *> currentOutputSection( - si->name(), nullptr); + section->outputSectionName(), nullptr); std::pair outputSectionInsert( _outputSectionMap.insert(currentOutputSection)); if (!outputSectionInsert.second) { outputSection = outputSectionInsert.first->second; } else { outputSection = new (_allocator.Allocate>()) - OutputSection(si->name()); + OutputSection(section->outputSectionName()); _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 eb3b463..8d53614 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h @@ -46,8 +46,8 @@ public: contentPermissions); } - /// \brief This maps the input sections to the output section names - virtual StringRef getSectionName(const DefinedAtom *da) const { + /// \brief Return the appropriate input section name. + virtual StringRef getInputSectionName(const DefinedAtom *da) const { switch (da->contentType()) { case DefinedAtom::typeDataFast: case DefinedAtom::typeZeroFillFast: @@ -55,7 +55,7 @@ public: default: break; } - return DefaultLayout::getSectionName(da); + return DefaultLayout::getInputSectionName(da); } /// \brief Gets or creates a section. diff --git a/lld/lib/ReaderWriter/ELF/OutputELFWriter.h b/lld/lib/ReaderWriter/ELF/OutputELFWriter.h index 440187e..2e6a881 100644 --- a/lld/lib/ReaderWriter/ELF/OutputELFWriter.h +++ b/lld/lib/ReaderWriter/ELF/OutputELFWriter.h @@ -302,7 +302,9 @@ template void OutputELFWriter::createDefaultSections() { _layout.addSection(_shdrtab.get()); for (auto sec : _layout.sections()) { - if (sec->name() != ".eh_frame") + // TODO: use findOutputSection + auto section = dyn_cast>(sec); + if (!section || section->outputSectionName() != ".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 8b9e819..20d3343 100644 --- a/lld/lib/ReaderWriter/ELF/SectionChunks.h +++ b/lld/lib/ReaderWriter/ELF/SectionChunks.h @@ -38,11 +38,13 @@ template class Segment; /// \brief An ELF section. template class Section : public Chunk { public: - Section(const ELFLinkingContext &context, StringRef name, + Section(const ELFLinkingContext &context, StringRef sectionName, + StringRef chunkName, typename Chunk::Kind k = Chunk::Kind::ELFSection) - : Chunk(name, k, context), _outputSection(nullptr), _flags(0), + : Chunk(chunkName, k, context), _outputSection(nullptr), _flags(0), _entSize(0), _type(0), _link(0), _info(0), - _isFirstSectionInOutputSection(false), _segmentType(SHT_NULL) {} + _isFirstSectionInOutputSection(false), _segmentType(SHT_NULL), + _inputSectionName(sectionName), _outputSectionName(sectionName) {} /// \brief Modify the section contents before assigning virtual addresses // or assigning file offsets @@ -110,6 +112,14 @@ 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; @@ -127,14 +137,19 @@ 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 name, + AtomSection(const ELFLinkingContext &context, StringRef sectionName, int32_t contentType, int32_t permissions, int32_t order) - : Section(context, name, Chunk::Kind::AtomSection), + : Section(context, sectionName, "AtomSection", + Chunk::Kind::AtomSection), _contentType(contentType), _contentPermissions(permissions), _isLoadedInMemory(true) { this->setOrder(order); @@ -555,7 +570,7 @@ private: template StringTable::StringTable(const ELFLinkingContext &context, const char *str, int32_t order, bool dynamic) - : Section(context, str) { + : Section(context, str, "StringTable") { // the string table has a NULL entry for which // add an empty string _strings.push_back(""); @@ -679,7 +694,7 @@ protected: template SymbolTable::SymbolTable(const ELFLinkingContext &context, const char *str, int32_t order) - : Section(context, str) { + : Section(context, str, "SymbolTable") { this->setOrder(order); Elf_Sym symbol; std::memset(&symbol, 0, sizeof(Elf_Sym)); @@ -911,7 +926,7 @@ public: RelocationTable(const ELFLinkingContext &context, StringRef str, int32_t order) - : Section(context, str), _symbolTable(nullptr) { + : Section(context, str, "RelocationTable"), _symbolTable(nullptr) { this->setOrder(order); this->_flags = SHF_ALLOC; // Set the alignment properly depending on the target architecture @@ -1027,7 +1042,7 @@ public: DynamicTable(const ELFLinkingContext &context, TargetLayout &layout, StringRef str, int32_t order) - : Section(context, str), _layout(layout) { + : Section(context, str, "DynamicSection"), _layout(layout) { this->setOrder(order); this->_entSize = sizeof(Elf_Dyn); this->_align2 = ELFT::Is64Bits ? 8 : 4; @@ -1210,7 +1225,7 @@ template class InterpSection : public Section { public: InterpSection(const ELFLinkingContext &context, StringRef str, int32_t order, StringRef interp) - : Section(context, str), _interp(interp) { + : Section(context, str, "Dynamic:Interp"), _interp(interp) { this->setOrder(order); this->_align2 = 1; // + 1 for null term. @@ -1259,7 +1274,7 @@ template class HashSection : public Section { public: HashSection(const ELFLinkingContext &context, StringRef name, int32_t order) - : Section(context, name), _symbolTable(nullptr) { + : Section(context, name, "Dynamic:Hash"), _symbolTable(nullptr) { this->setOrder(order); this->_entSize = 4; this->_type = SHT_HASH; @@ -1363,7 +1378,7 @@ template class EHFrameHeader : public Section { public: EHFrameHeader(const ELFLinkingContext &context, StringRef name, TargetLayout &layout, int32_t order) - : Section(context, name), _layout(layout) { + : Section(context, name, "EHFrameHeader"), _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 2317e8d..6267761 100644 --- a/lld/lib/ReaderWriter/ELF/SegmentChunks.h +++ b/lld/lib/ReaderWriter/ELF/SegmentChunks.h @@ -432,7 +432,6 @@ void Segment::assignFileOffsets(uint64_t startOffset) { isDataPageAlignedForNMagic = true; } else fileOffset = llvm::RoundUpToAlignment(fileOffset, section->align2()); - if (isFirstSection) { slice->setFileOffset(fileOffset); isFirstSection = false; @@ -524,7 +523,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)) {