Home | History | Annotate | Download | only in MC
      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"
     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   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 
    207 void 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 
    374 void 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 
    493 void 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 
    533 void 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