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 195ffd83dbSDimitry Andric namespace lld { 205ffd83dbSDimitry Andric namespace macho { 215ffd83dbSDimitry Andric 225ffd83dbSDimitry Andric class ArchiveFile; 235ffd83dbSDimitry Andric class DylibFile; 24e8d8bef9SDimitry Andric class InputFile; 25fe6060f1SDimitry Andric class ObjFile; 265ffd83dbSDimitry Andric class InputSection; 27e8d8bef9SDimitry Andric class MachHeaderSection; 285ffd83dbSDimitry Andric class Symbol; 29fe6060f1SDimitry Andric class Defined; 30fe6060f1SDimitry Andric class Undefined; 315ffd83dbSDimitry Andric 32e8d8bef9SDimitry Andric /* 33e8d8bef9SDimitry Andric * Note that the SymbolTable handles name collisions by calling 34e8d8bef9SDimitry Andric * replaceSymbol(), which does an in-place update of the Symbol via `placement 35e8d8bef9SDimitry Andric * new`. Therefore, there is no need to update any relocations that hold 36e8d8bef9SDimitry Andric * pointers the "old" Symbol -- they will automatically point to the new one. 37e8d8bef9SDimitry Andric */ 385ffd83dbSDimitry Andric class SymbolTable { 395ffd83dbSDimitry Andric public: 40fe6060f1SDimitry Andric Defined *addDefined(StringRef name, InputFile *, InputSection *, 41fe6060f1SDimitry Andric uint64_t value, uint64_t size, bool isWeakDef, 42fe6060f1SDimitry Andric bool isPrivateExtern, bool isThumb, 43349cc55cSDimitry Andric bool isReferencedDynamically, bool noDeadStrip, 44349cc55cSDimitry Andric bool isWeakDefCanBeHidden); 455ffd83dbSDimitry Andric 46fe6060f1SDimitry Andric Symbol *addUndefined(StringRef name, InputFile *, bool isWeakRef); 475ffd83dbSDimitry Andric 48e8d8bef9SDimitry Andric Symbol *addCommon(StringRef name, InputFile *, uint64_t size, uint32_t align, 49e8d8bef9SDimitry Andric bool isPrivateExtern); 50e8d8bef9SDimitry Andric 51e8d8bef9SDimitry Andric Symbol *addDylib(StringRef name, DylibFile *file, bool isWeakDef, bool isTlv); 52fe6060f1SDimitry Andric Symbol *addDynamicLookup(StringRef name); 535ffd83dbSDimitry Andric 54*04eeddc0SDimitry Andric Symbol *addLazyArchive(StringRef name, ArchiveFile *file, 555ffd83dbSDimitry Andric const llvm::object::Archive::Symbol &sym); 56*04eeddc0SDimitry Andric Symbol *addLazyObject(StringRef name, InputFile &file); 575ffd83dbSDimitry Andric 58fe6060f1SDimitry Andric Defined *addSynthetic(StringRef name, InputSection *, uint64_t value, 59fe6060f1SDimitry Andric bool isPrivateExtern, bool includeInSymtab, 60fe6060f1SDimitry Andric bool referencedDynamically); 61e8d8bef9SDimitry Andric 625ffd83dbSDimitry Andric ArrayRef<Symbol *> getSymbols() const { return symVector; } 63fe6060f1SDimitry Andric Symbol *find(llvm::CachedHashStringRef name); 64fe6060f1SDimitry Andric Symbol *find(StringRef name) { return find(llvm::CachedHashStringRef(name)); } 655ffd83dbSDimitry Andric 665ffd83dbSDimitry Andric private: 67fe6060f1SDimitry Andric std::pair<Symbol *, bool> insert(StringRef name, const InputFile *); 685ffd83dbSDimitry Andric llvm::DenseMap<llvm::CachedHashStringRef, int> symMap; 695ffd83dbSDimitry Andric std::vector<Symbol *> symVector; 705ffd83dbSDimitry Andric }; 715ffd83dbSDimitry Andric 72fe6060f1SDimitry Andric void treatUndefinedSymbol(const Undefined &, StringRef source = ""); 73e8d8bef9SDimitry Andric 74*04eeddc0SDimitry Andric extern std::unique_ptr<SymbolTable> symtab; 755ffd83dbSDimitry Andric 765ffd83dbSDimitry Andric } // namespace macho 775ffd83dbSDimitry Andric } // namespace lld 785ffd83dbSDimitry Andric 795ffd83dbSDimitry Andric #endif 80