1//===- llvm/CodeGen/MachineModuleInfoImpls.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// This file defines object-file format specific implementations of
10// MachineModuleInfoImpl.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CODEGEN_MACHINEMODULEINFOIMPLS_H
15#define LLVM_CODEGEN_MACHINEMODULEINFOIMPLS_H
16
17#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/SetVector.h"
19#include "llvm/CodeGen/MachineModuleInfo.h"
20#include <cassert>
21
22namespace llvm {
23
24class MCSymbol;
25
26/// MachineModuleInfoMachO - This is a MachineModuleInfoImpl implementation
27/// for MachO targets.
28class MachineModuleInfoMachO : public MachineModuleInfoImpl {
29 /// GVStubs - Darwin '$non_lazy_ptr' stubs. The key is something like
30 /// "Lfoo$non_lazy_ptr", the value is something like "_foo". The extra bit
31 /// is true if this GV is external.
32 DenseMap<MCSymbol *, StubValueTy> GVStubs;
33
34 /// ThreadLocalGVStubs - Darwin '$non_lazy_ptr' stubs. The key is something
35 /// like "Lfoo$non_lazy_ptr", the value is something like "_foo". The extra
36 /// bit is true if this GV is external.
37 DenseMap<MCSymbol *, StubValueTy> ThreadLocalGVStubs;
38
39 /// Darwin '$auth_ptr' stubs. The key is the stub symbol, like
40 /// "Lfoo$auth_ptr$ib$12". The value is the MCExpr representing that
41 /// signed pointer, something like "_foo@AUTH(ib, 12)".
42 DenseMap<MCSymbol *, const MCExpr *> AuthPtrStubs;
43
44 virtual void anchor(); // Out of line virtual method.
45
46public:
47 MachineModuleInfoMachO(const MachineModuleInfo &) {}
48
49 StubValueTy &getGVStubEntry(MCSymbol *Sym) {
50 assert(Sym && "Key cannot be null");
51 return GVStubs[Sym];
52 }
53
54 StubValueTy &getThreadLocalGVStubEntry(MCSymbol *Sym) {
55 assert(Sym && "Key cannot be null");
56 return ThreadLocalGVStubs[Sym];
57 }
58
59 const MCExpr *&getAuthPtrStubEntry(MCSymbol *Sym) {
60 assert(Sym && "Key cannot be null");
61 return AuthPtrStubs[Sym];
62 }
63
64 /// Accessor methods to return the set of stubs in sorted order.
65 SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); }
66 SymbolListTy GetThreadLocalGVStubList() {
67 return getSortedStubs(ThreadLocalGVStubs);
68 }
69
70 ExprStubListTy getAuthGVStubList() {
71 return getSortedExprStubs(AuthPtrStubs);
72 }
73};
74
75/// MachineModuleInfoELF - This is a MachineModuleInfoImpl implementation
76/// for ELF targets.
77class MachineModuleInfoELF : public MachineModuleInfoImpl {
78 /// GVStubs - These stubs are used to materialize global addresses in PIC
79 /// mode.
80 DenseMap<MCSymbol *, StubValueTy> GVStubs;
81
82 /// AuthPtrStubs - These stubs are used to materialize signed addresses for
83 /// extern_weak symbols.
84 DenseMap<MCSymbol *, const MCExpr *> AuthPtrStubs;
85
86 virtual void anchor(); // Out of line virtual method.
87
88public:
89 MachineModuleInfoELF(const MachineModuleInfo &) {}
90
91 StubValueTy &getGVStubEntry(MCSymbol *Sym) {
92 assert(Sym && "Key cannot be null");
93 return GVStubs[Sym];
94 }
95
96 const MCExpr *&getAuthPtrStubEntry(MCSymbol *Sym) {
97 assert(Sym && "Key cannot be null");
98 return AuthPtrStubs[Sym];
99 }
100
101 /// Accessor methods to return the set of stubs in sorted order.
102
103 SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); }
104
105 ExprStubListTy getAuthGVStubList() {
106 return getSortedExprStubs(AuthPtrStubs);
107 }
108};
109
110/// MachineModuleInfoCOFF - This is a MachineModuleInfoImpl implementation
111/// for COFF targets.
112class MachineModuleInfoCOFF : public MachineModuleInfoImpl {
113 /// GVStubs - These stubs are used to materialize global addresses in PIC
114 /// mode.
115 DenseMap<MCSymbol *, StubValueTy> GVStubs;
116
117 virtual void anchor(); // Out of line virtual method.
118
119public:
120 MachineModuleInfoCOFF(const MachineModuleInfo &) {}
121
122 StubValueTy &getGVStubEntry(MCSymbol *Sym) {
123 assert(Sym && "Key cannot be null");
124 return GVStubs[Sym];
125 }
126
127 /// Accessor methods to return the set of stubs in sorted order.
128
129 SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); }
130};
131
132/// MachineModuleInfoWasm - This is a MachineModuleInfoImpl implementation
133/// for Wasm targets.
134class MachineModuleInfoWasm : public MachineModuleInfoImpl {
135 virtual void anchor(); // Out of line virtual method.
136
137public:
138 MachineModuleInfoWasm(const MachineModuleInfo &) {}
139
140 SetVector<StringRef> MachineSymbolsUsed;
141};
142
143} // end namespace llvm
144
145#endif // LLVM_CODEGEN_MACHINEMODULEINFOIMPLS_H
146