xref: /llvm-project/llvm/lib/MC/MCObjectFileInfo.cpp (revision d96089b2487448af11ecdaba8371f08d9b2381a2)
1 //===-- MCObjectFileInfo.cpp - Object File Information --------------------===//
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 #include "llvm/MC/MCObjectFileInfo.h"
11 #include "llvm/ADT/StringExtras.h"
12 #include "llvm/ADT/Triple.h"
13 #include "llvm/MC/MCAsmInfo.h"
14 #include "llvm/MC/MCContext.h"
15 #include "llvm/MC/MCSection.h"
16 #include "llvm/MC/MCSectionCOFF.h"
17 #include "llvm/MC/MCSectionELF.h"
18 #include "llvm/MC/MCSectionMachO.h"
19 #include "llvm/Support/COFF.h"
20 #include "llvm/Support/ELF.h"
21 
22 using namespace llvm;
23 
24 static bool useCompactUnwind(const Triple &T) {
25   // Only on darwin.
26   if (!T.isOSDarwin())
27     return false;
28 
29   // aarch64 always has it.
30   if (T.getArch() == Triple::aarch64)
31     return true;
32 
33   // armv7k always has it.
34   if (T.isWatchABI())
35     return true;
36 
37   // Use it on newer version of OS X.
38   if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6))
39     return true;
40 
41   // And the iOS simulator.
42   if (T.isiOS() &&
43       (T.getArch() == Triple::x86_64 || T.getArch() == Triple::x86))
44     return true;
45 
46   return false;
47 }
48 
49 void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {
50   // MachO
51   SupportsWeakOmittedEHFrame = false;
52 
53   EHFrameSection = Ctx->getMachOSection(
54       "__TEXT", "__eh_frame",
55       MachO::S_COALESCED | MachO::S_ATTR_NO_TOC |
56           MachO::S_ATTR_STRIP_STATIC_SYMS | MachO::S_ATTR_LIVE_SUPPORT,
57       SectionKind::getReadOnly());
58 
59   if (T.isOSDarwin() && T.getArch() == Triple::aarch64)
60     SupportsCompactUnwindWithoutEHFrame = true;
61 
62   if (T.isWatchABI())
63     OmitDwarfIfHaveCompactUnwind = true;
64 
65   PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel
66     | dwarf::DW_EH_PE_sdata4;
67   LSDAEncoding = FDECFIEncoding = dwarf::DW_EH_PE_pcrel;
68   TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
69     dwarf::DW_EH_PE_sdata4;
70 
71   // .comm doesn't support alignment before Leopard.
72   if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5))
73     CommDirectiveSupportsAlignment = false;
74 
75   TextSection // .text
76     = Ctx->getMachOSection("__TEXT", "__text",
77                            MachO::S_ATTR_PURE_INSTRUCTIONS,
78                            SectionKind::getText());
79   DataSection // .data
80       = Ctx->getMachOSection("__DATA", "__data", 0, SectionKind::getData());
81 
82   // BSSSection might not be expected initialized on msvc.
83   BSSSection = nullptr;
84 
85   TLSDataSection // .tdata
86       = Ctx->getMachOSection("__DATA", "__thread_data",
87                              MachO::S_THREAD_LOCAL_REGULAR,
88                              SectionKind::getData());
89   TLSBSSSection // .tbss
90     = Ctx->getMachOSection("__DATA", "__thread_bss",
91                            MachO::S_THREAD_LOCAL_ZEROFILL,
92                            SectionKind::getThreadBSS());
93 
94   // TODO: Verify datarel below.
95   TLSTLVSection // .tlv
96       = Ctx->getMachOSection("__DATA", "__thread_vars",
97                              MachO::S_THREAD_LOCAL_VARIABLES,
98                              SectionKind::getData());
99 
100   TLSThreadInitSection = Ctx->getMachOSection(
101       "__DATA", "__thread_init", MachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
102       SectionKind::getData());
103 
104   CStringSection // .cstring
105     = Ctx->getMachOSection("__TEXT", "__cstring",
106                            MachO::S_CSTRING_LITERALS,
107                            SectionKind::getMergeable1ByteCString());
108   UStringSection
109     = Ctx->getMachOSection("__TEXT","__ustring", 0,
110                            SectionKind::getMergeable2ByteCString());
111   FourByteConstantSection // .literal4
112     = Ctx->getMachOSection("__TEXT", "__literal4",
113                            MachO::S_4BYTE_LITERALS,
114                            SectionKind::getMergeableConst4());
115   EightByteConstantSection // .literal8
116     = Ctx->getMachOSection("__TEXT", "__literal8",
117                            MachO::S_8BYTE_LITERALS,
118                            SectionKind::getMergeableConst8());
119 
120   SixteenByteConstantSection // .literal16
121       = Ctx->getMachOSection("__TEXT", "__literal16",
122                              MachO::S_16BYTE_LITERALS,
123                              SectionKind::getMergeableConst16());
124 
125   ReadOnlySection  // .const
126     = Ctx->getMachOSection("__TEXT", "__const", 0,
127                            SectionKind::getReadOnly());
128 
129   // If the target is not powerpc, map the coal sections to the non-coal
130   // sections.
131   //
132   // "__TEXT/__textcoal_nt" => section "__TEXT/__text"
133   // "__TEXT/__const_coal"  => section "__TEXT/__const"
134   // "__DATA/__datacoal_nt" => section "__DATA/__data"
135   Triple::ArchType ArchTy = T.getArch();
136 
137   if (ArchTy == Triple::ppc || ArchTy == Triple::ppc64) {
138     TextCoalSection
139       = Ctx->getMachOSection("__TEXT", "__textcoal_nt",
140                              MachO::S_COALESCED |
141                              MachO::S_ATTR_PURE_INSTRUCTIONS,
142                              SectionKind::getText());
143     ConstTextCoalSection
144       = Ctx->getMachOSection("__TEXT", "__const_coal",
145                              MachO::S_COALESCED,
146                              SectionKind::getReadOnly());
147     DataCoalSection = Ctx->getMachOSection(
148         "__DATA", "__datacoal_nt", MachO::S_COALESCED, SectionKind::getData());
149   } else {
150     TextCoalSection = TextSection;
151     ConstTextCoalSection = ReadOnlySection;
152     DataCoalSection = DataSection;
153   }
154 
155   ConstDataSection  // .const_data
156     = Ctx->getMachOSection("__DATA", "__const", 0,
157                            SectionKind::getReadOnlyWithRel());
158   DataCommonSection
159     = Ctx->getMachOSection("__DATA","__common",
160                            MachO::S_ZEROFILL,
161                            SectionKind::getBSS());
162   DataBSSSection
163     = Ctx->getMachOSection("__DATA","__bss", MachO::S_ZEROFILL,
164                            SectionKind::getBSS());
165 
166 
167   LazySymbolPointerSection
168     = Ctx->getMachOSection("__DATA", "__la_symbol_ptr",
169                            MachO::S_LAZY_SYMBOL_POINTERS,
170                            SectionKind::getMetadata());
171   NonLazySymbolPointerSection
172     = Ctx->getMachOSection("__DATA", "__nl_symbol_ptr",
173                            MachO::S_NON_LAZY_SYMBOL_POINTERS,
174                            SectionKind::getMetadata());
175 
176   ThreadLocalPointerSection
177     = Ctx->getMachOSection("__DATA", "__thread_ptr",
178                            MachO::S_THREAD_LOCAL_VARIABLE_POINTERS,
179                            SectionKind::getMetadata());
180 
181   // Exception Handling.
182   LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
183                                      SectionKind::getReadOnlyWithRel());
184 
185   COFFDebugSymbolsSection = nullptr;
186   COFFDebugTypesSection = nullptr;
187 
188   if (useCompactUnwind(T)) {
189     CompactUnwindSection =
190         Ctx->getMachOSection("__LD", "__compact_unwind", MachO::S_ATTR_DEBUG,
191                              SectionKind::getReadOnly());
192 
193     if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::x86)
194       CompactUnwindDwarfEHFrameOnly = 0x04000000;  // UNWIND_X86_64_MODE_DWARF
195     else if (T.getArch() == Triple::aarch64)
196       CompactUnwindDwarfEHFrameOnly = 0x03000000;  // UNWIND_ARM64_MODE_DWARF
197     else if (T.getArch() == Triple::arm || T.getArch() == Triple::thumb)
198       CompactUnwindDwarfEHFrameOnly = 0x04000000;  // UNWIND_ARM_MODE_DWARF
199   }
200 
201   // Debug Information.
202   DwarfAccelNamesSection =
203       Ctx->getMachOSection("__DWARF", "__apple_names", MachO::S_ATTR_DEBUG,
204                            SectionKind::getMetadata(), "names_begin");
205   DwarfAccelObjCSection =
206       Ctx->getMachOSection("__DWARF", "__apple_objc", MachO::S_ATTR_DEBUG,
207                            SectionKind::getMetadata(), "objc_begin");
208   // 16 character section limit...
209   DwarfAccelNamespaceSection =
210       Ctx->getMachOSection("__DWARF", "__apple_namespac", MachO::S_ATTR_DEBUG,
211                            SectionKind::getMetadata(), "namespac_begin");
212   DwarfAccelTypesSection =
213       Ctx->getMachOSection("__DWARF", "__apple_types", MachO::S_ATTR_DEBUG,
214                            SectionKind::getMetadata(), "types_begin");
215 
216   DwarfAbbrevSection =
217       Ctx->getMachOSection("__DWARF", "__debug_abbrev", MachO::S_ATTR_DEBUG,
218                            SectionKind::getMetadata(), "section_abbrev");
219   DwarfInfoSection =
220       Ctx->getMachOSection("__DWARF", "__debug_info", MachO::S_ATTR_DEBUG,
221                            SectionKind::getMetadata(), "section_info");
222   DwarfLineSection =
223       Ctx->getMachOSection("__DWARF", "__debug_line", MachO::S_ATTR_DEBUG,
224                            SectionKind::getMetadata(), "section_line");
225   DwarfFrameSection =
226       Ctx->getMachOSection("__DWARF", "__debug_frame", MachO::S_ATTR_DEBUG,
227                            SectionKind::getMetadata());
228   DwarfPubNamesSection =
229       Ctx->getMachOSection("__DWARF", "__debug_pubnames", MachO::S_ATTR_DEBUG,
230                            SectionKind::getMetadata());
231   DwarfPubTypesSection =
232       Ctx->getMachOSection("__DWARF", "__debug_pubtypes", MachO::S_ATTR_DEBUG,
233                            SectionKind::getMetadata());
234   DwarfGnuPubNamesSection =
235       Ctx->getMachOSection("__DWARF", "__debug_gnu_pubn", MachO::S_ATTR_DEBUG,
236                            SectionKind::getMetadata());
237   DwarfGnuPubTypesSection =
238       Ctx->getMachOSection("__DWARF", "__debug_gnu_pubt", MachO::S_ATTR_DEBUG,
239                            SectionKind::getMetadata());
240   DwarfStrSection =
241       Ctx->getMachOSection("__DWARF", "__debug_str", MachO::S_ATTR_DEBUG,
242                            SectionKind::getMetadata(), "info_string");
243   DwarfLocSection =
244       Ctx->getMachOSection("__DWARF", "__debug_loc", MachO::S_ATTR_DEBUG,
245                            SectionKind::getMetadata(), "section_debug_loc");
246   DwarfARangesSection =
247       Ctx->getMachOSection("__DWARF", "__debug_aranges", MachO::S_ATTR_DEBUG,
248                            SectionKind::getMetadata());
249   DwarfRangesSection =
250       Ctx->getMachOSection("__DWARF", "__debug_ranges", MachO::S_ATTR_DEBUG,
251                            SectionKind::getMetadata(), "debug_range");
252   DwarfMacinfoSection =
253       Ctx->getMachOSection("__DWARF", "__debug_macinfo", MachO::S_ATTR_DEBUG,
254                            SectionKind::getMetadata(), "debug_macinfo");
255   DwarfDebugInlineSection =
256       Ctx->getMachOSection("__DWARF", "__debug_inlined", MachO::S_ATTR_DEBUG,
257                            SectionKind::getMetadata());
258   DwarfCUIndexSection =
259       Ctx->getMachOSection("__DWARF", "__debug_cu_index", MachO::S_ATTR_DEBUG,
260                            SectionKind::getMetadata());
261   DwarfTUIndexSection =
262       Ctx->getMachOSection("__DWARF", "__debug_tu_index", MachO::S_ATTR_DEBUG,
263                            SectionKind::getMetadata());
264   StackMapSection = Ctx->getMachOSection("__LLVM_STACKMAPS", "__llvm_stackmaps",
265                                          0, SectionKind::getMetadata());
266 
267   FaultMapSection = Ctx->getMachOSection("__LLVM_FAULTMAPS", "__llvm_faultmaps",
268                                          0, SectionKind::getMetadata());
269 
270   TLSExtraDataSection = TLSTLVSection;
271 }
272 
273 void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T) {
274   switch (T.getArch()) {
275   case Triple::mips:
276   case Triple::mipsel:
277     FDECFIEncoding = dwarf::DW_EH_PE_sdata4;
278     break;
279   case Triple::mips64:
280   case Triple::mips64el:
281     FDECFIEncoding = dwarf::DW_EH_PE_sdata8;
282     break;
283   case Triple::x86_64:
284     FDECFIEncoding = dwarf::DW_EH_PE_pcrel |
285                      ((CMModel == CodeModel::Large) ? dwarf::DW_EH_PE_sdata8
286                                                     : dwarf::DW_EH_PE_sdata4);
287     break;
288   default:
289     FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
290     break;
291   }
292 
293   switch (T.getArch()) {
294   case Triple::arm:
295   case Triple::armeb:
296   case Triple::thumb:
297   case Triple::thumbeb:
298     if (Ctx->getAsmInfo()->getExceptionHandlingType() == ExceptionHandling::ARM)
299       break;
300     // Fallthrough if not using EHABI
301     LLVM_FALLTHROUGH;
302   case Triple::ppc:
303   case Triple::x86:
304     PersonalityEncoding = PositionIndependent
305                               ? dwarf::DW_EH_PE_indirect |
306                                     dwarf::DW_EH_PE_pcrel |
307                                     dwarf::DW_EH_PE_sdata4
308                               : dwarf::DW_EH_PE_absptr;
309     LSDAEncoding = PositionIndependent
310                        ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
311                        : dwarf::DW_EH_PE_absptr;
312     TTypeEncoding = PositionIndependent
313                         ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
314                               dwarf::DW_EH_PE_sdata4
315                         : dwarf::DW_EH_PE_absptr;
316     break;
317   case Triple::x86_64:
318     if (PositionIndependent) {
319       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
320         ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
321          ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
322       LSDAEncoding = dwarf::DW_EH_PE_pcrel |
323         (CMModel == CodeModel::Small
324          ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
325       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
326         ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
327          ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
328     } else {
329       PersonalityEncoding =
330         (CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
331         ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
332       LSDAEncoding = (CMModel == CodeModel::Small)
333         ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
334       TTypeEncoding = (CMModel == CodeModel::Small)
335         ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
336     }
337     break;
338   case Triple::hexagon:
339     PersonalityEncoding = dwarf::DW_EH_PE_absptr;
340     LSDAEncoding = dwarf::DW_EH_PE_absptr;
341     FDECFIEncoding = dwarf::DW_EH_PE_absptr;
342     TTypeEncoding = dwarf::DW_EH_PE_absptr;
343     if (PositionIndependent) {
344       PersonalityEncoding |= dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel;
345       LSDAEncoding |= dwarf::DW_EH_PE_pcrel;
346       FDECFIEncoding |= dwarf::DW_EH_PE_pcrel;
347       TTypeEncoding |= dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel;
348     }
349     break;
350   case Triple::aarch64:
351   case Triple::aarch64_be:
352     // The small model guarantees static code/data size < 4GB, but not where it
353     // will be in memory. Most of these could end up >2GB away so even a signed
354     // pc-relative 32-bit address is insufficient, theoretically.
355     if (PositionIndependent) {
356       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
357         dwarf::DW_EH_PE_sdata8;
358       LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8;
359       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
360         dwarf::DW_EH_PE_sdata8;
361     } else {
362       PersonalityEncoding = dwarf::DW_EH_PE_absptr;
363       LSDAEncoding = dwarf::DW_EH_PE_absptr;
364       TTypeEncoding = dwarf::DW_EH_PE_absptr;
365     }
366     break;
367   case Triple::lanai:
368     LSDAEncoding = dwarf::DW_EH_PE_absptr;
369     PersonalityEncoding = dwarf::DW_EH_PE_absptr;
370     TTypeEncoding = dwarf::DW_EH_PE_absptr;
371     break;
372   case Triple::mips:
373   case Triple::mipsel:
374   case Triple::mips64:
375   case Triple::mips64el:
376     // MIPS uses indirect pointer to refer personality functions and types, so
377     // that the eh_frame section can be read-only. DW.ref.personality will be
378     // generated for relocation.
379     PersonalityEncoding = dwarf::DW_EH_PE_indirect;
380     // FIXME: The N64 ABI probably ought to use DW_EH_PE_sdata8 but we can't
381     //        identify N64 from just a triple.
382     TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
383                     dwarf::DW_EH_PE_sdata4;
384     // We don't support PC-relative LSDA references in GAS so we use the default
385     // DW_EH_PE_absptr for those.
386 
387     // FreeBSD must be explicit about the data size and using pcrel since it's
388     // assembler/linker won't do the automatic conversion that the Linux tools
389     // do.
390     if (T.isOSFreeBSD()) {
391       PersonalityEncoding |= dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
392       LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
393     }
394     break;
395   case Triple::ppc64:
396   case Triple::ppc64le:
397     PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
398       dwarf::DW_EH_PE_udata8;
399     LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8;
400     TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
401       dwarf::DW_EH_PE_udata8;
402     break;
403   case Triple::sparcel:
404   case Triple::sparc:
405     if (PositionIndependent) {
406       LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
407       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
408         dwarf::DW_EH_PE_sdata4;
409       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
410         dwarf::DW_EH_PE_sdata4;
411     } else {
412       LSDAEncoding = dwarf::DW_EH_PE_absptr;
413       PersonalityEncoding = dwarf::DW_EH_PE_absptr;
414       TTypeEncoding = dwarf::DW_EH_PE_absptr;
415     }
416     break;
417   case Triple::sparcv9:
418     LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
419     if (PositionIndependent) {
420       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
421         dwarf::DW_EH_PE_sdata4;
422       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
423         dwarf::DW_EH_PE_sdata4;
424     } else {
425       PersonalityEncoding = dwarf::DW_EH_PE_absptr;
426       TTypeEncoding = dwarf::DW_EH_PE_absptr;
427     }
428     break;
429   case Triple::systemz:
430     // All currently-defined code models guarantee that 4-byte PC-relative
431     // values will be in range.
432     if (PositionIndependent) {
433       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
434         dwarf::DW_EH_PE_sdata4;
435       LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
436       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
437         dwarf::DW_EH_PE_sdata4;
438     } else {
439       PersonalityEncoding = dwarf::DW_EH_PE_absptr;
440       LSDAEncoding = dwarf::DW_EH_PE_absptr;
441       TTypeEncoding = dwarf::DW_EH_PE_absptr;
442     }
443     break;
444   default:
445     break;
446   }
447 
448   unsigned EHSectionType = T.getArch() == Triple::x86_64
449                                ? ELF::SHT_X86_64_UNWIND
450                                : ELF::SHT_PROGBITS;
451 
452   // Solaris requires different flags for .eh_frame to seemingly every other
453   // platform.
454   unsigned EHSectionFlags = ELF::SHF_ALLOC;
455   if (T.isOSSolaris() && T.getArch() != Triple::x86_64)
456     EHSectionFlags |= ELF::SHF_WRITE;
457 
458   // ELF
459   BSSSection = Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
460                                   ELF::SHF_WRITE | ELF::SHF_ALLOC);
461 
462   TextSection = Ctx->getELFSection(".text", ELF::SHT_PROGBITS,
463                                    ELF::SHF_EXECINSTR | ELF::SHF_ALLOC);
464 
465   DataSection = Ctx->getELFSection(".data", ELF::SHT_PROGBITS,
466                                    ELF::SHF_WRITE | ELF::SHF_ALLOC);
467 
468   ReadOnlySection =
469       Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
470 
471   TLSDataSection =
472       Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
473                          ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
474 
475   TLSBSSSection = Ctx->getELFSection(
476       ".tbss", ELF::SHT_NOBITS, ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
477 
478   DataRelROSection = Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
479                                         ELF::SHF_ALLOC | ELF::SHF_WRITE);
480 
481   MergeableConst4Section =
482       Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
483                          ELF::SHF_ALLOC | ELF::SHF_MERGE, 4, "");
484 
485   MergeableConst8Section =
486       Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
487                          ELF::SHF_ALLOC | ELF::SHF_MERGE, 8, "");
488 
489   MergeableConst16Section =
490       Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
491                          ELF::SHF_ALLOC | ELF::SHF_MERGE, 16, "");
492 
493   MergeableConst32Section =
494       Ctx->getELFSection(".rodata.cst32", ELF::SHT_PROGBITS,
495                          ELF::SHF_ALLOC | ELF::SHF_MERGE, 32, "");
496 
497   // Exception Handling Sections.
498 
499   // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
500   // it contains relocatable pointers.  In PIC mode, this is probably a big
501   // runtime hit for C++ apps.  Either the contents of the LSDA need to be
502   // adjusted or this should be a data section.
503   LSDASection = Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
504                                    ELF::SHF_ALLOC);
505 
506   COFFDebugSymbolsSection = nullptr;
507   COFFDebugTypesSection = nullptr;
508 
509   // Debug Info Sections.
510   DwarfAbbrevSection =
511       Ctx->getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0);
512   DwarfInfoSection = Ctx->getELFSection(".debug_info", ELF::SHT_PROGBITS, 0);
513   DwarfLineSection = Ctx->getELFSection(".debug_line", ELF::SHT_PROGBITS, 0);
514   DwarfFrameSection = Ctx->getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0);
515   DwarfPubNamesSection =
516       Ctx->getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0);
517   DwarfPubTypesSection =
518       Ctx->getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0);
519   DwarfGnuPubNamesSection =
520       Ctx->getELFSection(".debug_gnu_pubnames", ELF::SHT_PROGBITS, 0);
521   DwarfGnuPubTypesSection =
522       Ctx->getELFSection(".debug_gnu_pubtypes", ELF::SHT_PROGBITS, 0);
523   DwarfStrSection =
524       Ctx->getELFSection(".debug_str", ELF::SHT_PROGBITS,
525                          ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, "");
526   DwarfLocSection = Ctx->getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0);
527   DwarfARangesSection =
528       Ctx->getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0);
529   DwarfRangesSection =
530       Ctx->getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0);
531   DwarfMacinfoSection =
532       Ctx->getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0);
533 
534   // DWARF5 Experimental Debug Info
535 
536   // Accelerator Tables
537   DwarfAccelNamesSection =
538       Ctx->getELFSection(".apple_names", ELF::SHT_PROGBITS, 0);
539   DwarfAccelObjCSection =
540       Ctx->getELFSection(".apple_objc", ELF::SHT_PROGBITS, 0);
541   DwarfAccelNamespaceSection =
542       Ctx->getELFSection(".apple_namespaces", ELF::SHT_PROGBITS, 0);
543   DwarfAccelTypesSection =
544       Ctx->getELFSection(".apple_types", ELF::SHT_PROGBITS, 0);
545 
546   // Fission Sections
547   DwarfInfoDWOSection =
548       Ctx->getELFSection(".debug_info.dwo", ELF::SHT_PROGBITS, 0);
549   DwarfTypesDWOSection =
550       Ctx->getELFSection(".debug_types.dwo", ELF::SHT_PROGBITS, 0);
551   DwarfAbbrevDWOSection =
552       Ctx->getELFSection(".debug_abbrev.dwo", ELF::SHT_PROGBITS, 0);
553   DwarfStrDWOSection =
554       Ctx->getELFSection(".debug_str.dwo", ELF::SHT_PROGBITS,
555                          ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, "");
556   DwarfLineDWOSection =
557       Ctx->getELFSection(".debug_line.dwo", ELF::SHT_PROGBITS, 0);
558   DwarfLocDWOSection =
559       Ctx->getELFSection(".debug_loc.dwo", ELF::SHT_PROGBITS, 0);
560   DwarfStrOffDWOSection =
561       Ctx->getELFSection(".debug_str_offsets.dwo", ELF::SHT_PROGBITS, 0);
562   DwarfAddrSection = Ctx->getELFSection(".debug_addr", ELF::SHT_PROGBITS, 0);
563 
564   // DWP Sections
565   DwarfCUIndexSection =
566       Ctx->getELFSection(".debug_cu_index", ELF::SHT_PROGBITS, 0);
567   DwarfTUIndexSection =
568       Ctx->getELFSection(".debug_tu_index", ELF::SHT_PROGBITS, 0);
569 
570   StackMapSection =
571       Ctx->getELFSection(".llvm_stackmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
572 
573   FaultMapSection =
574       Ctx->getELFSection(".llvm_faultmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
575 
576   EHFrameSection =
577       Ctx->getELFSection(".eh_frame", EHSectionType, EHSectionFlags);
578 }
579 
580 void MCObjectFileInfo::initCOFFMCObjectFileInfo(const Triple &T) {
581   EHFrameSection = Ctx->getCOFFSection(
582       ".eh_frame", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
583                        COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
584       SectionKind::getData());
585 
586   // Set the `IMAGE_SCN_MEM_16BIT` flag when compiling for thumb mode.  This is
587   // used to indicate to the linker that the text segment contains thumb instructions
588   // and to set the ISA selection bit for calls accordingly.
589   const bool IsThumb = T.getArch() == Triple::thumb;
590 
591   CommDirectiveSupportsAlignment = true;
592 
593   // COFF
594   BSSSection = Ctx->getCOFFSection(
595       ".bss", COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
596                   COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
597       SectionKind::getBSS());
598   TextSection = Ctx->getCOFFSection(
599       ".text",
600       (IsThumb ? COFF::IMAGE_SCN_MEM_16BIT : (COFF::SectionCharacteristics)0) |
601           COFF::IMAGE_SCN_CNT_CODE | COFF::IMAGE_SCN_MEM_EXECUTE |
602           COFF::IMAGE_SCN_MEM_READ,
603       SectionKind::getText());
604   DataSection = Ctx->getCOFFSection(
605       ".data", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
606                    COFF::IMAGE_SCN_MEM_WRITE,
607       SectionKind::getData());
608   ReadOnlySection = Ctx->getCOFFSection(
609       ".rdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
610       SectionKind::getReadOnly());
611 
612   // FIXME: We're emitting LSDA info into a readonly section on COFF, even
613   // though it contains relocatable pointers.  In PIC mode, this is probably a
614   // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
615   // adjusted or this should be a data section.
616   if (T.getArch() == Triple::x86_64) {
617     // On Windows 64 with SEH, the LSDA is emitted into the .xdata section
618     LSDASection = nullptr;
619   } else {
620     LSDASection = Ctx->getCOFFSection(".gcc_except_table",
621                                       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
622                                           COFF::IMAGE_SCN_MEM_READ,
623                                       SectionKind::getReadOnly());
624   }
625 
626   // Debug info.
627   COFFDebugSymbolsSection =
628       Ctx->getCOFFSection(".debug$S", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
629                                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
630                                        COFF::IMAGE_SCN_MEM_READ),
631                           SectionKind::getMetadata());
632   COFFDebugTypesSection =
633       Ctx->getCOFFSection(".debug$T", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
634                                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
635                                        COFF::IMAGE_SCN_MEM_READ),
636                           SectionKind::getMetadata());
637 
638   DwarfAbbrevSection = Ctx->getCOFFSection(
639       ".debug_abbrev",
640       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
641           COFF::IMAGE_SCN_MEM_READ,
642       SectionKind::getMetadata(), "section_abbrev");
643   DwarfInfoSection = Ctx->getCOFFSection(
644       ".debug_info",
645       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
646           COFF::IMAGE_SCN_MEM_READ,
647       SectionKind::getMetadata(), "section_info");
648   DwarfLineSection = Ctx->getCOFFSection(
649       ".debug_line",
650       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
651           COFF::IMAGE_SCN_MEM_READ,
652       SectionKind::getMetadata(), "section_line");
653 
654   DwarfFrameSection = Ctx->getCOFFSection(
655       ".debug_frame",
656       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
657           COFF::IMAGE_SCN_MEM_READ,
658       SectionKind::getMetadata());
659   DwarfPubNamesSection = Ctx->getCOFFSection(
660       ".debug_pubnames",
661       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
662           COFF::IMAGE_SCN_MEM_READ,
663       SectionKind::getMetadata());
664   DwarfPubTypesSection = Ctx->getCOFFSection(
665       ".debug_pubtypes",
666       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
667           COFF::IMAGE_SCN_MEM_READ,
668       SectionKind::getMetadata());
669   DwarfGnuPubNamesSection = Ctx->getCOFFSection(
670       ".debug_gnu_pubnames",
671       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
672           COFF::IMAGE_SCN_MEM_READ,
673       SectionKind::getMetadata());
674   DwarfGnuPubTypesSection = Ctx->getCOFFSection(
675       ".debug_gnu_pubtypes",
676       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
677           COFF::IMAGE_SCN_MEM_READ,
678       SectionKind::getMetadata());
679   DwarfStrSection = Ctx->getCOFFSection(
680       ".debug_str",
681       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
682           COFF::IMAGE_SCN_MEM_READ,
683       SectionKind::getMetadata(), "info_string");
684   DwarfLocSection = Ctx->getCOFFSection(
685       ".debug_loc",
686       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
687           COFF::IMAGE_SCN_MEM_READ,
688       SectionKind::getMetadata(), "section_debug_loc");
689   DwarfARangesSection = Ctx->getCOFFSection(
690       ".debug_aranges",
691       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
692           COFF::IMAGE_SCN_MEM_READ,
693       SectionKind::getMetadata());
694   DwarfRangesSection = Ctx->getCOFFSection(
695       ".debug_ranges",
696       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
697           COFF::IMAGE_SCN_MEM_READ,
698       SectionKind::getMetadata(), "debug_range");
699   DwarfMacinfoSection = Ctx->getCOFFSection(
700       ".debug_macinfo",
701       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
702           COFF::IMAGE_SCN_MEM_READ,
703       SectionKind::getMetadata(), "debug_macinfo");
704   DwarfInfoDWOSection = Ctx->getCOFFSection(
705       ".debug_info.dwo",
706       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
707           COFF::IMAGE_SCN_MEM_READ,
708       SectionKind::getMetadata(), "section_info_dwo");
709   DwarfTypesDWOSection = Ctx->getCOFFSection(
710       ".debug_types.dwo",
711       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
712           COFF::IMAGE_SCN_MEM_READ,
713       SectionKind::getMetadata(), "section_types_dwo");
714   DwarfAbbrevDWOSection = Ctx->getCOFFSection(
715       ".debug_abbrev.dwo",
716       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
717           COFF::IMAGE_SCN_MEM_READ,
718       SectionKind::getMetadata(), "section_abbrev_dwo");
719   DwarfStrDWOSection = Ctx->getCOFFSection(
720       ".debug_str.dwo",
721       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
722           COFF::IMAGE_SCN_MEM_READ,
723       SectionKind::getMetadata(), "skel_string");
724   DwarfLineDWOSection = Ctx->getCOFFSection(
725       ".debug_line.dwo",
726       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
727           COFF::IMAGE_SCN_MEM_READ,
728       SectionKind::getMetadata());
729   DwarfLocDWOSection = Ctx->getCOFFSection(
730       ".debug_loc.dwo",
731       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
732           COFF::IMAGE_SCN_MEM_READ,
733       SectionKind::getMetadata(), "skel_loc");
734   DwarfStrOffDWOSection = Ctx->getCOFFSection(
735       ".debug_str_offsets.dwo",
736       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
737           COFF::IMAGE_SCN_MEM_READ,
738       SectionKind::getMetadata());
739   DwarfAddrSection = Ctx->getCOFFSection(
740       ".debug_addr",
741       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
742           COFF::IMAGE_SCN_MEM_READ,
743       SectionKind::getMetadata(), "addr_sec");
744   DwarfCUIndexSection = Ctx->getCOFFSection(
745       ".debug_cu_index",
746       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
747           COFF::IMAGE_SCN_MEM_READ,
748       SectionKind::getMetadata());
749   DwarfTUIndexSection = Ctx->getCOFFSection(
750       ".debug_tu_index",
751       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
752           COFF::IMAGE_SCN_MEM_READ,
753       SectionKind::getMetadata());
754   DwarfAccelNamesSection = Ctx->getCOFFSection(
755       ".apple_names",
756       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
757           COFF::IMAGE_SCN_MEM_READ,
758       SectionKind::getMetadata(), "names_begin");
759   DwarfAccelNamespaceSection = Ctx->getCOFFSection(
760       ".apple_namespaces",
761       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
762           COFF::IMAGE_SCN_MEM_READ,
763       SectionKind::getMetadata(), "namespac_begin");
764   DwarfAccelTypesSection = Ctx->getCOFFSection(
765       ".apple_types",
766       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
767           COFF::IMAGE_SCN_MEM_READ,
768       SectionKind::getMetadata(), "types_begin");
769   DwarfAccelObjCSection = Ctx->getCOFFSection(
770       ".apple_objc",
771       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
772           COFF::IMAGE_SCN_MEM_READ,
773       SectionKind::getMetadata(), "objc_begin");
774 
775   DrectveSection = Ctx->getCOFFSection(
776       ".drectve", COFF::IMAGE_SCN_LNK_INFO | COFF::IMAGE_SCN_LNK_REMOVE,
777       SectionKind::getMetadata());
778 
779   PDataSection = Ctx->getCOFFSection(
780       ".pdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
781       SectionKind::getData());
782 
783   XDataSection = Ctx->getCOFFSection(
784       ".xdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
785       SectionKind::getData());
786 
787   SXDataSection = Ctx->getCOFFSection(".sxdata", COFF::IMAGE_SCN_LNK_INFO,
788                                       SectionKind::getMetadata());
789 
790   TLSDataSection = Ctx->getCOFFSection(
791       ".tls$", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
792                    COFF::IMAGE_SCN_MEM_WRITE,
793       SectionKind::getData());
794 
795   StackMapSection = Ctx->getCOFFSection(".llvm_stackmaps",
796                                         COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
797                                             COFF::IMAGE_SCN_MEM_READ,
798                                         SectionKind::getReadOnly());
799 }
800 
801 void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple, bool PIC,
802                                             CodeModel::Model cm,
803                                             MCContext &ctx) {
804   PositionIndependent = PIC;
805   CMModel = cm;
806   Ctx = &ctx;
807 
808   // Common.
809   CommDirectiveSupportsAlignment = true;
810   SupportsWeakOmittedEHFrame = true;
811   SupportsCompactUnwindWithoutEHFrame = false;
812   OmitDwarfIfHaveCompactUnwind = false;
813 
814   PersonalityEncoding = LSDAEncoding = FDECFIEncoding = TTypeEncoding =
815       dwarf::DW_EH_PE_absptr;
816 
817   CompactUnwindDwarfEHFrameOnly = 0;
818 
819   EHFrameSection = nullptr;             // Created on demand.
820   CompactUnwindSection = nullptr;       // Used only by selected targets.
821   DwarfAccelNamesSection = nullptr;     // Used only by selected targets.
822   DwarfAccelObjCSection = nullptr;      // Used only by selected targets.
823   DwarfAccelNamespaceSection = nullptr; // Used only by selected targets.
824   DwarfAccelTypesSection = nullptr;     // Used only by selected targets.
825 
826   TT = TheTriple;
827 
828   switch (TT.getObjectFormat()) {
829   case Triple::MachO:
830     Env = IsMachO;
831     initMachOMCObjectFileInfo(TT);
832     break;
833   case Triple::COFF:
834     if (!TT.isOSWindows())
835       report_fatal_error(
836           "Cannot initialize MC for non-Windows COFF object files.");
837 
838     Env = IsCOFF;
839     initCOFFMCObjectFileInfo(TT);
840     break;
841   case Triple::ELF:
842     Env = IsELF;
843     initELFMCObjectFileInfo(TT);
844     break;
845   case Triple::Wasm:
846     report_fatal_error("Cannot initialize MC for wasm object file format yet.");
847     break;
848   case Triple::UnknownObjectFormat:
849     report_fatal_error("Cannot initialize MC for unknown object file format.");
850     break;
851   }
852 }
853 
854 MCSection *MCObjectFileInfo::getDwarfTypesSection(uint64_t Hash) const {
855   return Ctx->getELFSection(".debug_types", ELF::SHT_PROGBITS, ELF::SHF_GROUP,
856                             0, utostr(Hash));
857 }
858