1 //===-- llvm/MC/MCObjectFileInfo.h - Object File Info -----------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file describes common object file formats.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_MC_MCOBJECTFILEINFO_H
14 #define LLVM_MC_MCOBJECTFILEINFO_H
16 #include "llvm/ADT/DenseMap.h"
17 #include "llvm/ADT/Triple.h"
18 #include "llvm/MC/MCSymbol.h"
19 #include "llvm/Support/CodeGen.h"
20 #include "llvm/Support/VersionTuple.h"
26 class MCObjectFileInfo
{
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
;
32 /// True if target object file supports a weak_definition of constant 0 for an
34 bool SupportsWeakOmittedEHFrame
;
36 /// True if the target object file supports emitting a compact unwind section
37 /// without an associated EH frame section.
38 bool SupportsCompactUnwindWithoutEHFrame
;
40 /// OmitDwarfIfHaveCompactUnwind - True if the target object file
41 /// supports having some functions with compact unwind and other with
43 bool OmitDwarfIfHaveCompactUnwind
;
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
49 unsigned FDECFIEncoding
= 0;
51 /// Compact unwind encoding indicating that we should emit only an EH frame.
52 unsigned CompactUnwindDwarfEHFrameOnly
;
54 /// Section directive for standard text.
55 MCSection
*TextSection
;
57 /// Section directive for standard data.
58 MCSection
*DataSection
;
60 /// Section that is default initialized to zero.
61 MCSection
*BSSSection
;
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
67 MCSection
*ReadOnlySection
;
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
;
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
;
78 // Dwarf sections for debug info. If a target supports debug info, these must
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
;
96 /// Accelerator table sections. DwarfDebugNamesSection is the DWARF v5
97 /// accelerator table, while DwarfAccelNamesSection, DwarfAccelObjCSection,
98 /// DwarfAccelNamespaceSection, DwarfAccelTypesSection are pre-DWARF v5
100 MCSection
*DwarfDebugNamesSection
;
101 MCSection
*DwarfAccelNamesSection
;
102 MCSection
*DwarfAccelObjCSection
;
103 MCSection
*DwarfAccelNamespaceSection
;
104 MCSection
*DwarfAccelTypesSection
;
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
;
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
;
123 /// The DWARF v5 range list section for fission.
124 MCSection
*DwarfRnglistsDWOSection
;
126 // These are for Fission DWP files.
127 MCSection
*DwarfCUIndexSection
;
128 MCSection
*DwarfTUIndexSection
;
130 /// Section for newer gnu pubnames.
131 MCSection
*DwarfGnuPubNamesSection
;
132 /// Section for newer gnu pubtypes.
133 MCSection
*DwarfGnuPubTypesSection
;
135 // Section for Swift AST
136 MCSection
*DwarfSwiftASTSection
;
138 MCSection
*COFFDebugSymbolsSection
;
139 MCSection
*COFFDebugTypesSection
;
140 MCSection
*COFFGlobalTypeHashesSection
;
142 /// Extra TLS Variable Data section.
144 /// If the target needs to put additional information for a TLS variable,
146 MCSection
*TLSExtraDataSection
;
148 /// Section directive for Thread Local data. ELF, MachO, COFF, and Wasm.
149 MCSection
*TLSDataSection
; // Defaults to ".tdata".
151 /// Section directive for Thread Local uninitialized data.
153 /// Null if this target doesn't support a BSS section. ELF and MachO only.
154 MCSection
*TLSBSSSection
; // Defaults to ".tbss".
156 /// StackMap section.
157 MCSection
*StackMapSection
;
159 /// FaultMap section.
160 MCSection
*FaultMapSection
;
163 MCSection
*RemarksSection
;
165 /// EH frame section.
167 /// It is initialized on demand so it can be overwritten (with uniquing).
168 MCSection
*EHFrameSection
;
170 /// Section containing metadata on function stack sizes.
171 MCSection
*StackSizesSection
;
172 mutable DenseMap
<const MCSymbol
*, unsigned> StackSizesUniquing
;
174 // ELF specific sections.
175 MCSection
*DataRelROSection
;
176 MCSection
*MergeableConst4Section
;
177 MCSection
*MergeableConst8Section
;
178 MCSection
*MergeableConst16Section
;
179 MCSection
*MergeableConst32Section
;
181 // MachO specific sections.
183 /// Section for thread local structure information.
185 /// Contains the source code name of the variable, visibility and a pointer to
186 /// the initial value (.tdata or .tbss).
187 MCSection
*TLSTLVSection
; // Defaults to ".tlv".
189 /// Section for thread local data initialization functions.
190 const MCSection
*TLSThreadInitSection
; // Defaults to ".thread_init_func".
192 MCSection
*CStringSection
;
193 MCSection
*UStringSection
;
194 MCSection
*TextCoalSection
;
195 MCSection
*ConstTextCoalSection
;
196 MCSection
*ConstDataSection
;
197 MCSection
*DataCoalSection
;
198 MCSection
*ConstDataCoalSection
;
199 MCSection
*DataCommonSection
;
200 MCSection
*DataBSSSection
;
201 MCSection
*FourByteConstantSection
;
202 MCSection
*EightByteConstantSection
;
203 MCSection
*SixteenByteConstantSection
;
204 MCSection
*LazySymbolPointerSection
;
205 MCSection
*NonLazySymbolPointerSection
;
206 MCSection
*ThreadLocalPointerSection
;
208 /// COFF specific sections.
209 MCSection
*DrectveSection
;
210 MCSection
*PDataSection
;
211 MCSection
*XDataSection
;
212 MCSection
*SXDataSection
;
213 MCSection
*GFIDsSection
;
216 void InitMCObjectFileInfo(const Triple
&TT
, bool PIC
, MCContext
&ctx
,
217 bool LargeCodeModel
= false);
219 bool getSupportsWeakOmittedEHFrame() const {
220 return SupportsWeakOmittedEHFrame
;
222 bool getSupportsCompactUnwindWithoutEHFrame() const {
223 return SupportsCompactUnwindWithoutEHFrame
;
225 bool getOmitDwarfIfHaveCompactUnwind() const {
226 return OmitDwarfIfHaveCompactUnwind
;
229 bool getCommDirectiveSupportsAlignment() const {
230 return CommDirectiveSupportsAlignment
;
233 unsigned getFDEEncoding() const { return FDECFIEncoding
; }
235 unsigned getCompactUnwindDwarfEHFrameOnly() const {
236 return CompactUnwindDwarfEHFrameOnly
;
239 MCSection
*getTextSection() const { return TextSection
; }
240 MCSection
*getDataSection() const { return DataSection
; }
241 MCSection
*getBSSSection() const { return BSSSection
; }
242 MCSection
*getReadOnlySection() const { return ReadOnlySection
; }
243 MCSection
*getLSDASection() const { return LSDASection
; }
244 MCSection
*getCompactUnwindSection() const { return CompactUnwindSection
; }
245 MCSection
*getDwarfAbbrevSection() const { return DwarfAbbrevSection
; }
246 MCSection
*getDwarfInfoSection() const { return DwarfInfoSection
; }
247 MCSection
*getDwarfInfoSection(uint64_t Hash
) const {
248 return getDwarfComdatSection(".debug_info", Hash
);
250 MCSection
*getDwarfLineSection() const { return DwarfLineSection
; }
251 MCSection
*getDwarfLineStrSection() const { return DwarfLineStrSection
; }
252 MCSection
*getDwarfFrameSection() const { return DwarfFrameSection
; }
253 MCSection
*getDwarfPubNamesSection() const { return DwarfPubNamesSection
; }
254 MCSection
*getDwarfPubTypesSection() const { return DwarfPubTypesSection
; }
255 MCSection
*getDwarfGnuPubNamesSection() const {
256 return DwarfGnuPubNamesSection
;
258 MCSection
*getDwarfGnuPubTypesSection() const {
259 return DwarfGnuPubTypesSection
;
261 const MCSection
*getDwarfDebugInlineSection() const {
262 return DwarfDebugInlineSection
;
264 MCSection
*getDwarfStrSection() const { return DwarfStrSection
; }
265 MCSection
*getDwarfLocSection() const { return DwarfLocSection
; }
266 MCSection
*getDwarfARangesSection() const { return DwarfARangesSection
; }
267 MCSection
*getDwarfRangesSection() const { return DwarfRangesSection
; }
268 MCSection
*getDwarfRnglistsSection() const { return DwarfRnglistsSection
; }
269 MCSection
*getDwarfLoclistsSection() const { return DwarfLoclistsSection
; }
270 MCSection
*getDwarfMacinfoSection() const { return DwarfMacinfoSection
; }
272 MCSection
*getDwarfDebugNamesSection() const {
273 return DwarfDebugNamesSection
;
275 MCSection
*getDwarfAccelNamesSection() const {
276 return DwarfAccelNamesSection
;
278 MCSection
*getDwarfAccelObjCSection() const { return DwarfAccelObjCSection
; }
279 MCSection
*getDwarfAccelNamespaceSection() const {
280 return DwarfAccelNamespaceSection
;
282 MCSection
*getDwarfAccelTypesSection() const {
283 return DwarfAccelTypesSection
;
285 MCSection
*getDwarfInfoDWOSection() const { return DwarfInfoDWOSection
; }
286 MCSection
*getDwarfTypesSection(uint64_t Hash
) const {
287 return getDwarfComdatSection(".debug_types", Hash
);
289 MCSection
*getDwarfTypesDWOSection() const { return DwarfTypesDWOSection
; }
290 MCSection
*getDwarfAbbrevDWOSection() const { return DwarfAbbrevDWOSection
; }
291 MCSection
*getDwarfStrDWOSection() const { return DwarfStrDWOSection
; }
292 MCSection
*getDwarfLineDWOSection() const { return DwarfLineDWOSection
; }
293 MCSection
*getDwarfLocDWOSection() const { return DwarfLocDWOSection
; }
294 MCSection
*getDwarfStrOffDWOSection() const { return DwarfStrOffDWOSection
; }
295 MCSection
*getDwarfStrOffSection() const { return DwarfStrOffSection
; }
296 MCSection
*getDwarfAddrSection() const { return DwarfAddrSection
; }
297 MCSection
*getDwarfRnglistsDWOSection() const {
298 return DwarfRnglistsDWOSection
;
300 MCSection
*getDwarfCUIndexSection() const { return DwarfCUIndexSection
; }
301 MCSection
*getDwarfTUIndexSection() const { return DwarfTUIndexSection
; }
302 MCSection
*getDwarfSwiftASTSection() const { return DwarfSwiftASTSection
; }
304 MCSection
*getCOFFDebugSymbolsSection() const {
305 return COFFDebugSymbolsSection
;
307 MCSection
*getCOFFDebugTypesSection() const {
308 return COFFDebugTypesSection
;
310 MCSection
*getCOFFGlobalTypeHashesSection() const {
311 return COFFGlobalTypeHashesSection
;
314 MCSection
*getTLSExtraDataSection() const { return TLSExtraDataSection
; }
315 const MCSection
*getTLSDataSection() const { return TLSDataSection
; }
316 MCSection
*getTLSBSSSection() const { return TLSBSSSection
; }
318 MCSection
*getStackMapSection() const { return StackMapSection
; }
319 MCSection
*getFaultMapSection() const { return FaultMapSection
; }
320 MCSection
*getRemarksSection() const { return RemarksSection
; }
322 MCSection
*getStackSizesSection(const MCSection
&TextSec
) const;
324 // ELF specific sections.
325 MCSection
*getDataRelROSection() const { return DataRelROSection
; }
326 const MCSection
*getMergeableConst4Section() const {
327 return MergeableConst4Section
;
329 const MCSection
*getMergeableConst8Section() const {
330 return MergeableConst8Section
;
332 const MCSection
*getMergeableConst16Section() const {
333 return MergeableConst16Section
;
335 const MCSection
*getMergeableConst32Section() const {
336 return MergeableConst32Section
;
339 // MachO specific sections.
340 const MCSection
*getTLSTLVSection() const { return TLSTLVSection
; }
341 const MCSection
*getTLSThreadInitSection() const {
342 return TLSThreadInitSection
;
344 const MCSection
*getCStringSection() const { return CStringSection
; }
345 const MCSection
*getUStringSection() const { return UStringSection
; }
346 MCSection
*getTextCoalSection() const { return TextCoalSection
; }
347 const MCSection
*getConstTextCoalSection() const {
348 return ConstTextCoalSection
;
350 const MCSection
*getConstDataSection() const { return ConstDataSection
; }
351 const MCSection
*getDataCoalSection() const { return DataCoalSection
; }
352 const MCSection
*getConstDataCoalSection() const {
353 return ConstDataCoalSection
;
355 const MCSection
*getDataCommonSection() const { return DataCommonSection
; }
356 MCSection
*getDataBSSSection() const { return DataBSSSection
; }
357 const MCSection
*getFourByteConstantSection() const {
358 return FourByteConstantSection
;
360 const MCSection
*getEightByteConstantSection() const {
361 return EightByteConstantSection
;
363 const MCSection
*getSixteenByteConstantSection() const {
364 return SixteenByteConstantSection
;
366 MCSection
*getLazySymbolPointerSection() const {
367 return LazySymbolPointerSection
;
369 MCSection
*getNonLazySymbolPointerSection() const {
370 return NonLazySymbolPointerSection
;
372 MCSection
*getThreadLocalPointerSection() const {
373 return ThreadLocalPointerSection
;
376 // COFF specific sections.
377 MCSection
*getDrectveSection() const { return DrectveSection
; }
378 MCSection
*getPDataSection() const { return PDataSection
; }
379 MCSection
*getXDataSection() const { return XDataSection
; }
380 MCSection
*getSXDataSection() const { return SXDataSection
; }
381 MCSection
*getGFIDsSection() const { return GFIDsSection
; }
383 MCSection
*getEHFrameSection() {
384 return EHFrameSection
;
387 enum Environment
{ IsMachO
, IsELF
, IsCOFF
, IsWasm
, IsXCOFF
};
388 Environment
getObjectFileType() const { return Env
; }
390 bool isPositionIndependent() const { return PositionIndependent
; }
394 bool PositionIndependent
;
397 VersionTuple SDKVersion
;
399 void initMachOMCObjectFileInfo(const Triple
&T
);
400 void initELFMCObjectFileInfo(const Triple
&T
, bool Large
);
401 void initCOFFMCObjectFileInfo(const Triple
&T
);
402 void initWasmMCObjectFileInfo(const Triple
&T
);
403 void initXCOFFMCObjectFileInfo(const Triple
&T
);
404 MCSection
*getDwarfComdatSection(const char *Name
, uint64_t Hash
) const;
407 const Triple
&getTargetTriple() const { return TT
; }
409 void setSDKVersion(const VersionTuple
&TheSDKVersion
) {
410 SDKVersion
= TheSDKVersion
;
413 const VersionTuple
&getSDKVersion() const { return SDKVersion
; }
416 } // end namespace llvm