1 //===-- llvm/Target/TargetLoweringObjectFile.h - Object Info ----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements classes used to handle lowerings specific to common
11 // object file formats.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H
16 #define LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/ADT/StringMap.h"
28 /// SectionKind - This is a simple POD value that classifies the properties of
29 /// a section. A global variable is classified into the deepest possible
30 /// classification, and then the target maps them onto their sections based on
31 /// what capabilities they have.
33 /// The comments below describe these as if they were an inheritance hierarchy
34 /// in order to explain the predicates below.
38 /// Metadata - Debug info sections or other metadata.
41 /// Text - Text section, used for functions and other executable code.
44 /// ReadOnly - Data that is never written to at program runtime by the
45 /// program or the dynamic linker. Things in the top-level readonly
46 /// SectionKind are not mergeable.
49 /// MergeableCString - This is a special section for nul-terminated
50 /// strings. The linker can unique the C strings, knowing their
51 /// semantics. Because it uniques based on the nul terminators, the
52 /// compiler can't put strings in this section that have embeded nuls
56 /// MergeableConst - These are sections for merging fixed-length
57 /// constants together. For example, this can be used to unique
58 /// constant pool entries etc.
61 /// MergeableConst4 - This is a section used by 4-byte constants,
62 /// for example, floats.
65 /// MergeableConst8 - This is a section used by 8-byte constants,
66 /// for example, doubles.
69 /// MergeableConst16 - This is a section used by 16-byte constants,
70 /// for example, vectors.
73 /// Writeable - This is the base of all segments that need to be written
74 /// to during program runtime.
76 /// ThreadLocal - This is the base of all TLS segments. All TLS
77 /// objects must be writeable, otherwise there is no reason for them to
80 /// ThreadBSS - Zero-initialized TLS data objects.
83 /// ThreadData - Initialized TLS data objects.
86 /// GlobalWriteableData - Writeable data that is global (not thread
89 /// BSS - Zero initialized writeable data.
92 /// DataRel - This is the most general form of data that is written
93 /// to by the program, it can have random relocations to arbitrary
97 /// DataRelLocal - This is writeable data that has a non-zero
98 /// initializer and has relocations in it, but all of the
99 /// relocations are known to be within the final linked image
100 /// the global is linked into.
103 /// DataNoRel - This is writeable data that has a non-zero
104 /// initializer, but whose initializer is known to have no
108 /// ReadOnlyWithRel - These are global variables that are never
109 /// written to by the program, but that have relocations, so they
110 /// must be stuck in a writeable section so that the dynamic linker
111 /// can write to them. If it chooses to, the dynamic linker can
112 /// mark the pages these globals end up on as read-only after it is
113 /// done with its relocation phase.
116 /// ReadOnlyWithRelLocal - This is data that is readonly by the
117 /// program, but must be writeable so that the dynamic linker
118 /// can perform relocations in it. This is used when we know
119 /// that all the relocations are to globals in this final
130 bool isMetadata() const { return K == Metadata; }
131 bool isText() const { return K == Text; }
133 bool isReadOnly() const {
134 return K == ReadOnly || K == MergeableCString || isMergeableConst();
137 bool isMergeableCString() const { return K == MergeableCString; }
138 bool isMergeableConst() const {
139 return K == MergeableConst || K == MergeableConst4 ||
140 K == MergeableConst8 || K == MergeableConst16;
143 bool isMergeableConst4() const { return K == MergeableConst4; }
144 bool isMergeableConst8() const { return K == MergeableConst8; }
145 bool isMergeableConst16() const { return K == MergeableConst16; }
147 bool isWriteable() const {
148 return isThreadLocal() || isGlobalWriteableData();
151 bool isThreadLocal() const {
152 return K == ThreadData || K == ThreadBSS;
155 bool isThreadBSS() const { return K == ThreadBSS; }
156 bool isThreadData() const { return K == ThreadData; }
158 bool isGlobalWriteableData() const {
159 return isBSS() || isDataRel() || isReadOnlyWithRel();
162 bool isBSS() const { return K == BSS; }
164 bool isDataRel() const {
165 return K == DataRel || K == DataRelLocal || K == DataNoRel;
168 bool isDataRelLocal() const {
169 return K == DataRelLocal || K == DataNoRel;
172 bool isDataNoRel() const { return K == DataNoRel; }
174 bool isReadOnlyWithRel() const {
175 return K == ReadOnlyWithRel || K == ReadOnlyWithRelLocal;
178 bool isReadOnlyWithRelLocal() const {
179 return K == ReadOnlyWithRelLocal;
182 static SectionKind get(Kind K) {
190 /// SectionInfo - This class is a target-independent classification of a global
191 /// which is used to simplify target-specific code by exposing common
193 class SectionInfo : public SectionKind {
194 /// Weak - This is true if the referenced symbol is weak (i.e. linkonce,
195 /// weak, weak_odr, etc). This is orthogonal from the categorization.
200 /// Weak - This is true if the referenced symbol is weak (i.e. linkonce,
201 /// weak, weak_odr, etc). This is orthogonal from the categorization.
202 bool isWeak() const { return Weak; }
204 static SectionInfo get(Kind K, bool isWeak = false) {
210 static SectionInfo get(SectionKind K, bool isWeak = false) {
212 *(SectionKind*)&Res = K;
218 class TargetLoweringObjectFile {
222 TargetLoweringObjectFile();
224 /// TextSection - Section directive for standard text.
226 const MCSection *TextSection; // Defaults to ".text".
228 /// DataSection - Section directive for standard data.
230 const MCSection *DataSection; // Defaults to ".data".
234 // FIXME: SINK THESE.
235 const MCSection *BSSSection_;
237 /// ReadOnlySection - This is the directive that is emitted to switch to a
238 /// read-only section for constant data (e.g. data declared const,
240 const MCSection *ReadOnlySection; // Defaults to NULL
242 /// TLSDataSection - Section directive for Thread Local data.
244 const MCSection *TLSDataSection; // Defaults to ".tdata".
246 /// TLSBSSSection - Section directive for Thread Local uninitialized data.
247 /// Null if this target doesn't support a BSS section.
249 const MCSection *TLSBSSSection; // Defaults to ".tbss".
251 const MCSection *CStringSection_;
255 const MCSection *getOrCreateSection(const char *Name,
257 SectionKind K) const;
260 virtual ~TargetLoweringObjectFile();
262 /// Initialize - this method must be called before any actual lowering is
263 /// done. This specifies the current context for codegen, and gives the
264 /// lowering implementations a chance to set up their default sections.
265 virtual void Initialize(MCContext &ctx, const TargetMachine &TM) {
270 const MCSection *getTextSection() const { return TextSection; }
271 const MCSection *getDataSection() const { return DataSection; }
273 /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively
274 /// decide not to emit the UsedDirective for some symbols in llvm.used.
275 /// FIXME: REMOVE this (rdar://7071300)
276 virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV,
281 /// getSectionForMergeableConstant - Given a mergeable constant with the
282 /// specified size and relocation information, return a section that it
283 /// should be placed in.
284 virtual const MCSection *
285 getSectionForMergeableConstant(SectionKind Kind) const;
287 /// getKindForNamedSection - If this target wants to be able to override
288 /// section flags based on the name of the section specified for a global
289 /// variable, it can implement this. This is used on ELF systems so that
290 /// ".tbss" gets the TLS bit set etc.
291 virtual SectionKind getKindForNamedSection(const char *Section,
292 SectionKind K) const {
296 /// SectionForGlobal - This method computes the appropriate section to emit
297 /// the specified global variable or function definition. This should not
298 /// be passed external (or available externally) globals.
299 const MCSection *SectionForGlobal(const GlobalValue *GV,
301 const TargetMachine &TM) const;
303 /// getSpecialCasedSectionGlobals - Allow the target to completely override
304 /// section assignment of a global.
305 /// FIXME: ELIMINATE this by making PIC16 implement ADDRESS with
306 /// getFlagsForNamedSection.
307 virtual const MCSection *
308 getSpecialCasedSectionGlobals(const GlobalValue *GV, Mangler *Mang,
309 SectionInfo Kind) const {
313 /// getSectionFlagsAsString - Turn the flags in the specified SectionKind
314 /// into a string that can be printed to the assembly file after the
315 /// ".section foo" part of a section directive.
316 virtual void getSectionFlagsAsString(SectionKind Kind,
317 SmallVectorImpl<char> &Str) const {
321 virtual const MCSection *
322 SelectSectionForGlobal(const GlobalValue *GV, SectionInfo Kind,
323 Mangler *Mang, const TargetMachine &TM) const;
329 class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
330 bool AtIsCommentChar; // True if @ is the comment character on this target.
333 /// ELF Constructor - AtIsCommentChar is true if the CommentCharacter from TAI
335 TargetLoweringObjectFileELF(bool atIsCommentChar = false,
336 // FIXME: REMOVE AFTER UNIQUING IS FIXED.
337 bool hasCrazyBSS = false)
338 : AtIsCommentChar(atIsCommentChar), HasCrazyBSS(hasCrazyBSS) {}
340 virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
343 /// getSectionForMergeableConstant - Given a mergeable constant with the
344 /// specified size and relocation information, return a section that it
345 /// should be placed in.
346 virtual const MCSection *
347 getSectionForMergeableConstant(SectionKind Kind) const;
349 virtual SectionKind getKindForNamedSection(const char *Section,
350 SectionKind K) const;
351 void getSectionFlagsAsString(SectionKind Kind,
352 SmallVectorImpl<char> &Str) const;
354 virtual const MCSection *
355 SelectSectionForGlobal(const GlobalValue *GV, SectionInfo Kind,
356 Mangler *Mang, const TargetMachine &TM) const;
358 const MCSection *DataRelSection;
359 const MCSection *DataRelLocalSection;
360 const MCSection *DataRelROSection;
361 const MCSection *DataRelROLocalSection;
363 const MCSection *MergeableConst4Section;
364 const MCSection *MergeableConst8Section;
365 const MCSection *MergeableConst16Section;
370 class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
371 const MCSection *TextCoalSection;
372 const MCSection *ConstTextCoalSection;
373 const MCSection *ConstDataCoalSection;
374 const MCSection *ConstDataSection;
375 const MCSection *DataCoalSection;
376 const MCSection *FourByteConstantSection;
377 const MCSection *EightByteConstantSection;
378 const MCSection *SixteenByteConstantSection;
381 virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
383 virtual const MCSection *
384 SelectSectionForGlobal(const GlobalValue *GV, SectionInfo Kind,
385 Mangler *Mang, const TargetMachine &TM) const;
387 virtual const MCSection *
388 getSectionForMergeableConstant(SectionKind Kind) const;
390 /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively
391 /// decide not to emit the UsedDirective for some symbols in llvm.used.
392 /// FIXME: REMOVE this (rdar://7071300)
393 virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV,
399 class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
401 virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
403 virtual void getSectionFlagsAsString(SectionKind Kind,
404 SmallVectorImpl<char> &Str) const;
406 virtual const MCSection *
407 SelectSectionForGlobal(const GlobalValue *GV, SectionInfo Kind,
408 Mangler *Mang, const TargetMachine &TM) const;
411 } // end namespace llvm