Index: ELF/SymbolTable.cpp =================================================================== --- ELF/SymbolTable.cpp +++ ELF/SymbolTable.cpp @@ -595,14 +595,17 @@ return SymVector[It->second]; } -template -void SymbolTable::addLazyArchive(StringRef Name, ArchiveFile &F, - const object::Archive::Symbol Sym) { +// This is used to handle lazy symbols. May Replace existent +// symbol with lazy version or request to Fetch it. +static void +replaceOrFetchLazy(StringRef Name, + llvm::function_ref Replace, + llvm::function_ref Fetch) { Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(Name); + std::tie(S, WasInserted) = Symtab->insert(Name); if (WasInserted) { - replaceSymbol(S, F, Sym, Symbol::UnknownType); + Replace(S, Symbol::UnknownType); return; } if (!S->isUndefined()) @@ -611,34 +614,36 @@ // An undefined weak will not fetch archive members. See comment on Lazy in // Symbols.h for the details. if (S->isWeak()) { - replaceSymbol(S, F, Sym, S->Type); + Replace(S, S->Type); S->Binding = STB_WEAK; return; } - if (InputFile *File = F.fetch(Sym)) - addFile(File); + Fetch(S); } template -void SymbolTable::addLazyObject(StringRef Name, LazyObjFile &Obj) { - Symbol *S; - bool WasInserted; - std::tie(S, WasInserted) = insert(Name); - if (WasInserted) { - replaceSymbol(S, Obj, Name, Symbol::UnknownType); - return; - } - if (!S->isUndefined()) - return; +void SymbolTable::addLazyArchive(StringRef Name, ArchiveFile &F, + const object::Archive::Symbol Sym) { + replaceOrFetchLazy(Name, + [&](Symbol *S, uint8_t Type) { + replaceSymbol(S, F, Sym, Type); + }, + [&](Symbol *S) { + if (InputFile *File = F.fetch(Sym)) + addFile(File); + }); +} - // See comment for addLazyArchive above. - if (S->isWeak()) { - replaceSymbol(S, Obj, Name, S->Type); - S->Binding = STB_WEAK; - return; - } - if (InputFile *F = Obj.fetch()) - addFile(F); +template +void SymbolTable::addLazyObject(StringRef Name, LazyObjFile &Obj) { + replaceOrFetchLazy(Name, + [&](Symbol *S, uint8_t Type) { + replaceSymbol(S, Obj, Name, Type); + }, + [&](Symbol *S) { + if (InputFile *F = Obj.fetch()) + addFile(F); + }); } template void SymbolTable::fetchLazy(Symbol *Sym) {