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: ~TargetLoweringObjectFileELF()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, 47 const Constant *C) const override; 48 49 const MCSection *getExplicitSectionGlobal(const GlobalValue *GV, 50 SectionKind Kind, Mangler &Mang, 51 const TargetMachine &TM) const override; 52 53 const MCSection *SelectSectionForGlobal(const GlobalValue *GV, 54 SectionKind Kind, Mangler &Mang, 55 const TargetMachine &TM) const override; 56 57 /// Return an MCExpr to use for a reference to the specified type info global 58 /// variable from exception handling information. 59 const MCExpr * 60 getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding, 61 Mangler &Mang, const TargetMachine &TM, 62 MachineModuleInfo *MMI, 63 MCStreamer &Streamer) const override; 64 65 // The symbol that gets passed to .cfi_personality. 66 MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang, 67 const TargetMachine &TM, 68 MachineModuleInfo *MMI) const override; 69 70 void InitializeELF(bool UseInitArray_); 71 const MCSection *getStaticCtorSection(unsigned Priority, 72 const MCSymbol *KeySym) const override; 73 const MCSection *getStaticDtorSection(unsigned Priority, 74 const MCSymbol *KeySym) const override; 75 }; 76 77 78 79 class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile { 80 public: ~TargetLoweringObjectFileMachO()81 virtual ~TargetLoweringObjectFileMachO() {} 82 83 /// Extract the dependent library name from a linker option string. Returns 84 /// StringRef() if the option does not specify a library. 85 StringRef getDepLibFromLinkerOpt(StringRef LinkerOption) const override; 86 87 /// Emit the module flags that specify the garbage collection information. 88 void emitModuleFlags(MCStreamer &Streamer, 89 ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 90 Mangler &Mang, const TargetMachine &TM) const override; 91 92 const MCSection * 93 SelectSectionForGlobal(const GlobalValue *GV, 94 SectionKind Kind, Mangler &Mang, 95 const TargetMachine &TM) const override; 96 97 const MCSection * 98 getExplicitSectionGlobal(const GlobalValue *GV, 99 SectionKind Kind, Mangler &Mang, 100 const TargetMachine &TM) const override; 101 102 const MCSection *getSectionForConstant(SectionKind Kind, 103 const Constant *C) 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: ~TargetLoweringObjectFileCOFF()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