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