1 //===-- llvm/MC/MCObjectFileInfo.h - Object File 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 describes common object file formats.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_MC_MCOBJECTFILEINFO_H
15 #define LLVM_MC_MCOBJECTFILEINFO_H
17 #include "llvm/ADT/Triple.h"
18 #include "llvm/Support/CodeGen.h"
25 class MCObjectFileInfo
{
27 /// CommDirectiveSupportsAlignment - True if .comm supports alignment. This
28 /// is a hack for as long as we support 10.4 Tiger, whose assembler doesn't
29 /// support alignment on comm.
30 bool CommDirectiveSupportsAlignment
;
32 /// SupportsWeakEmptyEHFrame - True if target object file supports a
33 /// weak_definition of constant 0 for an omitted EH frame.
34 bool SupportsWeakOmittedEHFrame
;
36 /// SupportsCompactUnwindWithoutEHFrame - True if the target object file
37 /// supports emitting a compact unwind section without an associated EH frame
39 bool SupportsCompactUnwindWithoutEHFrame
;
41 /// PersonalityEncoding, LSDAEncoding, TTypeEncoding - Some encoding values
43 unsigned PersonalityEncoding
;
44 unsigned LSDAEncoding
;
45 unsigned FDECFIEncoding
;
46 unsigned TTypeEncoding
;
48 /// Section flags for eh_frame
49 unsigned EHSectionType
;
50 unsigned EHSectionFlags
;
52 /// CompactUnwindDwarfEHFrameOnly - Compact unwind encoding indicating that we
53 /// should emit only an EH frame.
54 unsigned CompactUnwindDwarfEHFrameOnly
;
56 /// TextSection - Section directive for standard text.
58 const MCSection
*TextSection
;
60 /// DataSection - Section directive for standard data.
62 const MCSection
*DataSection
;
64 /// BSSSection - Section that is default initialized to zero.
65 const MCSection
*BSSSection
;
67 /// ReadOnlySection - Section that is readonly and can contain arbitrary
68 /// initialized data. Targets are not required to have a readonly section.
69 /// If they don't, various bits of code will fall back to using the data
70 /// section for constants.
71 const MCSection
*ReadOnlySection
;
73 /// StaticCtorSection - This section contains the static constructor pointer
75 const MCSection
*StaticCtorSection
;
77 /// StaticDtorSection - This section contains the static destructor pointer
79 const MCSection
*StaticDtorSection
;
81 /// LSDASection - If exception handling is supported by the target, this is
82 /// the section the Language Specific Data Area information is emitted to.
83 const MCSection
*LSDASection
;
85 /// CompactUnwindSection - If exception handling is supported by the target
86 /// and the target can support a compact representation of the CIE and FDE,
87 /// this is the section to emit them into.
88 const MCSection
*CompactUnwindSection
;
90 // Dwarf sections for debug info. If a target supports debug info, these must
92 const MCSection
*DwarfAbbrevSection
;
93 const MCSection
*DwarfInfoSection
;
94 const MCSection
*DwarfLineSection
;
95 const MCSection
*DwarfFrameSection
;
96 const MCSection
*DwarfPubTypesSection
;
97 const MCSection
*DwarfDebugInlineSection
;
98 const MCSection
*DwarfStrSection
;
99 const MCSection
*DwarfLocSection
;
100 const MCSection
*DwarfARangesSection
;
101 const MCSection
*DwarfRangesSection
;
102 const MCSection
*DwarfMacroInfoSection
;
103 // The pubnames section is no longer generated by default. The generation
104 // can be enabled by a compiler flag.
105 const MCSection
*DwarfPubNamesSection
;
107 // DWARF5 Experimental Debug Info Sections
108 /// DwarfAccelNamesSection, DwarfAccelObjCSection,
109 /// DwarfAccelNamespaceSection, DwarfAccelTypesSection -
110 /// If we use the DWARF accelerated hash tables then we want to emit these
112 const MCSection
*DwarfAccelNamesSection
;
113 const MCSection
*DwarfAccelObjCSection
;
114 const MCSection
*DwarfAccelNamespaceSection
;
115 const MCSection
*DwarfAccelTypesSection
;
117 /// These are used for the Fission separate debug information files.
118 const MCSection
*DwarfInfoDWOSection
;
119 const MCSection
*DwarfTypesDWOSection
;
120 const MCSection
*DwarfAbbrevDWOSection
;
121 const MCSection
*DwarfStrDWOSection
;
122 const MCSection
*DwarfLineDWOSection
;
123 const MCSection
*DwarfLocDWOSection
;
124 const MCSection
*DwarfStrOffDWOSection
;
125 const MCSection
*DwarfAddrSection
;
127 /// Sections for newer gnu pubnames and pubtypes.
128 const MCSection
*DwarfGnuPubNamesSection
;
129 const MCSection
*DwarfGnuPubTypesSection
;
131 const MCSection
*COFFDebugSymbolsSection
;
133 // Extra TLS Variable Data section. If the target needs to put additional
134 // information for a TLS variable, it'll go here.
135 const MCSection
*TLSExtraDataSection
;
137 /// TLSDataSection - Section directive for Thread Local data.
138 /// ELF, MachO and COFF.
139 const MCSection
*TLSDataSection
; // Defaults to ".tdata".
141 /// TLSBSSSection - Section directive for Thread Local uninitialized data.
142 /// Null if this target doesn't support a BSS section.
143 /// ELF and MachO only.
144 const MCSection
*TLSBSSSection
; // Defaults to ".tbss".
146 /// StackMap section.
147 const MCSection
*StackMapSection
;
149 /// EHFrameSection - EH frame section. It is initialized on demand so it
150 /// can be overwritten (with uniquing).
151 const MCSection
*EHFrameSection
;
153 /// ELF specific sections.
155 const MCSection
*DataRelSection
;
156 const MCSection
*DataRelLocalSection
;
157 const MCSection
*DataRelROSection
;
158 const MCSection
*DataRelROLocalSection
;
159 const MCSection
*MergeableConst4Section
;
160 const MCSection
*MergeableConst8Section
;
161 const MCSection
*MergeableConst16Section
;
163 /// MachO specific sections.
166 /// TLSTLVSection - Section for thread local structure information.
167 /// Contains the source code name of the variable, visibility and a pointer
168 /// to the initial value (.tdata or .tbss).
169 const MCSection
*TLSTLVSection
; // Defaults to ".tlv".
171 /// TLSThreadInitSection - Section for thread local data initialization
173 const MCSection
*TLSThreadInitSection
; // Defaults to ".thread_init_func".
175 const MCSection
*CStringSection
;
176 const MCSection
*UStringSection
;
177 const MCSection
*TextCoalSection
;
178 const MCSection
*ConstTextCoalSection
;
179 const MCSection
*ConstDataSection
;
180 const MCSection
*DataCoalSection
;
181 const MCSection
*DataCommonSection
;
182 const MCSection
*DataBSSSection
;
183 const MCSection
*FourByteConstantSection
;
184 const MCSection
*EightByteConstantSection
;
185 const MCSection
*SixteenByteConstantSection
;
186 const MCSection
*LazySymbolPointerSection
;
187 const MCSection
*NonLazySymbolPointerSection
;
189 /// COFF specific sections.
191 const MCSection
*DrectveSection
;
192 const MCSection
*PDataSection
;
193 const MCSection
*XDataSection
;
196 void InitMCObjectFileInfo(StringRef TT
, Reloc::Model RM
, CodeModel::Model CM
,
199 bool getSupportsWeakOmittedEHFrame() const {
200 return SupportsWeakOmittedEHFrame
;
202 bool getSupportsCompactUnwindWithoutEHFrame() const {
203 return SupportsCompactUnwindWithoutEHFrame
;
205 bool getCommDirectiveSupportsAlignment() const {
206 return CommDirectiveSupportsAlignment
;
209 unsigned getPersonalityEncoding() const { return PersonalityEncoding
; }
210 unsigned getLSDAEncoding() const { return LSDAEncoding
; }
211 unsigned getFDEEncoding() const { return FDECFIEncoding
; }
212 unsigned getTTypeEncoding() const { return TTypeEncoding
; }
214 unsigned getCompactUnwindDwarfEHFrameOnly() const {
215 return CompactUnwindDwarfEHFrameOnly
;
218 const MCSection
*getTextSection() const { return TextSection
; }
219 const MCSection
*getDataSection() const { return DataSection
; }
220 const MCSection
*getBSSSection() const { return BSSSection
; }
221 const MCSection
*getLSDASection() const { return LSDASection
; }
222 const MCSection
*getCompactUnwindSection() const{
223 return CompactUnwindSection
;
225 const MCSection
*getDwarfAbbrevSection() const { return DwarfAbbrevSection
; }
226 const MCSection
*getDwarfInfoSection() const { return DwarfInfoSection
; }
227 const MCSection
*getDwarfLineSection() const { return DwarfLineSection
; }
228 const MCSection
*getDwarfFrameSection() const { return DwarfFrameSection
; }
229 const MCSection
*getDwarfPubNamesSection() const{return DwarfPubNamesSection
;}
230 const MCSection
*getDwarfPubTypesSection() const{return DwarfPubTypesSection
;}
231 const MCSection
*getDwarfGnuPubNamesSection() const {
232 return DwarfGnuPubNamesSection
;
234 const MCSection
*getDwarfGnuPubTypesSection() const {
235 return DwarfGnuPubTypesSection
;
237 const MCSection
*getDwarfDebugInlineSection() const {
238 return DwarfDebugInlineSection
;
240 const MCSection
*getDwarfStrSection() const { return DwarfStrSection
; }
241 const MCSection
*getDwarfLocSection() const { return DwarfLocSection
; }
242 const MCSection
*getDwarfARangesSection() const { return DwarfARangesSection
;}
243 const MCSection
*getDwarfRangesSection() const { return DwarfRangesSection
; }
244 const MCSection
*getDwarfMacroInfoSection() const {
245 return DwarfMacroInfoSection
;
248 // DWARF5 Experimental Debug Info Sections
249 const MCSection
*getDwarfAccelNamesSection() const {
250 return DwarfAccelNamesSection
;
252 const MCSection
*getDwarfAccelObjCSection() const {
253 return DwarfAccelObjCSection
;
255 const MCSection
*getDwarfAccelNamespaceSection() const {
256 return DwarfAccelNamespaceSection
;
258 const MCSection
*getDwarfAccelTypesSection() const {
259 return DwarfAccelTypesSection
;
261 const MCSection
*getDwarfInfoDWOSection() const {
262 return DwarfInfoDWOSection
;
264 const MCSection
*getDwarfTypesSection(uint64_t Hash
) const;
265 const MCSection
*getDwarfTypesDWOSection() const {
266 return DwarfTypesDWOSection
;
268 const MCSection
*getDwarfAbbrevDWOSection() const {
269 return DwarfAbbrevDWOSection
;
271 const MCSection
*getDwarfStrDWOSection() const {
272 return DwarfStrDWOSection
;
274 const MCSection
*getDwarfLineDWOSection() const {
275 return DwarfLineDWOSection
;
277 const MCSection
*getDwarfLocDWOSection() const {
278 return DwarfLocDWOSection
;
280 const MCSection
*getDwarfStrOffDWOSection() const {
281 return DwarfStrOffDWOSection
;
283 const MCSection
*getDwarfAddrSection() const {
284 return DwarfAddrSection
;
287 const MCSection
*getCOFFDebugSymbolsSection() const {
288 return COFFDebugSymbolsSection
;
291 const MCSection
*getTLSExtraDataSection() const {
292 return TLSExtraDataSection
;
294 const MCSection
*getTLSDataSection() const { return TLSDataSection
; }
295 const MCSection
*getTLSBSSSection() const { return TLSBSSSection
; }
297 const MCSection
*getStackMapSection() const { return StackMapSection
; }
299 /// ELF specific sections.
301 const MCSection
*getDataRelSection() const { return DataRelSection
; }
302 const MCSection
*getDataRelLocalSection() const {
303 return DataRelLocalSection
;
305 const MCSection
*getDataRelROSection() const { return DataRelROSection
; }
306 const MCSection
*getDataRelROLocalSection() const {
307 return DataRelROLocalSection
;
309 const MCSection
*getMergeableConst4Section() const {
310 return MergeableConst4Section
;
312 const MCSection
*getMergeableConst8Section() const {
313 return MergeableConst8Section
;
315 const MCSection
*getMergeableConst16Section() const {
316 return MergeableConst16Section
;
319 /// MachO specific sections.
321 const MCSection
*getTLSTLVSection() const { return TLSTLVSection
; }
322 const MCSection
*getTLSThreadInitSection() const {
323 return TLSThreadInitSection
;
325 const MCSection
*getCStringSection() const { return CStringSection
; }
326 const MCSection
*getUStringSection() const { return UStringSection
; }
327 const MCSection
*getTextCoalSection() const { return TextCoalSection
; }
328 const MCSection
*getConstTextCoalSection() const {
329 return ConstTextCoalSection
;
331 const MCSection
*getConstDataSection() const { return ConstDataSection
; }
332 const MCSection
*getDataCoalSection() const { return DataCoalSection
; }
333 const MCSection
*getDataCommonSection() const { return DataCommonSection
; }
334 const MCSection
*getDataBSSSection() const { return DataBSSSection
; }
335 const MCSection
*getFourByteConstantSection() const {
336 return FourByteConstantSection
;
338 const MCSection
*getEightByteConstantSection() const {
339 return EightByteConstantSection
;
341 const MCSection
*getSixteenByteConstantSection() const {
342 return SixteenByteConstantSection
;
344 const MCSection
*getLazySymbolPointerSection() const {
345 return LazySymbolPointerSection
;
347 const MCSection
*getNonLazySymbolPointerSection() const {
348 return NonLazySymbolPointerSection
;
351 /// COFF specific sections.
353 const MCSection
*getDrectveSection() const { return DrectveSection
; }
354 const MCSection
*getPDataSection() const { return PDataSection
; }
355 const MCSection
*getXDataSection() const { return XDataSection
; }
357 const MCSection
*getEHFrameSection() {
359 InitEHFrameSection();
360 return EHFrameSection
;
363 enum Environment
{ IsMachO
, IsELF
, IsCOFF
};
364 Environment
getObjectFileType() const {
368 Reloc::Model
getRelocM() const {
375 CodeModel::Model CMModel
;
379 void InitMachOMCObjectFileInfo(Triple T
);
380 void InitELFMCObjectFileInfo(Triple T
);
381 void InitCOFFMCObjectFileInfo(Triple T
);
383 /// InitEHFrameSection - Initialize EHFrameSection on demand.
385 void InitEHFrameSection();
388 const Triple
&getTargetTriple() const { return TT
; }
391 } // end namespace llvm