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"
24
class MCObjectFileInfo {
26
/// True if .comm supports alignment. This is a hack for as long as we
27
/// support 10.4 Tiger, whose assembler doesn't support alignment on comm.
28
bool CommDirectiveSupportsAlignment;
30
/// True if target object file supports a weak_definition of constant 0 for an
32
bool SupportsWeakOmittedEHFrame;
34
/// True if the target object file supports emitting a compact unwind section
35
/// without an associated EH frame section.
36
bool SupportsCompactUnwindWithoutEHFrame;
38
/// Some encoding values for EH.
39
unsigned PersonalityEncoding;
40
unsigned LSDAEncoding;
41
unsigned FDECFIEncoding;
42
unsigned TTypeEncoding;
44
/// Section flags for eh_frame
45
unsigned EHSectionType;
46
unsigned EHSectionFlags;
48
/// Compact unwind encoding indicating that we should emit only an EH frame.
49
unsigned CompactUnwindDwarfEHFrameOnly;
51
/// Section directive for standard text.
52
MCSection *TextSection;
54
/// Section directive for standard data.
55
MCSection *DataSection;
57
/// Section that is default initialized to zero.
58
MCSection *BSSSection;
60
/// Section that is readonly and can contain arbitrary initialized data.
61
/// Targets are not required to have a readonly section. If they don't,
62
/// various bits of code will fall back to using the data section for
64
MCSection *ReadOnlySection;
66
/// This section contains the static constructor pointer list.
67
MCSection *StaticCtorSection;
69
/// This section contains the static destructor pointer list.
70
MCSection *StaticDtorSection;
72
/// If exception handling is supported by the target, this is the section the
73
/// Language Specific Data Area information is emitted to.
74
MCSection *LSDASection;
76
/// If exception handling is supported by the target and the target can
77
/// support a compact representation of the CIE and FDE, this is the section
78
/// to emit them into.
79
MCSection *CompactUnwindSection;
81
// Dwarf sections for debug info. If a target supports debug info, these must
83
MCSection *DwarfAbbrevSection;
84
MCSection *DwarfInfoSection;
85
MCSection *DwarfLineSection;
86
MCSection *DwarfFrameSection;
87
MCSection *DwarfPubTypesSection;
88
const MCSection *DwarfDebugInlineSection;
89
MCSection *DwarfStrSection;
90
MCSection *DwarfLocSection;
91
MCSection *DwarfARangesSection;
92
MCSection *DwarfRangesSection;
93
// The pubnames section is no longer generated by default. The generation
94
// can be enabled by a compiler flag.
95
MCSection *DwarfPubNamesSection;
97
/// DWARF5 Experimental Debug Info Sections
98
/// DwarfAccelNamesSection, DwarfAccelObjCSection,
99
/// DwarfAccelNamespaceSection, DwarfAccelTypesSection -
100
/// If we use the DWARF accelerated hash tables then we want to emit these
102
MCSection *DwarfAccelNamesSection;
103
MCSection *DwarfAccelObjCSection;
104
MCSection *DwarfAccelNamespaceSection;
105
MCSection *DwarfAccelTypesSection;
107
// These are used for the Fission separate debug information files.
108
MCSection *DwarfInfoDWOSection;
109
MCSection *DwarfTypesDWOSection;
110
MCSection *DwarfAbbrevDWOSection;
111
MCSection *DwarfStrDWOSection;
112
MCSection *DwarfLineDWOSection;
113
MCSection *DwarfLocDWOSection;
114
MCSection *DwarfStrOffDWOSection;
115
MCSection *DwarfAddrSection;
117
/// Section for newer gnu pubnames.
118
MCSection *DwarfGnuPubNamesSection;
119
/// Section for newer gnu pubtypes.
120
MCSection *DwarfGnuPubTypesSection;
122
MCSection *COFFDebugSymbolsSection;
124
/// Extra TLS Variable Data section.
126
/// If the target needs to put additional information for a TLS variable,
128
MCSection *TLSExtraDataSection;
130
/// Section directive for Thread Local data. ELF, MachO and COFF.
131
MCSection *TLSDataSection; // Defaults to ".tdata".
133
/// Section directive for Thread Local uninitialized data.
135
/// Null if this target doesn't support a BSS section. ELF and MachO only.
136
MCSection *TLSBSSSection; // Defaults to ".tbss".
138
/// StackMap section.
139
MCSection *StackMapSection;
141
/// FaultMap section.
142
MCSection *FaultMapSection;
144
/// EH frame section.
146
/// It is initialized on demand so it can be overwritten (with uniquing).
147
MCSection *EHFrameSection;
149
// ELF specific sections.
150
MCSection *DataRelSection;
151
const MCSection *DataRelLocalSection;
152
MCSection *DataRelROSection;
153
MCSection *DataRelROLocalSection;
154
MCSection *MergeableConst4Section;
155
MCSection *MergeableConst8Section;
156
MCSection *MergeableConst16Section;
158
// MachO specific sections.
160
/// Section for thread local structure information.
162
/// Contains the source code name of the variable, visibility and a pointer to
163
/// the initial value (.tdata or .tbss).
164
MCSection *TLSTLVSection; // Defaults to ".tlv".
166
/// Section for thread local data initialization functions.
167
const MCSection *TLSThreadInitSection; // Defaults to ".thread_init_func".
169
MCSection *CStringSection;
170
MCSection *UStringSection;
171
MCSection *TextCoalSection;
172
MCSection *ConstTextCoalSection;
173
MCSection *ConstDataSection;
174
MCSection *DataCoalSection;
175
MCSection *DataCommonSection;
176
MCSection *DataBSSSection;
177
MCSection *FourByteConstantSection;
178
MCSection *EightByteConstantSection;
179
MCSection *SixteenByteConstantSection;
180
MCSection *LazySymbolPointerSection;
181
MCSection *NonLazySymbolPointerSection;
183
/// COFF specific sections.
184
MCSection *DrectveSection;
185
MCSection *PDataSection;
186
MCSection *XDataSection;
187
MCSection *SXDataSection;
190
void InitMCObjectFileInfo(const Triple &TT, Reloc::Model RM,
191
CodeModel::Model CM, MCContext &ctx);
192
LLVM_ATTRIBUTE_DEPRECATED(
193
void InitMCObjectFileInfo(StringRef TT, Reloc::Model RM,
194
CodeModel::Model CM, MCContext &ctx),
195
"StringRef GNU Triple argument replaced by a llvm::Triple object");
197
bool getSupportsWeakOmittedEHFrame() const {
198
return SupportsWeakOmittedEHFrame;
200
bool getSupportsCompactUnwindWithoutEHFrame() const {
201
return SupportsCompactUnwindWithoutEHFrame;
203
bool getCommDirectiveSupportsAlignment() const {
204
return CommDirectiveSupportsAlignment;
207
unsigned getPersonalityEncoding() const { return PersonalityEncoding; }
208
unsigned getLSDAEncoding() const { return LSDAEncoding; }
209
unsigned getFDEEncoding() const { return FDECFIEncoding; }
210
unsigned getTTypeEncoding() const { return TTypeEncoding; }
212
unsigned getCompactUnwindDwarfEHFrameOnly() const {
213
return CompactUnwindDwarfEHFrameOnly;
216
MCSection *getTextSection() const { return TextSection; }
217
MCSection *getDataSection() const { return DataSection; }
218
MCSection *getBSSSection() const { return BSSSection; }
219
MCSection *getLSDASection() const { return LSDASection; }
220
MCSection *getCompactUnwindSection() const { return CompactUnwindSection; }
221
MCSection *getDwarfAbbrevSection() const { return DwarfAbbrevSection; }
222
MCSection *getDwarfInfoSection() const { return DwarfInfoSection; }
223
MCSection *getDwarfLineSection() const { return DwarfLineSection; }
224
MCSection *getDwarfFrameSection() const { return DwarfFrameSection; }
225
MCSection *getDwarfPubNamesSection() const { return DwarfPubNamesSection; }
226
MCSection *getDwarfPubTypesSection() const { return DwarfPubTypesSection; }
227
MCSection *getDwarfGnuPubNamesSection() const {
228
return DwarfGnuPubNamesSection;
230
MCSection *getDwarfGnuPubTypesSection() const {
231
return DwarfGnuPubTypesSection;
233
const MCSection *getDwarfDebugInlineSection() const {
234
return DwarfDebugInlineSection;
236
MCSection *getDwarfStrSection() const { return DwarfStrSection; }
237
MCSection *getDwarfLocSection() const { return DwarfLocSection; }
238
MCSection *getDwarfARangesSection() const { return DwarfARangesSection; }
239
MCSection *getDwarfRangesSection() const { return DwarfRangesSection; }
241
// DWARF5 Experimental Debug Info Sections
242
MCSection *getDwarfAccelNamesSection() const {
243
return DwarfAccelNamesSection;
245
MCSection *getDwarfAccelObjCSection() const { return DwarfAccelObjCSection; }
246
MCSection *getDwarfAccelNamespaceSection() const {
247
return DwarfAccelNamespaceSection;
249
MCSection *getDwarfAccelTypesSection() const {
250
return DwarfAccelTypesSection;
252
MCSection *getDwarfInfoDWOSection() const { return DwarfInfoDWOSection; }
253
MCSection *getDwarfTypesSection(uint64_t Hash) const;
254
MCSection *getDwarfTypesDWOSection() const { return DwarfTypesDWOSection; }
255
MCSection *getDwarfAbbrevDWOSection() const { return DwarfAbbrevDWOSection; }
256
MCSection *getDwarfStrDWOSection() const { return DwarfStrDWOSection; }
257
MCSection *getDwarfLineDWOSection() const { return DwarfLineDWOSection; }
258
MCSection *getDwarfLocDWOSection() const { return DwarfLocDWOSection; }
259
MCSection *getDwarfStrOffDWOSection() const { return DwarfStrOffDWOSection; }
260
MCSection *getDwarfAddrSection() const { return DwarfAddrSection; }
262
MCSection *getCOFFDebugSymbolsSection() const {
263
return COFFDebugSymbolsSection;
266
MCSection *getTLSExtraDataSection() const { return TLSExtraDataSection; }
267
const MCSection *getTLSDataSection() const { return TLSDataSection; }
268
MCSection *getTLSBSSSection() const { return TLSBSSSection; }
270
MCSection *getStackMapSection() const { return StackMapSection; }
271
MCSection *getFaultMapSection() const { return FaultMapSection; }
273
// ELF specific sections.
274
MCSection *getDataRelSection() const { return DataRelSection; }
275
const MCSection *getDataRelLocalSection() const {
276
return DataRelLocalSection;
278
MCSection *getDataRelROSection() const { return DataRelROSection; }
279
MCSection *getDataRelROLocalSection() const { return DataRelROLocalSection; }
280
const MCSection *getMergeableConst4Section() const {
281
return MergeableConst4Section;
283
const MCSection *getMergeableConst8Section() const {
284
return MergeableConst8Section;
286
const MCSection *getMergeableConst16Section() const {
287
return MergeableConst16Section;
290
// MachO specific sections.
291
const MCSection *getTLSTLVSection() const { return TLSTLVSection; }
292
const MCSection *getTLSThreadInitSection() const {
293
return TLSThreadInitSection;
295
const MCSection *getCStringSection() const { return CStringSection; }
296
const MCSection *getUStringSection() const { return UStringSection; }
297
MCSection *getTextCoalSection() const { return TextCoalSection; }
298
const MCSection *getConstTextCoalSection() const {
299
return ConstTextCoalSection;
301
const MCSection *getConstDataSection() const { return ConstDataSection; }
302
const MCSection *getDataCoalSection() const { return DataCoalSection; }
303
const MCSection *getDataCommonSection() const { return DataCommonSection; }
304
MCSection *getDataBSSSection() const { return DataBSSSection; }
305
const MCSection *getFourByteConstantSection() const {
306
return FourByteConstantSection;
308
const MCSection *getEightByteConstantSection() const {
309
return EightByteConstantSection;
311
const MCSection *getSixteenByteConstantSection() const {
312
return SixteenByteConstantSection;
314
MCSection *getLazySymbolPointerSection() const {
315
return LazySymbolPointerSection;
317
MCSection *getNonLazySymbolPointerSection() const {
318
return NonLazySymbolPointerSection;
321
// COFF specific sections.
322
MCSection *getDrectveSection() const { return DrectveSection; }
323
MCSection *getPDataSection() const { return PDataSection; }
324
MCSection *getXDataSection() const { return XDataSection; }
325
MCSection *getSXDataSection() const { return SXDataSection; }
327
MCSection *getEHFrameSection() {
329
InitEHFrameSection();
330
return EHFrameSection;
333
enum Environment { IsMachO, IsELF, IsCOFF };
334
Environment getObjectFileType() const { return Env; }
336
Reloc::Model getRelocM() const { return RelocM; }
341
CodeModel::Model CMModel;
345
void initMachOMCObjectFileInfo(Triple T);
346
void initELFMCObjectFileInfo(Triple T);
347
void initCOFFMCObjectFileInfo(Triple T);
349
/// Initialize EHFrameSection on demand.
350
void InitEHFrameSection();
353
const Triple &getTargetTriple() const { return TT; }
356
} // end namespace llvm