Index: ELF/MarkLive.cpp =================================================================== --- ELF/MarkLive.cpp +++ ELF/MarkLive.cpp @@ -113,7 +113,7 @@ // Preserve externally-visible symbols if the symbols defined by this // file can interrupt other ELF file's symbols at runtime. if (Config->Shared || Config->ExportDynamic) { - for (const std::pair &P : Symtab->getSymbols()) { + for (const std::pair &P : Symtab->getSymbols()) { SymbolBody *B = P.second->Body; if (B->getVisibility() == STV_DEFAULT) MarkSymbol(B); Index: ELF/SymbolTable.h =================================================================== --- ELF/SymbolTable.h +++ ELF/SymbolTable.h @@ -20,6 +20,40 @@ template class OutputSectionBase; struct Symbol; +struct SymName { + SymName(StringRef Name) : Name(Name) { + HashValue = llvm::DenseMapInfo::getHashValue(Name); + } + SymName(StringRef Name, unsigned HashValue) + : Name(Name), HashValue(HashValue) {} + StringRef Name; + unsigned HashValue; +}; +} +} + +namespace llvm { +template <> struct DenseMapInfo { + static lld::elf::SymName getEmptyKey() { + StringRef N = DenseMapInfo::getEmptyKey(); + return {N, 0}; + } + static lld::elf::SymName getTombstoneKey() { + StringRef N = DenseMapInfo::getTombstoneKey(); + return {N, 0}; + } + static unsigned getHashValue(lld::elf::SymName Name) { + return Name.HashValue; + } + static bool isEqual(lld::elf::SymName A, lld::elf::SymName B) { + return A.Name == B.Name; + } +}; +} + +namespace lld { +namespace elf { + // SymbolTable is a bucket of all known symbols, including defined, // undefined, or lazy symbols (the last one is symbols in archive // files whose archive members are not yet loaded). @@ -38,7 +72,7 @@ void addFile(std::unique_ptr File); void addCombinedLtoObject(); - const llvm::MapVector &getSymbols() const { + const llvm::MapVector &getSymbols() const { return Symtab; } @@ -78,7 +112,7 @@ // a bit inefficient. // FIXME: Experiment with passing in a custom hashing or sorting the symbols // once symbol resolution is finished. - llvm::MapVector Symtab; + llvm::MapVector Symtab; llvm::BumpPtrAllocator Alloc; // Comdat groups define "link once" sections. If two comdat groups have the