diff options
Diffstat (limited to 'lib/MC/MCObjectFileInfo.cpp')
| -rw-r--r-- | lib/MC/MCObjectFileInfo.cpp | 93 | 
1 files changed, 78 insertions, 15 deletions
| diff --git a/lib/MC/MCObjectFileInfo.cpp b/lib/MC/MCObjectFileInfo.cpp index a6b5c43f1d2a..29d34a8c1e3e 100644 --- a/lib/MC/MCObjectFileInfo.cpp +++ b/lib/MC/MCObjectFileInfo.cpp @@ -135,6 +135,10 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {    // "__DATA/__datacoal_nt" => section "__DATA/__data"    Triple::ArchType ArchTy = T.getArch(); +  ConstDataSection  // .const_data +    = Ctx->getMachOSection("__DATA", "__const", 0, +                           SectionKind::getReadOnlyWithRel()); +    if (ArchTy == Triple::ppc || ArchTy == Triple::ppc64) {      TextCoalSection        = Ctx->getMachOSection("__TEXT", "__textcoal_nt", @@ -147,15 +151,14 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {                               SectionKind::getReadOnly());      DataCoalSection = Ctx->getMachOSection(          "__DATA", "__datacoal_nt", MachO::S_COALESCED, SectionKind::getData()); +    ConstDataCoalSection = DataCoalSection;    } else {      TextCoalSection = TextSection;      ConstTextCoalSection = ReadOnlySection;      DataCoalSection = DataSection; +    ConstDataCoalSection = ConstDataSection;    } -  ConstDataSection  // .const_data -    = Ctx->getMachOSection("__DATA", "__const", 0, -                           SectionKind::getReadOnlyWithRel());    DataCommonSection      = Ctx->getMachOSection("__DATA","__common",                             MachO::S_ZEROFILL, @@ -201,6 +204,9 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {    }    // Debug Information. +  DwarfDebugNamesSection = +      Ctx->getMachOSection("__DWARF", "__debug_names", MachO::S_ATTR_DEBUG, +                           SectionKind::getMetadata(), "debug_names_begin");    DwarfAccelNamesSection =        Ctx->getMachOSection("__DWARF", "__apple_names", MachO::S_ATTR_DEBUG,                             SectionKind::getMetadata(), "names_begin"); @@ -228,6 +234,9 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {    DwarfLineSection =        Ctx->getMachOSection("__DWARF", "__debug_line", MachO::S_ATTR_DEBUG,                             SectionKind::getMetadata(), "section_line"); +  DwarfLineStrSection = +      Ctx->getMachOSection("__DWARF", "__debug_line_str", MachO::S_ATTR_DEBUG, +                           SectionKind::getMetadata(), "section_line_str");    DwarfFrameSection =        Ctx->getMachOSection("__DWARF", "__debug_frame", MachO::S_ATTR_DEBUG,                             SectionKind::getMetadata()); @@ -258,6 +267,9 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {    DwarfRangesSection =        Ctx->getMachOSection("__DWARF", "__debug_ranges", MachO::S_ATTR_DEBUG,                             SectionKind::getMetadata(), "debug_range"); +  DwarfRnglistsSection = +      Ctx->getMachOSection("__DWARF", "__debug_rnglists", MachO::S_ATTR_DEBUG, +                           SectionKind::getMetadata(), "debug_range");    DwarfMacinfoSection =        Ctx->getMachOSection("__DWARF", "__debug_macinfo", MachO::S_ATTR_DEBUG,                             SectionKind::getMetadata(), "debug_macinfo"); @@ -289,6 +301,8 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {    case Triple::mips64el:      FDECFIEncoding = dwarf::DW_EH_PE_sdata8;      break; +  case Triple::ppc64: +  case Triple::ppc64le:    case Triple::x86_64:      FDECFIEncoding = dwarf::DW_EH_PE_pcrel |                       (Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4); @@ -518,8 +532,7 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {    // MIPS .debug_* sections should have SHT_MIPS_DWARF section type    // to distinguish among sections contain DWARF and ECOFF debug formats.    // Sections with ECOFF debug format are obsoleted and marked by SHT_PROGBITS. -  if (T.getArch() == Triple::mips || T.getArch() == Triple::mipsel || -      T.getArch() == Triple::mips64 || T.getArch() == Triple::mips64el) +  if (T.isMIPS())      DebugSecType = ELF::SHT_MIPS_DWARF;    // Debug Info Sections. @@ -527,6 +540,9 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {        Ctx->getELFSection(".debug_abbrev", DebugSecType, 0);    DwarfInfoSection = Ctx->getELFSection(".debug_info", DebugSecType, 0);    DwarfLineSection = Ctx->getELFSection(".debug_line", DebugSecType, 0); +  DwarfLineStrSection = +      Ctx->getELFSection(".debug_line_str", DebugSecType, +                         ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, "");    DwarfFrameSection = Ctx->getELFSection(".debug_frame", DebugSecType, 0);    DwarfPubNamesSection =        Ctx->getELFSection(".debug_pubnames", DebugSecType, 0); @@ -550,6 +566,8 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {    // DWARF5 Experimental Debug Info    // Accelerator Tables +  DwarfDebugNamesSection = +      Ctx->getELFSection(".debug_names", ELF::SHT_PROGBITS, 0);    DwarfAccelNamesSection =        Ctx->getELFSection(".apple_names", ELF::SHT_PROGBITS, 0);    DwarfAccelObjCSection = @@ -563,6 +581,7 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {    DwarfStrOffSection =        Ctx->getELFSection(".debug_str_offsets", DebugSecType, 0);    DwarfAddrSection = Ctx->getELFSection(".debug_addr", DebugSecType, 0); +  DwarfRnglistsSection = Ctx->getELFSection(".debug_rnglists", DebugSecType, 0);    // Fission Sections    DwarfInfoDWOSection = @@ -580,6 +599,8 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {        Ctx->getELFSection(".debug_loc.dwo", DebugSecType, 0);    DwarfStrOffDWOSection =        Ctx->getELFSection(".debug_str_offsets.dwo", DebugSecType, 0); +  DwarfRnglistsDWOSection = +      Ctx->getELFSection(".debug_rnglists.dwo", DebugSecType, 0);    // DWP Sections    DwarfCUIndexSection = @@ -677,7 +698,11 @@ void MCObjectFileInfo::initCOFFMCObjectFileInfo(const Triple &T) {        COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |            COFF::IMAGE_SCN_MEM_READ,        SectionKind::getMetadata(), "section_line"); - +  DwarfLineStrSection = Ctx->getCOFFSection( +      ".debug_line_str", +      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | +          COFF::IMAGE_SCN_MEM_READ, +      SectionKind::getMetadata(), "section_line_str");    DwarfFrameSection = Ctx->getCOFFSection(        ".debug_frame",        COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | @@ -783,6 +808,11 @@ void MCObjectFileInfo::initCOFFMCObjectFileInfo(const Triple &T) {        COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |            COFF::IMAGE_SCN_MEM_READ,        SectionKind::getMetadata()); +  DwarfDebugNamesSection = Ctx->getCOFFSection( +      ".debug_names", +      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | +          COFF::IMAGE_SCN_MEM_READ, +      SectionKind::getMetadata(), "debug_names_begin");    DwarfAccelNamesSection = Ctx->getCOFFSection(        ".apple_names",        COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | @@ -819,6 +849,11 @@ void MCObjectFileInfo::initCOFFMCObjectFileInfo(const Triple &T) {    SXDataSection = Ctx->getCOFFSection(".sxdata", COFF::IMAGE_SCN_LNK_INFO,                                        SectionKind::getMetadata()); +  GFIDsSection = Ctx->getCOFFSection(".gfids$y", +                                     COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | +                                         COFF::IMAGE_SCN_MEM_READ, +                                     SectionKind::getMetadata()); +    TLSDataSection = Ctx->getCOFFSection(        ".tls$", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |                     COFF::IMAGE_SCN_MEM_WRITE, @@ -831,22 +866,29 @@ void MCObjectFileInfo::initCOFFMCObjectFileInfo(const Triple &T) {  }  void MCObjectFileInfo::initWasmMCObjectFileInfo(const Triple &T) { -  // TODO: Set the section types and flags.    TextSection = Ctx->getWasmSection(".text", SectionKind::getText());    DataSection = Ctx->getWasmSection(".data", SectionKind::getData()); -  // TODO: Set the section types and flags. -  DwarfLineSection = Ctx->getWasmSection(".debug_line", SectionKind::getMetadata()); -  DwarfStrSection = Ctx->getWasmSection(".debug_str", SectionKind::getMetadata()); -  DwarfLocSection = Ctx->getWasmSection(".debug_loc", SectionKind::getMetadata()); -  DwarfAbbrevSection = Ctx->getWasmSection(".debug_abbrev", SectionKind::getMetadata(), "section_abbrev"); +  DwarfLineSection = +      Ctx->getWasmSection(".debug_line", SectionKind::getMetadata()); +  DwarfLineStrSection = +      Ctx->getWasmSection(".debug_line_str", SectionKind::getMetadata()); +  DwarfStrSection = +      Ctx->getWasmSection(".debug_str", SectionKind::getMetadata()); +  DwarfLocSection = +      Ctx->getWasmSection(".debug_loc", SectionKind::getMetadata()); +  DwarfAbbrevSection = +      Ctx->getWasmSection(".debug_abbrev", SectionKind::getMetadata());    DwarfARangesSection = Ctx->getWasmSection(".debug_aranges", SectionKind::getMetadata()); -  DwarfRangesSection = Ctx->getWasmSection(".debug_ranges", SectionKind::getMetadata(), "debug_range"); -  DwarfMacinfoSection = Ctx->getWasmSection(".debug_macinfo", SectionKind::getMetadata(), "debug_macinfo"); +  DwarfRangesSection = +      Ctx->getWasmSection(".debug_ranges", SectionKind::getMetadata()); +  DwarfMacinfoSection = +      Ctx->getWasmSection(".debug_macinfo", SectionKind::getMetadata());    DwarfAddrSection = Ctx->getWasmSection(".debug_addr", SectionKind::getMetadata());    DwarfCUIndexSection = Ctx->getWasmSection(".debug_cu_index", SectionKind::getMetadata());    DwarfTUIndexSection = Ctx->getWasmSection(".debug_tu_index", SectionKind::getMetadata()); -  DwarfInfoSection = Ctx->getWasmSection(".debug_info", SectionKind::getMetadata(), "section_info"); +  DwarfInfoSection = +      Ctx->getWasmSection(".debug_info", SectionKind::getMetadata());    DwarfFrameSection = Ctx->getWasmSection(".debug_frame", SectionKind::getMetadata());    DwarfPubNamesSection = Ctx->getWasmSection(".debug_pubnames", SectionKind::getMetadata());    DwarfPubTypesSection = Ctx->getWasmSection(".debug_pubtypes", SectionKind::getMetadata()); @@ -911,3 +953,24 @@ MCSection *MCObjectFileInfo::getDwarfTypesSection(uint64_t Hash) const {    return Ctx->getELFSection(".debug_types", ELF::SHT_PROGBITS, ELF::SHF_GROUP,                              0, utostr(Hash));  } + +MCSection * +MCObjectFileInfo::getStackSizesSection(const MCSection &TextSec) const { +  if (Env != IsELF) +    return StackSizesSection; + +  const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec); +  unsigned Flags = ELF::SHF_LINK_ORDER; +  StringRef GroupName; +  if (const MCSymbol *Group = ElfSec.getGroup()) { +    GroupName = Group->getName(); +    Flags |= ELF::SHF_GROUP; +  } + +  const MCSymbol *Link = TextSec.getBeginSymbol(); +  auto It = StackSizesUniquing.insert({Link, StackSizesUniquing.size()}); +  unsigned UniqueID = It.first->second; + +  return Ctx->getELFSection(".stack_sizes", ELF::SHT_PROGBITS, Flags, 0, +                            GroupName, UniqueID, cast<MCSymbolELF>(Link)); +} | 
