[lld] r360844 - De-template parseFile() and SymbolTable's add-family functions.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Wed May 15 20:45:13 PDT 2019
Author: ruiu
Date: Wed May 15 20:45:13 2019
New Revision: 360844
URL: http://llvm.org/viewvc/llvm-project?rev=360844&view=rev
Log:
De-template parseFile() and SymbolTable's add-family functions.
Differential Revision: https://reviews.llvm.org/D61896
Modified:
lld/trunk/ELF/Driver.cpp
lld/trunk/ELF/InputFiles.cpp
lld/trunk/ELF/InputFiles.h
lld/trunk/ELF/SymbolTable.cpp
lld/trunk/ELF/SymbolTable.h
Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=360844&r1=360843&r2=360844&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Wed May 15 20:45:13 2019
@@ -1295,7 +1295,7 @@ static void excludeLibs(opt::InputArgLis
}
// Force Sym to be entered in the output. Used for -u or equivalent.
-template <class ELFT> static void handleUndefined(StringRef Name) {
+static void handleUndefined(StringRef Name) {
Symbol *Sym = Symtab->find(Name);
if (!Sym)
return;
@@ -1305,10 +1305,10 @@ template <class ELFT> static void handle
Sym->IsUsedInRegularObj = true;
if (Sym->isLazy())
- Symtab->fetchLazy<ELFT>(Sym);
+ Symtab->fetchLazy(Sym);
}
-template <class ELFT> static void handleLibcall(StringRef Name) {
+static void handleLibcall(StringRef Name) {
Symbol *Sym = Symtab->find(Name);
if (!Sym || !Sym->isLazy())
return;
@@ -1320,7 +1320,7 @@ template <class ELFT> static void handle
MB = cast<LazyArchive>(Sym)->getMemberBuffer();
if (isBitcode(MB))
- Symtab->fetchLazy<ELFT>(Sym);
+ Symtab->fetchLazy(Sym);
}
// Replaces common symbols with defined symbols reside in .bss sections.
@@ -1426,7 +1426,7 @@ static void findKeepUniqueSections(opt::
}
template <class ELFT> static Symbol *addUndefined(StringRef Name) {
- return Symtab->addUndefined<ELFT>(
+ return Symtab->addUndefined(
Undefined{nullptr, Name, STB_GLOBAL, STV_DEFAULT, 0});
}
@@ -1551,7 +1551,7 @@ template <class ELFT> void LinkerDriver:
// Add all files to the symbol table. This will add almost all
// symbols that we need to the symbol table.
for (InputFile *F : Files)
- parseFile<ELFT>(F);
+ parseFile(F);
// Now that we have every file, we can decide if we will need a
// dynamic symbol table.
@@ -1569,10 +1569,10 @@ template <class ELFT> void LinkerDriver:
// Handle the `--undefined <sym>` options.
for (StringRef S : Config->Undefined)
- handleUndefined<ELFT>(S);
+ handleUndefined(S);
// If an entry symbol is in a static archive, pull out that file now.
- handleUndefined<ELFT>(Config->Entry);
+ handleUndefined(Config->Entry);
// If any of our inputs are bitcode files, the LTO code generator may create
// references to certain library functions that might not be explicit in the
@@ -1593,7 +1593,7 @@ template <class ELFT> void LinkerDriver:
// object file to the link.
if (!BitcodeFiles.empty())
for (const char *S : LibcallRoutineNames)
- handleLibcall<ELFT>(S);
+ handleLibcall(S);
// Return if there were name resolution errors.
if (errorCount())
Modified: lld/trunk/ELF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=360844&r1=360843&r2=360844&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.cpp (original)
+++ lld/trunk/ELF/InputFiles.cpp Wed May 15 20:45:13 2019
@@ -109,8 +109,7 @@ static bool isCompatible(InputFile *File
return false;
}
-// Add symbols in File to the symbol table.
-template <class ELFT> void elf::parseFile(InputFile *File) {
+template <class ELFT> static void doParseFile(InputFile *File) {
// Comdat groups define "link once" sections. If two comdat groups have the
// same name, only one of them is linked, and the other is ignored. This set
// is used to uniquify them.
@@ -128,7 +127,7 @@ template <class ELFT> void elf::parseFil
// .a file
if (auto *F = dyn_cast<ArchiveFile>(File)) {
- F->parse<ELFT>();
+ F->parse();
return;
}
@@ -160,6 +159,26 @@ template <class ELFT> void elf::parseFil
cast<ObjFile<ELFT>>(File)->parse(ComdatGroups);
}
+// Add symbols in File to the symbol table.
+void elf::parseFile(InputFile *File) {
+ switch (Config->EKind) {
+ case ELF32LEKind:
+ doParseFile<ELF32LE>(File);
+ return;
+ case ELF32BEKind:
+ doParseFile<ELF32BE>(File);
+ return;
+ case ELF64LEKind:
+ doParseFile<ELF64LE>(File);
+ return;
+ case ELF64BEKind:
+ doParseFile<ELF64BE>(File);
+ return;
+ default:
+ llvm_unreachable("unknown ELFT");
+ }
+}
+
// Concatenates arguments to construct a string representing an error location.
static std::string createFileLineMsg(StringRef Path, unsigned Line) {
std::string Filename = path::filename(Path);
@@ -892,8 +911,7 @@ template <class ELFT> Symbol *ObjFile<EL
switch (Sym->st_shndx) {
case SHN_UNDEF:
- return Symtab->addUndefined<ELFT>(
- Undefined{this, Name, Binding, StOther, Type});
+ return Symtab->addUndefined(Undefined{this, Name, Binding, StOther, Type});
case SHN_COMMON:
if (Value == 0 || Value >= UINT32_MAX)
fatal(toString(this) + ": common symbol '" + Name +
@@ -909,7 +927,7 @@ template <class ELFT> Symbol *ObjFile<EL
case STB_WEAK:
case STB_GNU_UNIQUE:
if (Sec == &InputSection::Discarded)
- return Symtab->addUndefined<ELFT>(
+ return Symtab->addUndefined(
Undefined{this, Name, Binding, StOther, Type});
return Symtab->addDefined(
Defined{this, Name, Binding, StOther, Type, Value, Size, Sec});
@@ -920,9 +938,9 @@ ArchiveFile::ArchiveFile(std::unique_ptr
: InputFile(ArchiveKind, File->getMemoryBufferRef()),
File(std::move(File)) {}
-template <class ELFT> void ArchiveFile::parse() {
+void ArchiveFile::parse() {
for (const Archive::Symbol &Sym : File->symbols())
- Symtab->addLazyArchive<ELFT>(LazyArchive{*this, Sym});
+ Symtab->addLazyArchive(LazyArchive{*this, Sym});
}
// Returns a buffer pointing to a member file containing a given symbol.
@@ -1123,7 +1141,7 @@ template <class ELFT> void SharedFile::p
}
if (Sym.isUndefined()) {
- Symbol *S = Symtab->addUndefined<ELFT>(
+ Symbol *S = Symtab->addUndefined(
Undefined{this, Name, Sym.getBinding(), Sym.st_other, Sym.getType()});
S->ExportDynamic = true;
continue;
@@ -1262,7 +1280,7 @@ static Symbol *createBitcodeSymbol(const
Undefined New(&F, Name, Binding, Visibility, Type);
if (CanOmitFromDynSym)
New.ExportDynamic = false;
- return Symtab->addUndefined<ELFT>(New);
+ return Symtab->addUndefined(New);
}
if (ObjSym.isCommon())
@@ -1404,7 +1422,7 @@ template <class ELFT> void LazyObjFile::
for (const lto::InputFile::Symbol &Sym : Obj->symbols()) {
if (Sym.isUndefined())
continue;
- Symtab->addLazyObject<ELFT>(LazyObject{*this, Saver.save(Sym.getName())});
+ Symtab->addLazyObject(LazyObject{*this, Saver.save(Sym.getName())});
}
return;
}
@@ -1429,7 +1447,7 @@ template <class ELFT> void LazyObjFile::
for (const typename ELFT::Sym &Sym : Syms.slice(FirstGlobal)) {
if (Sym.st_shndx == SHN_UNDEF)
continue;
- Symtab->addLazyObject<ELFT>(
+ Symtab->addLazyObject(
LazyObject{*this, CHECK(Sym.getName(StringTable), this)});
}
return;
@@ -1445,16 +1463,6 @@ std::string elf::replaceThinLTOSuffix(St
return Path;
}
-template void elf::parseFile<ELF32LE>(InputFile *);
-template void elf::parseFile<ELF32BE>(InputFile *);
-template void elf::parseFile<ELF64LE>(InputFile *);
-template void elf::parseFile<ELF64BE>(InputFile *);
-
-template void ArchiveFile::parse<ELF32LE>();
-template void ArchiveFile::parse<ELF32BE>();
-template void ArchiveFile::parse<ELF64LE>();
-template void ArchiveFile::parse<ELF64BE>();
-
template void BitcodeFile::parse<ELF32LE>(DenseSet<CachedHashStringRef> &);
template void BitcodeFile::parse<ELF32BE>(DenseSet<CachedHashStringRef> &);
template void BitcodeFile::parse<ELF64LE>(DenseSet<CachedHashStringRef> &);
Modified: lld/trunk/ELF/InputFiles.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=360844&r1=360843&r2=360844&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.h (original)
+++ lld/trunk/ELF/InputFiles.h Wed May 15 20:45:13 2019
@@ -55,7 +55,7 @@ extern std::unique_ptr<llvm::TarWriter>
llvm::Optional<MemoryBufferRef> readFile(StringRef Path);
// Add symbols in File to the symbol table.
-template <class ELFT> void parseFile(InputFile *File);
+void parseFile(InputFile *File);
// The root class of input files.
class InputFile {
@@ -323,7 +323,7 @@ class ArchiveFile : public InputFile {
public:
explicit ArchiveFile(std::unique_ptr<Archive> &&File);
static bool classof(const InputFile *F) { return F->kind() == ArchiveKind; }
- template <class ELFT> void parse();
+ void parse();
// Pulls out an object file that contains a definition for Sym and
// returns it. If the same file was instantiated before, this
Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=360844&r1=360843&r2=360844&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Wed May 15 20:45:13 2019
@@ -145,7 +145,7 @@ void SymbolTable::mergeProperties(Symbol
Old->Visibility = getMinVisibility(Old->Visibility, New.Visibility);
}
-template <class ELFT> Symbol *SymbolTable::addUndefined(const Undefined &New) {
+Symbol *SymbolTable::addUndefined(const Undefined &New) {
Symbol *Old = insert(New);
mergeProperties(Old, New);
@@ -225,7 +225,7 @@ template <class ELFT> Symbol *SymbolTabl
// group assignment rule simulates the traditional linker's semantics.
bool Backref = Config->WarnBackrefs && New.File &&
Old->File->GroupId < New.File->GroupId;
- fetchLazy<ELFT>(Old);
+ fetchLazy(Old);
// We don't report backward references to weak symbols as they can be
// overridden later.
@@ -429,7 +429,7 @@ Symbol *SymbolTable::find(StringRef Name
return SymVector[It->second];
}
-template <class ELFT, class LazyT> void SymbolTable::addLazy(const LazyT &New) {
+template <class LazyT> void SymbolTable::addLazy(const LazyT &New) {
Symbol *Old = insert(New);
mergeProperties(Old, New);
@@ -452,27 +452,23 @@ template <class ELFT, class LazyT> void
}
if (InputFile *F = New.fetch())
- parseFile<ELFT>(F);
+ parseFile(F);
}
-template <class ELFT> void SymbolTable::addLazyArchive(const LazyArchive &New) {
- addLazy<ELFT>(New);
-}
+void SymbolTable::addLazyArchive(const LazyArchive &New) { addLazy(New); }
-template <class ELFT> void SymbolTable::addLazyObject(const LazyObject &New) {
- addLazy<ELFT>(New);
-}
+void SymbolTable::addLazyObject(const LazyObject &New) { addLazy(New); }
-template <class ELFT> void SymbolTable::fetchLazy(Symbol *Sym) {
+void SymbolTable::fetchLazy(Symbol *Sym) {
if (auto *S = dyn_cast<LazyArchive>(Sym)) {
if (InputFile *File = S->fetch())
- parseFile<ELFT>(File);
+ parseFile(File);
return;
}
auto *S = cast<LazyObject>(Sym);
if (InputFile *File = cast<LazyObjFile>(S->File)->fetch())
- parseFile<ELFT>(File);
+ parseFile(File);
}
// Initialize DemangledSyms with a map from demangled symbols to symbol
@@ -636,27 +632,7 @@ void SymbolTable::scanVersionScript() {
Sym->parseSymbolVersion();
}
-template Symbol *SymbolTable::addUndefined<ELF32LE>(const Undefined &);
-template Symbol *SymbolTable::addUndefined<ELF32BE>(const Undefined &);
-template Symbol *SymbolTable::addUndefined<ELF64LE>(const Undefined &);
-template Symbol *SymbolTable::addUndefined<ELF64BE>(const Undefined &);
-
template void SymbolTable::addCombinedLTOObject<ELF32LE>();
template void SymbolTable::addCombinedLTOObject<ELF32BE>();
template void SymbolTable::addCombinedLTOObject<ELF64LE>();
template void SymbolTable::addCombinedLTOObject<ELF64BE>();
-
-template void SymbolTable::addLazyArchive<ELF32LE>(const LazyArchive &);
-template void SymbolTable::addLazyArchive<ELF32BE>(const LazyArchive &);
-template void SymbolTable::addLazyArchive<ELF64LE>(const LazyArchive &);
-template void SymbolTable::addLazyArchive<ELF64BE>(const LazyArchive &);
-
-template void SymbolTable::addLazyObject<ELF32LE>(const LazyObject &);
-template void SymbolTable::addLazyObject<ELF32BE>(const LazyObject &);
-template void SymbolTable::addLazyObject<ELF64LE>(const LazyObject &);
-template void SymbolTable::addLazyObject<ELF64BE>(const LazyObject &);
-
-template void SymbolTable::fetchLazy<ELF32LE>(Symbol *);
-template void SymbolTable::fetchLazy<ELF32BE>(Symbol *);
-template void SymbolTable::fetchLazy<ELF64LE>(Symbol *);
-template void SymbolTable::fetchLazy<ELF64BE>(Symbol *);
Modified: lld/trunk/ELF/SymbolTable.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=360844&r1=360843&r2=360844&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.h (original)
+++ lld/trunk/ELF/SymbolTable.h Wed May 15 20:45:13 2019
@@ -45,22 +45,18 @@ public:
ArrayRef<Symbol *> getSymbols() const { return SymVector; }
- template <class ELFT> Symbol *addUndefined(const Undefined &New);
-
+ Symbol *addUndefined(const Undefined &New);
Symbol *addDefined(const Defined &New);
-
void addShared(const SharedSymbol &New);
-
- template <class ELFT> void addLazyArchive(const LazyArchive &New);
- template <class ELFT> void addLazyObject(const LazyObject &New);
-
+ void addLazyArchive(const LazyArchive &New);
+ void addLazyObject(const LazyObject &New);
Symbol *addBitcode(const Defined &New);
Symbol *addCommon(const CommonSymbol &New);
Symbol *insert(const Symbol &New);
void mergeProperties(Symbol *Old, const Symbol &New);
- template <class ELFT> void fetchLazy(Symbol *Sym);
+ void fetchLazy(Symbol *Sym);
void scanVersionScript();
@@ -74,7 +70,7 @@ public:
llvm::DenseMap<StringRef, SharedFile *> SoNames;
private:
- template <class ELFT, class LazyT> void addLazy(const LazyT &New);
+ template <class LazyT> void addLazy(const LazyT &New);
std::vector<Symbol *> findByVersion(SymbolVersion Ver);
std::vector<Symbol *> findAllByVersion(SymbolVersion Ver);
More information about the llvm-commits
mailing list