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 #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.isWatchOS())
     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(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.isWatchOS())
     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   if (RelocM == Reloc::Static) {
    176     StaticCtorSection = Ctx->getMachOSection("__TEXT", "__constructor", 0,
    177                                              SectionKind::getData());
    178     StaticDtorSection = Ctx->getMachOSection("__TEXT", "__destructor", 0,
    179                                              SectionKind::getData());
    180   } else {
    181     StaticCtorSection = Ctx->getMachOSection("__DATA", "__mod_init_func",
    182                                              MachO::S_MOD_INIT_FUNC_POINTERS,
    183                                              SectionKind::getData());
    184     StaticDtorSection = Ctx->getMachOSection("__DATA", "__mod_term_func",
    185                                              MachO::S_MOD_TERM_FUNC_POINTERS,
    186                                              SectionKind::getData());
    187   }
    188 
    189   // Exception Handling.
    190   LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
    191                                      SectionKind::getReadOnlyWithRel());
    192 
    193   COFFDebugSymbolsSection = nullptr;
    194 
    195   if (useCompactUnwind(T)) {
    196     CompactUnwindSection =
    197         Ctx->getMachOSection("__LD", "__compact_unwind", MachO::S_ATTR_DEBUG,
    198                              SectionKind::getReadOnly());
    199 
    200     if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::x86)
    201       CompactUnwindDwarfEHFrameOnly = 0x04000000;  // UNWIND_X86_64_MODE_DWARF
    202     else if (T.getArch() == Triple::aarch64)
    203       CompactUnwindDwarfEHFrameOnly = 0x03000000;  // UNWIND_ARM64_MODE_DWARF
    204     else if (T.getArch() == Triple::arm || T.getArch() == Triple::thumb)
    205       CompactUnwindDwarfEHFrameOnly = 0x04000000;  // UNWIND_ARM_MODE_DWARF
    206   }
    207 
    208   // Debug Information.
    209   DwarfAccelNamesSection =
    210       Ctx->getMachOSection("__DWARF", "__apple_names", MachO::S_ATTR_DEBUG,
    211                            SectionKind::getMetadata(), "names_begin");
    212   DwarfAccelObjCSection =
    213       Ctx->getMachOSection("__DWARF", "__apple_objc", MachO::S_ATTR_DEBUG,
    214                            SectionKind::getMetadata(), "objc_begin");
    215   // 16 character section limit...
    216   DwarfAccelNamespaceSection =
    217       Ctx->getMachOSection("__DWARF", "__apple_namespac", MachO::S_ATTR_DEBUG,
    218                            SectionKind::getMetadata(), "namespac_begin");
    219   DwarfAccelTypesSection =
    220       Ctx->getMachOSection("__DWARF", "__apple_types", MachO::S_ATTR_DEBUG,
    221                            SectionKind::getMetadata(), "types_begin");
    222 
    223   DwarfAbbrevSection =
    224       Ctx->getMachOSection("__DWARF", "__debug_abbrev", MachO::S_ATTR_DEBUG,
    225                            SectionKind::getMetadata(), "section_abbrev");
    226   DwarfInfoSection =
    227       Ctx->getMachOSection("__DWARF", "__debug_info", MachO::S_ATTR_DEBUG,
    228                            SectionKind::getMetadata(), "section_info");
    229   DwarfLineSection =
    230       Ctx->getMachOSection("__DWARF", "__debug_line", MachO::S_ATTR_DEBUG,
    231                            SectionKind::getMetadata(), "section_line");
    232   DwarfFrameSection =
    233       Ctx->getMachOSection("__DWARF", "__debug_frame", MachO::S_ATTR_DEBUG,
    234                            SectionKind::getMetadata());
    235   DwarfPubNamesSection =
    236       Ctx->getMachOSection("__DWARF", "__debug_pubnames", MachO::S_ATTR_DEBUG,
    237                            SectionKind::getMetadata());
    238   DwarfPubTypesSection =
    239       Ctx->getMachOSection("__DWARF", "__debug_pubtypes", MachO::S_ATTR_DEBUG,
    240                            SectionKind::getMetadata());
    241   DwarfGnuPubNamesSection =
    242       Ctx->getMachOSection("__DWARF", "__debug_gnu_pubn", MachO::S_ATTR_DEBUG,
    243                            SectionKind::getMetadata());
    244   DwarfGnuPubTypesSection =
    245       Ctx->getMachOSection("__DWARF", "__debug_gnu_pubt", MachO::S_ATTR_DEBUG,
    246                            SectionKind::getMetadata());
    247   DwarfStrSection =
    248       Ctx->getMachOSection("__DWARF", "__debug_str", MachO::S_ATTR_DEBUG,
    249                            SectionKind::getMetadata(), "info_string");
    250   DwarfLocSection =
    251       Ctx->getMachOSection("__DWARF", "__debug_loc", MachO::S_ATTR_DEBUG,
    252                            SectionKind::getMetadata(), "section_debug_loc");
    253   DwarfARangesSection =
    254       Ctx->getMachOSection("__DWARF", "__debug_aranges", MachO::S_ATTR_DEBUG,
    255                            SectionKind::getMetadata());
    256   DwarfRangesSection =
    257       Ctx->getMachOSection("__DWARF", "__debug_ranges", MachO::S_ATTR_DEBUG,
    258                            SectionKind::getMetadata(), "debug_range");
    259   DwarfDebugInlineSection =
    260       Ctx->getMachOSection("__DWARF", "__debug_inlined", MachO::S_ATTR_DEBUG,
    261                            SectionKind::getMetadata());
    262   DwarfCUIndexSection =
    263       Ctx->getMachOSection("__DWARF", "__debug_cu_index", MachO::S_ATTR_DEBUG,
    264                            SectionKind::getMetadata());
    265   DwarfTUIndexSection =
    266       Ctx->getMachOSection("__DWARF", "__debug_tu_index", MachO::S_ATTR_DEBUG,
    267                            SectionKind::getMetadata());
    268   StackMapSection = Ctx->getMachOSection("__LLVM_STACKMAPS", "__llvm_stackmaps",
    269                                          0, SectionKind::getMetadata());
    270 
    271   FaultMapSection = Ctx->getMachOSection("__LLVM_FAULTMAPS", "__llvm_faultmaps",
    272                                          0, SectionKind::getMetadata());
    273 
    274   TLSExtraDataSection = TLSTLVSection;
    275 }
    276 
    277 void MCObjectFileInfo::initELFMCObjectFileInfo(Triple T) {
    278   switch (T.getArch()) {
    279   case Triple::mips:
    280   case Triple::mipsel:
    281     FDECFIEncoding = dwarf::DW_EH_PE_sdata4;
    282     break;
    283   case Triple::mips64:
    284   case Triple::mips64el:
    285     FDECFIEncoding = dwarf::DW_EH_PE_sdata8;
    286     break;
    287   case Triple::x86_64:
    288     FDECFIEncoding = dwarf::DW_EH_PE_pcrel |
    289                      ((CMModel == CodeModel::Large) ? dwarf::DW_EH_PE_sdata8
    290                                                     : dwarf::DW_EH_PE_sdata4);
    291     break;
    292   default:
    293     FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
    294     break;
    295   }
    296 
    297   switch (T.getArch()) {
    298   case Triple::arm:
    299   case Triple::armeb:
    300   case Triple::thumb:
    301   case Triple::thumbeb:
    302     if (Ctx->getAsmInfo()->getExceptionHandlingType() == ExceptionHandling::ARM)
    303       break;
    304     // Fallthrough if not using EHABI
    305   case Triple::ppc:
    306   case Triple::x86:
    307     PersonalityEncoding = (RelocM == Reloc::PIC_)
    308      ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
    309      : dwarf::DW_EH_PE_absptr;
    310     LSDAEncoding = (RelocM == Reloc::PIC_)
    311       ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
    312       : dwarf::DW_EH_PE_absptr;
    313     TTypeEncoding = (RelocM == Reloc::PIC_)
    314      ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
    315      : dwarf::DW_EH_PE_absptr;
    316     break;
    317   case Triple::x86_64:
    318     if (RelocM == Reloc::PIC_) {
    319       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
    320         ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
    321          ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
    322       LSDAEncoding = dwarf::DW_EH_PE_pcrel |
    323         (CMModel == CodeModel::Small
    324          ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
    325       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
    326         ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
    327          ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
    328     } else {
    329       PersonalityEncoding =
    330         (CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
    331         ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
    332       LSDAEncoding = (CMModel == CodeModel::Small)
    333         ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
    334       TTypeEncoding = (CMModel == CodeModel::Small)
    335         ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
    336     }
    337     break;
    338   case Triple::aarch64:
    339   case Triple::aarch64_be:
    340     // The small model guarantees static code/data size < 4GB, but not where it
    341     // will be in memory. Most of these could end up >2GB away so even a signed
    342     // pc-relative 32-bit address is insufficient, theoretically.
    343     if (RelocM == Reloc::PIC_) {
    344       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
    345         dwarf::DW_EH_PE_sdata8;
    346       LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8;
    347       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
    348         dwarf::DW_EH_PE_sdata8;
    349     } else {
    350       PersonalityEncoding = dwarf::DW_EH_PE_absptr;
    351       LSDAEncoding = dwarf::DW_EH_PE_absptr;
    352       TTypeEncoding = dwarf::DW_EH_PE_absptr;
    353     }
    354     break;
    355   case Triple::mips:
    356   case Triple::mipsel:
    357   case Triple::mips64:
    358   case Triple::mips64el:
    359     // MIPS uses indirect pointer to refer personality functions and types, so
    360     // that the eh_frame section can be read-only. DW.ref.personality will be
    361     // generated for relocation.
    362     PersonalityEncoding = dwarf::DW_EH_PE_indirect;
    363     // FIXME: The N64 ABI probably ought to use DW_EH_PE_sdata8 but we can't
    364     //        identify N64 from just a triple.
    365     TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
    366                     dwarf::DW_EH_PE_sdata4;
    367     // We don't support PC-relative LSDA references in GAS so we use the default
    368     // DW_EH_PE_absptr for those.
    369     break;
    370   case Triple::ppc64:
    371   case Triple::ppc64le:
    372     PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
    373       dwarf::DW_EH_PE_udata8;
    374     LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8;
    375     TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
    376       dwarf::DW_EH_PE_udata8;
    377     break;
    378   case Triple::sparcel:
    379   case Triple::sparc:
    380     if (RelocM == Reloc::PIC_) {
    381       LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
    382       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
    383         dwarf::DW_EH_PE_sdata4;
    384       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
    385         dwarf::DW_EH_PE_sdata4;
    386     } else {
    387       LSDAEncoding = dwarf::DW_EH_PE_absptr;
    388       PersonalityEncoding = dwarf::DW_EH_PE_absptr;
    389       TTypeEncoding = dwarf::DW_EH_PE_absptr;
    390     }
    391     break;
    392   case Triple::sparcv9:
    393     LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
    394     if (RelocM == Reloc::PIC_) {
    395       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
    396         dwarf::DW_EH_PE_sdata4;
    397       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
    398         dwarf::DW_EH_PE_sdata4;
    399     } else {
    400       PersonalityEncoding = dwarf::DW_EH_PE_absptr;
    401       TTypeEncoding = dwarf::DW_EH_PE_absptr;
    402     }
    403     break;
    404   case Triple::systemz:
    405     // All currently-defined code models guarantee that 4-byte PC-relative
    406     // values will be in range.
    407     if (RelocM == Reloc::PIC_) {
    408       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
    409         dwarf::DW_EH_PE_sdata4;
    410       LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
    411       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
    412         dwarf::DW_EH_PE_sdata4;
    413     } else {
    414       PersonalityEncoding = dwarf::DW_EH_PE_absptr;
    415       LSDAEncoding = dwarf::DW_EH_PE_absptr;
    416       TTypeEncoding = dwarf::DW_EH_PE_absptr;
    417     }
    418     break;
    419   default:
    420     break;
    421   }
    422 
    423   unsigned EHSectionType = T.getArch() == Triple::x86_64
    424                                ? ELF::SHT_X86_64_UNWIND
    425                                : ELF::SHT_PROGBITS;
    426 
    427   // Solaris requires different flags for .eh_frame to seemingly every other
    428   // platform.
    429   unsigned EHSectionFlags = ELF::SHF_ALLOC;
    430   if (T.isOSSolaris() && T.getArch() != Triple::x86_64)
    431     EHSectionFlags |= ELF::SHF_WRITE;
    432 
    433   // ELF
    434   BSSSection = Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
    435                                   ELF::SHF_WRITE | ELF::SHF_ALLOC);
    436 
    437   TextSection = Ctx->getELFSection(".text", ELF::SHT_PROGBITS,
    438                                    ELF::SHF_EXECINSTR | ELF::SHF_ALLOC);
    439 
    440   DataSection = Ctx->getELFSection(".data", ELF::SHT_PROGBITS,
    441                                    ELF::SHF_WRITE | ELF::SHF_ALLOC);
    442 
    443   ReadOnlySection =
    444       Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
    445 
    446   TLSDataSection =
    447       Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
    448                          ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
    449 
    450   TLSBSSSection = Ctx->getELFSection(
    451       ".tbss", ELF::SHT_NOBITS, ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
    452 
    453   DataRelROSection = Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
    454                                         ELF::SHF_ALLOC | ELF::SHF_WRITE);
    455 
    456   MergeableConst4Section =
    457       Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
    458                          ELF::SHF_ALLOC | ELF::SHF_MERGE, 4, "");
    459 
    460   MergeableConst8Section =
    461       Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
    462                          ELF::SHF_ALLOC | ELF::SHF_MERGE, 8, "");
    463 
    464   MergeableConst16Section =
    465       Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
    466                          ELF::SHF_ALLOC | ELF::SHF_MERGE, 16, "");
    467 
    468   StaticCtorSection = Ctx->getELFSection(".ctors", ELF::SHT_PROGBITS,
    469                                          ELF::SHF_ALLOC | ELF::SHF_WRITE);
    470 
    471   StaticDtorSection = Ctx->getELFSection(".dtors", ELF::SHT_PROGBITS,
    472                                          ELF::SHF_ALLOC | ELF::SHF_WRITE);
    473 
    474   // Exception Handling Sections.
    475 
    476   // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
    477   // it contains relocatable pointers.  In PIC mode, this is probably a big
    478   // runtime hit for C++ apps.  Either the contents of the LSDA need to be
    479   // adjusted or this should be a data section.
    480   LSDASection = Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
    481                                    ELF::SHF_ALLOC);
    482 
    483   COFFDebugSymbolsSection = nullptr;
    484 
    485   // Debug Info Sections.
    486   DwarfAbbrevSection = Ctx->getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0,
    487                                           "section_abbrev");
    488   DwarfInfoSection =
    489       Ctx->getELFSection(".debug_info", ELF::SHT_PROGBITS, 0, "section_info");
    490   DwarfLineSection = Ctx->getELFSection(".debug_line", ELF::SHT_PROGBITS, 0);
    491   DwarfFrameSection = Ctx->getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0);
    492   DwarfPubNamesSection =
    493       Ctx->getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0);
    494   DwarfPubTypesSection =
    495       Ctx->getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0);
    496   DwarfGnuPubNamesSection =
    497       Ctx->getELFSection(".debug_gnu_pubnames", ELF::SHT_PROGBITS, 0);
    498   DwarfGnuPubTypesSection =
    499       Ctx->getELFSection(".debug_gnu_pubtypes", ELF::SHT_PROGBITS, 0);
    500   DwarfStrSection =
    501       Ctx->getELFSection(".debug_str", ELF::SHT_PROGBITS,
    502                          ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, "");
    503   DwarfLocSection = Ctx->getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0);
    504   DwarfARangesSection =
    505       Ctx->getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0);
    506   DwarfRangesSection =
    507       Ctx->getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0, "debug_range");
    508 
    509   // DWARF5 Experimental Debug Info
    510 
    511   // Accelerator Tables
    512   DwarfAccelNamesSection =
    513       Ctx->getELFSection(".apple_names", ELF::SHT_PROGBITS, 0, "names_begin");
    514   DwarfAccelObjCSection =
    515       Ctx->getELFSection(".apple_objc", ELF::SHT_PROGBITS, 0, "objc_begin");
    516   DwarfAccelNamespaceSection = Ctx->getELFSection(
    517       ".apple_namespaces", ELF::SHT_PROGBITS, 0, "namespac_begin");
    518   DwarfAccelTypesSection =
    519       Ctx->getELFSection(".apple_types", ELF::SHT_PROGBITS, 0, "types_begin");
    520 
    521   // Fission Sections
    522   DwarfInfoDWOSection =
    523       Ctx->getELFSection(".debug_info.dwo", ELF::SHT_PROGBITS, 0);
    524   DwarfTypesDWOSection =
    525       Ctx->getELFSection(".debug_types.dwo", ELF::SHT_PROGBITS, 0);
    526   DwarfAbbrevDWOSection =
    527       Ctx->getELFSection(".debug_abbrev.dwo", ELF::SHT_PROGBITS, 0);
    528   DwarfStrDWOSection =
    529       Ctx->getELFSection(".debug_str.dwo", ELF::SHT_PROGBITS,
    530                          ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, "");
    531   DwarfLineDWOSection =
    532       Ctx->getELFSection(".debug_line.dwo", ELF::SHT_PROGBITS, 0);
    533   DwarfLocDWOSection =
    534       Ctx->getELFSection(".debug_loc.dwo", ELF::SHT_PROGBITS, 0, "skel_loc");
    535   DwarfStrOffDWOSection =
    536       Ctx->getELFSection(".debug_str_offsets.dwo", ELF::SHT_PROGBITS, 0);
    537   DwarfAddrSection =
    538       Ctx->getELFSection(".debug_addr", ELF::SHT_PROGBITS, 0, "addr_sec");
    539 
    540   // DWP Sections
    541   DwarfCUIndexSection =
    542       Ctx->getELFSection(".debug_cu_index", ELF::SHT_PROGBITS, 0);
    543   DwarfTUIndexSection =
    544       Ctx->getELFSection(".debug_tu_index", ELF::SHT_PROGBITS, 0);
    545 
    546   StackMapSection =
    547       Ctx->getELFSection(".llvm_stackmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
    548 
    549   FaultMapSection =
    550       Ctx->getELFSection(".llvm_faultmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
    551 
    552   EHFrameSection =
    553       Ctx->getELFSection(".eh_frame", EHSectionType, EHSectionFlags);
    554 }
    555 
    556 void MCObjectFileInfo::initCOFFMCObjectFileInfo(Triple T) {
    557   EHFrameSection = Ctx->getCOFFSection(
    558       ".eh_frame", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    559                        COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
    560       SectionKind::getData());
    561 
    562   bool IsWoA = T.getArch() == Triple::arm || T.getArch() == Triple::thumb;
    563 
    564   CommDirectiveSupportsAlignment = true;
    565 
    566   // COFF
    567   BSSSection = Ctx->getCOFFSection(
    568       ".bss", COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
    569                   COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
    570       SectionKind::getBSS());
    571   TextSection = Ctx->getCOFFSection(
    572       ".text",
    573       (IsWoA ? COFF::IMAGE_SCN_MEM_16BIT : (COFF::SectionCharacteristics)0) |
    574           COFF::IMAGE_SCN_CNT_CODE | COFF::IMAGE_SCN_MEM_EXECUTE |
    575           COFF::IMAGE_SCN_MEM_READ,
    576       SectionKind::getText());
    577   DataSection = Ctx->getCOFFSection(
    578       ".data", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
    579                    COFF::IMAGE_SCN_MEM_WRITE,
    580       SectionKind::getData());
    581   ReadOnlySection = Ctx->getCOFFSection(
    582       ".rdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
    583       SectionKind::getReadOnly());
    584 
    585   if (T.isKnownWindowsMSVCEnvironment() || T.isWindowsItaniumEnvironment()) {
    586     StaticCtorSection =
    587         Ctx->getCOFFSection(".CRT$XCU", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    588                                             COFF::IMAGE_SCN_MEM_READ,
    589                             SectionKind::getReadOnly());
    590     StaticDtorSection =
    591         Ctx->getCOFFSection(".CRT$XTX", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    592                                             COFF::IMAGE_SCN_MEM_READ,
    593                             SectionKind::getReadOnly());
    594   } else {
    595     StaticCtorSection = Ctx->getCOFFSection(
    596         ".ctors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    597                       COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
    598         SectionKind::getData());
    599     StaticDtorSection = Ctx->getCOFFSection(
    600         ".dtors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    601                       COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
    602         SectionKind::getData());
    603   }
    604 
    605   // FIXME: We're emitting LSDA info into a readonly section on COFF, even
    606   // though it contains relocatable pointers.  In PIC mode, this is probably a
    607   // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
    608   // adjusted or this should be a data section.
    609   if (T.getArch() == Triple::x86_64) {
    610     // On Windows 64 with SEH, the LSDA is emitted into the .xdata section
    611     LSDASection = nullptr;
    612   } else {
    613     LSDASection = Ctx->getCOFFSection(".gcc_except_table",
    614                                       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    615                                           COFF::IMAGE_SCN_MEM_READ,
    616                                       SectionKind::getReadOnly());
    617   }
    618 
    619   // Debug info.
    620   COFFDebugSymbolsSection =
    621       Ctx->getCOFFSection(".debug$S", COFF::IMAGE_SCN_MEM_DISCARDABLE |
    622                                           COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    623                                           COFF::IMAGE_SCN_MEM_READ,
    624                           SectionKind::getMetadata());
    625 
    626   DwarfAbbrevSection = Ctx->getCOFFSection(
    627       ".debug_abbrev",
    628       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    629           COFF::IMAGE_SCN_MEM_READ,
    630       SectionKind::getMetadata(), "section_abbrev");
    631   DwarfInfoSection = Ctx->getCOFFSection(
    632       ".debug_info",
    633       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    634           COFF::IMAGE_SCN_MEM_READ,
    635       SectionKind::getMetadata(), "section_info");
    636   DwarfLineSection = Ctx->getCOFFSection(
    637       ".debug_line",
    638       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    639           COFF::IMAGE_SCN_MEM_READ,
    640       SectionKind::getMetadata(), "section_line");
    641 
    642   DwarfFrameSection = Ctx->getCOFFSection(
    643       ".debug_frame",
    644       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    645           COFF::IMAGE_SCN_MEM_READ,
    646       SectionKind::getMetadata());
    647   DwarfPubNamesSection = Ctx->getCOFFSection(
    648       ".debug_pubnames",
    649       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    650           COFF::IMAGE_SCN_MEM_READ,
    651       SectionKind::getMetadata());
    652   DwarfPubTypesSection = Ctx->getCOFFSection(
    653       ".debug_pubtypes",
    654       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    655           COFF::IMAGE_SCN_MEM_READ,
    656       SectionKind::getMetadata());
    657   DwarfGnuPubNamesSection = Ctx->getCOFFSection(
    658       ".debug_gnu_pubnames",
    659       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    660           COFF::IMAGE_SCN_MEM_READ,
    661       SectionKind::getMetadata());
    662   DwarfGnuPubTypesSection = Ctx->getCOFFSection(
    663       ".debug_gnu_pubtypes",
    664       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    665           COFF::IMAGE_SCN_MEM_READ,
    666       SectionKind::getMetadata());
    667   DwarfStrSection = Ctx->getCOFFSection(
    668       ".debug_str",
    669       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    670           COFF::IMAGE_SCN_MEM_READ,
    671       SectionKind::getMetadata(), "info_string");
    672   DwarfLocSection = Ctx->getCOFFSection(
    673       ".debug_loc",
    674       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    675           COFF::IMAGE_SCN_MEM_READ,
    676       SectionKind::getMetadata(), "section_debug_loc");
    677   DwarfARangesSection = Ctx->getCOFFSection(
    678       ".debug_aranges",
    679       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    680           COFF::IMAGE_SCN_MEM_READ,
    681       SectionKind::getMetadata());
    682   DwarfRangesSection = Ctx->getCOFFSection(
    683       ".debug_ranges",
    684       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    685           COFF::IMAGE_SCN_MEM_READ,
    686       SectionKind::getMetadata(), "debug_range");
    687   DwarfInfoDWOSection = Ctx->getCOFFSection(
    688       ".debug_info.dwo",
    689       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    690           COFF::IMAGE_SCN_MEM_READ,
    691       SectionKind::getMetadata(), "section_info_dwo");
    692   DwarfTypesDWOSection = Ctx->getCOFFSection(
    693       ".debug_types.dwo",
    694       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    695           COFF::IMAGE_SCN_MEM_READ,
    696       SectionKind::getMetadata(), "section_types_dwo");
    697   DwarfAbbrevDWOSection = Ctx->getCOFFSection(
    698       ".debug_abbrev.dwo",
    699       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    700           COFF::IMAGE_SCN_MEM_READ,
    701       SectionKind::getMetadata(), "section_abbrev_dwo");
    702   DwarfStrDWOSection = Ctx->getCOFFSection(
    703       ".debug_str.dwo",
    704       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    705           COFF::IMAGE_SCN_MEM_READ,
    706       SectionKind::getMetadata(), "skel_string");
    707   DwarfLineDWOSection = Ctx->getCOFFSection(
    708       ".debug_line.dwo",
    709       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    710           COFF::IMAGE_SCN_MEM_READ,
    711       SectionKind::getMetadata());
    712   DwarfLocDWOSection = Ctx->getCOFFSection(
    713       ".debug_loc.dwo",
    714       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    715           COFF::IMAGE_SCN_MEM_READ,
    716       SectionKind::getMetadata(), "skel_loc");
    717   DwarfStrOffDWOSection = Ctx->getCOFFSection(
    718       ".debug_str_offsets.dwo",
    719       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    720           COFF::IMAGE_SCN_MEM_READ,
    721       SectionKind::getMetadata());
    722   DwarfAddrSection = Ctx->getCOFFSection(
    723       ".debug_addr",
    724       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    725           COFF::IMAGE_SCN_MEM_READ,
    726       SectionKind::getMetadata(), "addr_sec");
    727   DwarfCUIndexSection = Ctx->getCOFFSection(
    728       ".debug_cu_index",
    729       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    730           COFF::IMAGE_SCN_MEM_READ,
    731       SectionKind::getMetadata());
    732   DwarfTUIndexSection = Ctx->getCOFFSection(
    733       ".debug_tu_index",
    734       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    735           COFF::IMAGE_SCN_MEM_READ,
    736       SectionKind::getMetadata());
    737   DwarfAccelNamesSection = Ctx->getCOFFSection(
    738       ".apple_names",
    739       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    740           COFF::IMAGE_SCN_MEM_READ,
    741       SectionKind::getMetadata(), "names_begin");
    742   DwarfAccelNamespaceSection = Ctx->getCOFFSection(
    743       ".apple_namespaces",
    744       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    745           COFF::IMAGE_SCN_MEM_READ,
    746       SectionKind::getMetadata(), "namespac_begin");
    747   DwarfAccelTypesSection = Ctx->getCOFFSection(
    748       ".apple_types",
    749       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    750           COFF::IMAGE_SCN_MEM_READ,
    751       SectionKind::getMetadata(), "types_begin");
    752   DwarfAccelObjCSection = Ctx->getCOFFSection(
    753       ".apple_objc",
    754       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    755           COFF::IMAGE_SCN_MEM_READ,
    756       SectionKind::getMetadata(), "objc_begin");
    757 
    758   DrectveSection = Ctx->getCOFFSection(
    759       ".drectve", COFF::IMAGE_SCN_LNK_INFO | COFF::IMAGE_SCN_LNK_REMOVE,
    760       SectionKind::getMetadata());
    761 
    762   PDataSection = Ctx->getCOFFSection(
    763       ".pdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
    764       SectionKind::getData());
    765 
    766   XDataSection = Ctx->getCOFFSection(
    767       ".xdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
    768       SectionKind::getData());
    769 
    770   SXDataSection = Ctx->getCOFFSection(".sxdata", COFF::IMAGE_SCN_LNK_INFO,
    771                                       SectionKind::getMetadata());
    772 
    773   TLSDataSection = Ctx->getCOFFSection(
    774       ".tls$", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
    775                    COFF::IMAGE_SCN_MEM_WRITE,
    776       SectionKind::getData());
    777 
    778   StackMapSection = Ctx->getCOFFSection(".llvm_stackmaps",
    779                                         COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
    780                                             COFF::IMAGE_SCN_MEM_READ,
    781                                         SectionKind::getReadOnly());
    782 }
    783 
    784 void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple,
    785                                             Reloc::Model relocm,
    786                                             CodeModel::Model cm,
    787                                             MCContext &ctx) {
    788   RelocM = relocm;
    789   CMModel = cm;
    790   Ctx = &ctx;
    791 
    792   // Common.
    793   CommDirectiveSupportsAlignment = true;
    794   SupportsWeakOmittedEHFrame = true;
    795   SupportsCompactUnwindWithoutEHFrame = false;
    796   OmitDwarfIfHaveCompactUnwind = false;
    797 
    798   PersonalityEncoding = LSDAEncoding = FDECFIEncoding = TTypeEncoding =
    799       dwarf::DW_EH_PE_absptr;
    800 
    801   CompactUnwindDwarfEHFrameOnly = 0;
    802 
    803   EHFrameSection = nullptr;             // Created on demand.
    804   CompactUnwindSection = nullptr;       // Used only by selected targets.
    805   DwarfAccelNamesSection = nullptr;     // Used only by selected targets.
    806   DwarfAccelObjCSection = nullptr;      // Used only by selected targets.
    807   DwarfAccelNamespaceSection = nullptr; // Used only by selected targets.
    808   DwarfAccelTypesSection = nullptr;     // Used only by selected targets.
    809 
    810   TT = TheTriple;
    811 
    812   switch (TT.getObjectFormat()) {
    813   case Triple::MachO:
    814     Env = IsMachO;
    815     initMachOMCObjectFileInfo(TT);
    816     break;
    817   case Triple::COFF:
    818     if (!TT.isOSWindows())
    819       report_fatal_error(
    820           "Cannot initialize MC for non-Windows COFF object files.");
    821 
    822     Env = IsCOFF;
    823     initCOFFMCObjectFileInfo(TT);
    824     break;
    825   case Triple::ELF:
    826     Env = IsELF;
    827     initELFMCObjectFileInfo(TT);
    828     break;
    829   case Triple::UnknownObjectFormat:
    830     report_fatal_error("Cannot initialize MC for unknown object file format.");
    831     break;
    832   }
    833 }
    834 
    835 void MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model RM,
    836                                             CodeModel::Model CM,
    837                                             MCContext &ctx) {
    838   InitMCObjectFileInfo(Triple(TT), RM, CM, ctx);
    839 }
    840 
    841 MCSection *MCObjectFileInfo::getDwarfTypesSection(uint64_t Hash) const {
    842   return Ctx->getELFSection(".debug_types", ELF::SHT_PROGBITS, ELF::SHF_GROUP,
    843                             0, utostr(Hash));
    844 }
    845