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