diff options
Diffstat (limited to 'lld/ELF/SymbolTable.h')
-rw-r--r-- | lld/ELF/SymbolTable.h | 35 |
1 files changed, 33 insertions, 2 deletions
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 |