Index: lld/trunk/COFF/SymbolTable.h =================================================================== --- lld/trunk/COFF/SymbolTable.h +++ lld/trunk/COFF/SymbolTable.h @@ -108,7 +108,7 @@ } private: - std::pair insert(StringRef Name); + std::pair insert(StringRef Name, InputFile *F); StringRef findByPrefix(StringRef Prefix); llvm::DenseMap SymMap; Index: lld/trunk/COFF/SymbolTable.cpp =================================================================== --- lld/trunk/COFF/SymbolTable.cpp +++ lld/trunk/COFF/SymbolTable.cpp @@ -206,23 +206,25 @@ } } -std::pair SymbolTable::insert(StringRef Name) { +std::pair SymbolTable::insert(StringRef Name, InputFile *File) { + bool Inserted = false; Symbol *&Sym = SymMap[CachedHashStringRef(Name)]; - if (Sym) - return {Sym, false}; - Sym = reinterpret_cast(make()); - Sym->IsUsedInRegularObj = false; - Sym->PendingArchiveLoad = false; - return {Sym, true}; + if (!Sym) { + Sym = reinterpret_cast(make()); + Sym->IsUsedInRegularObj = false; + Sym->PendingArchiveLoad = false; + Inserted = true; + } + if (!File || !isa(File)) + Sym->IsUsedInRegularObj = true; + return {Sym, Inserted}; } Symbol *SymbolTable::addUndefined(StringRef Name, InputFile *F, bool IsWeakAlias) { Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(Name); - if (!F || !isa(F)) - S->IsUsedInRegularObj = true; + std::tie(S, WasInserted) = insert(Name, F); if (WasInserted || (isa(S) && IsWeakAlias)) { replaceSymbol(S, Name); return S; @@ -240,7 +242,7 @@ StringRef Name = Sym.getName(); Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(Name); + std::tie(S, WasInserted) = insert(Name, nullptr); if (WasInserted) { replaceSymbol(S, F, Sym); return; @@ -260,7 +262,7 @@ Symbol *SymbolTable::addAbsolute(StringRef N, COFFSymbolRef Sym) { Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(N); + std::tie(S, WasInserted) = insert(N, nullptr); S->IsUsedInRegularObj = true; if (WasInserted || isa(S) || isa(S)) replaceSymbol(S, N, Sym); @@ -272,7 +274,7 @@ Symbol *SymbolTable::addAbsolute(StringRef N, uint64_t VA) { Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(N); + std::tie(S, WasInserted) = insert(N, nullptr); S->IsUsedInRegularObj = true; if (WasInserted || isa(S) || isa(S)) replaceSymbol(S, N, VA); @@ -284,7 +286,7 @@ Symbol *SymbolTable::addSynthetic(StringRef N, Chunk *C) { Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(N); + std::tie(S, WasInserted) = insert(N, nullptr); S->IsUsedInRegularObj = true; if (WasInserted || isa(S) || isa(S)) replaceSymbol(S, N, C); @@ -298,9 +300,7 @@ SectionChunk *C) { Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(N); - if (!isa(F)) - S->IsUsedInRegularObj = true; + std::tie(S, WasInserted) = insert(N, F); if (WasInserted || !isa(S)) replaceSymbol(S, F, N, /*IsCOMDAT*/ false, /*IsExternal*/ true, Sym, C); @@ -314,9 +314,7 @@ const coff_symbol_generic *Sym) { Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(N); - if (!isa(F)) - S->IsUsedInRegularObj = true; + std::tie(S, WasInserted) = insert(N, F); if (WasInserted || !isa(S)) { replaceSymbol(S, F, N, /*IsCOMDAT*/ true, /*IsExternal*/ true, Sym, nullptr); @@ -331,9 +329,7 @@ const coff_symbol_generic *Sym, CommonChunk *C) { Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(N); - if (!isa(F)) - S->IsUsedInRegularObj = true; + std::tie(S, WasInserted) = insert(N, F); if (WasInserted || !isa(S)) replaceSymbol(S, F, N, Size, Sym, C); else if (auto *DC = dyn_cast(S)) @@ -345,7 +341,7 @@ Symbol *SymbolTable::addImportData(StringRef N, ImportFile *F) { Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(N); + std::tie(S, WasInserted) = insert(N, nullptr); S->IsUsedInRegularObj = true; if (WasInserted || isa(S) || isa(S)) { replaceSymbol(S, N, F); @@ -360,7 +356,7 @@ uint16_t Machine) { Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(Name); + std::tie(S, WasInserted) = insert(Name, nullptr); S->IsUsedInRegularObj = true; if (WasInserted || isa(S) || isa(S)) { replaceSymbol(S, Name, ID, Machine); Index: lld/trunk/wasm/SymbolTable.h =================================================================== --- lld/trunk/wasm/SymbolTable.h +++ lld/trunk/wasm/SymbolTable.h @@ -77,7 +77,7 @@ InputFunction *Function); private: - std::pair insert(StringRef Name); + std::pair insert(StringRef Name, InputFile *File); llvm::DenseMap SymMap; std::vector SymVector; Index: lld/trunk/wasm/SymbolTable.cpp =================================================================== --- lld/trunk/wasm/SymbolTable.cpp +++ lld/trunk/wasm/SymbolTable.cpp @@ -88,14 +88,18 @@ return SymMap.lookup(CachedHashStringRef(Name)); } -std::pair SymbolTable::insert(StringRef Name) { +std::pair SymbolTable::insert(StringRef Name, InputFile *File) { + bool Inserted = false; Symbol *&Sym = SymMap[CachedHashStringRef(Name)]; - if (Sym) - return {Sym, false}; - Sym = reinterpret_cast(make()); - Sym->IsUsedInRegularObj = false; - SymVector.emplace_back(Sym); - return {Sym, true}; + if (!Sym) { + Sym = reinterpret_cast(make()); + Sym->IsUsedInRegularObj = false; + SymVector.emplace_back(Sym); + Inserted = true; + } + if (!File || File->kind() == InputFile::ObjectKind) + Sym->IsUsedInRegularObj = true; + return {Sym, Inserted}; } static void reportTypeError(const Symbol *Existing, const InputFile *File, @@ -158,15 +162,15 @@ LLVM_DEBUG(dbgs() << "addSyntheticFunction: " << Name << "\n"); assert(!find(Name)); SyntheticFunctions.emplace_back(Function); - return replaceSymbol(insert(Name).first, Name, Flags, - nullptr, Function); + return replaceSymbol(insert(Name, nullptr).first, Name, + Flags, nullptr, Function); } DefinedData *SymbolTable::addSyntheticDataSymbol(StringRef Name, uint32_t Flags) { LLVM_DEBUG(dbgs() << "addSyntheticDataSymbol: " << Name << "\n"); assert(!find(Name)); - return replaceSymbol(insert(Name).first, Name, Flags); + return replaceSymbol(insert(Name, nullptr).first, Name, Flags); } DefinedGlobal *SymbolTable::addSyntheticGlobal(StringRef Name, uint32_t Flags, @@ -175,8 +179,8 @@ << "\n"); assert(!find(Name)); SyntheticGlobals.emplace_back(Global); - return replaceSymbol(insert(Name).first, Name, Flags, nullptr, - Global); + return replaceSymbol(insert(Name, nullptr).first, Name, Flags, + nullptr, Global); } static bool shouldReplace(const Symbol *Existing, InputFile *NewFile, @@ -213,10 +217,7 @@ LLVM_DEBUG(dbgs() << "addDefinedFunction: " << Name << "\n"); Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(Name); - - if (!File || File->kind() == InputFile::ObjectKind) - S->IsUsedInRegularObj = true; + std::tie(S, WasInserted) = insert(Name, File); if (WasInserted || S->isLazy()) { replaceSymbol(S, Name, Flags, File, Function); @@ -238,10 +239,7 @@ << "\n"); Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(Name); - - if (!File || File->kind() == InputFile::ObjectKind) - S->IsUsedInRegularObj = true; + std::tie(S, WasInserted) = insert(Name, File); if (WasInserted || S->isLazy()) { replaceSymbol(S, Name, Flags, File, Segment, Address, Size); @@ -258,12 +256,10 @@ Symbol *SymbolTable::addDefinedGlobal(StringRef Name, uint32_t Flags, InputFile *File, InputGlobal *Global) { LLVM_DEBUG(dbgs() << "addDefinedGlobal:" << Name << "\n"); + Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(Name); - - if (!File || File->kind() == InputFile::ObjectKind) - S->IsUsedInRegularObj = true; + std::tie(S, WasInserted) = insert(Name, File); if (WasInserted || S->isLazy()) { replaceSymbol(S, Name, Flags, File, Global); @@ -284,10 +280,7 @@ Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(Name); - - if (!File || File->kind() == InputFile::ObjectKind) - S->IsUsedInRegularObj = true; + std::tie(S, WasInserted) = insert(Name, File); if (WasInserted) replaceSymbol(S, Name, Flags, File, Sig); @@ -305,10 +298,7 @@ Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(Name); - - if (!File || File->kind() == InputFile::ObjectKind) - S->IsUsedInRegularObj = true; + std::tie(S, WasInserted) = insert(Name, File); if (WasInserted) replaceSymbol(S, Name, Flags, File); @@ -326,10 +316,7 @@ Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(Name); - - if (!File || File->kind() == InputFile::ObjectKind) - S->IsUsedInRegularObj = true; + std::tie(S, WasInserted) = insert(Name, File); if (WasInserted) replaceSymbol(S, Name, Flags, File, Type); @@ -346,7 +333,7 @@ Symbol *S; bool WasInserted; - std::tie(S, WasInserted) = insert(Name); + std::tie(S, WasInserted) = insert(Name, nullptr); if (WasInserted) { replaceSymbol(S, Name, File, *Sym);