Coverage Report

Created: 2018-11-16 02:38

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/MC/MCObjectFileInfo.h
Line
Count
Source (jump to first uncovered line)
1
//===-- llvm/MC/MCObjectFileInfo.h - Object File Info -----------*- C++ -*-===//
2
//
3
//                     The LLVM Compiler Infrastructure
4
//
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
7
//
8
//===----------------------------------------------------------------------===//
9
//
10
// This file describes common object file formats.
11
//
12
//===----------------------------------------------------------------------===//
13
14
#ifndef LLVM_MC_MCOBJECTFILEINFO_H
15
#define LLVM_MC_MCOBJECTFILEINFO_H
16
17
#include "llvm/ADT/DenseMap.h"
18
#include "llvm/ADT/Triple.h"
19
#include "llvm/MC/MCSymbol.h"
20
#include "llvm/Support/CodeGen.h"
21
22
namespace llvm {
23
class MCContext;
24
class MCSection;
25
26
class MCObjectFileInfo {
27
protected:
28
  /// True if .comm supports alignment.  This is a hack for as long as we
29
  /// support 10.4 Tiger, whose assembler doesn't support alignment on comm.
30
  bool CommDirectiveSupportsAlignment;
31
32
  /// True if target object file supports a weak_definition of constant 0 for an
33
  /// omitted EH frame.
34
  bool SupportsWeakOmittedEHFrame;
35
36
  /// True if the target object file supports emitting a compact unwind section
37
  /// without an associated EH frame section.
38
  bool SupportsCompactUnwindWithoutEHFrame;
39
40
  /// OmitDwarfIfHaveCompactUnwind - True if the target object file
41
  /// supports having some functions with compact unwind and other with
42
  /// dwarf unwind.
43
  bool OmitDwarfIfHaveCompactUnwind;
44
45
  /// FDE CFI encoding. Controls the encoding of the begin label in the
46
  /// .eh_frame section. Unlike the LSDA encoding, personality encoding, and
47
  /// type encodings, this is something that the assembler just "knows" about
48
  /// its target
49
  unsigned FDECFIEncoding = 0;
50
51
  /// Compact unwind encoding indicating that we should emit only an EH frame.
52
  unsigned CompactUnwindDwarfEHFrameOnly;
53
54
  /// Section directive for standard text.
55
  MCSection *TextSection;
56
57
  /// Section directive for standard data.
58
  MCSection *DataSection;
59
60
  /// Section that is default initialized to zero.
61
  MCSection *BSSSection;
62
63
  /// Section that is readonly and can contain arbitrary initialized data.
64
  /// Targets are not required to have a readonly section. If they don't,
65
  /// various bits of code will fall back to using the data section for
66
  /// constants.
67
  MCSection *ReadOnlySection;
68
69
  /// If exception handling is supported by the target, this is the section the
70
  /// Language Specific Data Area information is emitted to.
71
  MCSection *LSDASection;
72
73
  /// If exception handling is supported by the target and the target can
74
  /// support a compact representation of the CIE and FDE, this is the section
75
  /// to emit them into.
76
  MCSection *CompactUnwindSection;
77
78
  // Dwarf sections for debug info.  If a target supports debug info, these must
79
  // be set.
80
  MCSection *DwarfAbbrevSection;
81
  MCSection *DwarfInfoSection;
82
  MCSection *DwarfLineSection;
83
  MCSection *DwarfLineStrSection;
84
  MCSection *DwarfFrameSection;
85
  MCSection *DwarfPubTypesSection;
86
  const MCSection *DwarfDebugInlineSection;
87
  MCSection *DwarfStrSection;
88
  MCSection *DwarfLocSection;
89
  MCSection *DwarfARangesSection;
90
  MCSection *DwarfRangesSection;
91
  MCSection *DwarfMacinfoSection;
92
  // The pubnames section is no longer generated by default.  The generation
93
  // can be enabled by a compiler flag.
94
  MCSection *DwarfPubNamesSection;
95
96
  /// Accelerator table sections. DwarfDebugNamesSection is the DWARF v5
97
  /// accelerator table, while DwarfAccelNamesSection, DwarfAccelObjCSection,
98
  /// DwarfAccelNamespaceSection, DwarfAccelTypesSection are pre-DWARF v5
99
  /// extensions.
100
  MCSection *DwarfDebugNamesSection;
101
  MCSection *DwarfAccelNamesSection;
102
  MCSection *DwarfAccelObjCSection;
103
  MCSection *DwarfAccelNamespaceSection;
104
  MCSection *DwarfAccelTypesSection;
105
106
  // These are used for the Fission separate debug information files.
107
  MCSection *DwarfInfoDWOSection;
108
  MCSection *DwarfTypesDWOSection;
109
  MCSection *DwarfAbbrevDWOSection;
110
  MCSection *DwarfStrDWOSection;
111
  MCSection *DwarfLineDWOSection;
112
  MCSection *DwarfLocDWOSection;
113
  MCSection *DwarfStrOffDWOSection;
114
115
  /// The DWARF v5 string offset and address table sections.
116
  MCSection *DwarfStrOffSection;
117
  MCSection *DwarfAddrSection;
118
  /// The DWARF v5 range list section.
119
  MCSection *DwarfRnglistsSection;
120
  /// The DWARF v5 locations list section.
121
  MCSection *DwarfLoclistsSection;
122
123
  /// The DWARF v5 range list section for fission.
124
  MCSection *DwarfRnglistsDWOSection;
125
126
  // These are for Fission DWP files.
127
  MCSection *DwarfCUIndexSection;
128
  MCSection *DwarfTUIndexSection;
129
130
  /// Section for newer gnu pubnames.
131
  MCSection *DwarfGnuPubNamesSection;
132
  /// Section for newer gnu pubtypes.
133
  MCSection *DwarfGnuPubTypesSection;
134
135
  // Section for Swift AST
136
  MCSection *DwarfSwiftASTSection;
137
138
  MCSection *COFFDebugSymbolsSection;
139
  MCSection *COFFDebugTypesSection;
140
  MCSection *COFFGlobalTypeHashesSection;
141
142
  /// Extra TLS Variable Data section.
143
  ///
144
  /// If the target needs to put additional information for a TLS variable,
145
  /// it'll go here.
146
  MCSection *TLSExtraDataSection;
147
148
  /// Section directive for Thread Local data. ELF, MachO, COFF, and Wasm.
149
  MCSection *TLSDataSection; // Defaults to ".tdata".
150
151
  /// Section directive for Thread Local uninitialized data.
152
  ///
153
  /// Null if this target doesn't support a BSS section. ELF and MachO only.
154
  MCSection *TLSBSSSection; // Defaults to ".tbss".
155
156
  /// StackMap section.
157
  MCSection *StackMapSection;
158
159
  /// FaultMap section.
160
  MCSection *FaultMapSection;
161
162
  /// EH frame section.
163
  ///
164
  /// It is initialized on demand so it can be overwritten (with uniquing).
165
  MCSection *EHFrameSection;
166
167
  /// Section containing metadata on function stack sizes.
168
  MCSection *StackSizesSection;
169
  mutable DenseMap<const MCSymbol *, unsigned> StackSizesUniquing;
170
171
  // ELF specific sections.
172
  MCSection *DataRelROSection;
173
  MCSection *MergeableConst4Section;
174
  MCSection *MergeableConst8Section;
175
  MCSection *MergeableConst16Section;
176
  MCSection *MergeableConst32Section;
177
178
  // MachO specific sections.
179
180
  /// Section for thread local structure information.
181
  ///
182
  /// Contains the source code name of the variable, visibility and a pointer to
183
  /// the initial value (.tdata or .tbss).
184
  MCSection *TLSTLVSection; // Defaults to ".tlv".
185
186
  /// Section for thread local data initialization functions.
187
  const MCSection *TLSThreadInitSection; // Defaults to ".thread_init_func".
188
189
  MCSection *CStringSection;
190
  MCSection *UStringSection;
191
  MCSection *TextCoalSection;
192
  MCSection *ConstTextCoalSection;
193
  MCSection *ConstDataSection;
194
  MCSection *DataCoalSection;
195
  MCSection *ConstDataCoalSection;
196
  MCSection *DataCommonSection;
197
  MCSection *DataBSSSection;
198
  MCSection *FourByteConstantSection;
199
  MCSection *EightByteConstantSection;
200
  MCSection *SixteenByteConstantSection;
201
  MCSection *LazySymbolPointerSection;
202
  MCSection *NonLazySymbolPointerSection;
203
  MCSection *ThreadLocalPointerSection;
204
205
  /// COFF specific sections.
206
  MCSection *DrectveSection;
207
  MCSection *PDataSection;
208
  MCSection *XDataSection;
209
  MCSection *SXDataSection;
210
  MCSection *GFIDsSection;
211
212
public:
213
  void InitMCObjectFileInfo(const Triple &TT, bool PIC, MCContext &ctx,
214
                            bool LargeCodeModel = false);
215
216
0
  bool getSupportsWeakOmittedEHFrame() const {
217
0
    return SupportsWeakOmittedEHFrame;
218
0
  }
219
5.67k
  bool getSupportsCompactUnwindWithoutEHFrame() const {
220
5.67k
    return SupportsCompactUnwindWithoutEHFrame;
221
5.67k
  }
222
3.23k
  bool getOmitDwarfIfHaveCompactUnwind() const {
223
3.23k
    return OmitDwarfIfHaveCompactUnwind;
224
3.23k
  }
225
226
13.8k
  bool getCommDirectiveSupportsAlignment() const {
227
13.8k
    return CommDirectiveSupportsAlignment;
228
13.8k
  }
229
230
99.4k
  unsigned getFDEEncoding() const { return FDECFIEncoding; }
231
232
130k
  unsigned getCompactUnwindDwarfEHFrameOnly() const {
233
130k
    return CompactUnwindDwarfEHFrameOnly;
234
130k
  }
235
236
54.3k
  MCSection *getTextSection() const { return TextSection; }
237
2.65k
  MCSection *getDataSection() const { return DataSection; }
238
1.29k
  MCSection *getBSSSection() const { return BSSSection; }
239
1.73k
  MCSection *getReadOnlySection() const { return ReadOnlySection; }
240
3.42k
  MCSection *getLSDASection() const { return LSDASection; }
241
9.86k
  MCSection *getCompactUnwindSection() const { return CompactUnwindSection; }
242
6.28k
  MCSection *getDwarfAbbrevSection() const { return DwarfAbbrevSection; }
243
3.41k
  MCSection *getDwarfInfoSection() const { return DwarfInfoSection; }
244
4
  MCSection *getDwarfInfoSection(uint64_t Hash) const {
245
4
    return getDwarfComdatSection(".debug_info", Hash);
246
4
  }
247
7.58k
  MCSection *getDwarfLineSection() const { return DwarfLineSection; }
248
281
  MCSection *getDwarfLineStrSection() const { return DwarfLineStrSection; }
249
341
  MCSection *getDwarfFrameSection() const { return DwarfFrameSection; }
250
767
  MCSection *getDwarfPubNamesSection() const { return DwarfPubNamesSection; }
251
765
  MCSection *getDwarfPubTypesSection() const { return DwarfPubTypesSection; }
252
1.73k
  MCSection *getDwarfGnuPubNamesSection() const {
253
1.73k
    return DwarfGnuPubNamesSection;
254
1.73k
  }
255
1.73k
  MCSection *getDwarfGnuPubTypesSection() const {
256
1.73k
    return DwarfGnuPubTypesSection;
257
1.73k
  }
258
207
  const MCSection *getDwarfDebugInlineSection() const {
259
207
    return DwarfDebugInlineSection;
260
207
  }
261
3.54k
  MCSection *getDwarfStrSection() const { return DwarfStrSection; }
262
398
  MCSection *getDwarfLocSection() const { return DwarfLocSection; }
263
482
  MCSection *getDwarfARangesSection() const { return DwarfARangesSection; }
264
57.3k
  MCSection *getDwarfRangesSection() const { return DwarfRangesSection; }
265
22
  MCSection *getDwarfRnglistsSection() const { return DwarfRnglistsSection; }
266
6
  MCSection *getDwarfLoclistsSection() const { return DwarfLoclistsSection; }
267
2.50k
  MCSection *getDwarfMacinfoSection() const { return DwarfMacinfoSection; }
268
269
269
  MCSection *getDwarfDebugNamesSection() const {
270
269
    return DwarfDebugNamesSection;
271
269
  }
272
3.00k
  MCSection *getDwarfAccelNamesSection() const {
273
3.00k
    return DwarfAccelNamesSection;
274
3.00k
  }
275
3.00k
  MCSection *getDwarfAccelObjCSection() const { return DwarfAccelObjCSection; }
276
3.00k
  MCSection *getDwarfAccelNamespaceSection() const {
277
3.00k
    return DwarfAccelNamespaceSection;
278
3.00k
  }
279
3.00k
  MCSection *getDwarfAccelTypesSection() const {
280
3.00k
    return DwarfAccelTypesSection;
281
3.00k
  }
282
282
  MCSection *getDwarfInfoDWOSection() const { return DwarfInfoDWOSection; }
283
16
  MCSection *getDwarfTypesSection(uint64_t Hash) const {
284
16
    return getDwarfComdatSection(".debug_types", Hash);
285
16
  }
286
279
  MCSection *getDwarfTypesDWOSection() const { return DwarfTypesDWOSection; }
287
272
  MCSection *getDwarfAbbrevDWOSection() const { return DwarfAbbrevDWOSection; }
288
272
  MCSection *getDwarfStrDWOSection() const { return DwarfStrDWOSection; }
289
272
  MCSection *getDwarfLineDWOSection() const { return DwarfLineDWOSection; }
290
272
  MCSection *getDwarfLocDWOSection() const { return DwarfLocDWOSection; }
291
279
  MCSection *getDwarfStrOffDWOSection() const { return DwarfStrOffDWOSection; }
292
483
  MCSection *getDwarfStrOffSection() const { return DwarfStrOffSection; }
293
3.46k
  MCSection *getDwarfAddrSection() const { return DwarfAddrSection; }
294
1
  MCSection *getDwarfRnglistsDWOSection() const {
295
1
    return DwarfRnglistsDWOSection;
296
1
  }
297
244
  MCSection *getDwarfCUIndexSection() const { return DwarfCUIndexSection; }
298
244
  MCSection *getDwarfTUIndexSection() const { return DwarfTUIndexSection; }
299
208
  MCSection *getDwarfSwiftASTSection() const { return DwarfSwiftASTSection; }
300
301
779
  MCSection *getCOFFDebugSymbolsSection() const {
302
779
    return COFFDebugSymbolsSection;
303
779
  }
304
134
  MCSection *getCOFFDebugTypesSection() const {
305
134
    return COFFDebugTypesSection;
306
134
  }
307
2
  MCSection *getCOFFGlobalTypeHashesSection() const {
308
2
    return COFFGlobalTypeHashesSection;
309
2
  }
310
311
117
  MCSection *getTLSExtraDataSection() const { return TLSExtraDataSection; }
312
0
  const MCSection *getTLSDataSection() const { return TLSDataSection; }
313
105
  MCSection *getTLSBSSSection() const { return TLSBSSSection; }
314
315
58
  MCSection *getStackMapSection() const { return StackMapSection; }
316
4
  MCSection *getFaultMapSection() const { return FaultMapSection; }
317
318
  MCSection *getStackSizesSection(const MCSection &TextSec) const;
319
320
  // ELF specific sections.
321
0
  MCSection *getDataRelROSection() const { return DataRelROSection; }
322
0
  const MCSection *getMergeableConst4Section() const {
323
0
    return MergeableConst4Section;
324
0
  }
325
0
  const MCSection *getMergeableConst8Section() const {
326
0
    return MergeableConst8Section;
327
0
  }
328
0
  const MCSection *getMergeableConst16Section() const {
329
0
    return MergeableConst16Section;
330
0
  }
331
0
  const MCSection *getMergeableConst32Section() const {
332
0
    return MergeableConst32Section;
333
0
  }
334
335
  // MachO specific sections.
336
0
  const MCSection *getTLSTLVSection() const { return TLSTLVSection; }
337
0
  const MCSection *getTLSThreadInitSection() const {
338
0
    return TLSThreadInitSection;
339
0
  }
340
0
  const MCSection *getCStringSection() const { return CStringSection; }
341
0
  const MCSection *getUStringSection() const { return UStringSection; }
342
0
  MCSection *getTextCoalSection() const { return TextCoalSection; }
343
0
  const MCSection *getConstTextCoalSection() const {
344
0
    return ConstTextCoalSection;
345
0
  }
346
0
  const MCSection *getConstDataSection() const { return ConstDataSection; }
347
0
  const MCSection *getDataCoalSection() const { return DataCoalSection; }
348
0
  const MCSection *getConstDataCoalSection() const {
349
0
    return ConstDataCoalSection;
350
0
  }
351
0
  const MCSection *getDataCommonSection() const { return DataCommonSection; }
352
6
  MCSection *getDataBSSSection() const { return DataBSSSection; }
353
0
  const MCSection *getFourByteConstantSection() const {
354
0
    return FourByteConstantSection;
355
0
  }
356
0
  const MCSection *getEightByteConstantSection() const {
357
0
    return EightByteConstantSection;
358
0
  }
359
0
  const MCSection *getSixteenByteConstantSection() const {
360
0
    return SixteenByteConstantSection;
361
0
  }
362
0
  MCSection *getLazySymbolPointerSection() const {
363
0
    return LazySymbolPointerSection;
364
0
  }
365
512
  MCSection *getNonLazySymbolPointerSection() const {
366
512
    return NonLazySymbolPointerSection;
367
512
  }
368
5
  MCSection *getThreadLocalPointerSection() const {
369
5
    return ThreadLocalPointerSection;
370
5
  }
371
372
  // COFF specific sections.
373
292
  MCSection *getDrectveSection() const { return DrectveSection; }
374
114
  MCSection *getPDataSection() const { return PDataSection; }
375
935
  MCSection *getXDataSection() const { return XDataSection; }
376
5
  MCSection *getSXDataSection() const { return SXDataSection; }
377
1
  MCSection *getGFIDsSection() const { return GFIDsSection; }
378
379
3.13k
  MCSection *getEHFrameSection() {
380
3.13k
    return EHFrameSection;
381
3.13k
  }
382
383
  enum Environment { IsMachO, IsELF, IsCOFF, IsWasm };
384
7.53M
  Environment getObjectFileType() const { return Env; }
385
386
17.4k
  bool isPositionIndependent() const { return PositionIndependent; }
387
388
private:
389
  Environment Env;
390
  bool PositionIndependent;
391
  MCContext *Ctx;
392
  Triple TT;
393
394
  void initMachOMCObjectFileInfo(const Triple &T);
395
  void initELFMCObjectFileInfo(const Triple &T, bool Large);
396
  void initCOFFMCObjectFileInfo(const Triple &T);
397
  void initWasmMCObjectFileInfo(const Triple &T);
398
  MCSection *getDwarfComdatSection(const char *Name, uint64_t Hash) const;
399
400
public:
401
190k
  const Triple &getTargetTriple() const { return TT; }
402
};
403
404
} // end namespace llvm
405
406
#endif