xref: /freebsd/contrib/llvm-project/lld/MachO/SymbolTable.h (revision fe6060f10f634930ff71b7c50291ddc610da2475)
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 
12*fe6060f1SDimitry Andric #include "Symbols.h"
13*fe6060f1SDimitry 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;
25*fe6060f1SDimitry Andric class ObjFile;
265ffd83dbSDimitry Andric class InputSection;
27e8d8bef9SDimitry Andric class MachHeaderSection;
285ffd83dbSDimitry Andric class Symbol;
29*fe6060f1SDimitry Andric class Defined;
30*fe6060f1SDimitry 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:
40*fe6060f1SDimitry Andric   Defined *addDefined(StringRef name, InputFile *, InputSection *,
41*fe6060f1SDimitry Andric                       uint64_t value, uint64_t size, bool isWeakDef,
42*fe6060f1SDimitry Andric                       bool isPrivateExtern, bool isThumb,
43*fe6060f1SDimitry Andric                       bool isReferencedDynamically, bool noDeadStrip);
445ffd83dbSDimitry Andric 
45*fe6060f1SDimitry Andric   Symbol *addUndefined(StringRef name, InputFile *, bool isWeakRef);
465ffd83dbSDimitry Andric 
47e8d8bef9SDimitry Andric   Symbol *addCommon(StringRef name, InputFile *, uint64_t size, uint32_t align,
48e8d8bef9SDimitry Andric                     bool isPrivateExtern);
49e8d8bef9SDimitry Andric 
50e8d8bef9SDimitry Andric   Symbol *addDylib(StringRef name, DylibFile *file, bool isWeakDef, bool isTlv);
51*fe6060f1SDimitry Andric   Symbol *addDynamicLookup(StringRef name);
525ffd83dbSDimitry Andric 
535ffd83dbSDimitry Andric   Symbol *addLazy(StringRef name, ArchiveFile *file,
545ffd83dbSDimitry Andric                   const llvm::object::Archive::Symbol &sym);
555ffd83dbSDimitry Andric 
56*fe6060f1SDimitry Andric   Defined *addSynthetic(StringRef name, InputSection *, uint64_t value,
57*fe6060f1SDimitry Andric                         bool isPrivateExtern, bool includeInSymtab,
58*fe6060f1SDimitry Andric                         bool referencedDynamically);
59e8d8bef9SDimitry Andric 
605ffd83dbSDimitry Andric   ArrayRef<Symbol *> getSymbols() const { return symVector; }
61*fe6060f1SDimitry Andric   Symbol *find(llvm::CachedHashStringRef name);
62*fe6060f1SDimitry Andric   Symbol *find(StringRef name) { return find(llvm::CachedHashStringRef(name)); }
635ffd83dbSDimitry Andric 
645ffd83dbSDimitry Andric private:
65*fe6060f1SDimitry Andric   std::pair<Symbol *, bool> insert(StringRef name, const InputFile *);
665ffd83dbSDimitry Andric   llvm::DenseMap<llvm::CachedHashStringRef, int> symMap;
675ffd83dbSDimitry Andric   std::vector<Symbol *> symVector;
685ffd83dbSDimitry Andric };
695ffd83dbSDimitry Andric 
70*fe6060f1SDimitry Andric void treatUndefinedSymbol(const Undefined &, StringRef source = "");
71e8d8bef9SDimitry Andric 
725ffd83dbSDimitry Andric extern SymbolTable *symtab;
735ffd83dbSDimitry Andric 
745ffd83dbSDimitry Andric } // namespace macho
755ffd83dbSDimitry Andric } // namespace lld
765ffd83dbSDimitry Andric 
775ffd83dbSDimitry Andric #endif
78