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