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