xref: /freebsd/contrib/llvm-project/lld/MachO/SymbolTable.h (revision 04eeddc0aa8e0a417a16eaf9d7d095207f4a8623)
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