1 //==-- llvm/CodeGen/TargetLoweringObjectFileImpl.h - Object Info -*- C++ -*-==// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements classes used to handle lowerings specific to common 11 // object file formats. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H 16 #define LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H 17 18 #include "llvm/ADT/StringRef.h" 19 #include "llvm/MC/SectionKind.h" 20 #include "llvm/Target/TargetLoweringObjectFile.h" 21 22 namespace llvm { 23 class MachineModuleInfo; 24 class Mangler; 25 class MCAsmInfo; 26 class MCExpr; 27 class MCSection; 28 class MCSectionMachO; 29 class MCSymbol; 30 class MCContext; 31 class GlobalValue; 32 class TargetMachine; 33 34 35 class TargetLoweringObjectFileELF : public TargetLoweringObjectFile { 36 bool UseInitArray; 37 mutable unsigned NextUniqueID = 0; 38 39 public: TargetLoweringObjectFileELF()40 TargetLoweringObjectFileELF() : UseInitArray(false) {} 41 ~TargetLoweringObjectFileELF()42 ~TargetLoweringObjectFileELF() override {} 43 44 void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &TM, 45 const MCSymbol *Sym) const override; 46 47 /// Given a constant with the SectionKind, return a section that it should be 48 /// placed in. 49 MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind, 50 const Constant *C) const override; 51 52 MCSection *getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 53 Mangler &Mang, 54 const TargetMachine &TM) const override; 55 56 MCSection *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 57 Mangler &Mang, 58 const TargetMachine &TM) const override; 59 60 MCSection *getSectionForJumpTable(const Function &F, Mangler &Mang, 61 const TargetMachine &TM) const override; 62 63 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, 64 const Function &F) const override; 65 66 /// Return an MCExpr to use for a reference to the specified type info global 67 /// variable from exception handling information. 68 const MCExpr * 69 getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding, 70 Mangler &Mang, const TargetMachine &TM, 71 MachineModuleInfo *MMI, 72 MCStreamer &Streamer) const override; 73 74 // The symbol that gets passed to .cfi_personality. 75 MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang, 76 const TargetMachine &TM, 77 MachineModuleInfo *MMI) const override; 78 79 void InitializeELF(bool UseInitArray_); 80 MCSection *getStaticCtorSection(unsigned Priority, 81 const MCSymbol *KeySym) const override; 82 MCSection *getStaticDtorSection(unsigned Priority, 83 const MCSymbol *KeySym) const override; 84 }; 85 86 87 88 class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile { 89 public: ~TargetLoweringObjectFileMachO()90 ~TargetLoweringObjectFileMachO() override {} 91 TargetLoweringObjectFileMachO(); 92 93 /// Emit the module flags that specify the garbage collection information. 94 void emitModuleFlags(MCStreamer &Streamer, 95 ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 96 Mangler &Mang, const TargetMachine &TM) const override; 97 98 MCSection *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 99 Mangler &Mang, 100 const TargetMachine &TM) const override; 101 102 MCSection *getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 103 Mangler &Mang, 104 const TargetMachine &TM) const override; 105 106 MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind, 107 const Constant *C) const override; 108 109 /// The mach-o version of this method defaults to returning a stub reference. 110 const MCExpr * 111 getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding, 112 Mangler &Mang, const TargetMachine &TM, 113 MachineModuleInfo *MMI, 114 MCStreamer &Streamer) const override; 115 116 // The symbol that gets passed to .cfi_personality. 117 MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang, 118 const TargetMachine &TM, 119 MachineModuleInfo *MMI) const override; 120 121 /// Get MachO PC relative GOT entry relocation 122 const MCExpr *getIndirectSymViaGOTPCRel(const MCSymbol *Sym, 123 const MCValue &MV, int64_t Offset, 124 MachineModuleInfo *MMI, 125 MCStreamer &Streamer) const override; 126 127 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV, 128 Mangler &Mang, const TargetMachine &TM) const override; 129 }; 130 131 132 133 class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile { 134 public: ~TargetLoweringObjectFileCOFF()135 ~TargetLoweringObjectFileCOFF() override {} 136 137 MCSection *getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 138 Mangler &Mang, 139 const TargetMachine &TM) const override; 140 141 MCSection *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 142 Mangler &Mang, 143 const TargetMachine &TM) const override; 144 145 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV, 146 Mangler &Mang, const TargetMachine &TM) const override; 147 148 MCSection *getSectionForJumpTable(const Function &F, Mangler &Mang, 149 const TargetMachine &TM) const override; 150 151 /// Emit Obj-C garbage collection and linker options. Only linker option 152 /// emission is implemented for COFF. 153 void emitModuleFlags(MCStreamer &Streamer, 154 ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 155 Mangler &Mang, const TargetMachine &TM) const override; 156 157 MCSection *getStaticCtorSection(unsigned Priority, 158 const MCSymbol *KeySym) const override; 159 MCSection *getStaticDtorSection(unsigned Priority, 160 const MCSymbol *KeySym) const override; 161 162 void emitLinkerFlagsForGlobal(raw_ostream &OS, const GlobalValue *GV, 163 const Mangler &Mang) const override; 164 }; 165 166 } // end namespace llvm 167 168 #endif 169