119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===-- MObjectFileInfo.cpp - Object File Information ---------------------===//
219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                     The LLVM Compiler Infrastructure
419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source
619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details.
719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCObjectFileInfo.h"
1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCContext.h"
1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSection.h"
1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSectionCOFF.h"
1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSectionELF.h"
1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSectionMachO.h"
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/Triple.h"
1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace llvm;
1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCObjectFileInfo::InitMachOMCObjectFileInfo(Triple T) {
2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // MachO
2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  IsFunctionEHFrameSymbolPrivate = false;
2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SupportsWeakOmittedEHFrame = false;
2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel
2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    | dwarf::DW_EH_PE_sdata4;
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  LSDAEncoding = FDEEncoding = FDECFIEncoding = dwarf::DW_EH_PE_pcrel;
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    dwarf::DW_EH_PE_sdata4;
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // .comm doesn't support alignment before Leopard.
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5))
3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CommDirectiveSupportsAlignment = false;
3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  TextSection // .text
3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__TEXT", "__text",
3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getText());
3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DataSection // .data
3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__DATA", "__data", 0,
4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getDataRel());
4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  TLSDataSection // .tdata
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__DATA", "__thread_data",
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_THREAD_LOCAL_REGULAR,
4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getDataRel());
4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  TLSBSSSection // .tbss
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__DATA", "__thread_bss",
4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_THREAD_LOCAL_ZEROFILL,
4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getThreadBSS());
5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // TODO: Verify datarel below.
5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  TLSTLVSection // .tlv
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__DATA", "__thread_vars",
5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_THREAD_LOCAL_VARIABLES,
5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getDataRel());
5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  TLSThreadInitSection
5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__DATA", "__thread_init",
5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getDataRel());
6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CStringSection // .cstring
6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__TEXT", "__cstring",
6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_CSTRING_LITERALS,
6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getMergeable1ByteCString());
6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  UStringSection
6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__TEXT","__ustring", 0,
6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getMergeable2ByteCString());
6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  FourByteConstantSection // .literal4
7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__TEXT", "__literal4",
7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_4BYTE_LITERALS,
7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getMergeableConst4());
7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EightByteConstantSection // .literal8
7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__TEXT", "__literal8",
7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_8BYTE_LITERALS,
7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getMergeableConst8());
7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // to using it in -static mode.
8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SixteenByteConstantSection = 0;
8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (RelocM != Reloc::Static &&
8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      T.getArch() != Triple::x86_64 && T.getArch() != Triple::ppc64)
8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    SixteenByteConstantSection =   // .literal16
8419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Ctx->getMachOSection("__TEXT", "__literal16",
8519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_16BYTE_LITERALS,
8619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getMergeableConst16());
8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ReadOnlySection  // .const
8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__TEXT", "__const", 0,
9019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getReadOnly());
9119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  TextCoalSection
9319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__TEXT", "__textcoal_nt",
9419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_COALESCED |
9519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getText());
9719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ConstTextCoalSection
9819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__TEXT", "__const_coal",
9919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_COALESCED,
10019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getReadOnly());
10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ConstDataSection  // .const_data
10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__DATA", "__const", 0,
10319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getReadOnlyWithRel());
10419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DataCoalSection
10519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__DATA","__datacoal_nt",
10619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_COALESCED,
10719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getDataRel());
10819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DataCommonSection
10919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__DATA","__common",
11019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_ZEROFILL,
11119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getBSS());
11219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DataBSSSection
11319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
11419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getBSS());
11519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
11619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
11719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  LazySymbolPointerSection
11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__DATA", "__la_symbol_ptr",
11919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
12019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getMetadata());
12119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  NonLazySymbolPointerSection
12219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    = Ctx->getMachOSection("__DATA", "__nl_symbol_ptr",
12319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
12419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getMetadata());
12519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
12619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (RelocM == Reloc::Static) {
12719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    StaticCtorSection
12819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      = Ctx->getMachOSection("__TEXT", "__constructor", 0,
12919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                             SectionKind::getDataRel());
13019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    StaticDtorSection
13119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      = Ctx->getMachOSection("__TEXT", "__destructor", 0,
13219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                             SectionKind::getDataRel());
13319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else {
13419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    StaticCtorSection
13519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      = Ctx->getMachOSection("__DATA", "__mod_init_func",
13619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                             MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
13719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                             SectionKind::getDataRel());
13819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    StaticDtorSection
13919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      = Ctx->getMachOSection("__DATA", "__mod_term_func",
14019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                             MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
14119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                             SectionKind::getDataRel());
14219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
14319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
14419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Exception Handling.
14519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
14619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                     SectionKind::getReadOnlyWithRel());
14719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
14819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6))
14919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CompactUnwindSection =
15019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Ctx->getMachOSection("__LD", "__compact_unwind",
15119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_ATTR_DEBUG,
15219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getReadOnly());
15319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
15419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Debug Information.
15519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfAbbrevSection =
15619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getMachOSection("__DWARF", "__debug_abbrev",
15719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         MCSectionMachO::S_ATTR_DEBUG,
15819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         SectionKind::getMetadata());
15919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfInfoSection =
16019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getMachOSection("__DWARF", "__debug_info",
16119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         MCSectionMachO::S_ATTR_DEBUG,
16219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         SectionKind::getMetadata());
16319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfLineSection =
16419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getMachOSection("__DWARF", "__debug_line",
16519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         MCSectionMachO::S_ATTR_DEBUG,
16619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         SectionKind::getMetadata());
16719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfFrameSection =
16819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getMachOSection("__DWARF", "__debug_frame",
16919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         MCSectionMachO::S_ATTR_DEBUG,
17019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         SectionKind::getMetadata());
17119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfPubNamesSection =
17219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getMachOSection("__DWARF", "__debug_pubnames",
17319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         MCSectionMachO::S_ATTR_DEBUG,
17419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         SectionKind::getMetadata());
17519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfPubTypesSection =
17619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getMachOSection("__DWARF", "__debug_pubtypes",
17719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         MCSectionMachO::S_ATTR_DEBUG,
17819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         SectionKind::getMetadata());
17919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfStrSection =
18019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getMachOSection("__DWARF", "__debug_str",
18119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         MCSectionMachO::S_ATTR_DEBUG,
18219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         SectionKind::getMetadata());
18319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfLocSection =
18419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getMachOSection("__DWARF", "__debug_loc",
18519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         MCSectionMachO::S_ATTR_DEBUG,
18619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         SectionKind::getMetadata());
18719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfARangesSection =
18819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getMachOSection("__DWARF", "__debug_aranges",
18919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         MCSectionMachO::S_ATTR_DEBUG,
19019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         SectionKind::getMetadata());
19119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfRangesSection =
19219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getMachOSection("__DWARF", "__debug_ranges",
19319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         MCSectionMachO::S_ATTR_DEBUG,
19419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         SectionKind::getMetadata());
19519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfMacroInfoSection =
19619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getMachOSection("__DWARF", "__debug_macinfo",
19719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         MCSectionMachO::S_ATTR_DEBUG,
19819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         SectionKind::getMetadata());
19919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfDebugInlineSection =
20019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getMachOSection("__DWARF", "__debug_inlined",
20119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         MCSectionMachO::S_ATTR_DEBUG,
20219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         SectionKind::getMetadata());
20319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
20419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  TLSExtraDataSection = TLSTLVSection;
20519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
20619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
20719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCObjectFileInfo::InitELFMCObjectFileInfo(Triple T) {
20819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (T.getArch() == Triple::x86) {
20919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    PersonalityEncoding = (RelocM == Reloc::PIC_)
21019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
21119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      : dwarf::DW_EH_PE_absptr;
21219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    LSDAEncoding = (RelocM == Reloc::PIC_)
21319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
21419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      : dwarf::DW_EH_PE_absptr;
21519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    FDEEncoding = FDECFIEncoding = (RelocM == Reloc::PIC_)
21619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
21719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      : dwarf::DW_EH_PE_absptr;
21819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    TTypeEncoding = (RelocM == Reloc::PIC_)
21919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
22019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      : dwarf::DW_EH_PE_absptr;
22119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else if (T.getArch() == Triple::x86_64) {
22219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
22319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
22419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (RelocM == Reloc::PIC_) {
22519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
22619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
22719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman         ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
22819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      LSDAEncoding = dwarf::DW_EH_PE_pcrel |
22919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        (CMModel == CodeModel::Small
23019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman         ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
23119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
23219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
23319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
23419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman         ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
23519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    } else {
23619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      PersonalityEncoding =
23719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        (CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
23819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
23919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      LSDAEncoding = (CMModel == CodeModel::Small)
24019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
24119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      FDEEncoding = dwarf::DW_EH_PE_udata4;
24219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      TTypeEncoding = (CMModel == CodeModel::Small)
24319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
24419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
24519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
24619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
24719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // ELF
24819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BSSSection =
24919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
25019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_WRITE |ELF::SHF_ALLOC,
25119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getBSS());
25219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
25319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  TextSection =
25419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".text", ELF::SHT_PROGBITS,
25519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_EXECINSTR |
25619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_ALLOC,
25719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getText());
25819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
25919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DataSection =
26019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".data", ELF::SHT_PROGBITS,
26119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_WRITE |ELF::SHF_ALLOC,
26219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getDataRel());
26319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
26419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ReadOnlySection =
26519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS,
26619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_ALLOC,
26719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getReadOnly());
26819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
26919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  TLSDataSection =
27019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
27119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_ALLOC | ELF::SHF_TLS |
27219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_WRITE,
27319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getThreadData());
27419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
27519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  TLSBSSSection =
27619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".tbss", ELF::SHT_NOBITS,
27719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_ALLOC | ELF::SHF_TLS |
27819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_WRITE,
27919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getThreadBSS());
28019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
28119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DataRelSection =
28219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".data.rel", ELF::SHT_PROGBITS,
28319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
28419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getDataRel());
28519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
28619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DataRelLocalSection =
28719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".data.rel.local", ELF::SHT_PROGBITS,
28819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
28919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getDataRelLocal());
29019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
29119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DataRelROSection =
29219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
29319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
29419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getReadOnlyWithRel());
29519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
29619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DataRelROLocalSection =
29719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS,
29819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
29919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getReadOnlyWithRelLocal());
30019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
30119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MergeableConst4Section =
30219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
30319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_ALLOC |ELF::SHF_MERGE,
30419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getMergeableConst4());
30519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
30619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MergeableConst8Section =
30719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
30819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_ALLOC |ELF::SHF_MERGE,
30919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getMergeableConst8());
31019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
31119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MergeableConst16Section =
31219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
31319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_ALLOC |ELF::SHF_MERGE,
31419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getMergeableConst16());
31519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
31619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  StaticCtorSection =
31719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".ctors", ELF::SHT_PROGBITS,
31819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
31919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getDataRel());
32019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
32119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  StaticDtorSection =
32219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".dtors", ELF::SHT_PROGBITS,
32319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
32419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getDataRel());
32519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
32619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Exception Handling Sections.
32719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
32819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
32919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // it contains relocatable pointers.  In PIC mode, this is probably a big
33019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // runtime hit for C++ apps.  Either the contents of the LSDA need to be
33119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // adjusted or this should be a data section.
33219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  LSDASection =
33319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
33419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       ELF::SHF_ALLOC,
33519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getReadOnly());
33619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
33719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Debug Info Sections.
33819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfAbbrevSection =
33919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0,
34019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getMetadata());
34119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfInfoSection =
34219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".debug_info", ELF::SHT_PROGBITS, 0,
34319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getMetadata());
34419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfLineSection =
34519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".debug_line", ELF::SHT_PROGBITS, 0,
34619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getMetadata());
34719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfFrameSection =
34819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0,
34919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getMetadata());
35019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfPubNamesSection =
35119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0,
35219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getMetadata());
35319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfPubTypesSection =
35419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0,
35519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getMetadata());
35619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfStrSection =
35719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".debug_str", ELF::SHT_PROGBITS, 0,
35819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getMetadata());
35919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfLocSection =
36019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0,
36119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getMetadata());
36219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfARangesSection =
36319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0,
36419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getMetadata());
36519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfRangesSection =
36619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0,
36719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getMetadata());
36819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfMacroInfoSection =
36919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0,
37019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       SectionKind::getMetadata());
37119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
37219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
37319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
37419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCObjectFileInfo::InitCOFFMCObjectFileInfo(Triple T) {
37519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // COFF
37619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  TextSection =
37719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".text",
37819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_CNT_CODE |
37919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_EXECUTE |
38019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ,
38119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getText());
38219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DataSection =
38319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".data",
38419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
38519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ |
38619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_WRITE,
38719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getDataRel());
38819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ReadOnlySection =
38919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".rdata",
39019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
39119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ,
39219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getReadOnly());
39319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  StaticCtorSection =
39419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".ctors",
39519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
39619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ |
39719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_WRITE,
39819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getDataRel());
39919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  StaticDtorSection =
40019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".dtors",
40119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
40219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ |
40319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_WRITE,
40419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getDataRel());
40519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
40619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // FIXME: We're emitting LSDA info into a readonly section on COFF, even
40719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // though it contains relocatable pointers.  In PIC mode, this is probably a
40819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
40919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // adjusted or this should be a data section.
41019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  LSDASection =
41119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".gcc_except_table",
41219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
41319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ,
41419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getReadOnly());
41519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
41619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Debug info.
41719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfAbbrevSection =
41819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".debug_abbrev",
41919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
42019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ,
42119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getMetadata());
42219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfInfoSection =
42319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".debug_info",
42419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
42519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ,
42619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getMetadata());
42719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfLineSection =
42819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".debug_line",
42919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
43019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ,
43119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getMetadata());
43219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfFrameSection =
43319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".debug_frame",
43419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
43519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ,
43619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getMetadata());
43719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfPubNamesSection =
43819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".debug_pubnames",
43919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
44019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ,
44119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getMetadata());
44219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfPubTypesSection =
44319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".debug_pubtypes",
44419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
44519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ,
44619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getMetadata());
44719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfStrSection =
44819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".debug_str",
44919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
45019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ,
45119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getMetadata());
45219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfLocSection =
45319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".debug_loc",
45419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
45519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ,
45619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getMetadata());
45719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfARangesSection =
45819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".debug_aranges",
45919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
46019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ,
46119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getMetadata());
46219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfRangesSection =
46319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".debug_ranges",
46419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
46519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ,
46619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getMetadata());
46719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DwarfMacroInfoSection =
46819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".debug_macinfo",
46919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_DISCARDABLE |
47019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ,
47119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getMetadata());
47219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
47319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DrectveSection =
47419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".drectve",
47519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_LNK_INFO,
47619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getMetadata());
47719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
47819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  PDataSection =
47919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".pdata",
48019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
48119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ |
48219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_WRITE,
48319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getDataRel());
48419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
48519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  XDataSection =
48619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Ctx->getCOFFSection(".xdata",
48719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
48819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_READ |
48919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        COFF::IMAGE_SCN_MEM_WRITE,
49019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        SectionKind::getDataRel());
49119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
49219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
49319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model relocm,
49419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                            CodeModel::Model cm,
49519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                            MCContext &ctx) {
49619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  RelocM = relocm;
49719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CMModel = cm;
49819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Ctx = &ctx;
49919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
50019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Common.
50119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CommDirectiveSupportsAlignment = true;
50219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SupportsWeakOmittedEHFrame = true;
50319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  IsFunctionEHFrameSymbolPrivate = true;
50419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
50519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  PersonalityEncoding = LSDAEncoding = FDEEncoding = FDECFIEncoding =
50619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    TTypeEncoding = dwarf::DW_EH_PE_absptr;
50719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
50819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EHFrameSection = 0;           // Created on demand.
50919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CompactUnwindSection = 0;     // Used only by selected targets.
51019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
51119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Triple T(TT);
51219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Triple::ArchType Arch = T.getArch();
51319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // FIXME: Checking for Arch here to filter out bogus triples such as
51419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // cellspu-apple-darwin. Perhaps we should fix in Triple?
51519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if ((Arch == Triple::x86 || Arch == Triple::x86_64 ||
51619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman       Arch == Triple::arm || Arch == Triple::thumb ||
51719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman       Arch == Triple::ppc || Arch == Triple::ppc64 ||
51819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman       Arch == Triple::UnknownArch) &&
51919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      (T.isOSDarwin() || T.getEnvironment() == Triple::MachO)) {
52019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Env = IsMachO;
52119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    InitMachOMCObjectFileInfo(T);
52219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else if ((Arch == Triple::x86 || Arch == Triple::x86_64) &&
52319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman             (T.getOS() == Triple::MinGW32 || T.getOS() == Triple::Cygwin ||
52419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman              T.getOS() == Triple::Win32)) {
52519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Env = IsCOFF;
52619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    InitCOFFMCObjectFileInfo(T);
52719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else {
52819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Env = IsELF;
52919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    InitELFMCObjectFileInfo(T);
53019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
53119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
53219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
53319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MCObjectFileInfo::InitEHFrameSection() {
53419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Env == IsMachO)
53519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EHFrameSection =
53619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Ctx->getMachOSection("__TEXT", "__eh_frame",
53719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_COALESCED |
53819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_ATTR_NO_TOC |
53919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
54019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCSectionMachO::S_ATTR_LIVE_SUPPORT,
54119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           SectionKind::getReadOnly());
54219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  else if (Env == IsELF)
54319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EHFrameSection =
54419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Ctx->getELFSection(".eh_frame", ELF::SHT_PROGBITS,
54519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         ELF::SHF_ALLOC,
54619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         SectionKind::getDataRel());
54719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  else
54819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EHFrameSection =
54919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Ctx->getCOFFSection(".eh_frame",
55019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                          COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
55119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                          COFF::IMAGE_SCN_MEM_READ |
55219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                          COFF::IMAGE_SCN_MEM_WRITE,
55319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                          SectionKind::getDataRel());
55419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
555