[lld] r250466 - ELF2: Use ELFT to template OutputSections.
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 16 15:37:35 PDT 2015
On Thu, Oct 15, 2015 at 3:27 PM, Rui Ueyama via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: ruiu
> Date: Thu Oct 15 17:27:29 2015
> New Revision: 250466
>
> URL: http://llvm.org/viewvc/llvm-project?rev=250466&view=rev
> Log:
> ELF2: Use ELFT to template OutputSections.
>
> This patch is to use ELFT instead of Is64Bits to template OutputSection
> and its subclasses. This increases code size slightly because it creates
> two identical functions for some classes, but that's only 20 KB out of
> 33 MB, so it's negligible.
>
Are you doing this for the convenience of the users? (so they can specify
ELFT instead of having to extract the 64bit-ness from it?) If so, you could
keep the code size down by using an alias template, perhaps?
template<typename T>
using OutputSectionBase = OutputSectionBaseRealThing<T::is64Bits>;
>
> This is as per discussion with Rafael. He's not fan of the idea but OK
> with this. We'll revisit later to this topic.
>
> Modified:
> lld/trunk/ELF/InputSection.h
> lld/trunk/ELF/OutputSections.cpp
> lld/trunk/ELF/OutputSections.h
> lld/trunk/ELF/SymbolTable.cpp
> lld/trunk/ELF/SymbolTable.h
> lld/trunk/ELF/Symbols.h
> lld/trunk/ELF/Writer.cpp
>
> Modified: lld/trunk/ELF/InputSection.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.h?rev=250466&r1=250465&r2=250466&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/InputSection.h (original)
> +++ lld/trunk/ELF/InputSection.h Thu Oct 15 17:27:29 2015
> @@ -18,7 +18,7 @@ namespace elf2 {
>
> template <class ELFT> class ObjectFile;
> template <class ELFT> class OutputSection;
> -template <bool Is64Bits> class OutputSectionBase;
> +template <class ELFT> class OutputSectionBase;
>
> // This corresponds to a section of an input file.
> template <class ELFT> class InputSection {
> @@ -55,7 +55,7 @@ public:
> // The offset from beginning of the output sections this section was
> assigned
> // to. The writer sets a value.
> uint64_t OutSecOff = 0;
> - OutputSectionBase<ELFT::Is64Bits> *OutSec = nullptr;
> + OutputSectionBase<ELFT> *OutSec = nullptr;
>
> static InputSection<ELFT> Discarded;
>
>
> Modified: lld/trunk/ELF/OutputSections.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=250466&r1=250465&r2=250466&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/OutputSections.cpp (original)
> +++ lld/trunk/ELF/OutputSections.cpp Thu Oct 15 17:27:29 2015
> @@ -20,20 +20,19 @@ using namespace llvm::ELF;
> using namespace lld;
> using namespace lld::elf2;
>
> -template <bool Is64Bits>
> -OutputSectionBase<Is64Bits>::OutputSectionBase(StringRef Name, uint32_t
> sh_type,
> - uintX_t sh_flags)
> +template <class ELFT>
> +OutputSectionBase<ELFT>::OutputSectionBase(StringRef Name, uint32_t
> sh_type,
> + uintX_t sh_flags)
> : Name(Name) {
> - memset(&Header, 0, sizeof(HeaderT));
> + memset(&Header, 0, sizeof(Elf_Shdr));
> Header.sh_type = sh_type;
> Header.sh_flags = sh_flags;
> }
>
> template <class ELFT>
> GotSection<ELFT>::GotSection()
> - : OutputSectionBase<ELFT::Is64Bits>(".got", llvm::ELF::SHT_PROGBITS,
> - llvm::ELF::SHF_ALLOC |
> - llvm::ELF::SHF_WRITE) {
> + : OutputSectionBase<ELFT>(".got", llvm::ELF::SHT_PROGBITS,
> + llvm::ELF::SHF_ALLOC |
> llvm::ELF::SHF_WRITE) {
> this->Header.sh_addralign = sizeof(uintX_t);
> }
>
> @@ -61,9 +60,8 @@ template <class ELFT> void GotSection<EL
>
> template <class ELFT>
> PltSection<ELFT>::PltSection()
> - : OutputSectionBase<ELFT::Is64Bits>(".plt", llvm::ELF::SHT_PROGBITS,
> - llvm::ELF::SHF_ALLOC |
> - llvm::ELF::SHF_EXECINSTR) {
> + : OutputSectionBase<ELFT>(".plt", llvm::ELF::SHT_PROGBITS,
> + llvm::ELF::SHF_ALLOC |
> llvm::ELF::SHF_EXECINSTR) {
> this->Header.sh_addralign = 16;
> }
>
> @@ -95,10 +93,9 @@ void PltSection<ELFT>::finalize() {
>
> template <class ELFT>
> RelocationSection<ELFT>::RelocationSection(bool IsRela)
> - : OutputSectionBase<ELFT::Is64Bits>(IsRela ? ".rela.dyn" : ".rel.dyn",
> - IsRela ? llvm::ELF::SHT_RELA
> - : llvm::ELF::SHT_REL,
> - llvm::ELF::SHF_ALLOC),
> + : OutputSectionBase<ELFT>(IsRela ? ".rela.dyn" : ".rel.dyn",
> + IsRela ? llvm::ELF::SHT_RELA :
> llvm::ELF::SHT_REL,
> + llvm::ELF::SHF_ALLOC),
> IsRela(IsRela) {
> this->Header.sh_entsize = IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel);
> this->Header.sh_addralign = ELFT::Is64Bits ? 8 : 4;
> @@ -158,38 +155,27 @@ template <class ELFT> void RelocationSec
> this->Header.sh_size = Relocs.size() * this->Header.sh_entsize;
> }
>
> -template <bool Is64Bits>
> -InterpSection<Is64Bits>::InterpSection()
> - : OutputSectionBase<Is64Bits>(".interp", llvm::ELF::SHT_PROGBITS,
> - llvm::ELF::SHF_ALLOC) {
> +template <class ELFT>
> +InterpSection<ELFT>::InterpSection()
> + : OutputSectionBase<ELFT>(".interp", llvm::ELF::SHT_PROGBITS,
> + llvm::ELF::SHF_ALLOC) {
> this->Header.sh_size = Config->DynamicLinker.size() + 1;
> this->Header.sh_addralign = 1;
> }
>
> -template <bool Is64Bits>
> -template <endianness E>
> -void OutputSectionBase<Is64Bits>::writeHeaderTo(
> - typename ELFFile<ELFType<E, Is64Bits>>::Elf_Shdr *SHdr) {
> - SHdr->sh_name = Header.sh_name;
> - SHdr->sh_type = Header.sh_type;
> - SHdr->sh_flags = Header.sh_flags;
> - SHdr->sh_addr = Header.sh_addr;
> - SHdr->sh_offset = Header.sh_offset;
> - SHdr->sh_size = Header.sh_size;
> - SHdr->sh_link = Header.sh_link;
> - SHdr->sh_info = Header.sh_info;
> - SHdr->sh_addralign = Header.sh_addralign;
> - SHdr->sh_entsize = Header.sh_entsize;
> +template <class ELFT>
> +void OutputSectionBase<ELFT>::writeHeaderTo(Elf_Shdr *SHdr) {
> + *SHdr = Header;
> }
>
> -template <bool Is64Bits> void InterpSection<Is64Bits>::writeTo(uint8_t
> *Buf) {
> +template <class ELFT> void InterpSection<ELFT>::writeTo(uint8_t *Buf) {
> memcpy(Buf, Config->DynamicLinker.data(), Config->DynamicLinker.size());
> }
>
> template <class ELFT>
> HashTableSection<ELFT>::HashTableSection()
> - : OutputSectionBase<ELFT::Is64Bits>(".hash", llvm::ELF::SHT_HASH,
> - llvm::ELF::SHF_ALLOC) {
> + : OutputSectionBase<ELFT>(".hash", llvm::ELF::SHT_HASH,
> + llvm::ELF::SHF_ALLOC) {
> this->Header.sh_entsize = sizeof(Elf_Word);
> this->Header.sh_addralign = sizeof(Elf_Word);
> }
> @@ -245,11 +231,10 @@ template <class ELFT> void HashTableSect
>
> template <class ELFT>
> DynamicSection<ELFT>::DynamicSection(SymbolTable<ELFT> &SymTab)
> - : OutputSectionBase<ELFT::Is64Bits>(".dynamic",
> llvm::ELF::SHT_DYNAMIC,
> - llvm::ELF::SHF_ALLOC |
> - llvm::ELF::SHF_WRITE),
> + : OutputSectionBase<ELFT>(".dynamic", llvm::ELF::SHT_DYNAMIC,
> + llvm::ELF::SHF_ALLOC |
> llvm::ELF::SHF_WRITE),
> SymTab(SymTab) {
> - typename Base::HeaderT &Header = this->Header;
> + Elf_Shdr &Header = this->Header;
> Header.sh_addralign = ELFT::Is64Bits ? 8 : 4;
> Header.sh_entsize = ELFT::Is64Bits ? 16 : 8;
> }
> @@ -258,7 +243,7 @@ template <class ELFT> void DynamicSectio
> if (this->Header.sh_size)
> return; // Already finalized.
>
> - typename Base::HeaderT &Header = this->Header;
> + Elf_Shdr &Header = this->Header;
> Header.sh_link = Out<ELFT>::DynStrTab->SectionIndex;
>
> unsigned NumEntries = 0;
> @@ -358,7 +343,7 @@ template <class ELFT> void DynamicSectio
> WriteVal(DT_SONAME, Out<ELFT>::DynStrTab->getFileOff(Config->SoName));
>
> auto WriteArray = [&](int32_t T1, int32_t T2,
> - const OutputSectionBase<ELFT::Is64Bits> *Sec) {
> + const OutputSectionBase<ELFT> *Sec) {
> if (!Sec)
> return;
> WritePtr(T1, Sec->getVA());
> @@ -391,7 +376,7 @@ template <class ELFT> void DynamicSectio
> template <class ELFT>
> OutputSection<ELFT>::OutputSection(StringRef Name, uint32_t sh_type,
> uintX_t sh_flags)
> - : OutputSectionBase<ELFT::Is64Bits>(Name, sh_type, sh_flags) {}
> + : OutputSectionBase<ELFT>(Name, sh_type, sh_flags) {}
>
> template <class ELFT>
> void OutputSection<ELFT>::addSection(InputSection<ELFT> *C) {
> @@ -506,17 +491,16 @@ template <class ELFT> void OutputSection
> C->writeTo(Buf);
> }
>
> -template <bool Is64Bits>
> -StringTableSection<Is64Bits>::StringTableSection(bool Dynamic)
> - : OutputSectionBase<Is64Bits>(Dynamic ? ".dynstr" : ".strtab",
> - llvm::ELF::SHT_STRTAB,
> - Dynamic ? (uintX_t)llvm::ELF::SHF_ALLOC
> : 0),
> +template <class ELFT>
> +StringTableSection<ELFT>::StringTableSection(bool Dynamic)
> + : OutputSectionBase<ELFT>(Dynamic ? ".dynstr" : ".strtab",
> + llvm::ELF::SHT_STRTAB,
> + Dynamic ? (uintX_t)llvm::ELF::SHF_ALLOC :
> 0),
> Dynamic(Dynamic) {
> this->Header.sh_addralign = 1;
> }
>
> -template <bool Is64Bits>
> -void StringTableSection<Is64Bits>::writeTo(uint8_t *Buf) {
> +template <class ELFT> void StringTableSection<ELFT>::writeTo(uint8_t
> *Buf) {
> StringRef Data = StrTabBuilder.data();
> memcpy(Buf, Data.data(), Data.size());
> }
> @@ -571,14 +555,14 @@ bool lld::elf2::shouldKeepInSymtab(const
>
> template <class ELFT>
> SymbolTableSection<ELFT>::SymbolTableSection(
> - SymbolTable<ELFT> &Table, StringTableSection<ELFT::Is64Bits>
> &StrTabSec)
> - : OutputSectionBase<ELFT::Is64Bits>(
> + SymbolTable<ELFT> &Table, StringTableSection<ELFT> &StrTabSec)
> + : OutputSectionBase<ELFT>(
> StrTabSec.isDynamic() ? ".dynsym" : ".symtab",
> StrTabSec.isDynamic() ? llvm::ELF::SHT_DYNSYM :
> llvm::ELF::SHT_SYMTAB,
> StrTabSec.isDynamic() ? (uintX_t)llvm::ELF::SHF_ALLOC : 0),
> Table(Table), StrTabSec(StrTabSec) {
> - typedef OutputSectionBase<ELFT::Is64Bits> Base;
> - typename Base::HeaderT &Header = this->Header;
> + typedef OutputSectionBase<ELFT> Base;
> + typename Base::Elf_Shdr &Header = this->Header;
>
> Header.sh_entsize = sizeof(Elf_Sym);
> Header.sh_addralign = ELFT::Is64Bits ? 8 : 4;
> @@ -664,7 +648,7 @@ void SymbolTableSection<ELFT>::writeGlob
>
> ESym->st_name = StrTabSec.getFileOff(Name);
>
> - const OutputSectionBase<ELFT::Is64Bits> *OutSec = nullptr;
> + const OutputSectionBase<ELFT> *OutSec = nullptr;
> const InputSection<ELFT> *Section = nullptr;
>
> switch (Body->kind()) {
> @@ -721,17 +705,10 @@ void SymbolTableSection<ELFT>::writeGlob
>
> namespace lld {
> namespace elf2 {
> -template class OutputSectionBase<false>;
> -template class OutputSectionBase<true>;
> -
> -template void OutputSectionBase<false>::writeHeaderTo<support::little>(
> - ELFFile<ELFType<support::little, false>>::Elf_Shdr *SHdr);
> -template void OutputSectionBase<true>::writeHeaderTo<support::little>(
> - ELFFile<ELFType<support::little, true>>::Elf_Shdr *SHdr);
> -template void OutputSectionBase<false>::writeHeaderTo<support::big>(
> - ELFFile<ELFType<support::big, false>>::Elf_Shdr *SHdr);
> -template void OutputSectionBase<true>::writeHeaderTo<support::big>(
> - ELFFile<ELFType<support::big, true>>::Elf_Shdr *SHdr);
> +template class OutputSectionBase<ELF32LE>;
> +template class OutputSectionBase<ELF32BE>;
> +template class OutputSectionBase<ELF64LE>;
> +template class OutputSectionBase<ELF64BE>;
>
> template class GotSection<ELF32LE>;
> template class GotSection<ELF32BE>;
> @@ -748,8 +725,10 @@ template class RelocationSection<ELF32BE
> template class RelocationSection<ELF64LE>;
> template class RelocationSection<ELF64BE>;
>
> -template class InterpSection<false>;
> -template class InterpSection<true>;
> +template class InterpSection<ELF32LE>;
> +template class InterpSection<ELF32BE>;
> +template class InterpSection<ELF64LE>;
> +template class InterpSection<ELF64BE>;
>
> template class HashTableSection<ELF32LE>;
> template class HashTableSection<ELF32BE>;
> @@ -766,8 +745,10 @@ template class OutputSection<ELF32BE>;
> template class OutputSection<ELF64LE>;
> template class OutputSection<ELF64BE>;
>
> -template class StringTableSection<false>;
> -template class StringTableSection<true>;
> +template class StringTableSection<ELF32LE>;
> +template class StringTableSection<ELF32BE>;
> +template class StringTableSection<ELF64LE>;
> +template class StringTableSection<ELF64BE>;
>
> template class SymbolTableSection<ELF32LE>;
> template class SymbolTableSection<ELF32BE>;
>
> Modified: lld/trunk/ELF/OutputSections.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.h?rev=250466&r1=250465&r2=250466&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/OutputSections.h (original)
> +++ lld/trunk/ELF/OutputSections.h Thu Oct 15 17:27:29 2015
> @@ -25,7 +25,7 @@ namespace elf2 {
> class SymbolBody;
> template <class ELFT> class SymbolTable;
> template <class ELFT> class SymbolTableSection;
> -template <bool Is64Bits> class StringTableSection;
> +template <class ELFT> class StringTableSection;
> template <class ELFT> class InputSection;
> template <class ELFT> class OutputSection;
> template <class ELFT> class ObjectFile;
> @@ -54,19 +54,16 @@ bool shouldKeepInSymtab(
> // input sections, others are created by the linker.
> // The writer creates multiple OutputSections and assign them unique,
> // non-overlapping file offsets and VAs.
> -template <bool Is64Bits> class OutputSectionBase {
> +template <class ELFT> class OutputSectionBase {
> public:
> - typedef typename std::conditional<Is64Bits, uint64_t, uint32_t>::type
> uintX_t;
> - typedef typename std::conditional<Is64Bits, llvm::ELF::Elf64_Shdr,
> - llvm::ELF::Elf32_Shdr>::type HeaderT;
> + typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
> + typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
>
> OutputSectionBase(StringRef Name, uint32_t sh_type, uintX_t sh_flags);
> void setVA(uintX_t VA) { Header.sh_addr = VA; }
> uintX_t getVA() const { return Header.sh_addr; }
> void setFileOffset(uintX_t Off) { Header.sh_offset = Off; }
> - template <llvm::object::endianness E>
> - void writeHeaderTo(typename llvm::object::ELFFile<
> - llvm::object::ELFType<E, Is64Bits>>::Elf_Shdr *SHdr);
> + void writeHeaderTo(Elf_Shdr *SHdr);
> StringRef getName() { return Name; }
> void setNameOffset(uintX_t Offset) { Header.sh_name = Offset; }
>
> @@ -89,13 +86,12 @@ public:
>
> protected:
> StringRef Name;
> - HeaderT Header;
> + Elf_Shdr Header;
> ~OutputSectionBase() = default;
> };
>
> -template <class ELFT>
> -class GotSection final : public OutputSectionBase<ELFT::Is64Bits> {
> - typedef OutputSectionBase<ELFT::Is64Bits> Base;
> +template <class ELFT> class GotSection final : public
> OutputSectionBase<ELFT> {
> + typedef OutputSectionBase<ELFT> Base;
> typedef typename Base::uintX_t uintX_t;
>
> public:
> @@ -112,9 +108,8 @@ private:
> std::vector<const SymbolBody *> Entries;
> };
>
> -template <class ELFT>
> -class PltSection final : public OutputSectionBase<ELFT::Is64Bits> {
> - typedef OutputSectionBase<ELFT::Is64Bits> Base;
> +template <class ELFT> class PltSection final : public
> OutputSectionBase<ELFT> {
> + typedef OutputSectionBase<ELFT> Base;
> typedef typename Base::uintX_t uintX_t;
>
> public:
> @@ -136,19 +131,19 @@ template <class ELFT> struct DynamicRelo
> };
>
> template <class ELFT>
> -class SymbolTableSection final : public OutputSectionBase<ELFT::Is64Bits>
> {
> +class SymbolTableSection final : public OutputSectionBase<ELFT> {
> public:
> typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
> typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
> typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range
> Elf_Sym_Range;
> - typedef typename OutputSectionBase<ELFT::Is64Bits>::uintX_t uintX_t;
> + typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
> SymbolTableSection(SymbolTable<ELFT> &Table,
> - StringTableSection<ELFT::Is64Bits> &StrTabSec);
> + StringTableSection<ELFT> &StrTabSec);
>
> void finalize() override;
> void writeTo(uint8_t *Buf) override;
> void addSymbol(StringRef Name, bool isLocal = false);
> - StringTableSection<ELFT::Is64Bits> &getStrTabSec() const { return
> StrTabSec; }
> + StringTableSection<ELFT> &getStrTabSec() const { return StrTabSec; }
> unsigned getNumSymbols() const { return NumVisible + 1; }
>
> private:
> @@ -156,13 +151,13 @@ private:
> void writeGlobalSymbols(uint8_t *&Buf);
>
> SymbolTable<ELFT> &Table;
> - StringTableSection<ELFT::Is64Bits> &StrTabSec;
> + StringTableSection<ELFT> &StrTabSec;
> unsigned NumVisible = 0;
> unsigned NumLocals = 0;
> };
>
> template <class ELFT>
> -class RelocationSection final : public OutputSectionBase<ELFT::Is64Bits> {
> +class RelocationSection final : public OutputSectionBase<ELFT> {
> typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel;
> typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela;
> typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
> @@ -181,13 +176,13 @@ private:
> };
>
> template <class ELFT>
> -class OutputSection final : public OutputSectionBase<ELFT::Is64Bits> {
> +class OutputSection final : public OutputSectionBase<ELFT> {
> public:
> - typedef typename OutputSectionBase<ELFT::Is64Bits>::uintX_t uintX_t;
> typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
> typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
> typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel;
> typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela;
> + typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
> OutputSection(StringRef Name, uint32_t sh_type, uintX_t sh_flags);
> void addSection(InputSection<ELFT> *C);
> void writeTo(uint8_t *Buf) override;
> @@ -196,18 +191,17 @@ private:
> std::vector<InputSection<ELFT> *> Sections;
> };
>
> -template <bool Is64Bits>
> -class InterpSection final : public OutputSectionBase<Is64Bits> {
> +template <class ELFT>
> +class InterpSection final : public OutputSectionBase<ELFT> {
> public:
> InterpSection();
> -
> void writeTo(uint8_t *Buf);
> };
>
> -template <bool Is64Bits>
> -class StringTableSection final : public OutputSectionBase<Is64Bits> {
> +template <class ELFT>
> +class StringTableSection final : public OutputSectionBase<ELFT> {
> public:
> - typedef typename OutputSectionBase<Is64Bits>::uintX_t uintX_t;
> + typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
> StringTableSection(bool Dynamic);
> void add(StringRef S) { StrTabBuilder.add(S); }
> size_t getFileOff(StringRef S) const { return
> StrTabBuilder.getOffset(S); }
> @@ -227,7 +221,7 @@ private:
> };
>
> template <class ELFT>
> -class HashTableSection final : public OutputSectionBase<ELFT::Is64Bits> {
> +class HashTableSection final : public OutputSectionBase<ELFT> {
> typedef typename llvm::object::ELFFile<ELFT>::Elf_Word Elf_Word;
>
> public:
> @@ -241,22 +235,22 @@ private:
> };
>
> template <class ELFT>
> -class DynamicSection final : public OutputSectionBase<ELFT::Is64Bits> {
> - typedef OutputSectionBase<ELFT::Is64Bits> Base;
> - typedef typename Base::HeaderT HeaderT;
> +class DynamicSection final : public OutputSectionBase<ELFT> {
> + typedef OutputSectionBase<ELFT> Base;
> + typedef typename llvm::object::ELFFile<ELFT>::Elf_Dyn Elf_Dyn;
> typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel;
> typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela;
> + typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
> typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
> - typedef typename llvm::object::ELFFile<ELFT>::Elf_Dyn Elf_Dyn;
>
> public:
> DynamicSection(SymbolTable<ELFT> &SymTab);
> void finalize() override;
> void writeTo(uint8_t *Buf) override;
>
> - OutputSectionBase<ELFT::Is64Bits> *PreInitArraySec = nullptr;
> - OutputSectionBase<ELFT::Is64Bits> *InitArraySec = nullptr;
> - OutputSectionBase<ELFT::Is64Bits> *FiniArraySec = nullptr;
> + OutputSectionBase<ELFT> *PreInitArraySec = nullptr;
> + OutputSectionBase<ELFT> *InitArraySec = nullptr;
> + OutputSectionBase<ELFT> *FiniArraySec = nullptr;
>
> private:
> SymbolTable<ELFT> &SymTab;
> @@ -271,14 +265,14 @@ template <class ELFT> struct Out {
> static DynamicSection<ELFT> *Dynamic;
> static GotSection<ELFT> *Got;
> static HashTableSection<ELFT> *HashTab;
> - static InterpSection<ELFT::Is64Bits> *Interp;
> + static InterpSection<ELFT> *Interp;
> static OutputSection<ELFT> *Bss;
> - static OutputSectionBase<ELFT::Is64Bits> *Opd;
> + static OutputSectionBase<ELFT> *Opd;
> static uint8_t *OpdBuf;
> static PltSection<ELFT> *Plt;
> static RelocationSection<ELFT> *RelaDyn;
> - static StringTableSection<ELFT::Is64Bits> *DynStrTab;
> - static StringTableSection<ELFT::Is64Bits> *StrTab;
> + static StringTableSection<ELFT> *DynStrTab;
> + static StringTableSection<ELFT> *StrTab;
> static SymbolTableSection<ELFT> *DynSymTab;
> static SymbolTableSection<ELFT> *SymTab;
> };
> @@ -286,14 +280,14 @@ template <class ELFT> struct Out {
> template <class ELFT> DynamicSection<ELFT> *Out<ELFT>::Dynamic;
> template <class ELFT> GotSection<ELFT> *Out<ELFT>::Got;
> template <class ELFT> HashTableSection<ELFT> *Out<ELFT>::HashTab;
> -template <class ELFT> InterpSection<ELFT::Is64Bits> *Out<ELFT>::Interp;
> +template <class ELFT> InterpSection<ELFT> *Out<ELFT>::Interp;
> template <class ELFT> OutputSection<ELFT> *Out<ELFT>::Bss;
> -template <class ELFT> OutputSectionBase<ELFT::Is64Bits> *Out<ELFT>::Opd;
> +template <class ELFT> OutputSectionBase<ELFT> *Out<ELFT>::Opd;
> template <class ELFT> uint8_t *Out<ELFT>::OpdBuf;
> template <class ELFT> PltSection<ELFT> *Out<ELFT>::Plt;
> template <class ELFT> RelocationSection<ELFT> *Out<ELFT>::RelaDyn;
> -template <class ELFT> StringTableSection<ELFT::Is64Bits>
> *Out<ELFT>::DynStrTab;
> -template <class ELFT> StringTableSection<ELFT::Is64Bits>
> *Out<ELFT>::StrTab;
> +template <class ELFT> StringTableSection<ELFT> *Out<ELFT>::DynStrTab;
> +template <class ELFT> StringTableSection<ELFT> *Out<ELFT>::StrTab;
> template <class ELFT> SymbolTableSection<ELFT> *Out<ELFT>::DynSymTab;
> template <class ELFT> SymbolTableSection<ELFT> *Out<ELFT>::SymTab;
> }
>
> Modified: lld/trunk/ELF/SymbolTable.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=250466&r1=250465&r2=250466&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/SymbolTable.cpp (original)
> +++ lld/trunk/ELF/SymbolTable.cpp Thu Oct 15 17:27:29 2015
> @@ -71,9 +71,9 @@ SymbolBody *SymbolTable<ELFT>::addUndefi
> }
>
> template <class ELFT>
> -void SymbolTable<ELFT>::addSyntheticSym(
> - StringRef Name, OutputSectionBase<ELFT::Is64Bits> &Section,
> - typename ELFFile<ELFT>::uintX_t Value) {
> +void SymbolTable<ELFT>::addSyntheticSym(StringRef Name,
> + OutputSectionBase<ELFT> &Section,
> + typename ELFFile<ELFT>::uintX_t
> Value) {
> typedef typename DefinedSynthetic<ELFT>::Elf_Sym Elf_Sym;
> auto ESym = new (Alloc) Elf_Sym;
> memset(ESym, 0, sizeof(Elf_Sym));
>
> Modified: lld/trunk/ELF/SymbolTable.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=250466&r1=250465&r2=250466&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/SymbolTable.h (original)
> +++ lld/trunk/ELF/SymbolTable.h Thu Oct 15 17:27:29 2015
> @@ -15,7 +15,7 @@
>
> namespace lld {
> namespace elf2 {
> -template <bool Is64Bits> class OutputSectionBase;
> +template <class ELFT> class OutputSectionBase;
> struct Symbol;
>
> // SymbolTable is a bucket of all known symbols, including defined,
> @@ -50,8 +50,7 @@ public:
>
> SymbolBody *addUndefined(StringRef Name);
> SymbolBody *addUndefinedOpt(StringRef Name);
> - void addSyntheticSym(StringRef Name,
> - OutputSectionBase<ELFT::Is64Bits> &Section,
> + void addSyntheticSym(StringRef Name, OutputSectionBase<ELFT> &Section,
> typename llvm::object::ELFFile<ELFT>::uintX_t
> Value);
> void addIgnoredSym(StringRef Name);
> bool isUndefined(StringRef Name);
>
> Modified: lld/trunk/ELF/Symbols.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=250466&r1=250465&r2=250466&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/Symbols.h (original)
> +++ lld/trunk/ELF/Symbols.h Thu Oct 15 17:27:29 2015
> @@ -37,7 +37,7 @@ class InputFile;
> class SymbolBody;
> template <class ELFT> class ObjectFile;
> template <class ELFT> class OutputSection;
> -template <bool Is64Bits> class OutputSectionBase;
> +template <class ELFT> class OutputSectionBase;
> template <class ELFT> class SharedFile;
>
> // Initializes global objects defined in this file.
> @@ -193,8 +193,7 @@ template <class ELFT> class DefinedCommo
> typedef typename Base::Elf_Sym Elf_Sym;
>
> public:
> - typedef typename std::conditional<ELFT::Is64Bits, uint64_t,
> uint32_t>::type
> - uintX_t;
> + typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
> DefinedCommon(StringRef N, const Elf_Sym &Sym)
> : Defined<ELFT>(Base::DefinedCommonKind, N, Sym) {
> MaxAlignment = Sym.st_value;
> @@ -234,14 +233,14 @@ template <class ELFT> class DefinedSynth
> public:
> typedef typename Base::Elf_Sym Elf_Sym;
> DefinedSynthetic(StringRef N, const Elf_Sym &Sym,
> - OutputSectionBase<ELFT::Is64Bits> &Section)
> + OutputSectionBase<ELFT> &Section)
> : Defined<ELFT>(Base::DefinedSyntheticKind, N, Sym),
> Section(Section) {}
>
> static bool classof(const SymbolBody *S) {
> return S->kind() == Base::DefinedSyntheticKind;
> }
>
> - const OutputSectionBase<ELFT::Is64Bits> &Section;
> + const OutputSectionBase<ELFT> &Section;
> };
>
> // Undefined symbol.
>
> Modified: lld/trunk/ELF/Writer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=250466&r1=250465&r2=250466&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/Writer.cpp (original)
> +++ lld/trunk/ELF/Writer.cpp Thu Oct 15 17:27:29 2015
> @@ -72,13 +72,13 @@ private:
>
> SpecificBumpPtrAllocator<OutputSection<ELFT>> SecAlloc;
> BumpPtrAllocator Alloc;
> - std::vector<OutputSectionBase<ELFT::Is64Bits> *> OutputSections;
> + std::vector<OutputSectionBase<ELFT> *> OutputSections;
> unsigned getNumSections() const { return OutputSections.size() + 1; }
>
> - void addStartStopSymbols(OutputSectionBase<ELFT::Is64Bits> *Sec);
> + void addStartStopSymbols(OutputSectionBase<ELFT> *Sec);
> void setPhdr(Elf_Phdr *PH, uint32_t Type, uint32_t Flags, uintX_t
> FileOff,
> uintX_t VA, uintX_t Align);
> - void copyPhdr(Elf_Phdr *PH, OutputSectionBase<ELFT::Is64Bits> *From);
> + void copyPhdr(Elf_Phdr *PH, OutputSectionBase<ELFT> *From);
>
> SymbolTable<ELFT> &Symtab;
> std::vector<Elf_Phdr> Phdrs;
> @@ -91,11 +91,11 @@ private:
> template <class ELFT> void lld::elf2::writeResult(SymbolTable<ELFT>
> *Symtab) {
> // Initialize output sections that are handled by Writer specially.
> // Don't reorder because the order of initialization matters.
> - InterpSection<ELFT::Is64Bits> Interp;
> + InterpSection<ELFT> Interp;
> Out<ELFT>::Interp = &Interp;
> - StringTableSection<ELFT::Is64Bits> StrTab(false);
> + StringTableSection<ELFT> StrTab(false);
> Out<ELFT>::StrTab = &StrTab;
> - StringTableSection<ELFT::Is64Bits> DynStrTab(true);
> + StringTableSection<ELFT> DynStrTab(true);
> Out<ELFT>::DynStrTab = &DynStrTab;
> OutputSection<ELFT> Bss(".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE);
> Out<ELFT>::Bss = &Bss;
> @@ -284,8 +284,8 @@ static int getPPC64SectionRank(StringRef
>
> // Output section ordering is determined by this function.
> template <class ELFT>
> -static bool compareOutputSections(OutputSectionBase<ELFT::Is64Bits> *A,
> - OutputSectionBase<ELFT::Is64Bits> *B) {
> +static bool compareOutputSections(OutputSectionBase<ELFT> *A,
> + OutputSectionBase<ELFT> *B) {
> typedef typename ELFFile<ELFT>::uintX_t uintX_t;
>
> uintX_t AFlags = A->getFlags();
> @@ -403,7 +403,7 @@ template <class ELFT> void Writer<ELFT>:
> if (!isOutputDynamic())
> Symtab.addIgnoredSym("__tls_get_addr");
>
> - std::vector<OutputSectionBase<ELFT::Is64Bits> *> RegularSections;
> + std::vector<OutputSectionBase<ELFT> *> RegularSections;
>
> for (const std::unique_ptr<ObjectFile<ELFT>> &F :
> Symtab.getObjectFiles()) {
> for (InputSection<ELFT> *C : F->getSections()) {
> @@ -425,7 +425,7 @@ template <class ELFT> void Writer<ELFT>:
> }
> }
>
> - for (OutputSectionBase<ELFT::Is64Bits> *Sec : RegularSections)
> + for (OutputSectionBase<ELFT> *Sec : RegularSections)
> addStartStopSymbols(Sec);
>
> Out<ELFT>::Dynamic->PreInitArraySec =
> @@ -436,7 +436,7 @@ template <class ELFT> void Writer<ELFT>:
> Map.lookup({".fini_array", SHT_FINI_ARRAY, SHF_WRITE | SHF_ALLOC});
>
> auto AddStartEnd = [&](StringRef Start, StringRef End,
> - OutputSectionBase<ELFT::Is64Bits> *OS) {
> + OutputSectionBase<ELFT> *OS) {
> if (OS) {
> Symtab.addSyntheticSym(Start, *OS, 0);
> Symtab.addSyntheticSym(End, *OS, OS->getSize());
> @@ -493,7 +493,7 @@ template <class ELFT> void Writer<ELFT>:
> for (unsigned I = 0, N = OutputSections.size(); I < N; ++I)
> OutputSections[I]->SectionIndex = I + 1;
>
> - for (OutputSectionBase<ELFT::Is64Bits> *Sec : OutputSections)
> + for (OutputSectionBase<ELFT> *Sec : OutputSections)
> Out<ELFT>::StrTab->add(Sec->getName());
>
> // Fill the DynStrTab early because Dynamic adds strings to
> @@ -501,7 +501,7 @@ template <class ELFT> void Writer<ELFT>:
> Out<ELFT>::Dynamic->finalize();
>
> // Fill other section headers.
> - for (OutputSectionBase<ELFT::Is64Bits> *Sec : OutputSections)
> + for (OutputSectionBase<ELFT> *Sec : OutputSections)
> Sec->finalize();
>
> // If we have a .opd section (used under PPC64 for function
> descriptors),
> @@ -529,7 +529,7 @@ static bool isValidCIdentifier(StringRef
> // respectively. This is not requested by the ELF standard, but GNU ld and
> // gold provide the feature, and used by many programs.
> template <class ELFT>
> -void Writer<ELFT>::addStartStopSymbols(OutputSectionBase<ELFT::Is64Bits>
> *Sec) {
> +void Writer<ELFT>::addStartStopSymbols(OutputSectionBase<ELFT> *Sec) {
> StringRef S = Sec->getName();
> if (!isValidCIdentifier(S))
> return;
> @@ -542,8 +542,7 @@ void Writer<ELFT>::addStartStopSymbols(O
> Symtab.addSyntheticSym(Stop, *Sec, Sec->getSize());
> }
>
> -template <class ELFT>
> -static bool needsPhdr(OutputSectionBase<ELFT::Is64Bits> *Sec) {
> +template <class ELFT> static bool needsPhdr(OutputSectionBase<ELFT> *Sec)
> {
> return Sec->getFlags() & SHF_ALLOC;
> }
>
> @@ -561,7 +560,7 @@ template <class ELFT> void Writer<ELFT>:
> if (isOutputDynamic())
> ++NumPhdrs;
> uintX_t Last = PF_R;
> - for (OutputSectionBase<ELFT::Is64Bits> *Sec : OutputSections) {
> + for (OutputSectionBase<ELFT> *Sec : OutputSections) {
> if (!Sec->getSize() || !needsPhdr<ELFT>(Sec))
> continue;
> uintX_t Flags = toPhdrFlags(Sec->getFlags());
> @@ -595,7 +594,7 @@ template <class ELFT> void Writer<ELFT>:
> setPhdr(FileHeader, PT_LOAD, PF_R, 0, getVAStart(),
> Target->getPageSize());
>
> SmallPtrSet<Elf_Phdr *, 8> Closed;
> - for (OutputSectionBase<ELFT::Is64Bits> *Sec : OutputSections) {
> + for (OutputSectionBase<ELFT> *Sec : OutputSections) {
> if (Sec->getSize()) {
> uintX_t Flags = toPhdrFlags(Sec->getFlags());
> Elf_Phdr *Last = &Phdrs.back();
> @@ -699,9 +698,9 @@ template <class ELFT> void Writer<ELFT>:
> auto SHdrs = reinterpret_cast<Elf_Shdr *>(Buf + EHdr->e_shoff);
> // First entry is null.
> ++SHdrs;
> - for (OutputSectionBase<ELFT::Is64Bits> *Sec : OutputSections) {
> + for (OutputSectionBase<ELFT> *Sec : OutputSections) {
> Sec->setNameOffset(Out<ELFT>::StrTab->getFileOff(Sec->getName()));
> - Sec->template writeHeaderTo<ELFT::TargetEndianness>(SHdrs++);
> + Sec->writeHeaderTo(SHdrs++);
> }
> }
>
> @@ -718,12 +717,12 @@ template <class ELFT> void Writer<ELFT>:
>
> // PPC64 needs to process relocations in the .opd section before
> processing
> // relocations in code-containing sections.
> - if (OutputSectionBase<ELFT::Is64Bits> *Sec = Out<ELFT>::Opd) {
> + if (OutputSectionBase<ELFT> *Sec = Out<ELFT>::Opd) {
> Out<ELFT>::OpdBuf = Buf + Sec->getFileOff();
> Sec->writeTo(Buf + Sec->getFileOff());
> }
>
> - for (OutputSectionBase<ELFT::Is64Bits> *Sec : OutputSections)
> + for (OutputSectionBase<ELFT> *Sec : OutputSections)
> if (Sec != Out<ELFT>::Opd)
> Sec->writeTo(Buf + Sec->getFileOff());
> }
> @@ -740,8 +739,7 @@ void Writer<ELFT>::setPhdr(Elf_Phdr *PH,
> }
>
> template <class ELFT>
> -void Writer<ELFT>::copyPhdr(Elf_Phdr *PH,
> - OutputSectionBase<ELFT::Is64Bits> *From) {
> +void Writer<ELFT>::copyPhdr(Elf_Phdr *PH, OutputSectionBase<ELFT> *From) {
> PH->p_flags = toPhdrFlags(From->getFlags());
> PH->p_offset = From->getFileOff();
> PH->p_vaddr = From->getVA();
>
>
> _______________________________________________
> 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/20151016/64a1c137/attachment.html>
More information about the llvm-commits
mailing list