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/MC/SectionKind.h" 19 #include "llvm/Target/TargetLoweringObjectFile.h" 20 #include "llvm/ADT/StringRef.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 virtual void emitPersonalityValue(MCStreamer &Streamer, 42 const TargetMachine &TM, 43 const MCSymbol *Sym) const; 44 45 /// getSectionForConstant - Given a constant with the SectionKind, return a 46 /// section that it should be placed in. 47 virtual const MCSection *getSectionForConstant(SectionKind Kind) const; 48 49 50 virtual const MCSection * 51 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 52 Mangler *Mang, const TargetMachine &TM) const; 53 54 virtual const MCSection * 55 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 56 Mangler *Mang, const TargetMachine &TM) const; 57 58 /// getExprForDwarfGlobalReference - Return an MCExpr to use for a reference 59 /// to the specified global variable from exception handling information. 60 /// 61 virtual const MCExpr * 62 getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 63 MachineModuleInfo *MMI, unsigned Encoding, 64 MCStreamer &Streamer) const; 65 66 // getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality. 67 virtual MCSymbol * 68 getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang, 69 MachineModuleInfo *MMI) const; 70 71 void InitializeELF(bool UseInitArray_); 72 virtual const MCSection * 73 getStaticCtorSection(unsigned Priority = 65535) const; 74 virtual const MCSection * 75 getStaticDtorSection(unsigned Priority = 65535) const; 76 }; 77 78 79 80 class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile { 81 public: 82 virtual ~TargetLoweringObjectFileMachO() {} 83 84 /// emitModuleFlags - Emit the module flags that specify the garbage 85 /// collection information. 86 virtual void emitModuleFlags(MCStreamer &Streamer, 87 ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 88 Mangler *Mang, const TargetMachine &TM) const; 89 90 virtual const MCSection * 91 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 92 Mangler *Mang, const TargetMachine &TM) const; 93 94 virtual const MCSection * 95 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 96 Mangler *Mang, const TargetMachine &TM) const; 97 98 virtual const MCSection *getSectionForConstant(SectionKind Kind) const; 99 100 /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively 101 /// decide not to emit the UsedDirective for some symbols in llvm.used. 102 /// FIXME: REMOVE this (rdar://7071300) 103 virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV, 104 Mangler *) const; 105 106 /// getExprForDwarfGlobalReference - The mach-o version of this method 107 /// defaults to returning a stub reference. 108 virtual const MCExpr * 109 getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 110 MachineModuleInfo *MMI, unsigned Encoding, 111 MCStreamer &Streamer) const; 112 113 // getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality. 114 virtual MCSymbol * 115 getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang, 116 MachineModuleInfo *MMI) const; 117 }; 118 119 120 121 class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile { 122 public: 123 virtual ~TargetLoweringObjectFileCOFF() {} 124 125 virtual const MCSection * 126 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 127 Mangler *Mang, const TargetMachine &TM) const; 128 129 virtual const MCSection * 130 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 131 Mangler *Mang, const TargetMachine &TM) const; 132 }; 133 134 } // end namespace llvm 135 136 #endif 137