Index: lld/trunk/ELF/SymbolTable.cpp =================================================================== --- lld/trunk/ELF/SymbolTable.cpp +++ lld/trunk/ELF/SymbolTable.cpp @@ -595,14 +595,18 @@ 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. +template +void replaceOrFetchLazy(StringRef Name, InputFile &File, + llvm::function_ref Fetch, + ArgT &&... Arg) { 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); + replaceSymbol(S, File, Symbol::UnknownType, + std::forward(Arg)...); return; } if (!S->isUndefined()) @@ -611,34 +615,26 @@ // 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); + replaceSymbol(S, File, S->Type, std::forward(Arg)...); S->Binding = STB_WEAK; return; } - if (InputFile *File = F.fetch(Sym)) - addFile(File); + + if (InputFile *F = Fetch()) + Symtab->addFile(F); } 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, F, [&]() { return F.fetch(Sym); }, + Sym); +} - // 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, Obj, [&]() { return Obj.fetch(); }, + Name); } template void SymbolTable::fetchLazy(Symbol *Sym) { Index: lld/trunk/ELF/Symbols.h =================================================================== --- lld/trunk/ELF/Symbols.h +++ lld/trunk/ELF/Symbols.h @@ -263,8 +263,8 @@ // symbol. class LazyArchive : public Symbol { public: - LazyArchive(InputFile &File, const llvm::object::Archive::Symbol S, - uint8_t Type) + LazyArchive(InputFile &File, uint8_t Type, + const llvm::object::Archive::Symbol S) : Symbol(LazyArchiveKind, &File, S.getName(), llvm::ELF::STB_GLOBAL, llvm::ELF::STV_DEFAULT, Type), Sym(S) {} @@ -281,7 +281,7 @@ // --start-lib and --end-lib options. class LazyObject : public Symbol { public: - LazyObject(InputFile &File, StringRef Name, uint8_t Type) + LazyObject(InputFile &File, uint8_t Type, StringRef Name) : Symbol(LazyObjectKind, &File, Name, llvm::ELF::STB_GLOBAL, llvm::ELF::STV_DEFAULT, Type) {}