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: MachineModuleInfoMachO(const MachineModuleInfo &)42 MachineModuleInfoMachO(const MachineModuleInfo &) {} 43 getGVStubEntry(MCSymbol * Sym)44 StubValueTy &getGVStubEntry(MCSymbol *Sym) { 45 assert(Sym && "Key cannot be null"); 46 return GVStubs[Sym]; 47 } 48 getThreadLocalGVStubEntry(MCSymbol * Sym)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. GetGVStubList()55 SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); } GetThreadLocalGVStubList()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: MachineModuleInfoELF(const MachineModuleInfo &)71 MachineModuleInfoELF(const MachineModuleInfo &) {} 72 getGVStubEntry(MCSymbol * Sym)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 GetGVStubList()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: MachineModuleInfoCOFF(const MachineModuleInfo &)93 MachineModuleInfoCOFF(const MachineModuleInfo &) {} 94 getGVStubEntry(MCSymbol * Sym)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 GetGVStubList()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: MachineModuleInfoWasm(const MachineModuleInfo &)111 MachineModuleInfoWasm(const MachineModuleInfo &) {} 112 113 SetVector<StringRef> MachineSymbolsUsed; 114 }; 115 116 } // end namespace llvm 117 118 #endif // LLVM_CODEGEN_MACHINEMODULEINFOIMPLS_H 119