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/CodeGen/MachineModuleInfo.h" 19#include <cassert> 20 21namespace llvm { 22 23class MCSymbol; 24 25/// MachineModuleInfoMachO - This is a MachineModuleInfoImpl implementation 26/// for MachO targets. 27class MachineModuleInfoMachO : public MachineModuleInfoImpl { 28 /// GVStubs - Darwin '$non_lazy_ptr' stubs. The key is something like 29 /// "Lfoo$non_lazy_ptr", the value is something like "_foo". The extra bit 30 /// is true if this GV is external. 31 DenseMap<MCSymbol *, StubValueTy> GVStubs; 32 33 /// ThreadLocalGVStubs - Darwin '$non_lazy_ptr' stubs. The key is something 34 /// like "Lfoo$non_lazy_ptr", the value is something like "_foo". The extra 35 /// bit is true if this GV is external. 36 DenseMap<MCSymbol *, StubValueTy> ThreadLocalGVStubs; 37 38 virtual void anchor(); // Out of line virtual method. 39 40public: 41 MachineModuleInfoMachO(const MachineModuleInfo &) {} 42 43 StubValueTy &getGVStubEntry(MCSymbol *Sym) { 44 assert(Sym && "Key cannot be null"); 45 return GVStubs[Sym]; 46 } 47 48 StubValueTy &getThreadLocalGVStubEntry(MCSymbol *Sym) { 49 assert(Sym && "Key cannot be null"); 50 return ThreadLocalGVStubs[Sym]; 51 } 52 53 /// Accessor methods to return the set of stubs in sorted order. 54 SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); } 55 SymbolListTy GetThreadLocalGVStubList() { 56 return getSortedStubs(ThreadLocalGVStubs); 57 } 58}; 59 60/// MachineModuleInfoELF - This is a MachineModuleInfoImpl implementation 61/// for ELF targets. 62class MachineModuleInfoELF : public MachineModuleInfoImpl { 63 /// GVStubs - These stubs are used to materialize global addresses in PIC 64 /// mode. 65 DenseMap<MCSymbol *, StubValueTy> GVStubs; 66 67 virtual void anchor(); // Out of line virtual method. 68 69public: 70 MachineModuleInfoELF(const MachineModuleInfo &) {} 71 72 StubValueTy &getGVStubEntry(MCSymbol *Sym) { 73 assert(Sym && "Key cannot be null"); 74 return GVStubs[Sym]; 75 } 76 77 /// Accessor methods to return the set of stubs in sorted order. 78 79 SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); } 80}; 81 82/// MachineModuleInfoCOFF - This is a MachineModuleInfoImpl implementation 83/// for COFF targets. 84class MachineModuleInfoCOFF : public MachineModuleInfoImpl { 85 /// GVStubs - These stubs are used to materialize global addresses in PIC 86 /// mode. 87 DenseMap<MCSymbol *, StubValueTy> GVStubs; 88 89 virtual void anchor(); // Out of line virtual method. 90 91public: 92 MachineModuleInfoCOFF(const MachineModuleInfo &) {} 93 94 StubValueTy &getGVStubEntry(MCSymbol *Sym) { 95 assert(Sym && "Key cannot be null"); 96 return GVStubs[Sym]; 97 } 98 99 /// Accessor methods to return the set of stubs in sorted order. 100 101 SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); } 102}; 103 104} // end namespace llvm 105 106#endif // LLVM_CODEGEN_MACHINEMODULEINFOIMPLS_H 107