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/MC/MCContext.h"
12#include "llvm/MC/MCSection.h"
13#include "llvm/MC/MCSectionCOFF.h"
14#include "llvm/MC/MCSectionELF.h"
15#include "llvm/MC/MCSectionMachO.h"
16#include "llvm/ADT/Triple.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  TLSDataSection // .tdata
43    = Ctx->getMachOSection("__DATA", "__thread_data",
44                           MCSectionMachO::S_THREAD_LOCAL_REGULAR,
45                           SectionKind::getDataRel());
46  TLSBSSSection // .tbss
47    = Ctx->getMachOSection("__DATA", "__thread_bss",
48                           MCSectionMachO::S_THREAD_LOCAL_ZEROFILL,
49                           SectionKind::getThreadBSS());
50
51  // TODO: Verify datarel below.
52  TLSTLVSection // .tlv
53    = Ctx->getMachOSection("__DATA", "__thread_vars",
54                           MCSectionMachO::S_THREAD_LOCAL_VARIABLES,
55                           SectionKind::getDataRel());
56
57  TLSThreadInitSection
58    = Ctx->getMachOSection("__DATA", "__thread_init",
59                           MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
60                           SectionKind::getDataRel());
61
62  CStringSection // .cstring
63    = Ctx->getMachOSection("__TEXT", "__cstring",
64                           MCSectionMachO::S_CSTRING_LITERALS,
65                           SectionKind::getMergeable1ByteCString());
66  UStringSection
67    = Ctx->getMachOSection("__TEXT","__ustring", 0,
68                           SectionKind::getMergeable2ByteCString());
69  FourByteConstantSection // .literal4
70    = Ctx->getMachOSection("__TEXT", "__literal4",
71                           MCSectionMachO::S_4BYTE_LITERALS,
72                           SectionKind::getMergeableConst4());
73  EightByteConstantSection // .literal8
74    = Ctx->getMachOSection("__TEXT", "__literal8",
75                           MCSectionMachO::S_8BYTE_LITERALS,
76                           SectionKind::getMergeableConst8());
77
78  // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
79  // to using it in -static mode.
80  SixteenByteConstantSection = 0;
81  if (RelocM != Reloc::Static &&
82      T.getArch() != Triple::x86_64 && T.getArch() != Triple::ppc64)
83    SixteenByteConstantSection =   // .literal16
84      Ctx->getMachOSection("__TEXT", "__literal16",
85                           MCSectionMachO::S_16BYTE_LITERALS,
86                           SectionKind::getMergeableConst16());
87
88  ReadOnlySection  // .const
89    = Ctx->getMachOSection("__TEXT", "__const", 0,
90                           SectionKind::getReadOnly());
91
92  TextCoalSection
93    = Ctx->getMachOSection("__TEXT", "__textcoal_nt",
94                           MCSectionMachO::S_COALESCED |
95                           MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
96                           SectionKind::getText());
97  ConstTextCoalSection
98    = Ctx->getMachOSection("__TEXT", "__const_coal",
99                           MCSectionMachO::S_COALESCED,
100                           SectionKind::getReadOnly());
101  ConstDataSection  // .const_data
102    = Ctx->getMachOSection("__DATA", "__const", 0,
103                           SectionKind::getReadOnlyWithRel());
104  DataCoalSection
105    = Ctx->getMachOSection("__DATA","__datacoal_nt",
106                           MCSectionMachO::S_COALESCED,
107                           SectionKind::getDataRel());
108  DataCommonSection
109    = Ctx->getMachOSection("__DATA","__common",
110                           MCSectionMachO::S_ZEROFILL,
111                           SectionKind::getBSS());
112  DataBSSSection
113    = Ctx->getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
114                           SectionKind::getBSS());
115
116
117  LazySymbolPointerSection
118    = Ctx->getMachOSection("__DATA", "__la_symbol_ptr",
119                           MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
120                           SectionKind::getMetadata());
121  NonLazySymbolPointerSection
122    = Ctx->getMachOSection("__DATA", "__nl_symbol_ptr",
123                           MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
124                           SectionKind::getMetadata());
125
126  if (RelocM == Reloc::Static) {
127    StaticCtorSection
128      = Ctx->getMachOSection("__TEXT", "__constructor", 0,
129                             SectionKind::getDataRel());
130    StaticDtorSection
131      = Ctx->getMachOSection("__TEXT", "__destructor", 0,
132                             SectionKind::getDataRel());
133  } else {
134    StaticCtorSection
135      = Ctx->getMachOSection("__DATA", "__mod_init_func",
136                             MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
137                             SectionKind::getDataRel());
138    StaticDtorSection
139      = Ctx->getMachOSection("__DATA", "__mod_term_func",
140                             MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
141                             SectionKind::getDataRel());
142  }
143
144  // Exception Handling.
145  LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
146                                     SectionKind::getReadOnlyWithRel());
147
148  if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6))
149    CompactUnwindSection =
150      Ctx->getMachOSection("__LD", "__compact_unwind",
151                           MCSectionMachO::S_ATTR_DEBUG,
152                           SectionKind::getReadOnly());
153
154  // Debug Information.
155  DwarfAbbrevSection =
156    Ctx->getMachOSection("__DWARF", "__debug_abbrev",
157                         MCSectionMachO::S_ATTR_DEBUG,
158                         SectionKind::getMetadata());
159  DwarfInfoSection =
160    Ctx->getMachOSection("__DWARF", "__debug_info",
161                         MCSectionMachO::S_ATTR_DEBUG,
162                         SectionKind::getMetadata());
163  DwarfLineSection =
164    Ctx->getMachOSection("__DWARF", "__debug_line",
165                         MCSectionMachO::S_ATTR_DEBUG,
166                         SectionKind::getMetadata());
167  DwarfFrameSection =
168    Ctx->getMachOSection("__DWARF", "__debug_frame",
169                         MCSectionMachO::S_ATTR_DEBUG,
170                         SectionKind::getMetadata());
171  DwarfPubNamesSection =
172    Ctx->getMachOSection("__DWARF", "__debug_pubnames",
173                         MCSectionMachO::S_ATTR_DEBUG,
174                         SectionKind::getMetadata());
175  DwarfPubTypesSection =
176    Ctx->getMachOSection("__DWARF", "__debug_pubtypes",
177                         MCSectionMachO::S_ATTR_DEBUG,
178                         SectionKind::getMetadata());
179  DwarfStrSection =
180    Ctx->getMachOSection("__DWARF", "__debug_str",
181                         MCSectionMachO::S_ATTR_DEBUG,
182                         SectionKind::getMetadata());
183  DwarfLocSection =
184    Ctx->getMachOSection("__DWARF", "__debug_loc",
185                         MCSectionMachO::S_ATTR_DEBUG,
186                         SectionKind::getMetadata());
187  DwarfARangesSection =
188    Ctx->getMachOSection("__DWARF", "__debug_aranges",
189                         MCSectionMachO::S_ATTR_DEBUG,
190                         SectionKind::getMetadata());
191  DwarfRangesSection =
192    Ctx->getMachOSection("__DWARF", "__debug_ranges",
193                         MCSectionMachO::S_ATTR_DEBUG,
194                         SectionKind::getMetadata());
195  DwarfMacroInfoSection =
196    Ctx->getMachOSection("__DWARF", "__debug_macinfo",
197                         MCSectionMachO::S_ATTR_DEBUG,
198                         SectionKind::getMetadata());
199  DwarfDebugInlineSection =
200    Ctx->getMachOSection("__DWARF", "__debug_inlined",
201                         MCSectionMachO::S_ATTR_DEBUG,
202                         SectionKind::getMetadata());
203
204  TLSExtraDataSection = TLSTLVSection;
205}
206
207void MCObjectFileInfo::InitELFMCObjectFileInfo(Triple T) {
208  if (T.getArch() == Triple::x86) {
209    PersonalityEncoding = (RelocM == Reloc::PIC_)
210      ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
211      : dwarf::DW_EH_PE_absptr;
212    LSDAEncoding = (RelocM == Reloc::PIC_)
213      ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
214      : dwarf::DW_EH_PE_absptr;
215    FDEEncoding = FDECFIEncoding = (RelocM == Reloc::PIC_)
216      ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
217      : dwarf::DW_EH_PE_absptr;
218    TTypeEncoding = (RelocM == Reloc::PIC_)
219      ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
220      : dwarf::DW_EH_PE_absptr;
221  } else if (T.getArch() == Triple::x86_64) {
222    FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
223
224    if (RelocM == Reloc::PIC_) {
225      PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
226        ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
227         ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
228      LSDAEncoding = dwarf::DW_EH_PE_pcrel |
229        (CMModel == CodeModel::Small
230         ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
231      FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
232      TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
233        ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
234         ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
235    } else {
236      PersonalityEncoding =
237        (CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
238        ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
239      LSDAEncoding = (CMModel == CodeModel::Small)
240        ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
241      FDEEncoding = dwarf::DW_EH_PE_udata4;
242      TTypeEncoding = (CMModel == CodeModel::Small)
243        ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
244    }
245  }
246
247  // ELF
248  BSSSection =
249    Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
250                       ELF::SHF_WRITE |ELF::SHF_ALLOC,
251                       SectionKind::getBSS());
252
253  TextSection =
254    Ctx->getELFSection(".text", ELF::SHT_PROGBITS,
255                       ELF::SHF_EXECINSTR |
256                       ELF::SHF_ALLOC,
257                       SectionKind::getText());
258
259  DataSection =
260    Ctx->getELFSection(".data", ELF::SHT_PROGBITS,
261                       ELF::SHF_WRITE |ELF::SHF_ALLOC,
262                       SectionKind::getDataRel());
263
264  ReadOnlySection =
265    Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS,
266                       ELF::SHF_ALLOC,
267                       SectionKind::getReadOnly());
268
269  TLSDataSection =
270    Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
271                       ELF::SHF_ALLOC | ELF::SHF_TLS |
272                       ELF::SHF_WRITE,
273                       SectionKind::getThreadData());
274
275  TLSBSSSection =
276    Ctx->getELFSection(".tbss", ELF::SHT_NOBITS,
277                       ELF::SHF_ALLOC | ELF::SHF_TLS |
278                       ELF::SHF_WRITE,
279                       SectionKind::getThreadBSS());
280
281  DataRelSection =
282    Ctx->getELFSection(".data.rel", ELF::SHT_PROGBITS,
283                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
284                       SectionKind::getDataRel());
285
286  DataRelLocalSection =
287    Ctx->getELFSection(".data.rel.local", ELF::SHT_PROGBITS,
288                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
289                       SectionKind::getDataRelLocal());
290
291  DataRelROSection =
292    Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
293                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
294                       SectionKind::getReadOnlyWithRel());
295
296  DataRelROLocalSection =
297    Ctx->getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS,
298                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
299                       SectionKind::getReadOnlyWithRelLocal());
300
301  MergeableConst4Section =
302    Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
303                       ELF::SHF_ALLOC |ELF::SHF_MERGE,
304                       SectionKind::getMergeableConst4());
305
306  MergeableConst8Section =
307    Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
308                       ELF::SHF_ALLOC |ELF::SHF_MERGE,
309                       SectionKind::getMergeableConst8());
310
311  MergeableConst16Section =
312    Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
313                       ELF::SHF_ALLOC |ELF::SHF_MERGE,
314                       SectionKind::getMergeableConst16());
315
316  StaticCtorSection =
317    Ctx->getELFSection(".ctors", ELF::SHT_PROGBITS,
318                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
319                       SectionKind::getDataRel());
320
321  StaticDtorSection =
322    Ctx->getELFSection(".dtors", ELF::SHT_PROGBITS,
323                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
324                       SectionKind::getDataRel());
325
326  // Exception Handling Sections.
327
328  // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
329  // it contains relocatable pointers.  In PIC mode, this is probably a big
330  // runtime hit for C++ apps.  Either the contents of the LSDA need to be
331  // adjusted or this should be a data section.
332  LSDASection =
333    Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
334                       ELF::SHF_ALLOC,
335                       SectionKind::getReadOnly());
336
337  // Debug Info Sections.
338  DwarfAbbrevSection =
339    Ctx->getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0,
340                       SectionKind::getMetadata());
341  DwarfInfoSection =
342    Ctx->getELFSection(".debug_info", ELF::SHT_PROGBITS, 0,
343                       SectionKind::getMetadata());
344  DwarfLineSection =
345    Ctx->getELFSection(".debug_line", ELF::SHT_PROGBITS, 0,
346                       SectionKind::getMetadata());
347  DwarfFrameSection =
348    Ctx->getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0,
349                       SectionKind::getMetadata());
350  DwarfPubNamesSection =
351    Ctx->getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0,
352                       SectionKind::getMetadata());
353  DwarfPubTypesSection =
354    Ctx->getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0,
355                       SectionKind::getMetadata());
356  DwarfStrSection =
357    Ctx->getELFSection(".debug_str", ELF::SHT_PROGBITS, 0,
358                       SectionKind::getMetadata());
359  DwarfLocSection =
360    Ctx->getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0,
361                       SectionKind::getMetadata());
362  DwarfARangesSection =
363    Ctx->getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0,
364                       SectionKind::getMetadata());
365  DwarfRangesSection =
366    Ctx->getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0,
367                       SectionKind::getMetadata());
368  DwarfMacroInfoSection =
369    Ctx->getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0,
370                       SectionKind::getMetadata());
371}
372
373
374void MCObjectFileInfo::InitCOFFMCObjectFileInfo(Triple T) {
375  // COFF
376  TextSection =
377    Ctx->getCOFFSection(".text",
378                        COFF::IMAGE_SCN_CNT_CODE |
379                        COFF::IMAGE_SCN_MEM_EXECUTE |
380                        COFF::IMAGE_SCN_MEM_READ,
381                        SectionKind::getText());
382  DataSection =
383    Ctx->getCOFFSection(".data",
384                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
385                        COFF::IMAGE_SCN_MEM_READ |
386                        COFF::IMAGE_SCN_MEM_WRITE,
387                        SectionKind::getDataRel());
388  ReadOnlySection =
389    Ctx->getCOFFSection(".rdata",
390                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
391                        COFF::IMAGE_SCN_MEM_READ,
392                        SectionKind::getReadOnly());
393  StaticCtorSection =
394    Ctx->getCOFFSection(".ctors",
395                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
396                        COFF::IMAGE_SCN_MEM_READ |
397                        COFF::IMAGE_SCN_MEM_WRITE,
398                        SectionKind::getDataRel());
399  StaticDtorSection =
400    Ctx->getCOFFSection(".dtors",
401                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
402                        COFF::IMAGE_SCN_MEM_READ |
403                        COFF::IMAGE_SCN_MEM_WRITE,
404                        SectionKind::getDataRel());
405
406  // FIXME: We're emitting LSDA info into a readonly section on COFF, even
407  // though it contains relocatable pointers.  In PIC mode, this is probably a
408  // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
409  // adjusted or this should be a data section.
410  LSDASection =
411    Ctx->getCOFFSection(".gcc_except_table",
412                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
413                        COFF::IMAGE_SCN_MEM_READ,
414                        SectionKind::getReadOnly());
415
416  // Debug info.
417  DwarfAbbrevSection =
418    Ctx->getCOFFSection(".debug_abbrev",
419                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
420                        COFF::IMAGE_SCN_MEM_READ,
421                        SectionKind::getMetadata());
422  DwarfInfoSection =
423    Ctx->getCOFFSection(".debug_info",
424                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
425                        COFF::IMAGE_SCN_MEM_READ,
426                        SectionKind::getMetadata());
427  DwarfLineSection =
428    Ctx->getCOFFSection(".debug_line",
429                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
430                        COFF::IMAGE_SCN_MEM_READ,
431                        SectionKind::getMetadata());
432  DwarfFrameSection =
433    Ctx->getCOFFSection(".debug_frame",
434                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
435                        COFF::IMAGE_SCN_MEM_READ,
436                        SectionKind::getMetadata());
437  DwarfPubNamesSection =
438    Ctx->getCOFFSection(".debug_pubnames",
439                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
440                        COFF::IMAGE_SCN_MEM_READ,
441                        SectionKind::getMetadata());
442  DwarfPubTypesSection =
443    Ctx->getCOFFSection(".debug_pubtypes",
444                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
445                        COFF::IMAGE_SCN_MEM_READ,
446                        SectionKind::getMetadata());
447  DwarfStrSection =
448    Ctx->getCOFFSection(".debug_str",
449                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
450                        COFF::IMAGE_SCN_MEM_READ,
451                        SectionKind::getMetadata());
452  DwarfLocSection =
453    Ctx->getCOFFSection(".debug_loc",
454                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
455                        COFF::IMAGE_SCN_MEM_READ,
456                        SectionKind::getMetadata());
457  DwarfARangesSection =
458    Ctx->getCOFFSection(".debug_aranges",
459                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
460                        COFF::IMAGE_SCN_MEM_READ,
461                        SectionKind::getMetadata());
462  DwarfRangesSection =
463    Ctx->getCOFFSection(".debug_ranges",
464                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
465                        COFF::IMAGE_SCN_MEM_READ,
466                        SectionKind::getMetadata());
467  DwarfMacroInfoSection =
468    Ctx->getCOFFSection(".debug_macinfo",
469                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
470                        COFF::IMAGE_SCN_MEM_READ,
471                        SectionKind::getMetadata());
472
473  DrectveSection =
474    Ctx->getCOFFSection(".drectve",
475                        COFF::IMAGE_SCN_LNK_INFO,
476                        SectionKind::getMetadata());
477
478  PDataSection =
479    Ctx->getCOFFSection(".pdata",
480                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
481                        COFF::IMAGE_SCN_MEM_READ |
482                        COFF::IMAGE_SCN_MEM_WRITE,
483                        SectionKind::getDataRel());
484
485  XDataSection =
486    Ctx->getCOFFSection(".xdata",
487                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
488                        COFF::IMAGE_SCN_MEM_READ |
489                        COFF::IMAGE_SCN_MEM_WRITE,
490                        SectionKind::getDataRel());
491}
492
493void MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model relocm,
494                                            CodeModel::Model cm,
495                                            MCContext &ctx) {
496  RelocM = relocm;
497  CMModel = cm;
498  Ctx = &ctx;
499
500  // Common.
501  CommDirectiveSupportsAlignment = true;
502  SupportsWeakOmittedEHFrame = true;
503  IsFunctionEHFrameSymbolPrivate = true;
504
505  PersonalityEncoding = LSDAEncoding = FDEEncoding = FDECFIEncoding =
506    TTypeEncoding = dwarf::DW_EH_PE_absptr;
507
508  EHFrameSection = 0;           // Created on demand.
509  CompactUnwindSection = 0;     // Used only by selected targets.
510
511  Triple T(TT);
512  Triple::ArchType Arch = T.getArch();
513  // FIXME: Checking for Arch here to filter out bogus triples such as
514  // cellspu-apple-darwin. Perhaps we should fix in Triple?
515  if ((Arch == Triple::x86 || Arch == Triple::x86_64 ||
516       Arch == Triple::arm || Arch == Triple::thumb ||
517       Arch == Triple::ppc || Arch == Triple::ppc64 ||
518       Arch == Triple::UnknownArch) &&
519      (T.isOSDarwin() || T.getEnvironment() == Triple::MachO)) {
520    Env = IsMachO;
521    InitMachOMCObjectFileInfo(T);
522  } else if ((Arch == Triple::x86 || Arch == Triple::x86_64) &&
523             (T.getOS() == Triple::MinGW32 || T.getOS() == Triple::Cygwin ||
524              T.getOS() == Triple::Win32)) {
525    Env = IsCOFF;
526    InitCOFFMCObjectFileInfo(T);
527  } else {
528    Env = IsELF;
529    InitELFMCObjectFileInfo(T);
530  }
531}
532
533void MCObjectFileInfo::InitEHFrameSection() {
534  if (Env == IsMachO)
535    EHFrameSection =
536      Ctx->getMachOSection("__TEXT", "__eh_frame",
537                           MCSectionMachO::S_COALESCED |
538                           MCSectionMachO::S_ATTR_NO_TOC |
539                           MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
540                           MCSectionMachO::S_ATTR_LIVE_SUPPORT,
541                           SectionKind::getReadOnly());
542  else if (Env == IsELF)
543    EHFrameSection =
544      Ctx->getELFSection(".eh_frame", ELF::SHT_PROGBITS,
545                         ELF::SHF_ALLOC,
546                         SectionKind::getDataRel());
547  else
548    EHFrameSection =
549      Ctx->getCOFFSection(".eh_frame",
550                          COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
551                          COFF::IMAGE_SCN_MEM_READ |
552                          COFF::IMAGE_SCN_MEM_WRITE,
553                          SectionKind::getDataRel());
554}
555