Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===-- llvm/MC/MCObjectFileInfo.h - Object File Info -----------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file describes common object file formats.
10
//
11
//===----------------------------------------------------------------------===//
12
 
13
#ifndef LLVM_MC_MCOBJECTFILEINFO_H
14
#define LLVM_MC_MCOBJECTFILEINFO_H
15
 
16
#include "llvm/ADT/Triple.h"
17
#include "llvm/BinaryFormat/Swift.h"
18
#include "llvm/MC/MCSection.h"
19
#include "llvm/Support/VersionTuple.h"
20
 
21
#include <array>
22
#include <optional>
23
 
24
namespace llvm {
25
class MCContext;
26
class MCSection;
27
 
28
class MCObjectFileInfo {
29
protected:
30
  /// True if target object file supports a weak_definition of constant 0 for an
31
  /// omitted EH frame.
32
  bool SupportsWeakOmittedEHFrame = false;
33
 
34
  /// True if the target object file supports emitting a compact unwind section
35
  /// without an associated EH frame section.
36
  bool SupportsCompactUnwindWithoutEHFrame = false;
37
 
38
  /// OmitDwarfIfHaveCompactUnwind - True if the target object file
39
  /// supports having some functions with compact unwind and other with
40
  /// dwarf unwind.
41
  bool OmitDwarfIfHaveCompactUnwind = false;
42
 
43
  /// FDE CFI encoding. Controls the encoding of the begin label in the
44
  /// .eh_frame section. Unlike the LSDA encoding, personality encoding, and
45
  /// type encodings, this is something that the assembler just "knows" about
46
  /// its target
47
  unsigned FDECFIEncoding = 0;
48
 
49
  /// Compact unwind encoding indicating that we should emit only an EH frame.
50
  unsigned CompactUnwindDwarfEHFrameOnly = 0;
51
 
52
  /// Section directive for standard text.
53
  MCSection *TextSection = nullptr;
54
 
55
  /// Section directive for standard data.
56
  MCSection *DataSection = nullptr;
57
 
58
  /// Section that is default initialized to zero.
59
  MCSection *BSSSection = nullptr;
60
 
61
  /// Section that is readonly and can contain arbitrary initialized data.
62
  /// Targets are not required to have a readonly section. If they don't,
63
  /// various bits of code will fall back to using the data section for
64
  /// constants.
65
  MCSection *ReadOnlySection = nullptr;
66
 
67
  /// If exception handling is supported by the target, this is the section the
68
  /// Language Specific Data Area information is emitted to.
69
  MCSection *LSDASection = nullptr;
70
 
71
  /// If exception handling is supported by the target and the target can
72
  /// support a compact representation of the CIE and FDE, this is the section
73
  /// to emit them into.
74
  MCSection *CompactUnwindSection = nullptr;
75
 
76
  // Dwarf sections for debug info.  If a target supports debug info, these must
77
  // be set.
78
  MCSection *DwarfAbbrevSection = nullptr;
79
  MCSection *DwarfInfoSection = nullptr;
80
  MCSection *DwarfLineSection = nullptr;
81
  MCSection *DwarfLineStrSection = nullptr;
82
  MCSection *DwarfFrameSection = nullptr;
83
  MCSection *DwarfPubTypesSection = nullptr;
84
  const MCSection *DwarfDebugInlineSection = nullptr;
85
  MCSection *DwarfStrSection = nullptr;
86
  MCSection *DwarfLocSection = nullptr;
87
  MCSection *DwarfARangesSection = nullptr;
88
  MCSection *DwarfRangesSection = nullptr;
89
  MCSection *DwarfMacinfoSection = nullptr;
90
  MCSection *DwarfMacroSection = nullptr;
91
  // The pubnames section is no longer generated by default.  The generation
92
  // can be enabled by a compiler flag.
93
  MCSection *DwarfPubNamesSection = nullptr;
94
 
95
  /// Accelerator table sections. DwarfDebugNamesSection is the DWARF v5
96
  /// accelerator table, while DwarfAccelNamesSection, DwarfAccelObjCSection,
97
  /// DwarfAccelNamespaceSection, DwarfAccelTypesSection are pre-DWARF v5
98
  /// extensions.
99
  MCSection *DwarfDebugNamesSection = nullptr;
100
  MCSection *DwarfAccelNamesSection = nullptr;
101
  MCSection *DwarfAccelObjCSection = nullptr;
102
  MCSection *DwarfAccelNamespaceSection = nullptr;
103
  MCSection *DwarfAccelTypesSection = nullptr;
104
 
105
  // These are used for the Fission separate debug information files.
106
  MCSection *DwarfInfoDWOSection = nullptr;
107
  MCSection *DwarfTypesDWOSection = nullptr;
108
  MCSection *DwarfAbbrevDWOSection = nullptr;
109
  MCSection *DwarfStrDWOSection = nullptr;
110
  MCSection *DwarfLineDWOSection = nullptr;
111
  MCSection *DwarfLocDWOSection = nullptr;
112
  MCSection *DwarfStrOffDWOSection = nullptr;
113
  MCSection *DwarfMacinfoDWOSection = nullptr;
114
  MCSection *DwarfMacroDWOSection = nullptr;
115
 
116
  /// The DWARF v5 string offset and address table sections.
117
  MCSection *DwarfStrOffSection = nullptr;
118
  MCSection *DwarfAddrSection = nullptr;
119
  /// The DWARF v5 range list section.
120
  MCSection *DwarfRnglistsSection = nullptr;
121
  /// The DWARF v5 locations list section.
122
  MCSection *DwarfLoclistsSection = nullptr;
123
 
124
  /// The DWARF v5 range and location list sections for fission.
125
  MCSection *DwarfRnglistsDWOSection = nullptr;
126
  MCSection *DwarfLoclistsDWOSection = nullptr;
127
 
128
  // These are for Fission DWP files.
129
  MCSection *DwarfCUIndexSection = nullptr;
130
  MCSection *DwarfTUIndexSection = nullptr;
131
 
132
  /// Section for newer gnu pubnames.
133
  MCSection *DwarfGnuPubNamesSection = nullptr;
134
  /// Section for newer gnu pubtypes.
135
  MCSection *DwarfGnuPubTypesSection = nullptr;
136
 
137
  // Section for Swift AST
138
  MCSection *DwarfSwiftASTSection = nullptr;
139
 
140
  MCSection *COFFDebugSymbolsSection = nullptr;
141
  MCSection *COFFDebugTypesSection = nullptr;
142
  MCSection *COFFGlobalTypeHashesSection = nullptr;
143
 
144
  /// Extra TLS Variable Data section.
145
  ///
146
  /// If the target needs to put additional information for a TLS variable,
147
  /// it'll go here.
148
  MCSection *TLSExtraDataSection = nullptr;
149
 
150
  /// Section directive for Thread Local data. ELF, MachO, COFF, and Wasm.
151
  MCSection *TLSDataSection = nullptr; // Defaults to ".tdata".
152
 
153
  /// Section directive for Thread Local uninitialized data.
154
  ///
155
  /// Null if this target doesn't support a BSS section. ELF and MachO only.
156
  MCSection *TLSBSSSection = nullptr; // Defaults to ".tbss".
157
 
158
  /// StackMap section.
159
  MCSection *StackMapSection = nullptr;
160
 
161
  /// FaultMap section.
162
  MCSection *FaultMapSection = nullptr;
163
 
164
  /// Remarks section.
165
  MCSection *RemarksSection = nullptr;
166
 
167
  /// EH frame section.
168
  ///
169
  /// It is initialized on demand so it can be overwritten (with uniquing).
170
  MCSection *EHFrameSection = nullptr;
171
 
172
  /// Section containing metadata on function stack sizes.
173
  MCSection *StackSizesSection = nullptr;
174
 
175
  /// Section for pseudo probe information used by AutoFDO
176
  MCSection *PseudoProbeSection = nullptr;
177
  MCSection *PseudoProbeDescSection = nullptr;
178
 
179
  // Section for metadata of llvm statistics.
180
  MCSection *LLVMStatsSection = nullptr;
181
 
182
  // ELF specific sections.
183
  MCSection *DataRelROSection = nullptr;
184
  MCSection *MergeableConst4Section = nullptr;
185
  MCSection *MergeableConst8Section = nullptr;
186
  MCSection *MergeableConst16Section = nullptr;
187
  MCSection *MergeableConst32Section = nullptr;
188
 
189
  // MachO specific sections.
190
 
191
  /// Section for thread local structure information.
192
  ///
193
  /// Contains the source code name of the variable, visibility and a pointer to
194
  /// the initial value (.tdata or .tbss).
195
  MCSection *TLSTLVSection = nullptr; // Defaults to ".tlv".
196
 
197
  /// Section for thread local data initialization functions.
198
   // Defaults to ".thread_init_func".
199
  const MCSection *TLSThreadInitSection = nullptr;
200
 
201
  MCSection *CStringSection = nullptr;
202
  MCSection *UStringSection = nullptr;
203
  MCSection *TextCoalSection = nullptr;
204
  MCSection *ConstTextCoalSection = nullptr;
205
  MCSection *ConstDataSection = nullptr;
206
  MCSection *DataCoalSection = nullptr;
207
  MCSection *ConstDataCoalSection = nullptr;
208
  MCSection *DataCommonSection = nullptr;
209
  MCSection *DataBSSSection = nullptr;
210
  MCSection *FourByteConstantSection = nullptr;
211
  MCSection *EightByteConstantSection = nullptr;
212
  MCSection *SixteenByteConstantSection = nullptr;
213
  MCSection *LazySymbolPointerSection = nullptr;
214
  MCSection *NonLazySymbolPointerSection = nullptr;
215
  MCSection *ThreadLocalPointerSection = nullptr;
216
  MCSection *AddrSigSection = nullptr;
217
 
218
  /// COFF specific sections.
219
  MCSection *DrectveSection = nullptr;
220
  MCSection *PDataSection = nullptr;
221
  MCSection *XDataSection = nullptr;
222
  MCSection *SXDataSection = nullptr;
223
  MCSection *GEHContSection = nullptr;
224
  MCSection *GFIDsSection = nullptr;
225
  MCSection *GIATsSection = nullptr;
226
  MCSection *GLJMPSection = nullptr;
227
 
228
  // GOFF specific sections.
229
  MCSection *PPA1Section = nullptr;
230
 
231
  // XCOFF specific sections
232
  MCSection *TOCBaseSection = nullptr;
233
  MCSection *ReadOnly8Section = nullptr;
234
  MCSection *ReadOnly16Section = nullptr;
235
 
236
  // Swift5 Reflection Data Sections
237
  std::array<MCSection *, binaryformat::Swift5ReflectionSectionKind::last>
238
      Swift5ReflectionSections = {};
239
 
240
public:
241
  void initMCObjectFileInfo(MCContext &MCCtx, bool PIC,
242
                            bool LargeCodeModel = false);
243
  virtual ~MCObjectFileInfo();
244
  MCContext &getContext() const { return *Ctx; }
245
 
246
  bool getSupportsWeakOmittedEHFrame() const {
247
    return SupportsWeakOmittedEHFrame;
248
  }
249
  bool getSupportsCompactUnwindWithoutEHFrame() const {
250
    return SupportsCompactUnwindWithoutEHFrame;
251
  }
252
  bool getOmitDwarfIfHaveCompactUnwind() const {
253
    return OmitDwarfIfHaveCompactUnwind;
254
  }
255
 
256
  unsigned getFDEEncoding() const { return FDECFIEncoding; }
257
 
258
  unsigned getCompactUnwindDwarfEHFrameOnly() const {
259
    return CompactUnwindDwarfEHFrameOnly;
260
  }
261
 
262
  virtual unsigned getTextSectionAlignment() const { return 4; }
263
  MCSection *getTextSection() const { return TextSection; }
264
  MCSection *getDataSection() const { return DataSection; }
265
  MCSection *getBSSSection() const { return BSSSection; }
266
  MCSection *getReadOnlySection() const { return ReadOnlySection; }
267
  MCSection *getLSDASection() const { return LSDASection; }
268
  MCSection *getCompactUnwindSection() const { return CompactUnwindSection; }
269
  MCSection *getDwarfAbbrevSection() const { return DwarfAbbrevSection; }
270
  MCSection *getDwarfInfoSection() const { return DwarfInfoSection; }
271
  MCSection *getDwarfInfoSection(uint64_t Hash) const {
272
    return getDwarfComdatSection(".debug_info", Hash);
273
  }
274
  MCSection *getDwarfLineSection() const { return DwarfLineSection; }
275
  MCSection *getDwarfLineStrSection() const { return DwarfLineStrSection; }
276
  MCSection *getDwarfFrameSection() const { return DwarfFrameSection; }
277
  MCSection *getDwarfPubNamesSection() const { return DwarfPubNamesSection; }
278
  MCSection *getDwarfPubTypesSection() const { return DwarfPubTypesSection; }
279
  MCSection *getDwarfGnuPubNamesSection() const {
280
    return DwarfGnuPubNamesSection;
281
  }
282
  MCSection *getDwarfGnuPubTypesSection() const {
283
    return DwarfGnuPubTypesSection;
284
  }
285
  const MCSection *getDwarfDebugInlineSection() const {
286
    return DwarfDebugInlineSection;
287
  }
288
  MCSection *getDwarfStrSection() const { return DwarfStrSection; }
289
  MCSection *getDwarfLocSection() const { return DwarfLocSection; }
290
  MCSection *getDwarfARangesSection() const { return DwarfARangesSection; }
291
  MCSection *getDwarfRangesSection() const { return DwarfRangesSection; }
292
  MCSection *getDwarfRnglistsSection() const { return DwarfRnglistsSection; }
293
  MCSection *getDwarfLoclistsSection() const { return DwarfLoclistsSection; }
294
  MCSection *getDwarfMacinfoSection() const { return DwarfMacinfoSection; }
295
  MCSection *getDwarfMacroSection() const { return DwarfMacroSection; }
296
 
297
  MCSection *getDwarfDebugNamesSection() const {
298
    return DwarfDebugNamesSection;
299
  }
300
  MCSection *getDwarfAccelNamesSection() const {
301
    return DwarfAccelNamesSection;
302
  }
303
  MCSection *getDwarfAccelObjCSection() const { return DwarfAccelObjCSection; }
304
  MCSection *getDwarfAccelNamespaceSection() const {
305
    return DwarfAccelNamespaceSection;
306
  }
307
  MCSection *getDwarfAccelTypesSection() const {
308
    return DwarfAccelTypesSection;
309
  }
310
  MCSection *getDwarfInfoDWOSection() const { return DwarfInfoDWOSection; }
311
  MCSection *getDwarfTypesSection(uint64_t Hash) const {
312
    return getDwarfComdatSection(".debug_types", Hash);
313
  }
314
  MCSection *getDwarfTypesDWOSection() const { return DwarfTypesDWOSection; }
315
  MCSection *getDwarfAbbrevDWOSection() const { return DwarfAbbrevDWOSection; }
316
  MCSection *getDwarfStrDWOSection() const { return DwarfStrDWOSection; }
317
  MCSection *getDwarfLineDWOSection() const { return DwarfLineDWOSection; }
318
  MCSection *getDwarfLocDWOSection() const { return DwarfLocDWOSection; }
319
  MCSection *getDwarfStrOffDWOSection() const { return DwarfStrOffDWOSection; }
320
  MCSection *getDwarfStrOffSection() const { return DwarfStrOffSection; }
321
  MCSection *getDwarfAddrSection() const { return DwarfAddrSection; }
322
  MCSection *getDwarfRnglistsDWOSection() const {
323
    return DwarfRnglistsDWOSection;
324
  }
325
  MCSection *getDwarfLoclistsDWOSection() const {
326
    return DwarfLoclistsDWOSection;
327
  }
328
  MCSection *getDwarfMacroDWOSection() const { return DwarfMacroDWOSection; }
329
  MCSection *getDwarfMacinfoDWOSection() const {
330
    return DwarfMacinfoDWOSection;
331
  }
332
  MCSection *getDwarfCUIndexSection() const { return DwarfCUIndexSection; }
333
  MCSection *getDwarfTUIndexSection() const { return DwarfTUIndexSection; }
334
  MCSection *getDwarfSwiftASTSection() const { return DwarfSwiftASTSection; }
335
 
336
  MCSection *getCOFFDebugSymbolsSection() const {
337
    return COFFDebugSymbolsSection;
338
  }
339
  MCSection *getCOFFDebugTypesSection() const {
340
    return COFFDebugTypesSection;
341
  }
342
  MCSection *getCOFFGlobalTypeHashesSection() const {
343
    return COFFGlobalTypeHashesSection;
344
  }
345
 
346
  MCSection *getTLSExtraDataSection() const { return TLSExtraDataSection; }
347
  const MCSection *getTLSDataSection() const { return TLSDataSection; }
348
  MCSection *getTLSBSSSection() const { return TLSBSSSection; }
349
 
350
  MCSection *getStackMapSection() const { return StackMapSection; }
351
  MCSection *getFaultMapSection() const { return FaultMapSection; }
352
  MCSection *getRemarksSection() const { return RemarksSection; }
353
 
354
  MCSection *getStackSizesSection(const MCSection &TextSec) const;
355
 
356
  MCSection *getBBAddrMapSection(const MCSection &TextSec) const;
357
 
358
  MCSection *getKCFITrapSection(const MCSection &TextSec) const;
359
 
360
  MCSection *getPseudoProbeSection(const MCSection &TextSec) const;
361
 
362
  MCSection *getPseudoProbeDescSection(StringRef FuncName) const;
363
 
364
  MCSection *getLLVMStatsSection() const;
365
 
366
  MCSection *getPCSection(StringRef Name, const MCSection *TextSec) const;
367
 
368
  // ELF specific sections.
369
  MCSection *getDataRelROSection() const { return DataRelROSection; }
370
  const MCSection *getMergeableConst4Section() const {
371
    return MergeableConst4Section;
372
  }
373
  const MCSection *getMergeableConst8Section() const {
374
    return MergeableConst8Section;
375
  }
376
  const MCSection *getMergeableConst16Section() const {
377
    return MergeableConst16Section;
378
  }
379
  const MCSection *getMergeableConst32Section() const {
380
    return MergeableConst32Section;
381
  }
382
 
383
  // MachO specific sections.
384
  const MCSection *getTLSTLVSection() const { return TLSTLVSection; }
385
  const MCSection *getTLSThreadInitSection() const {
386
    return TLSThreadInitSection;
387
  }
388
  const MCSection *getCStringSection() const { return CStringSection; }
389
  const MCSection *getUStringSection() const { return UStringSection; }
390
  MCSection *getTextCoalSection() const { return TextCoalSection; }
391
  const MCSection *getConstTextCoalSection() const {
392
    return ConstTextCoalSection;
393
  }
394
  const MCSection *getConstDataSection() const { return ConstDataSection; }
395
  const MCSection *getDataCoalSection() const { return DataCoalSection; }
396
  const MCSection *getConstDataCoalSection() const {
397
    return ConstDataCoalSection;
398
  }
399
  const MCSection *getDataCommonSection() const { return DataCommonSection; }
400
  MCSection *getDataBSSSection() const { return DataBSSSection; }
401
  const MCSection *getFourByteConstantSection() const {
402
    return FourByteConstantSection;
403
  }
404
  const MCSection *getEightByteConstantSection() const {
405
    return EightByteConstantSection;
406
  }
407
  const MCSection *getSixteenByteConstantSection() const {
408
    return SixteenByteConstantSection;
409
  }
410
  MCSection *getLazySymbolPointerSection() const {
411
    return LazySymbolPointerSection;
412
  }
413
  MCSection *getNonLazySymbolPointerSection() const {
414
    return NonLazySymbolPointerSection;
415
  }
416
  MCSection *getThreadLocalPointerSection() const {
417
    return ThreadLocalPointerSection;
418
  }
419
  MCSection *getAddrSigSection() const { return AddrSigSection; }
420
 
421
  // COFF specific sections.
422
  MCSection *getDrectveSection() const { return DrectveSection; }
423
  MCSection *getPDataSection() const { return PDataSection; }
424
  MCSection *getXDataSection() const { return XDataSection; }
425
  MCSection *getSXDataSection() const { return SXDataSection; }
426
  MCSection *getGEHContSection() const { return GEHContSection; }
427
  MCSection *getGFIDsSection() const { return GFIDsSection; }
428
  MCSection *getGIATsSection() const { return GIATsSection; }
429
  MCSection *getGLJMPSection() const { return GLJMPSection; }
430
 
431
  // GOFF specific sections.
432
  MCSection *getPPA1Section() const { return PPA1Section; }
433
 
434
  // XCOFF specific sections
435
  MCSection *getTOCBaseSection() const { return TOCBaseSection; }
436
 
437
  MCSection *getEHFrameSection() const { return EHFrameSection; }
438
 
439
  bool isPositionIndependent() const { return PositionIndependent; }
440
 
441
  // Swift5 Reflection Data Sections
442
  MCSection *getSwift5ReflectionSection(
443
      llvm::binaryformat::Swift5ReflectionSectionKind ReflSectionKind) {
444
    return ReflSectionKind !=
445
                   llvm::binaryformat::Swift5ReflectionSectionKind::unknown
446
               ? Swift5ReflectionSections[ReflSectionKind]
447
               : nullptr;
448
  }
449
 
450
private:
451
  bool PositionIndependent = false;
452
  MCContext *Ctx = nullptr;
453
  VersionTuple SDKVersion;
454
  std::optional<Triple> DarwinTargetVariantTriple;
455
  VersionTuple DarwinTargetVariantSDKVersion;
456
 
457
  void initMachOMCObjectFileInfo(const Triple &T);
458
  void initELFMCObjectFileInfo(const Triple &T, bool Large);
459
  void initGOFFMCObjectFileInfo(const Triple &T);
460
  void initCOFFMCObjectFileInfo(const Triple &T);
461
  void initSPIRVMCObjectFileInfo(const Triple &T);
462
  void initWasmMCObjectFileInfo(const Triple &T);
463
  void initXCOFFMCObjectFileInfo(const Triple &T);
464
  void initDXContainerObjectFileInfo(const Triple &T);
465
  MCSection *getDwarfComdatSection(const char *Name, uint64_t Hash) const;
466
 
467
public:
468
  void setSDKVersion(const VersionTuple &TheSDKVersion) {
469
    SDKVersion = TheSDKVersion;
470
  }
471
 
472
  const VersionTuple &getSDKVersion() const { return SDKVersion; }
473
 
474
  void setDarwinTargetVariantTriple(const Triple &T) {
475
    DarwinTargetVariantTriple = T;
476
  }
477
 
478
  const Triple *getDarwinTargetVariantTriple() const {
479
    return DarwinTargetVariantTriple ? &*DarwinTargetVariantTriple : nullptr;
480
  }
481
 
482
  void setDarwinTargetVariantSDKVersion(const VersionTuple &TheSDKVersion) {
483
    DarwinTargetVariantSDKVersion = TheSDKVersion;
484
  }
485
 
486
  const VersionTuple &getDarwinTargetVariantSDKVersion() const {
487
    return DarwinTargetVariantSDKVersion;
488
  }
489
};
490
 
491
} // end namespace llvm
492
 
493
#endif