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