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 38 public: 39 virtual ~TargetLoweringObjectFileELF() {} 40 41 void emitPersonalityValue(MCStreamer &Streamer, const TargetMachine &TM, 42 const MCSymbol *Sym) const override; 43 44 /// Given a constant with the SectionKind, return a section that it should be 45 /// placed in. 46 const MCSection *getSectionForConstant(SectionKind Kind) const override; 47 48 const MCSection *getExplicitSectionGlobal(const GlobalValue *GV, 49 SectionKind Kind, Mangler &Mang, 50 const TargetMachine &TM) const override; 51 52 const MCSection *SelectSectionForGlobal(const GlobalValue *GV, 53 SectionKind Kind, Mangler &Mang, 54 const TargetMachine &TM) const override; 55 56 /// Return an MCExpr to use for a reference to the specified type info global 57 /// variable from exception handling information. 58 const MCExpr * 59 getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding, 60 Mangler &Mang, const TargetMachine &TM, 61 MachineModuleInfo *MMI, 62 MCStreamer &Streamer) const override; 63 64 // The symbol that gets passed to .cfi_personality. 65 MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang, 66 const TargetMachine &TM, 67 MachineModuleInfo *MMI) const override; 68 69 void InitializeELF(bool UseInitArray_); 70 const MCSection *getStaticCtorSection(unsigned Priority, 71 const MCSymbol *KeySym) const override; 72 const MCSection *getStaticDtorSection(unsigned Priority, 73 const MCSymbol *KeySym) const override; 74 }; 75 76 77 78 class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile { 79 public: 80 virtual ~TargetLoweringObjectFileMachO() {} 81 82 /// Extract the dependent library name from a linker option string. Returns 83 /// StringRef() if the option does not specify a library. 84 StringRef getDepLibFromLinkerOpt(StringRef LinkerOption) const override; 85 86 /// Emit the module flags that specify the garbage collection information. 87 void emitModuleFlags(MCStreamer &Streamer, 88 ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 89 Mangler &Mang, const TargetMachine &TM) const override; 90 91 bool isSectionAtomizableBySymbols(const MCSection &Section) const override; 92 93 const MCSection * 94 SelectSectionForGlobal(const GlobalValue *GV, 95 SectionKind Kind, Mangler &Mang, 96 const TargetMachine &TM) const override; 97 98 const MCSection * 99 getExplicitSectionGlobal(const GlobalValue *GV, 100 SectionKind Kind, Mangler &Mang, 101 const TargetMachine &TM) const override; 102 103 const MCSection *getSectionForConstant(SectionKind Kind) const override; 104 105 /// The mach-o version of this method defaults to returning a stub reference. 106 const MCExpr * 107 getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding, 108 Mangler &Mang, const TargetMachine &TM, 109 MachineModuleInfo *MMI, 110 MCStreamer &Streamer) const override; 111 112 // The symbol that gets passed to .cfi_personality. 113 MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang, 114 const TargetMachine &TM, 115 MachineModuleInfo *MMI) const override; 116 }; 117 118 119 120 class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile { 121 public: 122 virtual ~TargetLoweringObjectFileCOFF() {} 123 124 const MCSection * 125 getExplicitSectionGlobal(const GlobalValue *GV, 126 SectionKind Kind, Mangler &Mang, 127 const TargetMachine &TM) const override; 128 129 const MCSection * 130 SelectSectionForGlobal(const GlobalValue *GV, 131 SectionKind Kind, Mangler &Mang, 132 const TargetMachine &TM) const override; 133 134 /// Extract the dependent library name from a linker option string. Returns 135 /// StringRef() if the option does not specify a library. 136 StringRef getDepLibFromLinkerOpt(StringRef LinkerOption) const override; 137 138 /// Emit Obj-C garbage collection and linker options. Only linker option 139 /// emission is implemented for COFF. 140 void emitModuleFlags(MCStreamer &Streamer, 141 ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 142 Mangler &Mang, const TargetMachine &TM) const override; 143 144 const MCSection *getStaticCtorSection(unsigned Priority, 145 const MCSymbol *KeySym) const override; 146 const MCSection *getStaticDtorSection(unsigned Priority, 147 const MCSymbol *KeySym) const override; 148 }; 149 150 } // end namespace llvm 151 152 #endif 153