Index: lld/trunk/wasm/InputFiles.cpp =================================================================== --- lld/trunk/wasm/InputFiles.cpp +++ lld/trunk/wasm/InputFiles.cpp @@ -117,9 +117,6 @@ TypeMap.resize(getWasmObj()->types().size()); TypeIsUsed.resize(getWasmObj()->types().size(), false); - for (StringRef Name : WasmObj->comdats()) - Symtab->addComdat(Name, this); - // Populate `Segments`. for (const WasmSegment &S : WasmObj->dataSegments()) { InputSegment *Seg = make(S, this); @@ -156,8 +153,10 @@ } bool ObjFile::isExcludedByComdat(InputChunk *Chunk) const { - StringRef Comdat = Chunk->getComdat(); - return !Comdat.empty() && Symtab->findComdat(Comdat) != this; + StringRef S = Chunk->getComdat(); + if (S.empty()) + return false; + return !Symtab->addComdat(S, this); } FunctionSymbol *ObjFile::getFunctionSymbol(uint32_t Index) const { Index: lld/trunk/wasm/SymbolTable.h =================================================================== --- lld/trunk/wasm/SymbolTable.h +++ lld/trunk/wasm/SymbolTable.h @@ -46,7 +46,6 @@ ArrayRef getSymbols() const { return SymVector; } Symbol *find(StringRef Name); - ObjFile *findComdat(StringRef Name) const; Symbol *addDefinedFunction(StringRef Name, uint32_t Flags, InputFile *File, InputFunction *Function); @@ -63,7 +62,8 @@ const WasmGlobalType *Type); void addLazy(ArchiveFile *F, const Archive::Symbol *Sym); - bool addComdat(StringRef Name, ObjFile *); + + bool addComdat(StringRef Name, const ObjFile *File); DefinedData *addSyntheticDataSymbol(StringRef Name, uint32_t Flags); DefinedGlobal *addSyntheticGlobal(StringRef Name, uint32_t Flags, @@ -75,9 +75,10 @@ private: std::pair insert(StringRef Name); - llvm::DenseMap ComdatMap; llvm::DenseMap SymMap; std::vector SymVector; + + llvm::DenseMap Comdats; }; extern SymbolTable *Symtab; Index: lld/trunk/wasm/SymbolTable.cpp =================================================================== --- lld/trunk/wasm/SymbolTable.cpp +++ lld/trunk/wasm/SymbolTable.cpp @@ -301,18 +301,6 @@ } } -bool SymbolTable::addComdat(StringRef Name, ObjFile *F) { - DEBUG(dbgs() << "addComdat: " << Name << "\n"); - ObjFile *&File = ComdatMap[CachedHashStringRef(Name)]; - if (File) { - DEBUG(dbgs() << "COMDAT already defined\n"); - return false; - } - File = F; - return true; -} - -ObjFile *SymbolTable::findComdat(StringRef Name) const { - auto It = ComdatMap.find(CachedHashStringRef(Name)); - return It == ComdatMap.end() ? nullptr : It->second; +bool SymbolTable::addComdat(StringRef Name, const ObjFile *File) { + return Comdats.insert({Name, File}).first->second == File; }