MCObjectFileInfo.cpp revision 263763
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"
17using namespace llvm;
18
19void 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
244void 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::sparc) {
314    if (RelocM == Reloc::PIC_) {
315      LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
316      PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
317        dwarf::DW_EH_PE_sdata4;
318      FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
319      TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
320        dwarf::DW_EH_PE_sdata4;
321    } else {
322      LSDAEncoding = dwarf::DW_EH_PE_absptr;
323      PersonalityEncoding = dwarf::DW_EH_PE_absptr;
324      FDEEncoding = dwarf::DW_EH_PE_udata4;
325      TTypeEncoding = dwarf::DW_EH_PE_absptr;
326    }
327  } else if (T.getArch() == Triple::sparcv9) {
328    LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
329    if (RelocM == Reloc::PIC_) {
330      PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
331        dwarf::DW_EH_PE_sdata4;
332      FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
333      TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
334        dwarf::DW_EH_PE_sdata4;
335    } else {
336      PersonalityEncoding = dwarf::DW_EH_PE_absptr;
337      FDEEncoding = dwarf::DW_EH_PE_udata4;
338      TTypeEncoding = dwarf::DW_EH_PE_absptr;
339    }
340  } else if (T.getArch() == Triple::systemz) {
341    // All currently-defined code models guarantee that 4-byte PC-relative
342    // values will be in range.
343    if (RelocM == Reloc::PIC_) {
344      PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
345        dwarf::DW_EH_PE_sdata4;
346      LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
347      FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
348      TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
349        dwarf::DW_EH_PE_sdata4;
350    } else {
351      PersonalityEncoding = dwarf::DW_EH_PE_absptr;
352      LSDAEncoding = dwarf::DW_EH_PE_absptr;
353      FDEEncoding = dwarf::DW_EH_PE_absptr;
354      TTypeEncoding = dwarf::DW_EH_PE_absptr;
355    }
356  }
357
358  // Solaris requires different flags for .eh_frame to seemingly every other
359  // platform.
360  EHSectionType = ELF::SHT_PROGBITS;
361  EHSectionFlags = ELF::SHF_ALLOC;
362  if (T.getOS() == Triple::Solaris) {
363    if (T.getArch() == Triple::x86_64)
364      EHSectionType = ELF::SHT_X86_64_UNWIND;
365    else
366      EHSectionFlags |= ELF::SHF_WRITE;
367  }
368
369
370  // ELF
371  BSSSection =
372    Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
373                       ELF::SHF_WRITE | ELF::SHF_ALLOC,
374                       SectionKind::getBSS());
375
376  TextSection =
377    Ctx->getELFSection(".text", ELF::SHT_PROGBITS,
378                       ELF::SHF_EXECINSTR |
379                       ELF::SHF_ALLOC,
380                       SectionKind::getText());
381
382  DataSection =
383    Ctx->getELFSection(".data", ELF::SHT_PROGBITS,
384                       ELF::SHF_WRITE |ELF::SHF_ALLOC,
385                       SectionKind::getDataRel());
386
387  ReadOnlySection =
388    Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS,
389                       ELF::SHF_ALLOC,
390                       SectionKind::getReadOnly());
391
392  TLSDataSection =
393    Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
394                       ELF::SHF_ALLOC | ELF::SHF_TLS |
395                       ELF::SHF_WRITE,
396                       SectionKind::getThreadData());
397
398  TLSBSSSection =
399    Ctx->getELFSection(".tbss", ELF::SHT_NOBITS,
400                       ELF::SHF_ALLOC | ELF::SHF_TLS |
401                       ELF::SHF_WRITE,
402                       SectionKind::getThreadBSS());
403
404  DataRelSection =
405    Ctx->getELFSection(".data.rel", ELF::SHT_PROGBITS,
406                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
407                       SectionKind::getDataRel());
408
409  DataRelLocalSection =
410    Ctx->getELFSection(".data.rel.local", ELF::SHT_PROGBITS,
411                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
412                       SectionKind::getDataRelLocal());
413
414  DataRelROSection =
415    Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
416                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
417                       SectionKind::getReadOnlyWithRel());
418
419  DataRelROLocalSection =
420    Ctx->getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS,
421                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
422                       SectionKind::getReadOnlyWithRelLocal());
423
424  MergeableConst4Section =
425    Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
426                       ELF::SHF_ALLOC |ELF::SHF_MERGE,
427                       SectionKind::getMergeableConst4());
428
429  MergeableConst8Section =
430    Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
431                       ELF::SHF_ALLOC |ELF::SHF_MERGE,
432                       SectionKind::getMergeableConst8());
433
434  MergeableConst16Section =
435    Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
436                       ELF::SHF_ALLOC |ELF::SHF_MERGE,
437                       SectionKind::getMergeableConst16());
438
439  StaticCtorSection =
440    Ctx->getELFSection(".ctors", ELF::SHT_PROGBITS,
441                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
442                       SectionKind::getDataRel());
443
444  StaticDtorSection =
445    Ctx->getELFSection(".dtors", ELF::SHT_PROGBITS,
446                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
447                       SectionKind::getDataRel());
448
449  // Exception Handling Sections.
450
451  // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
452  // it contains relocatable pointers.  In PIC mode, this is probably a big
453  // runtime hit for C++ apps.  Either the contents of the LSDA need to be
454  // adjusted or this should be a data section.
455  LSDASection =
456    Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
457                       ELF::SHF_ALLOC,
458                       SectionKind::getReadOnly());
459
460  // Debug Info Sections.
461  DwarfAbbrevSection =
462    Ctx->getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0,
463                       SectionKind::getMetadata());
464  DwarfInfoSection =
465    Ctx->getELFSection(".debug_info", ELF::SHT_PROGBITS, 0,
466                       SectionKind::getMetadata());
467  DwarfLineSection =
468    Ctx->getELFSection(".debug_line", ELF::SHT_PROGBITS, 0,
469                       SectionKind::getMetadata());
470  DwarfFrameSection =
471    Ctx->getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0,
472                       SectionKind::getMetadata());
473  DwarfPubNamesSection =
474    Ctx->getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0,
475                       SectionKind::getMetadata());
476  DwarfPubTypesSection =
477    Ctx->getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0,
478                       SectionKind::getMetadata());
479  DwarfGnuPubNamesSection =
480    Ctx->getELFSection(".debug_gnu_pubnames", ELF::SHT_PROGBITS, 0,
481                       SectionKind::getMetadata());
482  DwarfGnuPubTypesSection =
483    Ctx->getELFSection(".debug_gnu_pubtypes", ELF::SHT_PROGBITS, 0,
484                       SectionKind::getMetadata());
485  DwarfStrSection =
486    Ctx->getELFSection(".debug_str", ELF::SHT_PROGBITS,
487                       ELF::SHF_MERGE | ELF::SHF_STRINGS,
488                       SectionKind::getMergeable1ByteCString());
489  DwarfLocSection =
490    Ctx->getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0,
491                       SectionKind::getMetadata());
492  DwarfARangesSection =
493    Ctx->getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0,
494                       SectionKind::getMetadata());
495  DwarfRangesSection =
496    Ctx->getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0,
497                       SectionKind::getMetadata());
498  DwarfMacroInfoSection =
499    Ctx->getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0,
500                       SectionKind::getMetadata());
501
502  // DWARF5 Experimental Debug Info
503
504  // Accelerator Tables
505  DwarfAccelNamesSection =
506    Ctx->getELFSection(".apple_names", ELF::SHT_PROGBITS, 0,
507                       SectionKind::getMetadata());
508  DwarfAccelObjCSection =
509    Ctx->getELFSection(".apple_objc", ELF::SHT_PROGBITS, 0,
510                       SectionKind::getMetadata());
511  DwarfAccelNamespaceSection =
512    Ctx->getELFSection(".apple_namespaces", ELF::SHT_PROGBITS, 0,
513                       SectionKind::getMetadata());
514  DwarfAccelTypesSection =
515    Ctx->getELFSection(".apple_types", ELF::SHT_PROGBITS, 0,
516                       SectionKind::getMetadata());
517
518  // Fission Sections
519  DwarfInfoDWOSection =
520    Ctx->getELFSection(".debug_info.dwo", ELF::SHT_PROGBITS, 0,
521                       SectionKind::getMetadata());
522  DwarfAbbrevDWOSection =
523    Ctx->getELFSection(".debug_abbrev.dwo", ELF::SHT_PROGBITS, 0,
524                       SectionKind::getMetadata());
525  DwarfStrDWOSection =
526    Ctx->getELFSection(".debug_str.dwo", ELF::SHT_PROGBITS,
527                       ELF::SHF_MERGE | ELF::SHF_STRINGS,
528                       SectionKind::getMergeable1ByteCString());
529  DwarfLineDWOSection =
530    Ctx->getELFSection(".debug_line.dwo", ELF::SHT_PROGBITS, 0,
531                       SectionKind::getMetadata());
532  DwarfLocDWOSection =
533    Ctx->getELFSection(".debug_loc.dwo", ELF::SHT_PROGBITS, 0,
534                       SectionKind::getMetadata());
535  DwarfStrOffDWOSection =
536    Ctx->getELFSection(".debug_str_offsets.dwo", ELF::SHT_PROGBITS, 0,
537                       SectionKind::getMetadata());
538  DwarfAddrSection =
539    Ctx->getELFSection(".debug_addr", ELF::SHT_PROGBITS, 0,
540                       SectionKind::getMetadata());
541}
542
543
544void MCObjectFileInfo::InitCOFFMCObjectFileInfo(Triple T) {
545  // COFF
546  BSSSection =
547    Ctx->getCOFFSection(".bss",
548                        COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
549                        COFF::IMAGE_SCN_MEM_READ |
550                        COFF::IMAGE_SCN_MEM_WRITE,
551                        SectionKind::getBSS());
552  TextSection =
553    Ctx->getCOFFSection(".text",
554                        COFF::IMAGE_SCN_CNT_CODE |
555                        COFF::IMAGE_SCN_MEM_EXECUTE |
556                        COFF::IMAGE_SCN_MEM_READ,
557                        SectionKind::getText());
558  DataSection =
559    Ctx->getCOFFSection(".data",
560                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
561                        COFF::IMAGE_SCN_MEM_READ |
562                        COFF::IMAGE_SCN_MEM_WRITE,
563                        SectionKind::getDataRel());
564  ReadOnlySection =
565    Ctx->getCOFFSection(".rdata",
566                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
567                        COFF::IMAGE_SCN_MEM_READ,
568                        SectionKind::getReadOnly());
569  if (T.getOS() == Triple::Win32) {
570    StaticCtorSection =
571      Ctx->getCOFFSection(".CRT$XCU",
572                          COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
573                          COFF::IMAGE_SCN_MEM_READ,
574                          SectionKind::getReadOnly());
575  } else {
576    StaticCtorSection =
577      Ctx->getCOFFSection(".ctors",
578                          COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
579                          COFF::IMAGE_SCN_MEM_READ |
580                          COFF::IMAGE_SCN_MEM_WRITE,
581                          SectionKind::getDataRel());
582  }
583
584
585  if (T.getOS() == Triple::Win32) {
586    StaticDtorSection =
587      Ctx->getCOFFSection(".CRT$XTX",
588                          COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
589                          COFF::IMAGE_SCN_MEM_READ,
590                          SectionKind::getReadOnly());
591  } else {
592    StaticDtorSection =
593      Ctx->getCOFFSection(".dtors",
594                          COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
595                          COFF::IMAGE_SCN_MEM_READ |
596                          COFF::IMAGE_SCN_MEM_WRITE,
597                          SectionKind::getDataRel());
598  }
599
600  // FIXME: We're emitting LSDA info into a readonly section on COFF, even
601  // though it contains relocatable pointers.  In PIC mode, this is probably a
602  // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
603  // adjusted or this should be a data section.
604  LSDASection =
605    Ctx->getCOFFSection(".gcc_except_table",
606                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
607                        COFF::IMAGE_SCN_MEM_READ,
608                        SectionKind::getReadOnly());
609
610  // Debug info.
611  DwarfAbbrevSection =
612    Ctx->getCOFFSection(".debug_abbrev",
613                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
614                        COFF::IMAGE_SCN_MEM_READ,
615                        SectionKind::getMetadata());
616  DwarfInfoSection =
617    Ctx->getCOFFSection(".debug_info",
618                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
619                        COFF::IMAGE_SCN_MEM_READ,
620                        SectionKind::getMetadata());
621  DwarfLineSection =
622    Ctx->getCOFFSection(".debug_line",
623                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
624                        COFF::IMAGE_SCN_MEM_READ,
625                        SectionKind::getMetadata());
626  DwarfFrameSection =
627    Ctx->getCOFFSection(".debug_frame",
628                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
629                        COFF::IMAGE_SCN_MEM_READ,
630                        SectionKind::getMetadata());
631  DwarfPubNamesSection =
632    Ctx->getCOFFSection(".debug_pubnames",
633                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
634                        COFF::IMAGE_SCN_MEM_READ,
635                        SectionKind::getMetadata());
636  DwarfPubTypesSection =
637    Ctx->getCOFFSection(".debug_pubtypes",
638                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
639                        COFF::IMAGE_SCN_MEM_READ,
640                        SectionKind::getMetadata());
641  DwarfGnuPubNamesSection =
642    Ctx->getCOFFSection(".debug_gnu_pubnames",
643                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
644                        COFF::IMAGE_SCN_MEM_READ,
645                        SectionKind::getMetadata());
646  DwarfGnuPubTypesSection =
647    Ctx->getCOFFSection(".debug_gnu_pubtypes",
648                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
649                        COFF::IMAGE_SCN_MEM_READ,
650                        SectionKind::getMetadata());
651  DwarfStrSection =
652    Ctx->getCOFFSection(".debug_str",
653                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
654                        COFF::IMAGE_SCN_MEM_READ,
655                        SectionKind::getMetadata());
656  DwarfLocSection =
657    Ctx->getCOFFSection(".debug_loc",
658                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
659                        COFF::IMAGE_SCN_MEM_READ,
660                        SectionKind::getMetadata());
661  DwarfARangesSection =
662    Ctx->getCOFFSection(".debug_aranges",
663                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
664                        COFF::IMAGE_SCN_MEM_READ,
665                        SectionKind::getMetadata());
666  DwarfRangesSection =
667    Ctx->getCOFFSection(".debug_ranges",
668                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
669                        COFF::IMAGE_SCN_MEM_READ,
670                        SectionKind::getMetadata());
671  DwarfMacroInfoSection =
672    Ctx->getCOFFSection(".debug_macinfo",
673                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
674                        COFF::IMAGE_SCN_MEM_READ,
675                        SectionKind::getMetadata());
676
677  DrectveSection =
678    Ctx->getCOFFSection(".drectve",
679                        COFF::IMAGE_SCN_LNK_INFO,
680                        SectionKind::getMetadata());
681
682  PDataSection =
683    Ctx->getCOFFSection(".pdata",
684                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
685                        COFF::IMAGE_SCN_MEM_READ,
686                        SectionKind::getDataRel());
687
688  XDataSection =
689    Ctx->getCOFFSection(".xdata",
690                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
691                        COFF::IMAGE_SCN_MEM_READ,
692                        SectionKind::getDataRel());
693  TLSDataSection =
694    Ctx->getCOFFSection(".tls$",
695                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
696                        COFF::IMAGE_SCN_MEM_READ |
697                        COFF::IMAGE_SCN_MEM_WRITE,
698                        SectionKind::getDataRel());
699}
700
701void MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model relocm,
702                                            CodeModel::Model cm,
703                                            MCContext &ctx) {
704  RelocM = relocm;
705  CMModel = cm;
706  Ctx = &ctx;
707
708  // Common.
709  CommDirectiveSupportsAlignment = true;
710  SupportsWeakOmittedEHFrame = true;
711  IsFunctionEHFrameSymbolPrivate = true;
712
713  PersonalityEncoding = LSDAEncoding = FDEEncoding = FDECFIEncoding =
714    TTypeEncoding = dwarf::DW_EH_PE_absptr;
715
716  CompactUnwindDwarfEHFrameOnly = 0;
717
718  EHFrameSection = 0;             // Created on demand.
719  CompactUnwindSection = 0;       // Used only by selected targets.
720  DwarfAccelNamesSection = 0;     // Used only by selected targets.
721  DwarfAccelObjCSection = 0;      // Used only by selected targets.
722  DwarfAccelNamespaceSection = 0; // Used only by selected targets.
723  DwarfAccelTypesSection = 0;     // Used only by selected targets.
724
725  Triple T(TT);
726  Triple::ArchType Arch = T.getArch();
727  // FIXME: Checking for Arch here to filter out bogus triples such as
728  // cellspu-apple-darwin. Perhaps we should fix in Triple?
729  if ((Arch == Triple::x86 || Arch == Triple::x86_64 ||
730       Arch == Triple::arm || Arch == Triple::thumb ||
731       Arch == Triple::ppc || Arch == Triple::ppc64 ||
732       Arch == Triple::UnknownArch) &&
733      (T.isOSDarwin() || T.getEnvironment() == Triple::MachO)) {
734    Env = IsMachO;
735    InitMachOMCObjectFileInfo(T);
736  } else if ((Arch == Triple::x86 || Arch == Triple::x86_64) &&
737             (T.getEnvironment() != Triple::ELF) &&
738             (T.getOS() == Triple::MinGW32 || T.getOS() == Triple::Cygwin ||
739              T.getOS() == Triple::Win32)) {
740    Env = IsCOFF;
741    InitCOFFMCObjectFileInfo(T);
742  } else {
743    Env = IsELF;
744    InitELFMCObjectFileInfo(T);
745  }
746}
747
748void MCObjectFileInfo::InitEHFrameSection() {
749  if (Env == IsMachO)
750    EHFrameSection =
751      Ctx->getMachOSection("__TEXT", "__eh_frame",
752                           MCSectionMachO::S_COALESCED |
753                           MCSectionMachO::S_ATTR_NO_TOC |
754                           MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
755                           MCSectionMachO::S_ATTR_LIVE_SUPPORT,
756                           SectionKind::getReadOnly());
757  else if (Env == IsELF)
758    EHFrameSection =
759      Ctx->getELFSection(".eh_frame", EHSectionType,
760                         EHSectionFlags,
761                         SectionKind::getDataRel());
762  else
763    EHFrameSection =
764      Ctx->getCOFFSection(".eh_frame",
765                          COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
766                          COFF::IMAGE_SCN_MEM_READ |
767                          COFF::IMAGE_SCN_MEM_WRITE,
768                          SectionKind::getDataRel());
769}
770