xref: /freebsd/contrib/llvm-project/llvm/include/llvm/CodeGen/MachineModuleInfoImpls.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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 
22 namespace llvm {
23 
24 class MCSymbol;
25 
26 /// MachineModuleInfoMachO - This is a MachineModuleInfoImpl implementation
27 /// for MachO targets.
28 class 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 
46 public:
MachineModuleInfoMachO(const MachineModuleInfo &)47   MachineModuleInfoMachO(const MachineModuleInfo &) {}
48 
getGVStubEntry(MCSymbol * Sym)49   StubValueTy &getGVStubEntry(MCSymbol *Sym) {
50     assert(Sym && "Key cannot be null");
51     return GVStubs[Sym];
52   }
53 
getThreadLocalGVStubEntry(MCSymbol * Sym)54   StubValueTy &getThreadLocalGVStubEntry(MCSymbol *Sym) {
55     assert(Sym && "Key cannot be null");
56     return ThreadLocalGVStubs[Sym];
57   }
58 
getAuthPtrStubEntry(MCSymbol * Sym)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.
GetGVStubList()65   SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); }
GetThreadLocalGVStubList()66   SymbolListTy GetThreadLocalGVStubList() {
67     return getSortedStubs(ThreadLocalGVStubs);
68   }
69 
getAuthGVStubList()70   ExprStubListTy getAuthGVStubList() {
71     return getSortedExprStubs(AuthPtrStubs);
72   }
73 };
74 
75 /// MachineModuleInfoELF - This is a MachineModuleInfoImpl implementation
76 /// for ELF targets.
77 class 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 
88 public:
MachineModuleInfoELF(const MachineModuleInfo &)89   MachineModuleInfoELF(const MachineModuleInfo &) {}
90 
getGVStubEntry(MCSymbol * Sym)91   StubValueTy &getGVStubEntry(MCSymbol *Sym) {
92     assert(Sym && "Key cannot be null");
93     return GVStubs[Sym];
94   }
95 
getAuthPtrStubEntry(MCSymbol * Sym)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 
GetGVStubList()103   SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); }
104 
getAuthGVStubList()105   ExprStubListTy getAuthGVStubList() {
106     return getSortedExprStubs(AuthPtrStubs);
107   }
108 };
109 
110 /// MachineModuleInfoCOFF - This is a MachineModuleInfoImpl implementation
111 /// for COFF targets.
112 class 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 
119 public:
MachineModuleInfoCOFF(const MachineModuleInfo &)120   MachineModuleInfoCOFF(const MachineModuleInfo &) {}
121 
getGVStubEntry(MCSymbol * Sym)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 
GetGVStubList()129   SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); }
130 };
131 
132 /// MachineModuleInfoWasm - This is a MachineModuleInfoImpl implementation
133 /// for Wasm targets.
134 class MachineModuleInfoWasm : public MachineModuleInfoImpl {
135   virtual void anchor(); // Out of line virtual method.
136 
137 public:
MachineModuleInfoWasm(const MachineModuleInfo &)138   MachineModuleInfoWasm(const MachineModuleInfo &) {}
139 
140   SetVector<StringRef> MachineSymbolsUsed;
141 };
142 
143 } // end namespace llvm
144 
145 #endif // LLVM_CODEGEN_MACHINEMODULEINFOIMPLS_H
146