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