173
|
1 //===- SymbolTable.h --------------------------------------------*- C++ -*-===//
|
|
2 //
|
|
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
4 // See https://llvm.org/LICENSE.txt for license information.
|
|
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
6 //
|
|
7 //===----------------------------------------------------------------------===//
|
|
8
|
|
9 #ifndef LLD_MACHO_SYMBOL_TABLE_H
|
|
10 #define LLD_MACHO_SYMBOL_TABLE_H
|
|
11
|
207
|
12 #include "Symbols.h"
|
|
13
|
173
|
14 #include "lld/Common/LLVM.h"
|
|
15 #include "llvm/ADT/CachedHashString.h"
|
|
16 #include "llvm/ADT/DenseMap.h"
|
|
17 #include "llvm/Object/Archive.h"
|
|
18
|
|
19 namespace lld {
|
|
20 namespace macho {
|
|
21
|
|
22 class ArchiveFile;
|
|
23 class DylibFile;
|
207
|
24 class InputFile;
|
|
25 class ObjFile;
|
173
|
26 class InputSection;
|
207
|
27 class MachHeaderSection;
|
173
|
28 class Symbol;
|
207
|
29 class Defined;
|
|
30 class Undefined;
|
173
|
31
|
207
|
32 /*
|
|
33 * Note that the SymbolTable handles name collisions by calling
|
|
34 * replaceSymbol(), which does an in-place update of the Symbol via `placement
|
|
35 * new`. Therefore, there is no need to update any relocations that hold
|
|
36 * pointers the "old" Symbol -- they will automatically point to the new one.
|
|
37 */
|
173
|
38 class SymbolTable {
|
|
39 public:
|
207
|
40 Defined *addDefined(StringRef name, InputFile *, InputSection *,
|
|
41 uint64_t value, uint64_t size, bool isWeakDef,
|
|
42 bool isPrivateExtern, bool isThumb,
|
|
43 bool isReferencedDynamically, bool noDeadStrip);
|
173
|
44
|
207
|
45 Symbol *addUndefined(StringRef name, InputFile *, bool isWeakRef);
|
173
|
46
|
207
|
47 Symbol *addCommon(StringRef name, InputFile *, uint64_t size, uint32_t align,
|
|
48 bool isPrivateExtern);
|
|
49
|
|
50 Symbol *addDylib(StringRef name, DylibFile *file, bool isWeakDef, bool isTlv);
|
|
51 Symbol *addDynamicLookup(StringRef name);
|
173
|
52
|
|
53 Symbol *addLazy(StringRef name, ArchiveFile *file,
|
|
54 const llvm::object::Archive::Symbol &sym);
|
|
55
|
207
|
56 Defined *addSynthetic(StringRef name, InputSection *, uint64_t value,
|
|
57 bool isPrivateExtern, bool includeInSymtab,
|
|
58 bool referencedDynamically);
|
|
59
|
173
|
60 ArrayRef<Symbol *> getSymbols() const { return symVector; }
|
207
|
61 Symbol *find(llvm::CachedHashStringRef name);
|
|
62 Symbol *find(StringRef name) { return find(llvm::CachedHashStringRef(name)); }
|
173
|
63
|
|
64 private:
|
207
|
65 std::pair<Symbol *, bool> insert(StringRef name, const InputFile *);
|
173
|
66 llvm::DenseMap<llvm::CachedHashStringRef, int> symMap;
|
|
67 std::vector<Symbol *> symVector;
|
|
68 };
|
|
69
|
207
|
70 void treatUndefinedSymbol(const Undefined &, StringRef source = "");
|
|
71
|
173
|
72 extern SymbolTable *symtab;
|
|
73
|
|
74 } // namespace macho
|
|
75 } // namespace lld
|
|
76
|
|
77 #endif
|