diff options
-rw-r--r-- | lld/ELF/MarkLive.cpp | 2 | ||||
-rw-r--r-- | lld/ELF/SymbolTable.h | 35 |
2 files changed, 34 insertions, 3 deletions
diff --git a/lld/ELF/MarkLive.cpp b/lld/ELF/MarkLive.cpp index 56c89f60f6a..115bc57434d 100644 --- a/lld/ELF/MarkLive.cpp +++ b/lld/ELF/MarkLive.cpp @@ -113,7 +113,7 @@ template <class ELFT> void elf::markLive(SymbolTable<ELFT> *Symtab) { // 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<StringRef, Symbol *> &P : Symtab->getSymbols()) { + for (const std::pair<SymName, Symbol *> &P : Symtab->getSymbols()) { SymbolBody *B = P.second->Body; if (B->getVisibility() == STV_DEFAULT) MarkSymbol(B); diff --git a/lld/ELF/SymbolTable.h b/lld/ELF/SymbolTable.h index 9309b20fdfc..207d5b414e6 100644 --- a/lld/ELF/SymbolTable.h +++ b/lld/ELF/SymbolTable.h @@ -20,6 +20,37 @@ class Lazy; template <class ELFT> class OutputSectionBase; struct Symbol; +struct SymName { + SymName(StringRef Name) : Name(Name) { + Hash = llvm::DenseMapInfo<StringRef>::getHashValue(Name); + } + SymName(StringRef Name, unsigned Hash) : Name(Name), Hash(Hash) {} + StringRef Name; + unsigned Hash; +}; +} +} + +namespace llvm { +template <> struct DenseMapInfo<lld::elf::SymName> { + static lld::elf::SymName getEmptyKey() { + StringRef N = DenseMapInfo<StringRef>::getEmptyKey(); + return {N, 0}; + } + static lld::elf::SymName getTombstoneKey() { + StringRef N = DenseMapInfo<StringRef>::getTombstoneKey(); + return {N, 0}; + } + static unsigned getHashValue(lld::elf::SymName Name) { return Name.Hash; } + 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 +69,7 @@ public: void addFile(std::unique_ptr<InputFile> File); void addCombinedLtoObject(); - const llvm::MapVector<StringRef, Symbol *> &getSymbols() const { + const llvm::MapVector<SymName, Symbol *> &getSymbols() const { return Symtab; } @@ -79,7 +110,7 @@ private: // a bit inefficient. // FIXME: Experiment with passing in a custom hashing or sorting the symbols // once symbol resolution is finished. - llvm::MapVector<StringRef, Symbol *> Symtab; + llvm::MapVector<SymName, Symbol *> Symtab; llvm::BumpPtrAllocator Alloc; // Comdat groups define "link once" sections. If two comdat groups have the |