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