Convert two char* that are only ever used as booleans to bool.
[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/Triple.h"
12 #include "llvm/MC/MCContext.h"
13 #include "llvm/MC/MCSection.h"
14 #include "llvm/MC/MCSectionCOFF.h"
15 #include "llvm/MC/MCSectionELF.h"
16 #include "llvm/MC/MCSectionMachO.h"
17 using namespace llvm;
18
19 void MCObjectFileInfo::InitMachOMCObjectFileInfo(Triple T) {
20   // MachO
21   IsFunctionEHFrameSymbolPrivate = false;
22   SupportsWeakOmittedEHFrame = false;
23
24   PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel
25     | dwarf::DW_EH_PE_sdata4;
26   LSDAEncoding = FDEEncoding = FDECFIEncoding = dwarf::DW_EH_PE_pcrel;
27   TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
28     dwarf::DW_EH_PE_sdata4;
29
30   // .comm doesn't support alignment before Leopard.
31   if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5))
32     CommDirectiveSupportsAlignment = false;
33
34   TextSection // .text
35     = Ctx->getMachOSection("__TEXT", "__text",
36                            MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
37                            SectionKind::getText());
38   DataSection // .data
39     = Ctx->getMachOSection("__DATA", "__data", 0,
40                            SectionKind::getDataRel());
41
42   // BSSSection might not be expected initialized on msvc.
43   BSSSection = 0;
44
45   TLSDataSection // .tdata
46     = Ctx->getMachOSection("__DATA", "__thread_data",
47                            MCSectionMachO::S_THREAD_LOCAL_REGULAR,
48                            SectionKind::getDataRel());
49   TLSBSSSection // .tbss
50     = Ctx->getMachOSection("__DATA", "__thread_bss",
51                            MCSectionMachO::S_THREAD_LOCAL_ZEROFILL,
52                            SectionKind::getThreadBSS());
53
54   // TODO: Verify datarel below.
55   TLSTLVSection // .tlv
56     = Ctx->getMachOSection("__DATA", "__thread_vars",
57                            MCSectionMachO::S_THREAD_LOCAL_VARIABLES,
58                            SectionKind::getDataRel());
59
60   TLSThreadInitSection
61     = Ctx->getMachOSection("__DATA", "__thread_init",
62                           MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
63                           SectionKind::getDataRel());
64
65   CStringSection // .cstring
66     = Ctx->getMachOSection("__TEXT", "__cstring",
67                            MCSectionMachO::S_CSTRING_LITERALS,
68                            SectionKind::getMergeable1ByteCString());
69   UStringSection
70     = Ctx->getMachOSection("__TEXT","__ustring", 0,
71                            SectionKind::getMergeable2ByteCString());
72   FourByteConstantSection // .literal4
73     = Ctx->getMachOSection("__TEXT", "__literal4",
74                            MCSectionMachO::S_4BYTE_LITERALS,
75                            SectionKind::getMergeableConst4());
76   EightByteConstantSection // .literal8
77     = Ctx->getMachOSection("__TEXT", "__literal8",
78                            MCSectionMachO::S_8BYTE_LITERALS,
79                            SectionKind::getMergeableConst8());
80
81   // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
82   // to using it in -static mode.
83   SixteenByteConstantSection = 0;
84   if (RelocM != Reloc::Static &&
85       T.getArch() != Triple::x86_64 && T.getArch() != Triple::ppc64 &&
86       T.getArch() != Triple::ppc64le)
87     SixteenByteConstantSection =   // .literal16
88       Ctx->getMachOSection("__TEXT", "__literal16",
89                            MCSectionMachO::S_16BYTE_LITERALS,
90                            SectionKind::getMergeableConst16());
91
92   ReadOnlySection  // .const
93     = Ctx->getMachOSection("__TEXT", "__const", 0,
94                            SectionKind::getReadOnly());
95
96   TextCoalSection
97     = Ctx->getMachOSection("__TEXT", "__textcoal_nt",
98                            MCSectionMachO::S_COALESCED |
99                            MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
100                            SectionKind::getText());
101   ConstTextCoalSection
102     = Ctx->getMachOSection("__TEXT", "__const_coal",
103                            MCSectionMachO::S_COALESCED,
104                            SectionKind::getReadOnly());
105   ConstDataSection  // .const_data
106     = Ctx->getMachOSection("__DATA", "__const", 0,
107                            SectionKind::getReadOnlyWithRel());
108   DataCoalSection
109     = Ctx->getMachOSection("__DATA","__datacoal_nt",
110                            MCSectionMachO::S_COALESCED,
111                            SectionKind::getDataRel());
112   DataCommonSection
113     = Ctx->getMachOSection("__DATA","__common",
114                            MCSectionMachO::S_ZEROFILL,
115                            SectionKind::getBSS());
116   DataBSSSection
117     = Ctx->getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
118                            SectionKind::getBSS());
119
120
121   LazySymbolPointerSection
122     = Ctx->getMachOSection("__DATA", "__la_symbol_ptr",
123                            MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
124                            SectionKind::getMetadata());
125   NonLazySymbolPointerSection
126     = Ctx->getMachOSection("__DATA", "__nl_symbol_ptr",
127                            MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
128                            SectionKind::getMetadata());
129
130   if (RelocM == Reloc::Static) {
131     StaticCtorSection
132       = Ctx->getMachOSection("__TEXT", "__constructor", 0,
133                              SectionKind::getDataRel());
134     StaticDtorSection
135       = Ctx->getMachOSection("__TEXT", "__destructor", 0,
136                              SectionKind::getDataRel());
137   } else {
138     StaticCtorSection
139       = Ctx->getMachOSection("__DATA", "__mod_init_func",
140                              MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
141                              SectionKind::getDataRel());
142     StaticDtorSection
143       = Ctx->getMachOSection("__DATA", "__mod_term_func",
144                              MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
145                              SectionKind::getDataRel());
146   }
147
148   // Exception Handling.
149   LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
150                                      SectionKind::getReadOnlyWithRel());
151
152   if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6)) {
153     CompactUnwindSection =
154       Ctx->getMachOSection("__LD", "__compact_unwind",
155                            MCSectionMachO::S_ATTR_DEBUG,
156                            SectionKind::getReadOnly());
157
158     if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::x86)
159       CompactUnwindDwarfEHFrameOnly = 0x04000000;
160   }
161
162   // Debug Information.
163   DwarfAccelNamesSection =
164     Ctx->getMachOSection("__DWARF", "__apple_names",
165                          MCSectionMachO::S_ATTR_DEBUG,
166                          SectionKind::getMetadata());
167   DwarfAccelObjCSection =
168     Ctx->getMachOSection("__DWARF", "__apple_objc",
169                          MCSectionMachO::S_ATTR_DEBUG,
170                          SectionKind::getMetadata());
171   // 16 character section limit...
172   DwarfAccelNamespaceSection =
173     Ctx->getMachOSection("__DWARF", "__apple_namespac",
174                          MCSectionMachO::S_ATTR_DEBUG,
175                          SectionKind::getMetadata());
176   DwarfAccelTypesSection =
177     Ctx->getMachOSection("__DWARF", "__apple_types",
178                          MCSectionMachO::S_ATTR_DEBUG,
179                          SectionKind::getMetadata());
180
181   DwarfAbbrevSection =
182     Ctx->getMachOSection("__DWARF", "__debug_abbrev",
183                          MCSectionMachO::S_ATTR_DEBUG,
184                          SectionKind::getMetadata());
185   DwarfInfoSection =
186     Ctx->getMachOSection("__DWARF", "__debug_info",
187                          MCSectionMachO::S_ATTR_DEBUG,
188                          SectionKind::getMetadata());
189   DwarfLineSection =
190     Ctx->getMachOSection("__DWARF", "__debug_line",
191                          MCSectionMachO::S_ATTR_DEBUG,
192                          SectionKind::getMetadata());
193   DwarfFrameSection =
194     Ctx->getMachOSection("__DWARF", "__debug_frame",
195                          MCSectionMachO::S_ATTR_DEBUG,
196                          SectionKind::getMetadata());
197   DwarfPubNamesSection =
198     Ctx->getMachOSection("__DWARF", "__debug_pubnames",
199                          MCSectionMachO::S_ATTR_DEBUG,
200                          SectionKind::getMetadata());
201   DwarfPubTypesSection =
202     Ctx->getMachOSection("__DWARF", "__debug_pubtypes",
203                          MCSectionMachO::S_ATTR_DEBUG,
204                          SectionKind::getMetadata());
205   DwarfGnuPubNamesSection =
206     Ctx->getMachOSection("__DWARF", "__debug_gnu_pubn",
207                          MCSectionMachO::S_ATTR_DEBUG,
208                          SectionKind::getMetadata());
209   DwarfGnuPubTypesSection =
210     Ctx->getMachOSection("__DWARF", "__debug_gnu_pubt",
211                          MCSectionMachO::S_ATTR_DEBUG,
212                          SectionKind::getMetadata());
213   DwarfStrSection =
214     Ctx->getMachOSection("__DWARF", "__debug_str",
215                          MCSectionMachO::S_ATTR_DEBUG,
216                          SectionKind::getMetadata());
217   DwarfLocSection =
218     Ctx->getMachOSection("__DWARF", "__debug_loc",
219                          MCSectionMachO::S_ATTR_DEBUG,
220                          SectionKind::getMetadata());
221   DwarfARangesSection =
222     Ctx->getMachOSection("__DWARF", "__debug_aranges",
223                          MCSectionMachO::S_ATTR_DEBUG,
224                          SectionKind::getMetadata());
225   DwarfRangesSection =
226     Ctx->getMachOSection("__DWARF", "__debug_ranges",
227                          MCSectionMachO::S_ATTR_DEBUG,
228                          SectionKind::getMetadata());
229   DwarfMacroInfoSection =
230     Ctx->getMachOSection("__DWARF", "__debug_macinfo",
231                          MCSectionMachO::S_ATTR_DEBUG,
232                          SectionKind::getMetadata());
233   DwarfDebugInlineSection =
234     Ctx->getMachOSection("__DWARF", "__debug_inlined",
235                          MCSectionMachO::S_ATTR_DEBUG,
236                          SectionKind::getMetadata());
237   StackMapSection =
238     Ctx->getMachOSection("__LLVM_STACKMAPS", "__llvm_stackmaps", 0,
239                          SectionKind::getMetadata());
240
241   TLSExtraDataSection = TLSTLVSection;
242 }
243
244 void MCObjectFileInfo::InitELFMCObjectFileInfo(Triple T) {
245   if (T.getArch() == Triple::mips ||
246       T.getArch() == Triple::mipsel)
247     FDECFIEncoding = dwarf::DW_EH_PE_sdata4;
248   else if (T.getArch() == Triple::mips64 ||
249            T.getArch() == Triple::mips64el)
250     FDECFIEncoding = dwarf::DW_EH_PE_sdata8;
251   else
252     FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
253
254   if (T.getArch() == Triple::x86) {
255     PersonalityEncoding = (RelocM == Reloc::PIC_)
256      ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
257      : dwarf::DW_EH_PE_absptr;
258     LSDAEncoding = (RelocM == Reloc::PIC_)
259       ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
260       : dwarf::DW_EH_PE_absptr;
261     FDEEncoding = (RelocM == Reloc::PIC_)
262       ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
263       : dwarf::DW_EH_PE_absptr;
264     TTypeEncoding = (RelocM == Reloc::PIC_)
265      ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
266      : dwarf::DW_EH_PE_absptr;
267   } else if (T.getArch() == Triple::x86_64) {
268     if (RelocM == Reloc::PIC_) {
269       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
270         ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
271          ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
272       LSDAEncoding = dwarf::DW_EH_PE_pcrel |
273         (CMModel == CodeModel::Small
274          ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
275       FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
276       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
277         ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
278          ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
279     } else {
280       PersonalityEncoding =
281         (CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
282         ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
283       LSDAEncoding = (CMModel == CodeModel::Small)
284         ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
285       FDEEncoding = dwarf::DW_EH_PE_udata4;
286       TTypeEncoding = (CMModel == CodeModel::Small)
287         ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
288     }
289   }  else if (T.getArch() ==  Triple::aarch64) {
290     // The small model guarantees static code/data size < 4GB, but not where it
291     // will be in memory. Most of these could end up >2GB away so even a signed
292     // pc-relative 32-bit address is insufficient, theoretically.
293     if (RelocM == Reloc::PIC_) {
294       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
295         dwarf::DW_EH_PE_sdata8;
296       LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8;
297       FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
298       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
299         dwarf::DW_EH_PE_sdata8;
300     } else {
301       PersonalityEncoding = dwarf::DW_EH_PE_absptr;
302       LSDAEncoding = dwarf::DW_EH_PE_absptr;
303       FDEEncoding = dwarf::DW_EH_PE_udata4;
304       TTypeEncoding = dwarf::DW_EH_PE_absptr;
305     }
306   } else if (T.getArch() == Triple::ppc64 || T.getArch() == Triple::ppc64le) {
307     PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
308       dwarf::DW_EH_PE_udata8;
309     LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8;
310     FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8;
311     TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
312       dwarf::DW_EH_PE_udata8;
313   } else if (T.getArch() == Triple::systemz) {
314     // All currently-defined code models guarantee that 4-byte PC-relative
315     // values will be in range.
316     if (RelocM == Reloc::PIC_) {
317       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
318         dwarf::DW_EH_PE_sdata4;
319       LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
320       FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
321       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
322         dwarf::DW_EH_PE_sdata4;
323     } else {
324       PersonalityEncoding = dwarf::DW_EH_PE_absptr;
325       LSDAEncoding = dwarf::DW_EH_PE_absptr;
326       FDEEncoding = dwarf::DW_EH_PE_absptr;
327       TTypeEncoding = dwarf::DW_EH_PE_absptr;
328     }
329   }
330
331   // Solaris requires different flags for .eh_frame to seemingly every other
332   // platform.
333   EHSectionType = ELF::SHT_PROGBITS;
334   EHSectionFlags = ELF::SHF_ALLOC;
335   if (T.getOS() == Triple::Solaris) {
336     if (T.getArch() == Triple::x86_64)
337       EHSectionType = ELF::SHT_X86_64_UNWIND;
338     else
339       EHSectionFlags |= ELF::SHF_WRITE;
340   }
341
342
343   // ELF
344   BSSSection =
345     Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
346                        ELF::SHF_WRITE | ELF::SHF_ALLOC,
347                        SectionKind::getBSS());
348
349   TextSection =
350     Ctx->getELFSection(".text", ELF::SHT_PROGBITS,
351                        ELF::SHF_EXECINSTR |
352                        ELF::SHF_ALLOC,
353                        SectionKind::getText());
354
355   DataSection =
356     Ctx->getELFSection(".data", ELF::SHT_PROGBITS,
357                        ELF::SHF_WRITE |ELF::SHF_ALLOC,
358                        SectionKind::getDataRel());
359
360   ReadOnlySection =
361     Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS,
362                        ELF::SHF_ALLOC,
363                        SectionKind::getReadOnly());
364
365   TLSDataSection =
366     Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
367                        ELF::SHF_ALLOC | ELF::SHF_TLS |
368                        ELF::SHF_WRITE,
369                        SectionKind::getThreadData());
370
371   TLSBSSSection =
372     Ctx->getELFSection(".tbss", ELF::SHT_NOBITS,
373                        ELF::SHF_ALLOC | ELF::SHF_TLS |
374                        ELF::SHF_WRITE,
375                        SectionKind::getThreadBSS());
376
377   DataRelSection =
378     Ctx->getELFSection(".data.rel", ELF::SHT_PROGBITS,
379                        ELF::SHF_ALLOC |ELF::SHF_WRITE,
380                        SectionKind::getDataRel());
381
382   DataRelLocalSection =
383     Ctx->getELFSection(".data.rel.local", ELF::SHT_PROGBITS,
384                        ELF::SHF_ALLOC |ELF::SHF_WRITE,
385                        SectionKind::getDataRelLocal());
386
387   DataRelROSection =
388     Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
389                        ELF::SHF_ALLOC |ELF::SHF_WRITE,
390                        SectionKind::getReadOnlyWithRel());
391
392   DataRelROLocalSection =
393     Ctx->getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS,
394                        ELF::SHF_ALLOC |ELF::SHF_WRITE,
395                        SectionKind::getReadOnlyWithRelLocal());
396
397   MergeableConst4Section =
398     Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
399                        ELF::SHF_ALLOC |ELF::SHF_MERGE,
400                        SectionKind::getMergeableConst4());
401
402   MergeableConst8Section =
403     Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
404                        ELF::SHF_ALLOC |ELF::SHF_MERGE,
405                        SectionKind::getMergeableConst8());
406
407   MergeableConst16Section =
408     Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
409                        ELF::SHF_ALLOC |ELF::SHF_MERGE,
410                        SectionKind::getMergeableConst16());
411
412   StaticCtorSection =
413     Ctx->getELFSection(".ctors", ELF::SHT_PROGBITS,
414                        ELF::SHF_ALLOC |ELF::SHF_WRITE,
415                        SectionKind::getDataRel());
416
417   StaticDtorSection =
418     Ctx->getELFSection(".dtors", ELF::SHT_PROGBITS,
419                        ELF::SHF_ALLOC |ELF::SHF_WRITE,
420                        SectionKind::getDataRel());
421
422   // Exception Handling Sections.
423
424   // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
425   // it contains relocatable pointers.  In PIC mode, this is probably a big
426   // runtime hit for C++ apps.  Either the contents of the LSDA need to be
427   // adjusted or this should be a data section.
428   LSDASection =
429     Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
430                        ELF::SHF_ALLOC,
431                        SectionKind::getReadOnly());
432
433   // Debug Info Sections.
434   DwarfAbbrevSection =
435     Ctx->getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0,
436                        SectionKind::getMetadata());
437   DwarfInfoSection =
438     Ctx->getELFSection(".debug_info", ELF::SHT_PROGBITS, 0,
439                        SectionKind::getMetadata());
440   DwarfLineSection =
441     Ctx->getELFSection(".debug_line", ELF::SHT_PROGBITS, 0,
442                        SectionKind::getMetadata());
443   DwarfFrameSection =
444     Ctx->getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0,
445                        SectionKind::getMetadata());
446   DwarfPubNamesSection =
447     Ctx->getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0,
448                        SectionKind::getMetadata());
449   DwarfPubTypesSection =
450     Ctx->getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0,
451                        SectionKind::getMetadata());
452   DwarfGnuPubNamesSection =
453     Ctx->getELFSection(".debug_gnu_pubnames", ELF::SHT_PROGBITS, 0,
454                        SectionKind::getMetadata());
455   DwarfGnuPubTypesSection =
456     Ctx->getELFSection(".debug_gnu_pubtypes", ELF::SHT_PROGBITS, 0,
457                        SectionKind::getMetadata());
458   DwarfStrSection =
459     Ctx->getELFSection(".debug_str", ELF::SHT_PROGBITS,
460                        ELF::SHF_MERGE | ELF::SHF_STRINGS,
461                        SectionKind::getMergeable1ByteCString());
462   DwarfLocSection =
463     Ctx->getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0,
464                        SectionKind::getMetadata());
465   DwarfARangesSection =
466     Ctx->getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0,
467                        SectionKind::getMetadata());
468   DwarfRangesSection =
469     Ctx->getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0,
470                        SectionKind::getMetadata());
471   DwarfMacroInfoSection =
472     Ctx->getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0,
473                        SectionKind::getMetadata());
474
475   // DWARF5 Experimental Debug Info
476
477   // Accelerator Tables
478   DwarfAccelNamesSection =
479     Ctx->getELFSection(".apple_names", ELF::SHT_PROGBITS, 0,
480                        SectionKind::getMetadata());
481   DwarfAccelObjCSection =
482     Ctx->getELFSection(".apple_objc", ELF::SHT_PROGBITS, 0,
483                        SectionKind::getMetadata());
484   DwarfAccelNamespaceSection =
485     Ctx->getELFSection(".apple_namespaces", ELF::SHT_PROGBITS, 0,
486                        SectionKind::getMetadata());
487   DwarfAccelTypesSection =
488     Ctx->getELFSection(".apple_types", ELF::SHT_PROGBITS, 0,
489                        SectionKind::getMetadata());
490
491   // Fission Sections
492   DwarfInfoDWOSection =
493     Ctx->getELFSection(".debug_info.dwo", ELF::SHT_PROGBITS, 0,
494                        SectionKind::getMetadata());
495   DwarfAbbrevDWOSection =
496     Ctx->getELFSection(".debug_abbrev.dwo", ELF::SHT_PROGBITS, 0,
497                        SectionKind::getMetadata());
498   DwarfStrDWOSection =
499     Ctx->getELFSection(".debug_str.dwo", ELF::SHT_PROGBITS,
500                        ELF::SHF_MERGE | ELF::SHF_STRINGS,
501                        SectionKind::getMergeable1ByteCString());
502   DwarfLineDWOSection =
503     Ctx->getELFSection(".debug_line.dwo", ELF::SHT_PROGBITS, 0,
504                        SectionKind::getMetadata());
505   DwarfLocDWOSection =
506     Ctx->getELFSection(".debug_loc.dwo", ELF::SHT_PROGBITS, 0,
507                        SectionKind::getMetadata());
508   DwarfStrOffDWOSection =
509     Ctx->getELFSection(".debug_str_offsets.dwo", ELF::SHT_PROGBITS, 0,
510                        SectionKind::getMetadata());
511   DwarfAddrSection =
512     Ctx->getELFSection(".debug_addr", ELF::SHT_PROGBITS, 0,
513                        SectionKind::getMetadata());
514 }
515
516
517 void MCObjectFileInfo::InitCOFFMCObjectFileInfo(Triple T) {
518   // COFF
519   BSSSection =
520     Ctx->getCOFFSection(".bss",
521                         COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
522                         COFF::IMAGE_SCN_MEM_READ |
523                         COFF::IMAGE_SCN_MEM_WRITE,
524                         SectionKind::getBSS());
525   TextSection =
526     Ctx->getCOFFSection(".text",
527                         COFF::IMAGE_SCN_CNT_CODE |
528                         COFF::IMAGE_SCN_MEM_EXECUTE |
529                         COFF::IMAGE_SCN_MEM_READ,
530                         SectionKind::getText());
531   DataSection =
532     Ctx->getCOFFSection(".data",
533                         COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
534                         COFF::IMAGE_SCN_MEM_READ |
535                         COFF::IMAGE_SCN_MEM_WRITE,
536                         SectionKind::getDataRel());
537   ReadOnlySection =
538     Ctx->getCOFFSection(".rdata",
539                         COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
540                         COFF::IMAGE_SCN_MEM_READ,
541                         SectionKind::getReadOnly());
542   if (T.getOS() == Triple::Win32) {
543     StaticCtorSection =
544       Ctx->getCOFFSection(".CRT$XCU",
545                           COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
546                           COFF::IMAGE_SCN_MEM_READ,
547                           SectionKind::getReadOnly());
548   } else {
549     StaticCtorSection =
550       Ctx->getCOFFSection(".ctors",
551                           COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
552                           COFF::IMAGE_SCN_MEM_READ |
553                           COFF::IMAGE_SCN_MEM_WRITE,
554                           SectionKind::getDataRel());
555   }
556
557
558   if (T.getOS() == Triple::Win32) {
559     StaticDtorSection =
560       Ctx->getCOFFSection(".CRT$XTX",
561                           COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
562                           COFF::IMAGE_SCN_MEM_READ,
563                           SectionKind::getReadOnly());
564   } else {
565     StaticDtorSection =
566       Ctx->getCOFFSection(".dtors",
567                           COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
568                           COFF::IMAGE_SCN_MEM_READ |
569                           COFF::IMAGE_SCN_MEM_WRITE,
570                           SectionKind::getDataRel());
571   }
572
573   // FIXME: We're emitting LSDA info into a readonly section on COFF, even
574   // though it contains relocatable pointers.  In PIC mode, this is probably a
575   // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
576   // adjusted or this should be a data section.
577   LSDASection =
578     Ctx->getCOFFSection(".gcc_except_table",
579                         COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
580                         COFF::IMAGE_SCN_MEM_READ,
581                         SectionKind::getReadOnly());
582
583   // Debug info.
584   DwarfAbbrevSection =
585     Ctx->getCOFFSection(".debug_abbrev",
586                         COFF::IMAGE_SCN_MEM_DISCARDABLE |
587                         COFF::IMAGE_SCN_MEM_READ,
588                         SectionKind::getMetadata());
589   DwarfInfoSection =
590     Ctx->getCOFFSection(".debug_info",
591                         COFF::IMAGE_SCN_MEM_DISCARDABLE |
592                         COFF::IMAGE_SCN_MEM_READ,
593                         SectionKind::getMetadata());
594   DwarfLineSection =
595     Ctx->getCOFFSection(".debug_line",
596                         COFF::IMAGE_SCN_MEM_DISCARDABLE |
597                         COFF::IMAGE_SCN_MEM_READ,
598                         SectionKind::getMetadata());
599   DwarfFrameSection =
600     Ctx->getCOFFSection(".debug_frame",
601                         COFF::IMAGE_SCN_MEM_DISCARDABLE |
602                         COFF::IMAGE_SCN_MEM_READ,
603                         SectionKind::getMetadata());
604   DwarfPubNamesSection =
605     Ctx->getCOFFSection(".debug_pubnames",
606                         COFF::IMAGE_SCN_MEM_DISCARDABLE |
607                         COFF::IMAGE_SCN_MEM_READ,
608                         SectionKind::getMetadata());
609   DwarfPubTypesSection =
610     Ctx->getCOFFSection(".debug_pubtypes",
611                         COFF::IMAGE_SCN_MEM_DISCARDABLE |
612                         COFF::IMAGE_SCN_MEM_READ,
613                         SectionKind::getMetadata());
614   DwarfGnuPubNamesSection =
615     Ctx->getCOFFSection(".debug_gnu_pubnames",
616                         COFF::IMAGE_SCN_MEM_DISCARDABLE |
617                         COFF::IMAGE_SCN_MEM_READ,
618                         SectionKind::getMetadata());
619   DwarfGnuPubTypesSection =
620     Ctx->getCOFFSection(".debug_gnu_pubtypes",
621                         COFF::IMAGE_SCN_MEM_DISCARDABLE |
622                         COFF::IMAGE_SCN_MEM_READ,
623                         SectionKind::getMetadata());
624   DwarfStrSection =
625     Ctx->getCOFFSection(".debug_str",
626                         COFF::IMAGE_SCN_MEM_DISCARDABLE |
627                         COFF::IMAGE_SCN_MEM_READ,
628                         SectionKind::getMetadata());
629   DwarfLocSection =
630     Ctx->getCOFFSection(".debug_loc",
631                         COFF::IMAGE_SCN_MEM_DISCARDABLE |
632                         COFF::IMAGE_SCN_MEM_READ,
633                         SectionKind::getMetadata());
634   DwarfARangesSection =
635     Ctx->getCOFFSection(".debug_aranges",
636                         COFF::IMAGE_SCN_MEM_DISCARDABLE |
637                         COFF::IMAGE_SCN_MEM_READ,
638                         SectionKind::getMetadata());
639   DwarfRangesSection =
640     Ctx->getCOFFSection(".debug_ranges",
641                         COFF::IMAGE_SCN_MEM_DISCARDABLE |
642                         COFF::IMAGE_SCN_MEM_READ,
643                         SectionKind::getMetadata());
644   DwarfMacroInfoSection =
645     Ctx->getCOFFSection(".debug_macinfo",
646                         COFF::IMAGE_SCN_MEM_DISCARDABLE |
647                         COFF::IMAGE_SCN_MEM_READ,
648                         SectionKind::getMetadata());
649
650   DrectveSection =
651     Ctx->getCOFFSection(".drectve",
652                         COFF::IMAGE_SCN_LNK_INFO,
653                         SectionKind::getMetadata());
654
655   PDataSection =
656     Ctx->getCOFFSection(".pdata",
657                         COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
658                         COFF::IMAGE_SCN_MEM_READ,
659                         SectionKind::getDataRel());
660
661   XDataSection =
662     Ctx->getCOFFSection(".xdata",
663                         COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
664                         COFF::IMAGE_SCN_MEM_READ,
665                         SectionKind::getDataRel());
666   TLSDataSection =
667     Ctx->getCOFFSection(".tls$",
668                         COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
669                         COFF::IMAGE_SCN_MEM_READ |
670                         COFF::IMAGE_SCN_MEM_WRITE,
671                         SectionKind::getDataRel());
672 }
673
674 void MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model relocm,
675                                             CodeModel::Model cm,
676                                             MCContext &ctx) {
677   RelocM = relocm;
678   CMModel = cm;
679   Ctx = &ctx;
680
681   // Common.
682   CommDirectiveSupportsAlignment = true;
683   SupportsWeakOmittedEHFrame = true;
684   IsFunctionEHFrameSymbolPrivate = true;
685
686   PersonalityEncoding = LSDAEncoding = FDEEncoding = FDECFIEncoding =
687     TTypeEncoding = dwarf::DW_EH_PE_absptr;
688
689   CompactUnwindDwarfEHFrameOnly = 0;
690
691   EHFrameSection = 0;             // Created on demand.
692   CompactUnwindSection = 0;       // Used only by selected targets.
693   DwarfAccelNamesSection = 0;     // Used only by selected targets.
694   DwarfAccelObjCSection = 0;      // Used only by selected targets.
695   DwarfAccelNamespaceSection = 0; // Used only by selected targets.
696   DwarfAccelTypesSection = 0;     // Used only by selected targets.
697
698   Triple T(TT);
699   Triple::ArchType Arch = T.getArch();
700   // FIXME: Checking for Arch here to filter out bogus triples such as
701   // cellspu-apple-darwin. Perhaps we should fix in Triple?
702   if ((Arch == Triple::x86 || Arch == Triple::x86_64 ||
703        Arch == Triple::arm || Arch == Triple::thumb ||
704        Arch == Triple::ppc || Arch == Triple::ppc64 ||
705        Arch == Triple::UnknownArch) &&
706       (T.isOSDarwin() || T.getEnvironment() == Triple::MachO)) {
707     Env = IsMachO;
708     InitMachOMCObjectFileInfo(T);
709   } else if ((Arch == Triple::x86 || Arch == Triple::x86_64) &&
710              (T.getEnvironment() != Triple::ELF) &&
711              (T.getOS() == Triple::MinGW32 || T.getOS() == Triple::Cygwin ||
712               T.getOS() == Triple::Win32)) {
713     Env = IsCOFF;
714     InitCOFFMCObjectFileInfo(T);
715   } else {
716     Env = IsELF;
717     InitELFMCObjectFileInfo(T);
718   }
719 }
720
721 void MCObjectFileInfo::InitEHFrameSection() {
722   if (Env == IsMachO)
723     EHFrameSection =
724       Ctx->getMachOSection("__TEXT", "__eh_frame",
725                            MCSectionMachO::S_COALESCED |
726                            MCSectionMachO::S_ATTR_NO_TOC |
727                            MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
728                            MCSectionMachO::S_ATTR_LIVE_SUPPORT,
729                            SectionKind::getReadOnly());
730   else if (Env == IsELF)
731     EHFrameSection =
732       Ctx->getELFSection(".eh_frame", EHSectionType,
733                          EHSectionFlags,
734                          SectionKind::getDataRel());
735   else
736     EHFrameSection =
737       Ctx->getCOFFSection(".eh_frame",
738                           COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
739                           COFF::IMAGE_SCN_MEM_READ |
740                           COFF::IMAGE_SCN_MEM_WRITE,
741                           SectionKind::getDataRel());
742 }