15ffd83dbSDimitry Andric //===- SymbolTable.h --------------------------------------------*- C++ -*-===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric 95ffd83dbSDimitry Andric #ifndef LLD_MACHO_SYMBOL_TABLE_H 105ffd83dbSDimitry Andric #define LLD_MACHO_SYMBOL_TABLE_H 115ffd83dbSDimitry Andric 12fe6060f1SDimitry Andric #include "Symbols.h" 13fe6060f1SDimitry Andric 145ffd83dbSDimitry Andric #include "lld/Common/LLVM.h" 155ffd83dbSDimitry Andric #include "llvm/ADT/CachedHashString.h" 165ffd83dbSDimitry Andric #include "llvm/ADT/DenseMap.h" 175ffd83dbSDimitry Andric #include "llvm/Object/Archive.h" 185ffd83dbSDimitry Andric 19bdd1243dSDimitry Andric namespace lld::macho { 205ffd83dbSDimitry Andric 215ffd83dbSDimitry Andric class ArchiveFile; 225ffd83dbSDimitry Andric class DylibFile; 23e8d8bef9SDimitry Andric class InputFile; 24fe6060f1SDimitry Andric class ObjFile; 255ffd83dbSDimitry Andric class InputSection; 26e8d8bef9SDimitry Andric class MachHeaderSection; 275ffd83dbSDimitry Andric class Symbol; 28fe6060f1SDimitry Andric class Defined; 29fe6060f1SDimitry Andric class Undefined; 305ffd83dbSDimitry Andric 31e8d8bef9SDimitry Andric /* 32e8d8bef9SDimitry Andric * Note that the SymbolTable handles name collisions by calling 33e8d8bef9SDimitry Andric * replaceSymbol(), which does an in-place update of the Symbol via `placement 34e8d8bef9SDimitry Andric * new`. Therefore, there is no need to update any relocations that hold 35e8d8bef9SDimitry Andric * pointers the "old" Symbol -- they will automatically point to the new one. 36e8d8bef9SDimitry Andric */ 375ffd83dbSDimitry Andric class SymbolTable { 385ffd83dbSDimitry Andric public: 39fe6060f1SDimitry Andric Defined *addDefined(StringRef name, InputFile *, InputSection *, 40fe6060f1SDimitry Andric uint64_t value, uint64_t size, bool isWeakDef, 41*06c3fb27SDimitry Andric bool isPrivateExtern, bool isReferencedDynamically, 42*06c3fb27SDimitry Andric bool noDeadStrip, bool isWeakDefCanBeHidden); 435ffd83dbSDimitry Andric 44bdd1243dSDimitry Andric Defined *aliasDefined(Defined *src, StringRef target, InputFile *newFile, 45bdd1243dSDimitry Andric bool makePrivateExtern = false); 46fcaf7f86SDimitry Andric 47fe6060f1SDimitry Andric Symbol *addUndefined(StringRef name, InputFile *, bool isWeakRef); 485ffd83dbSDimitry Andric 49e8d8bef9SDimitry Andric Symbol *addCommon(StringRef name, InputFile *, uint64_t size, uint32_t align, 50e8d8bef9SDimitry Andric bool isPrivateExtern); 51e8d8bef9SDimitry Andric 52e8d8bef9SDimitry Andric Symbol *addDylib(StringRef name, DylibFile *file, bool isWeakDef, bool isTlv); 53fe6060f1SDimitry Andric Symbol *addDynamicLookup(StringRef name); 545ffd83dbSDimitry Andric 5504eeddc0SDimitry Andric Symbol *addLazyArchive(StringRef name, ArchiveFile *file, 565ffd83dbSDimitry Andric const llvm::object::Archive::Symbol &sym); 5704eeddc0SDimitry Andric Symbol *addLazyObject(StringRef name, InputFile &file); 585ffd83dbSDimitry Andric 59fe6060f1SDimitry Andric Defined *addSynthetic(StringRef name, InputSection *, uint64_t value, 60fe6060f1SDimitry Andric bool isPrivateExtern, bool includeInSymtab, 61fe6060f1SDimitry Andric bool referencedDynamically); 62e8d8bef9SDimitry Andric getSymbols()635ffd83dbSDimitry Andric ArrayRef<Symbol *> getSymbols() const { return symVector; } 64fe6060f1SDimitry Andric Symbol *find(llvm::CachedHashStringRef name); find(StringRef name)65fe6060f1SDimitry Andric Symbol *find(StringRef name) { return find(llvm::CachedHashStringRef(name)); } 665ffd83dbSDimitry Andric 675ffd83dbSDimitry Andric private: 68fe6060f1SDimitry Andric std::pair<Symbol *, bool> insert(StringRef name, const InputFile *); 695ffd83dbSDimitry Andric llvm::DenseMap<llvm::CachedHashStringRef, int> symMap; 705ffd83dbSDimitry Andric std::vector<Symbol *> symVector; 715ffd83dbSDimitry Andric }; 725ffd83dbSDimitry Andric 7381ad6265SDimitry Andric void reportPendingUndefinedSymbols(); 74bdd1243dSDimitry Andric void reportPendingDuplicateSymbols(); 7581ad6265SDimitry Andric 7681ad6265SDimitry Andric // Call reportPendingUndefinedSymbols() to emit diagnostics. 7781ad6265SDimitry Andric void treatUndefinedSymbol(const Undefined &, StringRef source); 7881ad6265SDimitry Andric void treatUndefinedSymbol(const Undefined &, const InputSection *, 7981ad6265SDimitry Andric uint64_t offset); 80e8d8bef9SDimitry Andric 8104eeddc0SDimitry Andric extern std::unique_ptr<SymbolTable> symtab; 825ffd83dbSDimitry Andric 83bdd1243dSDimitry Andric } // namespace lld::macho 845ffd83dbSDimitry Andric 855ffd83dbSDimitry Andric #endif 86