xref: /freebsd/contrib/llvm-project/lld/MachO/SymbolTable.h (revision fcaf7f8644a9988098ac6be2165bce3ea4786e91)
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 
46*fcaf7f86SDimitry Andric   Defined *aliasDefined(Defined *src, StringRef target);
47*fcaf7f86SDimitry Andric 
48fe6060f1SDimitry Andric   Symbol *addUndefined(StringRef name, InputFile *, bool isWeakRef);
495ffd83dbSDimitry Andric 
50e8d8bef9SDimitry Andric   Symbol *addCommon(StringRef name, InputFile *, uint64_t size, uint32_t align,
51e8d8bef9SDimitry Andric                     bool isPrivateExtern);
52e8d8bef9SDimitry Andric 
53e8d8bef9SDimitry Andric   Symbol *addDylib(StringRef name, DylibFile *file, bool isWeakDef, bool isTlv);
54fe6060f1SDimitry Andric   Symbol *addDynamicLookup(StringRef name);
555ffd83dbSDimitry Andric 
5604eeddc0SDimitry Andric   Symbol *addLazyArchive(StringRef name, ArchiveFile *file,
575ffd83dbSDimitry Andric                          const llvm::object::Archive::Symbol &sym);
5804eeddc0SDimitry Andric   Symbol *addLazyObject(StringRef name, InputFile &file);
595ffd83dbSDimitry Andric 
60fe6060f1SDimitry Andric   Defined *addSynthetic(StringRef name, InputSection *, uint64_t value,
61fe6060f1SDimitry Andric                         bool isPrivateExtern, bool includeInSymtab,
62fe6060f1SDimitry Andric                         bool referencedDynamically);
63e8d8bef9SDimitry Andric 
645ffd83dbSDimitry Andric   ArrayRef<Symbol *> getSymbols() const { return symVector; }
65fe6060f1SDimitry Andric   Symbol *find(llvm::CachedHashStringRef name);
66fe6060f1SDimitry Andric   Symbol *find(StringRef name) { return find(llvm::CachedHashStringRef(name)); }
675ffd83dbSDimitry Andric 
685ffd83dbSDimitry Andric private:
69fe6060f1SDimitry Andric   std::pair<Symbol *, bool> insert(StringRef name, const InputFile *);
705ffd83dbSDimitry Andric   llvm::DenseMap<llvm::CachedHashStringRef, int> symMap;
715ffd83dbSDimitry Andric   std::vector<Symbol *> symVector;
725ffd83dbSDimitry Andric };
735ffd83dbSDimitry Andric 
7481ad6265SDimitry Andric void reportPendingUndefinedSymbols();
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 
835ffd83dbSDimitry Andric } // namespace macho
845ffd83dbSDimitry Andric } // namespace lld
855ffd83dbSDimitry Andric 
865ffd83dbSDimitry Andric #endif
87