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   virtual void anchor(); // Out of line virtual method.
40 
41 public:
42   MachineModuleInfoMachO(const MachineModuleInfo &) {}
43 
44   StubValueTy &getGVStubEntry(MCSymbol *Sym) {
45     assert(Sym && "Key cannot be null");
46     return GVStubs[Sym];
47   }
48 
49   StubValueTy &getThreadLocalGVStubEntry(MCSymbol *Sym) {
50     assert(Sym && "Key cannot be null");
51     return ThreadLocalGVStubs[Sym];
52   }
53 
54   /// Accessor methods to return the set of stubs in sorted order.
55   SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); }
56   SymbolListTy GetThreadLocalGVStubList() {
57     return getSortedStubs(ThreadLocalGVStubs);
58   }
59 };
60 
61 /// MachineModuleInfoELF - This is a MachineModuleInfoImpl implementation
62 /// for ELF targets.
63 class MachineModuleInfoELF : public MachineModuleInfoImpl {
64   /// GVStubs - These stubs are used to materialize global addresses in PIC
65   /// mode.
66   DenseMap<MCSymbol *, StubValueTy> GVStubs;
67 
68   virtual void anchor(); // Out of line virtual method.
69 
70 public:
71   MachineModuleInfoELF(const MachineModuleInfo &) {}
72 
73   StubValueTy &getGVStubEntry(MCSymbol *Sym) {
74     assert(Sym && "Key cannot be null");
75     return GVStubs[Sym];
76   }
77 
78   /// Accessor methods to return the set of stubs in sorted order.
79 
80   SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); }
81 };
82 
83 /// MachineModuleInfoCOFF - This is a MachineModuleInfoImpl implementation
84 /// for COFF targets.
85 class MachineModuleInfoCOFF : public MachineModuleInfoImpl {
86   /// GVStubs - These stubs are used to materialize global addresses in PIC
87   /// mode.
88   DenseMap<MCSymbol *, StubValueTy> GVStubs;
89 
90   virtual void anchor(); // Out of line virtual method.
91 
92 public:
93   MachineModuleInfoCOFF(const MachineModuleInfo &) {}
94 
95   StubValueTy &getGVStubEntry(MCSymbol *Sym) {
96     assert(Sym && "Key cannot be null");
97     return GVStubs[Sym];
98   }
99 
100   /// Accessor methods to return the set of stubs in sorted order.
101 
102   SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); }
103 };
104 
105 /// MachineModuleInfoWasm - This is a MachineModuleInfoImpl implementation
106 /// for Wasm targets.
107 class MachineModuleInfoWasm : public MachineModuleInfoImpl {
108   virtual void anchor(); // Out of line virtual method.
109 
110 public:
111   MachineModuleInfoWasm(const MachineModuleInfo &) {}
112 
113   SetVector<StringRef> MachineSymbolsUsed;
114 };
115 
116 } // end namespace llvm
117 
118 #endif // LLVM_CODEGEN_MACHINEMODULEINFOIMPLS_H
119