TargetLoweringObjectFile.h revision 35039ac24163e99cfab161620a9fb41f944a63d5
1//===-- llvm/Target/TargetLoweringObjectFile.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_TARGET_TARGETLOWERINGOBJECTFILE_H 16#define LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H 17 18#include "llvm/ADT/SmallVector.h" 19#include "llvm/ADT/StringMap.h" 20#include "llvm/MC/SectionKind.h" 21 22namespace llvm { 23 class MCSection; 24 class MCContext; 25 class GlobalValue; 26 class Mangler; 27 class TargetMachine; 28 29 30class TargetLoweringObjectFile { 31 MCContext *Ctx; 32protected: 33 34 TargetLoweringObjectFile(); 35 36 /// TextSection - Section directive for standard text. 37 /// 38 const MCSection *TextSection; 39 40 /// DataSection - Section directive for standard data. 41 /// 42 const MCSection *DataSection; 43 44 /// BSSSection - Section that is default initialized to zero. 45 const MCSection *BSSSection; 46 47 /// ReadOnlySection - Section that is readonly and can contain arbitrary 48 /// initialized data. Targets are not required to have a readonly section. 49 /// If they don't, various bits of code will fall back to using the data 50 /// section for constants. 51 const MCSection *ReadOnlySection; 52 53 /// StaticCtorSection - This section contains the static constructor pointer 54 /// list. 55 const MCSection *StaticCtorSection; 56 57 /// StaticDtorSection - This section contains the static destructor pointer 58 /// list. 59 const MCSection *StaticDtorSection; 60 61 /// LSDASection - If exception handling is supported by the target, this is 62 /// the section the Language Specific Data Area information is emitted to. 63 const MCSection *LSDASection; 64 65 /// EHFrameSection - If exception handling is supported by the target, this is 66 /// the section the EH Frame is emitted to. 67 const MCSection *EHFrameSection; 68 69 70public: 71 // FIXME: NONPUB. 72 const MCSection *getOrCreateSection(const char *Name, 73 bool isDirective, 74 SectionKind K) const; 75public: 76 77 virtual ~TargetLoweringObjectFile(); 78 79 /// Initialize - this method must be called before any actual lowering is 80 /// done. This specifies the current context for codegen, and gives the 81 /// lowering implementations a chance to set up their default sections. 82 virtual void Initialize(MCContext &ctx, const TargetMachine &TM) { 83 Ctx = &ctx; 84 } 85 86 87 const MCSection *getTextSection() const { return TextSection; } 88 const MCSection *getDataSection() const { return DataSection; } 89 const MCSection *getStaticCtorSection() const { return StaticCtorSection; } 90 const MCSection *getStaticDtorSection() const { return StaticDtorSection; } 91 const MCSection *getLSDASection() const { return LSDASection; } 92 const MCSection *getEHFrameSection() const { return EHFrameSection; } 93 94 /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively 95 /// decide not to emit the UsedDirective for some symbols in llvm.used. 96 /// FIXME: REMOVE this (rdar://7071300) 97 virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV, 98 Mangler *) const { 99 return GV != 0; 100 } 101 102 /// getSectionForConstant - Given a constant with the SectionKind, return a 103 /// section that it should be placed in. 104 virtual const MCSection *getSectionForConstant(SectionKind Kind) const; 105 106 /// getKindForNamedSection - If this target wants to be able to override 107 /// section flags based on the name of the section specified for a global 108 /// variable, it can implement this. This is used on ELF systems so that 109 /// ".tbss" gets the TLS bit set etc. 110 virtual SectionKind getKindForNamedSection(const char *Section, 111 SectionKind K) const { 112 return K; 113 } 114 115 /// SectionForGlobal - This method computes the appropriate section to emit 116 /// the specified global variable or function definition. This should not 117 /// be passed external (or available externally) globals. 118 const MCSection *SectionForGlobal(const GlobalValue *GV, 119 Mangler *Mang, 120 const TargetMachine &TM) const; 121 122 /// getSpecialCasedSectionGlobals - Allow the target to completely override 123 /// section assignment of a global. 124 /// FIXME: ELIMINATE this by making PIC16 implement ADDRESS with 125 /// getFlagsForNamedSection. 126 virtual const MCSection * 127 getSpecialCasedSectionGlobals(const GlobalValue *GV, Mangler *Mang, 128 SectionKind Kind) const { 129 return 0; 130 } 131 132 /// getSectionFlagsAsString - Turn the flags in the specified SectionKind 133 /// into a string that can be printed to the assembly file after the 134 /// ".section foo" part of a section directive. 135 virtual void getSectionFlagsAsString(SectionKind Kind, 136 SmallVectorImpl<char> &Str) const { 137 } 138 139protected: 140 virtual const MCSection * 141 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 142 Mangler *Mang, const TargetMachine &TM) const; 143}; 144 145 146 147 148class TargetLoweringObjectFileELF : public TargetLoweringObjectFile { 149 bool AtIsCommentChar; // True if @ is the comment character on this target. 150 bool HasCrazyBSS; 151protected: 152 /// TLSDataSection - Section directive for Thread Local data. 153 /// 154 const MCSection *TLSDataSection; // Defaults to ".tdata". 155 156 /// TLSBSSSection - Section directive for Thread Local uninitialized data. 157 /// Null if this target doesn't support a BSS section. 158 /// 159 const MCSection *TLSBSSSection; // Defaults to ".tbss". 160 161 const MCSection *CStringSection; 162 163 const MCSection *DataRelSection; 164 const MCSection *DataRelLocalSection; 165 const MCSection *DataRelROSection; 166 const MCSection *DataRelROLocalSection; 167 168 const MCSection *MergeableConst4Section; 169 const MCSection *MergeableConst8Section; 170 const MCSection *MergeableConst16Section; 171public: 172 /// ELF Constructor - AtIsCommentChar is true if the CommentCharacter from TAI 173 /// is "@". 174 TargetLoweringObjectFileELF(bool atIsCommentChar = false, 175 // FIXME: REMOVE AFTER UNIQUING IS FIXED. 176 bool hasCrazyBSS = false) 177 : AtIsCommentChar(atIsCommentChar), HasCrazyBSS(hasCrazyBSS) {} 178 179 virtual void Initialize(MCContext &Ctx, const TargetMachine &TM); 180 181 182 /// getSectionForConstant - Given a constant with the SectionKind, return a 183 /// section that it should be placed in. 184 virtual const MCSection *getSectionForConstant(SectionKind Kind) const; 185 186 virtual SectionKind getKindForNamedSection(const char *Section, 187 SectionKind K) const; 188 void getSectionFlagsAsString(SectionKind Kind, 189 SmallVectorImpl<char> &Str) const; 190 191 virtual const MCSection * 192 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 193 Mangler *Mang, const TargetMachine &TM) const; 194}; 195 196 197 198class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile { 199 const MCSection *CStringSection; 200 const MCSection *TextCoalSection; 201 const MCSection *ConstTextCoalSection; 202 const MCSection *ConstDataCoalSection; 203 const MCSection *ConstDataSection; 204 const MCSection *DataCoalSection; 205 const MCSection *FourByteConstantSection; 206 const MCSection *EightByteConstantSection; 207 const MCSection *SixteenByteConstantSection; 208public: 209 210 virtual void Initialize(MCContext &Ctx, const TargetMachine &TM); 211 212 virtual const MCSection * 213 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 214 Mangler *Mang, const TargetMachine &TM) const; 215 216 virtual const MCSection *getSectionForConstant(SectionKind Kind) const; 217 218 /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively 219 /// decide not to emit the UsedDirective for some symbols in llvm.used. 220 /// FIXME: REMOVE this (rdar://7071300) 221 virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV, 222 Mangler *) const; 223}; 224 225 226 227class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile { 228public: 229 virtual void Initialize(MCContext &Ctx, const TargetMachine &TM); 230 231 virtual void getSectionFlagsAsString(SectionKind Kind, 232 SmallVectorImpl<char> &Str) const; 233 234 virtual const MCSection * 235 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 236 Mangler *Mang, const TargetMachine &TM) const; 237}; 238 239} // end namespace llvm 240 241#endif 242