LCOV - code coverage report
Current view: top level - lib/MC - MCObjectFileInfo.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 366 391 93.6 %
Date: 2017-09-14 15:23:50 Functions: 6 7 85.7 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.13