[lld] r256408 - Factor out static members from DefinedRegular.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 24 22:12:19 PST 2015
Author: ruiu
Date: Fri Dec 25 00:12:18 2015
New Revision: 256408
URL: http://llvm.org/viewvc/llvm-project?rev=256408&view=rev
Log:
Factor out static members from DefinedRegular.
This patch moves statically-allocated Elf_Sym objects out
of DefinedRegular class, so that the class definition becomes
smaller.
Modified:
lld/trunk/ELF/Driver.cpp
lld/trunk/ELF/SymbolTable.cpp
lld/trunk/ELF/Symbols.cpp
lld/trunk/ELF/Symbols.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=256408&r1=256407&r2=256408&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Fri Dec 25 00:12:18 2015
@@ -279,7 +279,7 @@ template <class ELFT> void LinkerDriver:
// so that it points to an absolute address which is relative to GOT.
// See "Global Data Symbols" in Chapter 6 in the following document:
// ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
- Symtab.addAbsolute("_gp", DefinedRegular<ELFT>::MipsGp);
+ Symtab.addAbsolute("_gp", ElfSym<ELFT>::MipsGp);
}
for (std::unique_ptr<InputFile> &F : Files)
Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=256408&r1=256407&r2=256408&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Fri Dec 25 00:12:18 2015
@@ -112,7 +112,7 @@ void SymbolTable<ELFT>::addSynthetic(Str
template <class ELFT>
SymbolBody *SymbolTable<ELFT>::addIgnored(StringRef Name) {
auto *Sym = new (Alloc)
- DefinedRegular<ELFT>(Name, DefinedRegular<ELFT>::IgnoreUndef, nullptr);
+ DefinedRegular<ELFT>(Name, ElfSym<ELFT>::IgnoreUndef, nullptr);
resolve(Sym);
return Sym;
}
Modified: lld/trunk/ELF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=256408&r1=256407&r2=256408&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.cpp (original)
+++ lld/trunk/ELF/Symbols.cpp Fri Dec 25 00:12:18 2015
@@ -120,9 +120,9 @@ std::unique_ptr<InputFile> Lazy::getMemb
}
template <class ELFT> static void doInitSymbols() {
- DefinedRegular<ELFT>::End.setBinding(STB_GLOBAL);
- DefinedRegular<ELFT>::IgnoreUndef.setBinding(STB_WEAK);
- DefinedRegular<ELFT>::IgnoreUndef.setVisibility(STV_HIDDEN);
+ ElfSym<ELFT>::End.setBinding(STB_GLOBAL);
+ ElfSym<ELFT>::IgnoreUndef.setBinding(STB_WEAK);
+ ElfSym<ELFT>::IgnoreUndef.setVisibility(STV_HIDDEN);
}
void lld::elf2::initSymbols() {
Modified: lld/trunk/ELF/Symbols.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=256408&r1=256407&r2=256408&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.h (original)
+++ lld/trunk/ELF/Symbols.h Fri Dec 25 00:12:18 2015
@@ -189,40 +189,8 @@ public:
// If this is null, the symbol is absolute.
InputSectionBase<ELFT> *Section;
-
- static Elf_Sym IgnoreUndef;
-
- // The following symbols must be added early to reserve their places
- // in symbol tables. The value of the symbols are set when all sections
- // are finalized and their addresses are determined.
-
- // The content for _end and end symbols.
- static Elf_Sym End;
-
- // The content for _gp symbol for MIPS target.
- static Elf_Sym MipsGp;
-
- // __rel_iplt_start/__rel_iplt_end for signaling
- // where R_[*]_IRELATIVE relocations do live.
- static Elf_Sym RelaIpltStart;
- static Elf_Sym RelaIpltEnd;
};
-template <class ELFT>
-typename DefinedRegular<ELFT>::Elf_Sym DefinedRegular<ELFT>::IgnoreUndef;
-
-template <class ELFT>
-typename DefinedRegular<ELFT>::Elf_Sym DefinedRegular<ELFT>::End;
-
-template <class ELFT>
-typename DefinedRegular<ELFT>::Elf_Sym DefinedRegular<ELFT>::MipsGp;
-
-template <class ELFT>
-typename DefinedRegular<ELFT>::Elf_Sym DefinedRegular<ELFT>::RelaIpltStart;
-
-template <class ELFT>
-typename DefinedRegular<ELFT>::Elf_Sym DefinedRegular<ELFT>::RelaIpltEnd;
-
// DefinedSynthetic is a class to represent linker-generated ELF symbols.
// The difference from the regular symbol is that DefinedSynthetic symbols
// don't belong to any input files or sections. Thus, its constructor
@@ -316,6 +284,35 @@ private:
const llvm::object::Archive::Symbol Sym;
};
+// Some linker-generated symbols need to be created as
+// DefinedRegular symbols, so they need Elf_Sym symbols.
+// Here we allocate such Elf_Sym symbols statically.
+template <class ELFT> struct ElfSym {
+ typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
+
+ // Used to represent an undefined symbol which we don't want
+ // to add to the output file's symbol table.
+ static Elf_Sym IgnoreUndef;
+
+ // The content for _end and end symbols.
+ static Elf_Sym End;
+
+ // The content for _gp symbol for MIPS target.
+ static Elf_Sym MipsGp;
+
+ // __rel_iplt_start/__rel_iplt_end for signaling
+ // where R_[*]_IRELATIVE relocations do live.
+ static Elf_Sym RelaIpltStart;
+ static Elf_Sym RelaIpltEnd;
+};
+
+template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::IgnoreUndef;
+template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::End;
+template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::MipsGp;
+template <class ELFT>
+typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::RelaIpltStart;
+template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::RelaIpltEnd;
+
} // namespace elf2
} // namespace lld
Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=256408&r1=256407&r2=256408&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Fri Dec 25 00:12:18 2015
@@ -587,9 +587,9 @@ static void addIRelocMarkers(SymbolTable
Symtab.addAbsolute(Name, Sym);
};
AddMarker(IsRela ? "__rela_iplt_start" : "__rel_iplt_start",
- DefinedRegular<ELFT>::RelaIpltStart);
+ ElfSym<ELFT>::RelaIpltStart);
AddMarker(IsRela ? "__rela_iplt_end" : "__rel_iplt_end",
- DefinedRegular<ELFT>::RelaIpltEnd);
+ ElfSym<ELFT>::RelaIpltEnd);
}
template <class ELFT> static bool includeInSymtab(const SymbolBody &B) {
@@ -598,7 +598,7 @@ template <class ELFT> static bool includ
// Don't include synthetic symbols like __init_array_start in every output.
if (auto *U = dyn_cast<DefinedRegular<ELFT>>(&B))
- if (&U->Sym == &DefinedRegular<ELFT>::IgnoreUndef)
+ if (&U->Sym == &ElfSym<ELFT>::IgnoreUndef)
return false;
return true;
@@ -723,14 +723,14 @@ template <class ELFT> void Writer<ELFT>:
// So, if this symbol is referenced, we just add the placeholder here
// and update its value later.
if (Symtab.find("_end"))
- Symtab.addAbsolute("_end", DefinedRegular<ELFT>::End);
+ Symtab.addAbsolute("_end", ElfSym<ELFT>::End);
// If there is an undefined symbol "end", we should initialize it
// with the same value as "_end". In any other case it should stay intact,
// because it is an allowable name for a user symbol.
if (SymbolBody *B = Symtab.find("end"))
if (B->isUndefined())
- Symtab.addAbsolute("end", DefinedRegular<ELFT>::End);
+ Symtab.addAbsolute("end", ElfSym<ELFT>::End);
// Scan relocations. This must be done after every symbol is declared so that
// we can correctly decide if a dynamic relocation is needed.
@@ -1035,20 +1035,19 @@ template <class ELFT> void Writer<ELFT>:
// Update "_end" and "end" symbols so that they
// point to the end of the data segment.
- DefinedRegular<ELFT>::End.st_value = VA;
+ ElfSym<ELFT>::End.st_value = VA;
// Update __rel_iplt_start/__rel_iplt_end to wrap the
// rela.plt section.
if (Out<ELFT>::RelaPlt) {
uintX_t Start = Out<ELFT>::RelaPlt->getVA();
- DefinedRegular<ELFT>::RelaIpltStart.st_value = Start;
- DefinedRegular<ELFT>::RelaIpltEnd.st_value =
- Start + Out<ELFT>::RelaPlt->getSize();
+ ElfSym<ELFT>::RelaIpltStart.st_value = Start;
+ ElfSym<ELFT>::RelaIpltEnd.st_value = Start + Out<ELFT>::RelaPlt->getSize();
}
// Update MIPS _gp absolute symbol so that it points to the static data.
if (Config->EMachine == EM_MIPS)
- DefinedRegular<ELFT>::MipsGp.st_value = getMipsGpAddr<ELFT>();
+ ElfSym<ELFT>::MipsGp.st_value = getMipsGpAddr<ELFT>();
}
// Returns the number of PHDR entries.
More information about the llvm-commits
mailing list