diff options
| author | Rui Ueyama <ruiu@google.com> | 2018-10-09 19:54:32 +0000 |
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2018-10-09 19:54:32 +0000 |
| commit | 659cff37d6c6a6600e5ee997bddf840ca2364234 (patch) | |
| tree | 8ffb0af00abe19ee1815781665fedbce9baa21df /lld/ELF/SymbolTable.cpp | |
| parent | f6d840086999a5f23010caac81413c8f370a21d3 (diff) | |
| download | bcm5719-llvm-659cff37d6c6a6600e5ee997bddf840ca2364234.tar.gz bcm5719-llvm-659cff37d6c6a6600e5ee997bddf840ca2364234.zip | |
Remove a use of template to make code less abstracted.
Sometimes, code that is a bit longer but doesn't use template is
easier to understand than code that uses template.
llvm-svn: 344072
Diffstat (limited to 'lld/ELF/SymbolTable.cpp')
| -rw-r--r-- | lld/ELF/SymbolTable.cpp | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index b3d9339380d..746b352a318 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -559,18 +559,14 @@ Symbol *SymbolTable::find(StringRef Name) { return SymVector[It->second]; } -// This is used to handle lazy symbols. May replace existent -// symbol with lazy version or request to Fetch it. -template <class ELFT, typename LazyT, typename... ArgT> -static void replaceOrFetchLazy(StringRef Name, InputFile &File, - llvm::function_ref<InputFile *()> Fetch, - ArgT &&... Arg) { +template <class ELFT> +void SymbolTable::addLazyArchive(StringRef Name, ArchiveFile &File, + const object::Archive::Symbol Sym) { Symbol *S; bool WasInserted; std::tie(S, WasInserted) = Symtab->insert(Name); if (WasInserted) { - replaceSymbol<LazyT>(S, File, Symbol::UnknownType, - std::forward<ArgT>(Arg)...); + replaceSymbol<LazyArchive>(S, File, Symbol::UnknownType, Sym); return; } if (!S->isUndefined()) @@ -579,26 +575,37 @@ static void replaceOrFetchLazy(StringRef Name, InputFile &File, // An undefined weak will not fetch archive members. See comment on Lazy in // Symbols.h for the details. if (S->isWeak()) { - replaceSymbol<LazyT>(S, File, S->Type, std::forward<ArgT>(Arg)...); + replaceSymbol<LazyArchive>(S, File, S->Type, Sym); S->Binding = STB_WEAK; return; } - if (InputFile *F = Fetch()) + if (InputFile *F = File.fetch(Sym)) Symtab->addFile<ELFT>(F); } template <class ELFT> -void SymbolTable::addLazyArchive(StringRef Name, ArchiveFile &F, - const object::Archive::Symbol Sym) { - replaceOrFetchLazy<ELFT, LazyArchive>(Name, F, [&]() { return F.fetch(Sym); }, - Sym); -} +void SymbolTable::addLazyObject(StringRef Name, LazyObjFile &File) { + Symbol *S; + bool WasInserted; + std::tie(S, WasInserted) = Symtab->insert(Name); + if (WasInserted) { + replaceSymbol<LazyObject>(S, File, Symbol::UnknownType, Name); + return; + } + if (!S->isUndefined()) + return; -template <class ELFT> -void SymbolTable::addLazyObject(StringRef Name, LazyObjFile &Obj) { - replaceOrFetchLazy<ELFT, LazyObject>(Name, Obj, [&]() { return Obj.fetch(); }, - Name); + // An undefined weak will not fetch archive members. See comment on Lazy in + // Symbols.h for the details. + if (S->isWeak()) { + replaceSymbol<LazyObject>(S, File, S->Type, Name); + S->Binding = STB_WEAK; + return; + } + + if (InputFile *F = File.fetch()) + Symtab->addFile<ELFT>(F); } template <class ELFT> void SymbolTable::fetchLazy(Symbol *Sym) { |

