[lld] r297061 - Detemplate merge (input and synthetic) sections. NFC.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 6 12:53:20 PST 2017
Nice! De-templating classes should not only simplify code but also reduce
compile time.
On Mon, Mar 6, 2017 at 12:23 PM, Rafael Espindola via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: rafael
> Date: Mon Mar 6 14:23:56 2017
> New Revision: 297061
>
> URL: http://llvm.org/viewvc/llvm-project?rev=297061&view=rev
> Log:
> Detemplate merge (input and synthetic) sections. NFC.
>
> Modified:
> lld/trunk/ELF/Driver.cpp
> lld/trunk/ELF/InputFiles.cpp
> lld/trunk/ELF/InputSection.cpp
> lld/trunk/ELF/InputSection.h
> lld/trunk/ELF/MarkLive.cpp
> lld/trunk/ELF/OutputSections.h
> lld/trunk/ELF/SyntheticSections.cpp
> lld/trunk/ELF/SyntheticSections.h
> lld/trunk/ELF/Writer.cpp
>
> Modified: lld/trunk/ELF/Driver.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.
> cpp?rev=297061&r1=297060&r2=297061&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/Driver.cpp (original)
> +++ lld/trunk/ELF/Driver.cpp Mon Mar 6 14:23:56 2017
> @@ -876,7 +876,7 @@ template <class ELFT> void LinkerDriver:
> return;
> if (Decompressor::isCompressedELFSection(S->Flags, S->Name))
> S->uncompress<ELFT>();
> - if (auto *MS = dyn_cast<MergeInputSection<ELFT>>(S))
> + if (auto *MS = dyn_cast<MergeInputSection>(S))
> MS->splitIntoPieces();
> });
>
>
> Modified: lld/trunk/ELF/InputFiles.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> InputFiles.cpp?rev=297061&r1=297060&r2=297061&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/InputFiles.cpp (original)
> +++ lld/trunk/ELF/InputFiles.cpp Mon Mar 6 14:23:56 2017
> @@ -381,7 +381,7 @@ elf::ObjectFile<ELFT>::createInputSectio
> if (Target->FirstRelocation)
> fatal(toString(this) +
> ": multiple relocation sections to one section are not
> supported");
> - if (isa<MergeInputSection<ELFT>>(Target))
> + if (isa<MergeInputSection>(Target))
> fatal(toString(this) +
> ": relocations pointing to SHF_MERGE are not supported");
>
> @@ -458,7 +458,7 @@ elf::ObjectFile<ELFT>::createInputSectio
> return make<EhInputSection<ELFT>>(this, &Sec, Name);
>
> if (shouldMerge(Sec))
> - return make<MergeInputSection<ELFT>>(this, &Sec, Name);
> + return make<MergeInputSection>(this, &Sec, Name);
> return make<InputSection>(this, &Sec, Name);
> }
>
>
> Modified: lld/trunk/ELF/InputSection.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> InputSection.cpp?rev=297061&r1=297060&r2=297061&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/InputSection.cpp (original)
> +++ lld/trunk/ELF/InputSection.cpp Mon Mar 6 14:23:56 2017
> @@ -111,7 +111,7 @@ uint64_t InputSectionBase::getOffset(uin
> // identify the start of the output .eh_frame.
> return Offset;
> case Merge:
> - const MergeInputSection<ELFT> *MS = cast<MergeInputSection<ELFT>>(
> this);
> + const MergeInputSection *MS = cast<MergeInputSection>(this);
> if (MS->MergeSec)
> return MS->MergeSec->OutSecOff + MS->getOffset(Offset);
> return MS->getOffset(Offset);
> @@ -121,7 +121,7 @@ uint64_t InputSectionBase::getOffset(uin
>
> template <class ELFT>
> OutputSection *InputSectionBase::getOutputSection() const {
> - if (auto *MS = dyn_cast<MergeInputSection<ELFT>>(this))
> + if (auto *MS = dyn_cast<MergeInputSection>(this))
> return MS->MergeSec ? MS->MergeSec->OutSec : nullptr;
> if (auto *EH = dyn_cast<EhInputSection<ELFT>>(this))
> return EH->EHSec->OutSec;
> @@ -660,9 +660,7 @@ static size_t findNull(ArrayRef<uint8_t>
>
> // Split SHF_STRINGS section. Such section is a sequence of
> // null-terminated strings.
> -template <class ELFT>
> -void MergeInputSection<ELFT>::splitStrings(ArrayRef<uint8_t> Data,
> - size_t EntSize) {
> +void MergeInputSection::splitStrings(ArrayRef<uint8_t> Data, size_t
> EntSize) {
> size_t Off = 0;
> bool IsAlloc = this->Flags & SHF_ALLOC;
> while (!Data.empty()) {
> @@ -679,9 +677,8 @@ void MergeInputSection<ELFT>::splitStrin
>
> // Split non-SHF_STRINGS section. Such section is a sequence of
> // fixed size records.
> -template <class ELFT>
> -void MergeInputSection<ELFT>::splitNonStrings(ArrayRef<uint8_t> Data,
> - size_t EntSize) {
> +void MergeInputSection::splitNonStrings(ArrayRef<uint8_t> Data,
> + size_t EntSize) {
> size_t Size = Data.size();
> assert((Size % EntSize) == 0);
> bool IsAlloc = this->Flags & SHF_ALLOC;
> @@ -692,9 +689,9 @@ void MergeInputSection<ELFT>::splitNonSt
> }
>
> template <class ELFT>
> -MergeInputSection<ELFT>::MergeInputSection(elf::ObjectFile<ELFT> *F,
> - const Elf_Shdr *Header,
> - StringRef Name)
> +MergeInputSection::MergeInputSection(elf::ObjectFile<ELFT> *F,
> + const typename ELFT::Shdr *Header,
> + StringRef Name)
> : InputSectionBase(F, Header, Name, InputSectionBase::Merge) {}
>
> // This function is called after we obtain a complete list of input
> sections
> @@ -703,28 +700,26 @@ MergeInputSection<ELFT>::MergeInputSecti
> //
> // Note that this function is called from parallel_for_each. This must be
> // thread-safe (i.e. no memory allocation from the pools).
> -template <class ELFT> void MergeInputSection<ELFT>::splitIntoPieces() {
> +void MergeInputSection::splitIntoPieces() {
> ArrayRef<uint8_t> Data = this->Data;
> - uintX_t EntSize = this->Entsize;
> + uint64_t EntSize = this->Entsize;
> if (this->Flags & SHF_STRINGS)
> splitStrings(Data, EntSize);
> else
> splitNonStrings(Data, EntSize);
>
> if (Config->GcSections && (this->Flags & SHF_ALLOC))
> - for (uintX_t Off : LiveOffsets)
> + for (uint64_t Off : LiveOffsets)
> this->getSectionPiece(Off)->Live = true;
> }
>
> -template <class ELFT>
> -bool MergeInputSection<ELFT>::classof(const InputSectionBase *S) {
> +bool MergeInputSection::classof(const InputSectionBase *S) {
> return S->kind() == InputSectionBase::Merge;
> }
>
> // Do binary search to get a section piece at a given input offset.
> -template <class ELFT>
> -SectionPiece *MergeInputSection<ELFT>::getSectionPiece(uintX_t Offset) {
> - auto *This = static_cast<const MergeInputSection<ELFT> *>(this);
> +SectionPiece *MergeInputSection::getSectionPiece(uint64_t Offset) {
> + auto *This = static_cast<const MergeInputSection *>(this);
> return const_cast<SectionPiece *>(This->getSectionPiece(Offset));
> }
>
> @@ -741,17 +736,15 @@ static It fastUpperBound(It First, It La
> return Comp(Value, *First) ? First : First + 1;
> }
>
> -template <class ELFT>
> -const SectionPiece *
> -MergeInputSection<ELFT>::getSectionPiece(uintX_t Offset) const {
> - uintX_t Size = this->Data.size();
> +const SectionPiece *MergeInputSection::getSectionPiece(uint64_t Offset)
> const {
> + uint64_t Size = this->Data.size();
> if (Offset >= Size)
> fatal(toString(this) + ": entry is past the end of the section");
>
> // Find the element this offset points to.
> auto I = fastUpperBound(
> Pieces.begin(), Pieces.end(), Offset,
> - [](const uintX_t &A, const SectionPiece &B) { return A <
> B.InputOff; });
> + [](const uint64_t &A, const SectionPiece &B) { return A <
> B.InputOff; });
> --I;
> return &*I;
> }
> @@ -759,8 +752,7 @@ MergeInputSection<ELFT>::getSectionPiece
> // Returns the offset in an output section for a given input offset.
> // Because contents of a mergeable section is not contiguous in output,
> // it is not just an addition to a base output offset.
> -template <class ELFT>
> -typename ELFT::uint MergeInputSection<ELFT>::getOffset(uintX_t Offset)
> const {
> +uint64_t MergeInputSection::getOffset(uint64_t Offset) const {
> // Initialize OffsetMap lazily.
> std::call_once(InitOffsetMap, [&] {
> OffsetMap.reserve(Pieces.size());
> @@ -782,7 +774,7 @@ typename ELFT::uint MergeInputSection<EL
> if (!Piece.Live)
> return 0;
>
> - uintX_t Addend = Offset - Piece.InputOff;
> + uint64_t Addend = Offset - Piece.InputOff;
> return Piece.OutputOff + Addend;
> }
>
> @@ -814,11 +806,6 @@ template class elf::EhInputSection<ELF32
> template class elf::EhInputSection<ELF64LE>;
> template class elf::EhInputSection<ELF64BE>;
>
> -template class elf::MergeInputSection<ELF32LE>;
> -template class elf::MergeInputSection<ELF32BE>;
> -template class elf::MergeInputSection<ELF64LE>;
> -template class elf::MergeInputSection<ELF64BE>;
> -
> template void InputSectionBase::uncompress<ELF32LE>();
> template void InputSectionBase::uncompress<ELF32BE>();
> template void InputSectionBase::uncompress<ELF64LE>();
> @@ -862,3 +849,16 @@ template elf::ObjectFile<ELF32LE> *Input
> template elf::ObjectFile<ELF32BE> *InputSectionBase::getFile<ELF32BE>()
> const;
> template elf::ObjectFile<ELF64LE> *InputSectionBase::getFile<ELF64LE>()
> const;
> template elf::ObjectFile<ELF64BE> *InputSectionBase::getFile<ELF64BE>()
> const;
> +
> +template MergeInputSection::MergeInputSection(elf::ObjectFile<ELF32LE>
> *F,
> + const ELF32LE::Shdr *Header,
> + StringRef Name);
> +template MergeInputSection::MergeInputSection(elf::ObjectFile<ELF32BE>
> *F,
> + const ELF32BE::Shdr *Header,
> + StringRef Name);
> +template MergeInputSection::MergeInputSection(elf::ObjectFile<ELF64LE>
> *F,
> + const ELF64LE::Shdr *Header,
> + StringRef Name);
> +template MergeInputSection::MergeInputSection(elf::ObjectFile<ELF64BE>
> *F,
> + const ELF64BE::Shdr *Header,
> + StringRef Name);
>
> Modified: lld/trunk/ELF/InputSection.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> InputSection.h?rev=297061&r1=297060&r2=297061&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/InputSection.h (original)
> +++ lld/trunk/ELF/InputSection.h Mon Mar 6 14:23:56 2017
> @@ -29,7 +29,7 @@ struct SectionPiece;
>
> class DefinedRegular;
> template <class ELFT> class EhFrameSection;
> -template <class ELFT> class MergeSyntheticSection;
> +class MergeSyntheticSection;
> template <class ELFT> class ObjectFile;
> class OutputSection;
>
> @@ -156,26 +156,23 @@ static_assert(sizeof(SectionPiece) == 2
> "SectionPiece is too big");
>
> // This corresponds to a SHF_MERGE section of an input file.
> -template <class ELFT> class MergeInputSection : public InputSectionBase {
> - typedef typename ELFT::uint uintX_t;
> - typedef typename ELFT::Sym Elf_Sym;
> - typedef typename ELFT::Shdr Elf_Shdr;
> -
> +class MergeInputSection : public InputSectionBase {
> public:
> - MergeInputSection(ObjectFile<ELFT> *F, const Elf_Shdr *Header,
> + template <class ELFT>
> + MergeInputSection(ObjectFile<ELFT> *F, const typename ELFT::Shdr
> *Header,
> StringRef Name);
> static bool classof(const InputSectionBase *S);
> void splitIntoPieces();
>
> // Mark the piece at a given offset live. Used by GC.
> - void markLiveAt(uintX_t Offset) {
> + void markLiveAt(uint64_t Offset) {
> assert(this->Flags & llvm::ELF::SHF_ALLOC);
> LiveOffsets.insert(Offset);
> }
>
> // Translate an offset in the input section to an offset
> // in the output section.
> - uintX_t getOffset(uintX_t Offset) const;
> + uint64_t getOffset(uint64_t Offset) const;
>
> // Splittable sections are handled as a sequence of data
> // rather than a single large blob of data.
> @@ -197,13 +194,13 @@ public:
> }
>
> // Returns the SectionPiece at a given input section offset.
> - SectionPiece *getSectionPiece(uintX_t Offset);
> - const SectionPiece *getSectionPiece(uintX_t Offset) const;
> + SectionPiece *getSectionPiece(uint64_t Offset);
> + const SectionPiece *getSectionPiece(uint64_t Offset) const;
>
> // MergeInputSections are aggregated to a synthetic input sections,
> // and then added to an OutputSection. This pointer points to a
> // synthetic MergeSyntheticSection which this section belongs to.
> - MergeSyntheticSection<ELFT> *MergeSec = nullptr;
> + MergeSyntheticSection *MergeSec = nullptr;
>
> private:
> void splitStrings(ArrayRef<uint8_t> A, size_t Size);
> @@ -211,10 +208,10 @@ private:
>
> std::vector<uint32_t> Hashes;
>
> - mutable llvm::DenseMap<uintX_t, uintX_t> OffsetMap;
> + mutable llvm::DenseMap<uint64_t, uint64_t> OffsetMap;
> mutable std::once_flag InitOffsetMap;
>
> - llvm::DenseSet<uintX_t> LiveOffsets;
> + llvm::DenseSet<uint64_t> LiveOffsets;
> };
>
> struct EhSectionPiece : public SectionPiece {
>
> Modified: lld/trunk/ELF/MarkLive.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> MarkLive.cpp?rev=297061&r1=297060&r2=297061&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/MarkLive.cpp (original)
> +++ lld/trunk/ELF/MarkLive.cpp Mon Mar 6 14:23:56 2017
> @@ -210,7 +210,7 @@ template <class ELFT> void elf::markLive
> // Usually, a whole section is marked as live or dead, but in
> mergeable
> // (splittable) sections, each piece of data has independent liveness
> bit.
> // So we explicitly tell it which offset is in use.
> - if (auto *MS = dyn_cast<MergeInputSection<ELFT>>(R.Sec))
> + if (auto *MS = dyn_cast<MergeInputSection>(R.Sec))
> MS->markLiveAt(R.Offset);
>
> if (R.Sec->Live)
>
> Modified: lld/trunk/ELF/OutputSections.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> OutputSections.h?rev=297061&r1=297060&r2=297061&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/OutputSections.h (original)
> +++ lld/trunk/ELF/OutputSections.h Mon Mar 6 14:23:56 2017
> @@ -26,7 +26,7 @@ struct EhSectionPiece;
> template <class ELFT> class EhInputSection;
> class InputSection;
> class InputSectionBase;
> -template <class ELFT> class MergeInputSection;
> +class MergeInputSection;
> class OutputSection;
> template <class ELFT> class ObjectFile;
> template <class ELFT> class SharedFile;
>
> Modified: lld/trunk/ELF/SyntheticSections.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> SyntheticSections.cpp?rev=297061&r1=297060&r2=297061&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/SyntheticSections.cpp (original)
> +++ lld/trunk/ELF/SyntheticSections.cpp Mon Mar 6 14:23:56 2017
> @@ -110,14 +110,15 @@ static ArrayRef<uint8_t> getVersion() {
> // With this feature, you can identify LLD-generated binaries easily
> // by "objdump -s -j .comment <file>".
> // The returned object is a mergeable string section.
> -template <class ELFT> MergeInputSection<ELFT>
> *elf::createCommentSection() {
> +template <class ELFT> MergeInputSection *elf::createCommentSection() {
> typename ELFT::Shdr Hdr = {};
> Hdr.sh_flags = SHF_MERGE | SHF_STRINGS;
> Hdr.sh_type = SHT_PROGBITS;
> Hdr.sh_entsize = 1;
> Hdr.sh_addralign = 1;
>
> - auto *Ret = make<MergeInputSection<ELFT>>(/*file=*/nullptr, &Hdr,
> ".comment");
> + auto *Ret =
> + make<MergeInputSection>((ObjectFile<ELFT> *)nullptr, &Hdr,
> ".comment");
> Ret->Data = getVersion();
> Ret->splitIntoPieces();
> return Ret;
> @@ -2134,34 +2135,27 @@ template <class ELFT> bool VersionNeedSe
> return getNeedNum() == 0;
> }
>
> -template <class ELFT>
> -MergeSyntheticSection<ELFT>::MergeSyntheticSection(StringRef Name,
> - uint32_t Type,
> - uint64_t Flags,
> - uint64_t Alignment)
> +MergeSyntheticSection::MergeSyntheticSection(StringRef Name, uint32_t
> Type,
> + uint64_t Flags, uint64_t
> Alignment)
> : SyntheticSection(Flags, Type, Alignment, Name),
> Builder(StringTableBuilder::RAW, Alignment) {}
>
> -template <class ELFT>
> -void MergeSyntheticSection<ELFT>::addSection(MergeInputSection<ELFT>
> *MS) {
> +void MergeSyntheticSection::addSection(MergeInputSection *MS) {
> assert(!Finalized);
> MS->MergeSec = this;
> Sections.push_back(MS);
> }
>
> -template <class ELFT> void MergeSyntheticSection<ELFT>::writeTo(uint8_t
> *Buf) {
> - Builder.write(Buf);
> -}
> +void MergeSyntheticSection::writeTo(uint8_t *Buf) { Builder.write(Buf); }
>
> -template <class ELFT>
> -bool MergeSyntheticSection<ELFT>::shouldTailMerge() const {
> +bool MergeSyntheticSection::shouldTailMerge() const {
> return (this->Flags & SHF_STRINGS) && Config->Optimize >= 2;
> }
>
> -template <class ELFT> void MergeSyntheticSection<ELFT>::finalizeTailMerge()
> {
> +void MergeSyntheticSection::finalizeTailMerge() {
> // Add all string pieces to the string table builder to create section
> // contents.
> - for (MergeInputSection<ELFT> *Sec : Sections)
> + for (MergeInputSection *Sec : Sections)
> for (size_t I = 0, E = Sec->Pieces.size(); I != E; ++I)
> if (Sec->Pieces[I].Live)
> Builder.add(Sec->getData(I));
> @@ -2172,18 +2166,18 @@ template <class ELFT> void MergeSyntheti
> // finalize() fixed tail-optimized strings, so we can now get
> // offsets of strings. Get an offset for each string and save it
> // to a corresponding StringPiece for easy access.
> - for (MergeInputSection<ELFT> *Sec : Sections)
> + for (MergeInputSection *Sec : Sections)
> for (size_t I = 0, E = Sec->Pieces.size(); I != E; ++I)
> if (Sec->Pieces[I].Live)
> Sec->Pieces[I].OutputOff = Builder.getOffset(Sec->getData(I));
> }
>
> -template <class ELFT> void MergeSyntheticSection<ELFT>::finalizeNoTailMerge()
> {
> +void MergeSyntheticSection::finalizeNoTailMerge() {
> // Add all string pieces to the string table builder to create section
> // contents. Because we are not tail-optimizing, offsets of strings are
> // fixed when they are added to the builder (string table builder
> contains
> // a hash table from strings to offsets).
> - for (MergeInputSection<ELFT> *Sec : Sections)
> + for (MergeInputSection *Sec : Sections)
> for (size_t I = 0, E = Sec->Pieces.size(); I != E; ++I)
> if (Sec->Pieces[I].Live)
> Sec->Pieces[I].OutputOff = Builder.add(Sec->getData(I));
> @@ -2191,7 +2185,7 @@ template <class ELFT> void MergeSyntheti
> Builder.finalizeInOrder();
> }
>
> -template <class ELFT> void MergeSyntheticSection<ELFT>::finalizeContents()
> {
> +void MergeSyntheticSection::finalizeContents() {
> if (Finalized)
> return;
> Finalized = true;
> @@ -2201,9 +2195,9 @@ template <class ELFT> void MergeSyntheti
> finalizeNoTailMerge();
> }
>
> -template <class ELFT> size_t MergeSyntheticSection<ELFT>::getSize()
> const {
> +size_t MergeSyntheticSection::getSize() const {
> // We should finalize string builder to know the size.
> - const_cast<MergeSyntheticSection<ELFT> *>(this)->finalizeContents();
> + const_cast<MergeSyntheticSection *>(this)->finalizeContents();
> return Builder.getSize();
> }
>
> @@ -2273,10 +2267,10 @@ template InputSection *elf::createCommon
> template InputSection *elf::createCommonSection<ELF64LE>();
> template InputSection *elf::createCommonSection<ELF64BE>();
>
> -template MergeInputSection<ELF32LE> *elf::createCommentSection();
> -template MergeInputSection<ELF32BE> *elf::createCommentSection();
> -template MergeInputSection<ELF64LE> *elf::createCommentSection();
> -template MergeInputSection<ELF64BE> *elf::createCommentSection();
> +template MergeInputSection *elf::createCommentSection<ELF32LE>();
> +template MergeInputSection *elf::createCommentSection<ELF32BE>();
> +template MergeInputSection *elf::createCommentSection<ELF64LE>();
> +template MergeInputSection *elf::createCommentSection<ELF64BE>();
>
> template SymbolBody *elf::addSyntheticLocal<ELF32LE>(StringRef, uint8_t,
> uint64_t, uint64_t,
> @@ -2396,11 +2390,6 @@ template class elf::VersionDefinitionSec
> template class elf::VersionDefinitionSection<ELF64LE>;
> template class elf::VersionDefinitionSection<ELF64BE>;
>
> -template class elf::MergeSyntheticSection<ELF32LE>;
> -template class elf::MergeSyntheticSection<ELF32BE>;
> -template class elf::MergeSyntheticSection<ELF64LE>;
> -template class elf::MergeSyntheticSection<ELF64BE>;
> -
> template class elf::MipsRldMapSection<ELF32LE>;
> template class elf::MipsRldMapSection<ELF32BE>;
> template class elf::MipsRldMapSection<ELF64LE>;
>
> Modified: lld/trunk/ELF/SyntheticSections.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> SyntheticSections.h?rev=297061&r1=297060&r2=297061&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/SyntheticSections.h (original)
> +++ lld/trunk/ELF/SyntheticSections.h Mon Mar 6 14:23:56 2017
> @@ -640,12 +640,11 @@ public:
> // with different attributes in a single output sections. To do that
> // we put them into MergeSyntheticSection synthetic input sections which
> are
> // attached to regular output sections.
> -template <class ELFT>
> class MergeSyntheticSection final : public SyntheticSection {
> public:
> MergeSyntheticSection(StringRef Name, uint32_t Type, uint64_t Flags,
> uint64_t Alignment);
> - void addSection(MergeInputSection<ELFT> *MS);
> + void addSection(MergeInputSection *MS);
> void writeTo(uint8_t *Buf) override;
> void finalizeContents() override;
> bool shouldTailMerge() const;
> @@ -657,7 +656,7 @@ private:
>
> bool Finalized = false;
> llvm::StringTableBuilder Builder;
> - std::vector<MergeInputSection<ELFT> *> Sections;
> + std::vector<MergeInputSection *> Sections;
> };
>
> // .MIPS.abiflags section.
> @@ -751,7 +750,7 @@ private:
>
> template <class ELFT> InputSection *createCommonSection();
> InputSection *createInterpSection();
> -template <class ELFT> MergeInputSection<ELFT> *createCommentSection();
> +template <class ELFT> MergeInputSection *createCommentSection();
> template <class ELFT>
> SymbolBody *addSyntheticLocal(StringRef Name, uint8_t Type, uint64_t
> Value,
> uint64_t Size, InputSectionBase *Section);
>
> Modified: lld/trunk/ELF/Writer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.
> cpp?rev=297061&r1=297060&r2=297061&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/Writer.cpp (original)
> +++ lld/trunk/ELF/Writer.cpp Mon Mar 6 14:23:56 2017
> @@ -163,9 +163,9 @@ static typename ELFT::uint getOutFlags(I
> template <class ELFT> static void combineMergableSections() {
> typedef typename ELFT::uint uintX_t;
>
> - std::vector<MergeSyntheticSection<ELFT> *> MergeSections;
> + std::vector<MergeSyntheticSection *> MergeSections;
> for (InputSectionBase *&S : InputSections) {
> - MergeInputSection<ELFT> *MS = dyn_cast<MergeInputSection<ELFT>>(S);
> + MergeInputSection *MS = dyn_cast<MergeInputSection>(S);
> if (!MS)
> continue;
>
> @@ -179,13 +179,13 @@ template <class ELFT> static void combin
> uintX_t Alignment = std::max<uintX_t>(MS->Alignment, MS->Entsize);
>
> auto I =
> - llvm::find_if(MergeSections, [=](MergeSyntheticSection<ELFT>
> *Sec) {
> + llvm::find_if(MergeSections, [=](MergeSyntheticSection *Sec) {
> return Sec->Name == OutsecName && Sec->Flags == Flags &&
> Sec->Alignment == Alignment;
> });
> if (I == MergeSections.end()) {
> - MergeSyntheticSection<ELFT> *Syn = make<MergeSyntheticSection<
> ELFT>>(
> - OutsecName, MS->Type, Flags, Alignment);
> + MergeSyntheticSection *Syn =
> + make<MergeSyntheticSection>(OutsecName, MS->Type, Flags,
> Alignment);
> MergeSections.push_back(Syn);
> I = std::prev(MergeSections.end());
> S = Syn;
> @@ -491,7 +491,7 @@ template <class ELFT> static bool includ
> // Exclude symbols pointing to garbage-collected sections.
> if (!D->Section->Live)
> return false;
> - if (auto *S = dyn_cast<MergeInputSection<ELFT>>(D->Section))
> + if (auto *S = dyn_cast<MergeInputSection>(D->Section))
> if (!S->getSectionPiece(D->Value)->Live)
> return false;
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170306/7ef7830b/attachment.html>
More information about the llvm-commits
mailing list