aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/MC/MCObjectFileInfo.h
blob: a5853b602c871c609bfd6264301f60968df4a62b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
//===-- llvm/MC/MCObjectFileInfo.h - Object File Info -----------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file describes common object file formats.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_MC_MCBJECTFILEINFO_H
#define LLVM_MC_MCBJECTFILEINFO_H

#include "llvm/Support/CodeGen.h"

namespace llvm {
  class MCContext;
  class MCSection;
  class StringRef;
  class Triple;

class MCObjectFileInfo {
protected:
  /// CommDirectiveSupportsAlignment - True if .comm supports alignment.  This
  /// is a hack for as long as we support 10.4 Tiger, whose assembler doesn't
  /// support alignment on comm.
  bool CommDirectiveSupportsAlignment;

  /// SupportsWeakEmptyEHFrame - True if target object file supports a
  /// weak_definition of constant 0 for an omitted EH frame.
  bool SupportsWeakOmittedEHFrame;

  /// IsFunctionEHFrameSymbolPrivate - This flag is set to true if the
  /// "EH_frame" symbol for EH information should be an assembler temporary (aka
  /// private linkage, aka an L or .L label) or false if it should be a normal
  /// non-.globl label.  This defaults to true.
  bool IsFunctionEHFrameSymbolPrivate;

  /// PersonalityEncoding, LSDAEncoding, FDEEncoding, TTypeEncoding - Some
  /// encoding values for EH.
  unsigned PersonalityEncoding;
  unsigned LSDAEncoding;
  unsigned FDEEncoding;
  unsigned FDECFIEncoding;
  unsigned TTypeEncoding;

  /// Section flags for eh_frame
  unsigned EHSectionType;
  unsigned EHSectionFlags;

  /// CompactUnwindDwarfEHFrameOnly - Compact unwind encoding indicating that we
  /// should emit only an EH frame.
  unsigned CompactUnwindDwarfEHFrameOnly;

  /// TextSection - Section directive for standard text.
  ///
  const MCSection *TextSection;

  /// DataSection - Section directive for standard data.
  ///
  const MCSection *DataSection;

  /// BSSSection - Section that is default initialized to zero.
  const MCSection *BSSSection;

  /// ReadOnlySection - Section that is readonly and can contain arbitrary
  /// initialized data.  Targets are not required to have a readonly section.
  /// If they don't, various bits of code will fall back to using the data
  /// section for constants.
  const MCSection *ReadOnlySection;

  /// StaticCtorSection - This section contains the static constructor pointer
  /// list.
  const MCSection *StaticCtorSection;

  /// StaticDtorSection - This section contains the static destructor pointer
  /// list.
  const MCSection *StaticDtorSection;

  /// LSDASection - If exception handling is supported by the target, this is
  /// the section the Language Specific Data Area information is emitted to.
  const MCSection *LSDASection;

  /// CompactUnwindSection - If exception handling is supported by the target
  /// and the target can support a compact representation of the CIE and FDE,
  /// this is the section to emit them into.
  const MCSection *CompactUnwindSection;

  // Dwarf sections for debug info.  If a target supports debug info, these must
  // be set.
  const MCSection *DwarfAbbrevSection;
  const MCSection *DwarfInfoSection;
  const MCSection *DwarfLineSection;
  const MCSection *DwarfFrameSection;
  const MCSection *DwarfPubTypesSection;
  const MCSection *DwarfDebugInlineSection;
  const MCSection *DwarfStrSection;
  const MCSection *DwarfLocSection;
  const MCSection *DwarfARangesSection;
  const MCSection *DwarfRangesSection;
  const MCSection *DwarfMacroInfoSection;
  // The pubnames section is no longer generated by default.  The generation
  // can be enabled by a compiler flag.
  const MCSection *DwarfPubNamesSection;

  // DWARF5 Experimental Debug Info Sections
  /// DwarfAccelNamesSection, DwarfAccelObjCSection,
  /// DwarfAccelNamespaceSection, DwarfAccelTypesSection -
  /// If we use the DWARF accelerated hash tables then we want to emit these
  /// sections.
  const MCSection *DwarfAccelNamesSection;
  const MCSection *DwarfAccelObjCSection;
  const MCSection *DwarfAccelNamespaceSection;
  const MCSection *DwarfAccelTypesSection;

  /// These are used for the Fission separate debug information files.
  const MCSection *DwarfInfoDWOSection;
  const MCSection *DwarfAbbrevDWOSection;
  const MCSection *DwarfStrDWOSection;
  const MCSection *DwarfLineDWOSection;
  const MCSection *DwarfLocDWOSection;
  const MCSection *DwarfStrOffDWOSection;
  const MCSection *DwarfAddrSection;

  // Extra TLS Variable Data section.  If the target needs to put additional
  // information for a TLS variable, it'll go here.
  const MCSection *TLSExtraDataSection;

  /// TLSDataSection - Section directive for Thread Local data.
  /// ELF, MachO and COFF.
  const MCSection *TLSDataSection;        // Defaults to ".tdata".

  /// TLSBSSSection - Section directive for Thread Local uninitialized data.
  /// Null if this target doesn't support a BSS section.
  /// ELF and MachO only.
  const MCSection *TLSBSSSection;         // Defaults to ".tbss".


  /// EHFrameSection - EH frame section. It is initialized on demand so it
  /// can be overwritten (with uniquing).
  const MCSection *EHFrameSection;

  /// ELF specific sections.
  ///
  const MCSection *DataRelSection;
  const MCSection *DataRelLocalSection;
  const MCSection *DataRelROSection;
  const MCSection *DataRelROLocalSection;
  const MCSection *MergeableConst4Section;
  const MCSection *MergeableConst8Section;
  const MCSection *MergeableConst16Section;

  /// MachO specific sections.
  ///

  /// TLSTLVSection - Section for thread local structure information.
  /// Contains the source code name of the variable, visibility and a pointer
  /// to the initial value (.tdata or .tbss).
  const MCSection *TLSTLVSection;         // Defaults to ".tlv".

  /// TLSThreadInitSection - Section for thread local data initialization
  /// functions.
  const MCSection *TLSThreadInitSection;  // Defaults to ".thread_init_func".

  const MCSection *CStringSection;
  const MCSection *UStringSection;
  const MCSection *TextCoalSection;
  const MCSection *ConstTextCoalSection;
  const MCSection *ConstDataSection;
  const MCSection *DataCoalSection;
  const MCSection *DataCommonSection;
  const MCSection *DataBSSSection;
  const MCSection *FourByteConstantSection;
  const MCSection *EightByteConstantSection;
  const MCSection *SixteenByteConstantSection;
  const MCSection *LazySymbolPointerSection;
  const MCSection *NonLazySymbolPointerSection;

  /// COFF specific sections.
  ///
  const MCSection *DrectveSection;
  const MCSection *PDataSection;
  const MCSection *XDataSection;

public:
  void InitMCObjectFileInfo(StringRef TT, Reloc::Model RM, CodeModel::Model CM,
                            MCContext &ctx);

  bool isFunctionEHFrameSymbolPrivate() const {
    return IsFunctionEHFrameSymbolPrivate;
  }
  bool getSupportsWeakOmittedEHFrame() const {
    return SupportsWeakOmittedEHFrame;
  }
  bool getCommDirectiveSupportsAlignment() const {
    return CommDirectiveSupportsAlignment;
  }

  unsigned getPersonalityEncoding() const { return PersonalityEncoding; }
  unsigned getLSDAEncoding() const { return LSDAEncoding; }
  unsigned getFDEEncoding(bool CFI) const {
    return CFI ? FDECFIEncoding : FDEEncoding;
  }
  unsigned getTTypeEncoding() const { return TTypeEncoding; }

  unsigned getCompactUnwindDwarfEHFrameOnly() const {
    return CompactUnwindDwarfEHFrameOnly;
  }

  const MCSection *getTextSection() const { return TextSection; }
  const MCSection *getDataSection() const { return DataSection; }
  const MCSection *getBSSSection() const { return BSSSection; }
  const MCSection *getLSDASection() const { return LSDASection; }
  const MCSection *getCompactUnwindSection() const{
    return CompactUnwindSection;
  }
  const MCSection *getDwarfAbbrevSection() const { return DwarfAbbrevSection; }
  const MCSection *getDwarfInfoSection() const { return DwarfInfoSection; }
  const MCSection *getDwarfLineSection() const { return DwarfLineSection; }
  const MCSection *getDwarfFrameSection() const { return DwarfFrameSection; }
  const MCSection *getDwarfPubNamesSection() const{return DwarfPubNamesSection;}
  const MCSection *getDwarfPubTypesSection() const{return DwarfPubTypesSection;}
  const MCSection *getDwarfDebugInlineSection() const {
    return DwarfDebugInlineSection;
  }
  const MCSection *getDwarfStrSection() const { return DwarfStrSection; }
  const MCSection *getDwarfLocSection() const { return DwarfLocSection; }
  const MCSection *getDwarfARangesSection() const { return DwarfARangesSection;}
  const MCSection *getDwarfRangesSection() const { return DwarfRangesSection; }
  const MCSection *getDwarfMacroInfoSection() const {
    return DwarfMacroInfoSection;
  }

  // DWARF5 Experimental Debug Info Sections
  const MCSection *getDwarfAccelNamesSection() const {
    return DwarfAccelNamesSection;
  }
  const MCSection *getDwarfAccelObjCSection() const {
    return DwarfAccelObjCSection;
  }
  const MCSection *getDwarfAccelNamespaceSection() const {
    return DwarfAccelNamespaceSection;
  }
  const MCSection *getDwarfAccelTypesSection() const {
    return DwarfAccelTypesSection;
  }
  const MCSection *getDwarfInfoDWOSection() const {
    return DwarfInfoDWOSection;
  }
  const MCSection *getDwarfAbbrevDWOSection() const {
    return DwarfAbbrevDWOSection;
  }
  const MCSection *getDwarfStrDWOSection() const {
    return DwarfStrDWOSection;
  }
  const MCSection *getDwarfLineDWOSection() const {
    return DwarfLineDWOSection;
  }
  const MCSection *getDwarfLocDWOSection() const {
    return DwarfLocDWOSection;
  }
  const MCSection *getDwarfStrOffDWOSection() const {
    return DwarfStrOffDWOSection;
  }
  const MCSection *getDwarfAddrSection() const {
    return DwarfAddrSection;
  }

  const MCSection *getTLSExtraDataSection() const {
    return TLSExtraDataSection;
  }
  const MCSection *getTLSDataSection() const { return TLSDataSection; }
  const MCSection *getTLSBSSSection() const { return TLSBSSSection; }

  /// ELF specific sections.
  ///
  const MCSection *getDataRelSection() const { return DataRelSection; }
  const MCSection *getDataRelLocalSection() const {
    return DataRelLocalSection;
  }
  const MCSection *getDataRelROSection() const { return DataRelROSection; }
  const MCSection *getDataRelROLocalSection() const {
    return DataRelROLocalSection;
  }
  const MCSection *getMergeableConst4Section() const {
    return MergeableConst4Section;
  }
  const MCSection *getMergeableConst8Section() const {
    return MergeableConst8Section;
  }
  const MCSection *getMergeableConst16Section() const {
    return MergeableConst16Section;
  }

  /// MachO specific sections.
  ///
  const MCSection *getTLSTLVSection() const { return TLSTLVSection; }
  const MCSection *getTLSThreadInitSection() const {
    return TLSThreadInitSection;
  }
  const MCSection *getCStringSection() const { return CStringSection; }
  const MCSection *getUStringSection() const { return UStringSection; }
  const MCSection *getTextCoalSection() const { return TextCoalSection; }
  const MCSection *getConstTextCoalSection() const {
    return ConstTextCoalSection;
  }
  const MCSection *getConstDataSection() const { return ConstDataSection; }
  const MCSection *getDataCoalSection() const { return DataCoalSection; }
  const MCSection *getDataCommonSection() const { return DataCommonSection; }
  const MCSection *getDataBSSSection() const { return DataBSSSection; }
  const MCSection *getFourByteConstantSection() const {
    return FourByteConstantSection;
  }
  const MCSection *getEightByteConstantSection() const {
    return EightByteConstantSection;
  }
  const MCSection *getSixteenByteConstantSection() const {
    return SixteenByteConstantSection;
  }
  const MCSection *getLazySymbolPointerSection() const {
    return LazySymbolPointerSection;
  }
  const MCSection *getNonLazySymbolPointerSection() const {
    return NonLazySymbolPointerSection;
  }

  /// COFF specific sections.
  ///
  const MCSection *getDrectveSection() const { return DrectveSection; }
  const MCSection *getPDataSection() const { return PDataSection; }
  const MCSection *getXDataSection() const { return XDataSection; }

  const MCSection *getEHFrameSection() {
    if (!EHFrameSection)
      InitEHFrameSection();
    return EHFrameSection;
  }

private:
  enum Environment { IsMachO, IsELF, IsCOFF };
  Environment Env;
  Reloc::Model RelocM;
  CodeModel::Model CMModel;
  MCContext *Ctx;

  void InitMachOMCObjectFileInfo(Triple T);
  void InitELFMCObjectFileInfo(Triple T);
  void InitCOFFMCObjectFileInfo(Triple T);

  /// InitEHFrameSection - Initialize EHFrameSection on demand.
  ///
  void InitEHFrameSection();
};

} // end namespace llvm

#endif