diff options
Diffstat (limited to 'contrib/llvm/tools/lld/ELF/SymbolTable.h')
-rw-r--r-- | contrib/llvm/tools/lld/ELF/SymbolTable.h | 92 |
1 files changed, 50 insertions, 42 deletions
diff --git a/contrib/llvm/tools/lld/ELF/SymbolTable.h b/contrib/llvm/tools/lld/ELF/SymbolTable.h index 40415b6..f39dbd1 100644 --- a/contrib/llvm/tools/lld/ELF/SymbolTable.h +++ b/contrib/llvm/tools/lld/ELF/SymbolTable.h @@ -12,16 +12,16 @@ #include "InputFiles.h" #include "LTO.h" +#include "Strings.h" +#include "llvm/ADT/CachedHashString.h" #include "llvm/ADT/DenseMap.h" namespace lld { namespace elf { class Lazy; -template <class ELFT> class OutputSectionBase; +class OutputSectionBase; struct Symbol; -typedef llvm::CachedHash<StringRef> SymName; - // 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). @@ -39,40 +39,39 @@ template <class ELFT> class SymbolTable { typedef typename ELFT::uint uintX_t; public: - void addFile(std::unique_ptr<InputFile> File); - void addCombinedLtoObject(); - - llvm::ArrayRef<Symbol *> getSymbols() const { return SymVector; } + void addFile(InputFile *File); + void addCombinedLTOObject(); - const std::vector<std::unique_ptr<ObjectFile<ELFT>>> &getObjectFiles() const { - return ObjectFiles; - } - - const std::vector<std::unique_ptr<SharedFile<ELFT>>> &getSharedFiles() const { - return SharedFiles; - } + ArrayRef<Symbol *> getSymbols() const { return SymVector; } + ArrayRef<ObjectFile<ELFT> *> getObjectFiles() const { return ObjectFiles; } + ArrayRef<BinaryFile *> getBinaryFiles() const { return BinaryFiles; } + ArrayRef<SharedFile<ELFT> *> getSharedFiles() const { return SharedFiles; } DefinedRegular<ELFT> *addAbsolute(StringRef Name, - uint8_t Visibility = llvm::ELF::STV_HIDDEN); + uint8_t Visibility = llvm::ELF::STV_HIDDEN, + uint8_t Binding = llvm::ELF::STB_GLOBAL); DefinedRegular<ELFT> *addIgnored(StringRef Name, uint8_t Visibility = llvm::ELF::STV_HIDDEN); Symbol *addUndefined(StringRef Name); - Symbol *addUndefined(StringRef Name, uint8_t Binding, uint8_t StOther, - uint8_t Type, bool CanOmitFromDynSym, InputFile *File); - - Symbol *addRegular(StringRef Name, const Elf_Sym &Sym, - InputSectionBase<ELFT> *Section); - Symbol *addRegular(StringRef Name, uint8_t Binding, uint8_t StOther); - Symbol *addSynthetic(StringRef N, OutputSectionBase<ELFT> *Section, - uintX_t Value); + Symbol *addUndefined(StringRef Name, bool IsLocal, uint8_t Binding, + uint8_t StOther, uint8_t Type, bool CanOmitFromDynSym, + InputFile *File); + + Symbol *addRegular(StringRef Name, uint8_t StOther, uint8_t Type, + uintX_t Value, uintX_t Size, uint8_t Binding, + InputSectionBase<ELFT> *Section, InputFile *File); + + Symbol *addSynthetic(StringRef N, const OutputSectionBase *Section, + uintX_t Value, uint8_t StOther); + void addShared(SharedFile<ELFT> *F, StringRef Name, const Elf_Sym &Sym, const typename ELFT::Verdef *Verdef); void addLazyArchive(ArchiveFile *F, const llvm::object::Archive::Symbol S); void addLazyObject(StringRef Name, LazyObjectFile &Obj); - Symbol *addBitcode(StringRef Name, bool IsWeak, uint8_t StOther, uint8_t Type, - bool CanOmitFromDynSym, BitcodeFile *File); + Symbol *addBitcode(StringRef Name, uint8_t Binding, uint8_t StOther, + uint8_t Type, bool CanOmitFromDynSym, BitcodeFile *File); Symbol *addCommon(StringRef N, uint64_t Size, uint64_t Alignment, uint8_t Binding, uint8_t StOther, uint8_t Type, @@ -80,28 +79,33 @@ public: void scanUndefinedFlags(); void scanShlibUndefined(); - void scanDynamicList(); void scanVersionScript(); - void scanSymbolVersions(); SymbolBody *find(StringRef Name); + SymbolBody *findInCurrentDSO(StringRef Name); void trace(StringRef Name); void wrap(StringRef Name); + std::vector<InputSectionBase<ELFT> *> Sections; + private: - std::vector<SymbolBody *> findAll(StringRef Pattern); std::pair<Symbol *, bool> insert(StringRef Name); std::pair<Symbol *, bool> insert(StringRef Name, uint8_t Type, uint8_t Visibility, bool CanOmitFromDynSym, - bool IsUsedInRegularObj, InputFile *File); + InputFile *File); - std::string conflictMsg(SymbolBody *Existing, InputFile *NewFile); - void reportDuplicate(SymbolBody *Existing, InputFile *NewFile); + std::vector<SymbolBody *> findByVersion(SymbolVersion Ver); + std::vector<SymbolBody *> findAllByVersion(SymbolVersion Ver); - std::map<std::string, SymbolBody *> getDemangledSyms(); + llvm::StringMap<std::vector<SymbolBody *>> &getDemangledSyms(); + void handleAnonymousVersion(); + void assignExactVersion(SymbolVersion Ver, uint16_t VersionId, + StringRef VersionName); + void assignWildcardVersion(SymbolVersion Ver, uint16_t VersionId); struct SymIndex { + SymIndex(int Idx, bool Traced) : Idx(Idx), Traced(Traced) {} int Idx : 31; unsigned Traced : 1; }; @@ -113,26 +117,30 @@ private: // but a bit inefficient. // FIXME: Experiment with passing in a custom hashing or sorting the symbols // once symbol resolution is finished. - llvm::DenseMap<SymName, SymIndex> Symtab; + llvm::DenseMap<llvm::CachedHashStringRef, SymIndex> Symtab; std::vector<Symbol *> SymVector; - llvm::BumpPtrAllocator Alloc; // Comdat groups define "link once" sections. If two comdat groups have the // same name, only one of them is linked, and the other is ignored. This set // is used to uniquify them. - llvm::DenseSet<StringRef> ComdatGroups; + llvm::DenseSet<llvm::CachedHashStringRef> ComdatGroups; - // The symbol table owns all file objects. - std::vector<std::unique_ptr<ArchiveFile>> ArchiveFiles; - std::vector<std::unique_ptr<ObjectFile<ELFT>>> ObjectFiles; - std::vector<std::unique_ptr<LazyObjectFile>> LazyObjectFiles; - std::vector<std::unique_ptr<SharedFile<ELFT>>> SharedFiles; - std::vector<std::unique_ptr<BitcodeFile>> BitcodeFiles; + std::vector<ObjectFile<ELFT> *> ObjectFiles; + std::vector<SharedFile<ELFT> *> SharedFiles; + std::vector<BitcodeFile *> BitcodeFiles; + std::vector<BinaryFile *> BinaryFiles; // Set of .so files to not link the same shared object file more than once. llvm::DenseSet<StringRef> SoNames; - std::unique_ptr<BitcodeCompiler> Lto; + // A map from demangled symbol names to their symbol objects. + // This mapping is 1:N because two symbols with different versions + // can have the same name. We use this map to handle "extern C++ {}" + // directive in version scripts. + llvm::Optional<llvm::StringMap<std::vector<SymbolBody *>>> DemangledSyms; + + // For LTO. + std::unique_ptr<BitcodeCompiler> LTO; }; template <class ELFT> struct Symtab { static SymbolTable<ELFT> *X; }; |