
SUMMARY: 1. in the patch , remove setting storageclass in function .getXCOFFSection and construct function of class MCSectionXCOFF there are XCOFF::StorageMappingClass MappingClass; XCOFF::SymbolType Type; XCOFF::StorageClass StorageClass; in the MCSectionXCOFF class, these attribute only used in the XCOFFObjectWriter, (asm path do not need the StorageClass) we need get the value of StorageClass, Type,MappingClass before we invoke the getXCOFFSection every time. actually , we can get the StorageClass of the MCSectionXCOFF from it's delegated symbol. 2. we also change the oprand of branch instruction from symbol name to qualify symbol name. for example change bl .foo extern .foo to bl .foo[PR] extern .foo[PR] 3. and if there is reference indirect call a function bar. we also add extern .bar[PR] Reviewers: Jason liu, Xiangling Liao Differential Revision: https://reviews.llvm.org/D84765
956 lines
40 KiB
C++
956 lines
40 KiB
C++
//===-- MCObjectFileInfo.cpp - Object File Information --------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/MC/MCObjectFileInfo.h"
|
|
#include "llvm/ADT/StringExtras.h"
|
|
#include "llvm/ADT/Triple.h"
|
|
#include "llvm/BinaryFormat/COFF.h"
|
|
#include "llvm/BinaryFormat/ELF.h"
|
|
#include "llvm/MC/MCAsmInfo.h"
|
|
#include "llvm/MC/MCContext.h"
|
|
#include "llvm/MC/MCSection.h"
|
|
#include "llvm/MC/MCSectionCOFF.h"
|
|
#include "llvm/MC/MCSectionELF.h"
|
|
#include "llvm/MC/MCSectionMachO.h"
|
|
#include "llvm/MC/MCSectionWasm.h"
|
|
#include "llvm/MC/MCSectionXCOFF.h"
|
|
|
|
using namespace llvm;
|
|
|
|
static bool useCompactUnwind(const Triple &T) {
|
|
// Only on darwin.
|
|
if (!T.isOSDarwin())
|
|
return false;
|
|
|
|
// aarch64 always has it.
|
|
if (T.getArch() == Triple::aarch64 || T.getArch() == Triple::aarch64_32)
|
|
return true;
|
|
|
|
// armv7k always has it.
|
|
if (T.isWatchABI())
|
|
return true;
|
|
|
|
// Use it on newer version of OS X.
|
|
if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6))
|
|
return true;
|
|
|
|
// And the iOS simulator.
|
|
if (T.isiOS() && T.isX86())
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {
|
|
// MachO
|
|
SupportsWeakOmittedEHFrame = false;
|
|
|
|
EHFrameSection = Ctx->getMachOSection(
|
|
"__TEXT", "__eh_frame",
|
|
MachO::S_COALESCED | MachO::S_ATTR_NO_TOC |
|
|
MachO::S_ATTR_STRIP_STATIC_SYMS | MachO::S_ATTR_LIVE_SUPPORT,
|
|
SectionKind::getReadOnly());
|
|
|
|
if (T.isOSDarwin() &&
|
|
(T.getArch() == Triple::aarch64 || T.getArch() == Triple::aarch64_32))
|
|
SupportsCompactUnwindWithoutEHFrame = true;
|
|
|
|
if (T.isWatchABI())
|
|
OmitDwarfIfHaveCompactUnwind = true;
|
|
|
|
FDECFIEncoding = dwarf::DW_EH_PE_pcrel;
|
|
|
|
// .comm doesn't support alignment before Leopard.
|
|
if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5))
|
|
CommDirectiveSupportsAlignment = false;
|
|
|
|
TextSection // .text
|
|
= Ctx->getMachOSection("__TEXT", "__text",
|
|
MachO::S_ATTR_PURE_INSTRUCTIONS,
|
|
SectionKind::getText());
|
|
DataSection // .data
|
|
= Ctx->getMachOSection("__DATA", "__data", 0, SectionKind::getData());
|
|
|
|
// BSSSection might not be expected initialized on msvc.
|
|
BSSSection = nullptr;
|
|
|
|
TLSDataSection // .tdata
|
|
= Ctx->getMachOSection("__DATA", "__thread_data",
|
|
MachO::S_THREAD_LOCAL_REGULAR,
|
|
SectionKind::getData());
|
|
TLSBSSSection // .tbss
|
|
= Ctx->getMachOSection("__DATA", "__thread_bss",
|
|
MachO::S_THREAD_LOCAL_ZEROFILL,
|
|
SectionKind::getThreadBSS());
|
|
|
|
// TODO: Verify datarel below.
|
|
TLSTLVSection // .tlv
|
|
= Ctx->getMachOSection("__DATA", "__thread_vars",
|
|
MachO::S_THREAD_LOCAL_VARIABLES,
|
|
SectionKind::getData());
|
|
|
|
TLSThreadInitSection = Ctx->getMachOSection(
|
|
"__DATA", "__thread_init", MachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
|
|
SectionKind::getData());
|
|
|
|
CStringSection // .cstring
|
|
= Ctx->getMachOSection("__TEXT", "__cstring",
|
|
MachO::S_CSTRING_LITERALS,
|
|
SectionKind::getMergeable1ByteCString());
|
|
UStringSection
|
|
= Ctx->getMachOSection("__TEXT","__ustring", 0,
|
|
SectionKind::getMergeable2ByteCString());
|
|
FourByteConstantSection // .literal4
|
|
= Ctx->getMachOSection("__TEXT", "__literal4",
|
|
MachO::S_4BYTE_LITERALS,
|
|
SectionKind::getMergeableConst4());
|
|
EightByteConstantSection // .literal8
|
|
= Ctx->getMachOSection("__TEXT", "__literal8",
|
|
MachO::S_8BYTE_LITERALS,
|
|
SectionKind::getMergeableConst8());
|
|
|
|
SixteenByteConstantSection // .literal16
|
|
= Ctx->getMachOSection("__TEXT", "__literal16",
|
|
MachO::S_16BYTE_LITERALS,
|
|
SectionKind::getMergeableConst16());
|
|
|
|
ReadOnlySection // .const
|
|
= Ctx->getMachOSection("__TEXT", "__const", 0,
|
|
SectionKind::getReadOnly());
|
|
|
|
// If the target is not powerpc, map the coal sections to the non-coal
|
|
// sections.
|
|
//
|
|
// "__TEXT/__textcoal_nt" => section "__TEXT/__text"
|
|
// "__TEXT/__const_coal" => section "__TEXT/__const"
|
|
// "__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",
|
|
MachO::S_COALESCED |
|
|
MachO::S_ATTR_PURE_INSTRUCTIONS,
|
|
SectionKind::getText());
|
|
ConstTextCoalSection
|
|
= Ctx->getMachOSection("__TEXT", "__const_coal",
|
|
MachO::S_COALESCED,
|
|
SectionKind::getReadOnly());
|
|
DataCoalSection = Ctx->getMachOSection(
|
|
"__DATA", "__datacoal_nt", MachO::S_COALESCED, SectionKind::getData());
|
|
ConstDataCoalSection = DataCoalSection;
|
|
} else {
|
|
TextCoalSection = TextSection;
|
|
ConstTextCoalSection = ReadOnlySection;
|
|
DataCoalSection = DataSection;
|
|
ConstDataCoalSection = ConstDataSection;
|
|
}
|
|
|
|
DataCommonSection
|
|
= Ctx->getMachOSection("__DATA","__common",
|
|
MachO::S_ZEROFILL,
|
|
SectionKind::getBSS());
|
|
DataBSSSection
|
|
= Ctx->getMachOSection("__DATA","__bss", MachO::S_ZEROFILL,
|
|
SectionKind::getBSS());
|
|
|
|
|
|
LazySymbolPointerSection
|
|
= Ctx->getMachOSection("__DATA", "__la_symbol_ptr",
|
|
MachO::S_LAZY_SYMBOL_POINTERS,
|
|
SectionKind::getMetadata());
|
|
NonLazySymbolPointerSection
|
|
= Ctx->getMachOSection("__DATA", "__nl_symbol_ptr",
|
|
MachO::S_NON_LAZY_SYMBOL_POINTERS,
|
|
SectionKind::getMetadata());
|
|
|
|
ThreadLocalPointerSection
|
|
= Ctx->getMachOSection("__DATA", "__thread_ptr",
|
|
MachO::S_THREAD_LOCAL_VARIABLE_POINTERS,
|
|
SectionKind::getMetadata());
|
|
|
|
// Exception Handling.
|
|
LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
|
|
SectionKind::getReadOnlyWithRel());
|
|
|
|
COFFDebugSymbolsSection = nullptr;
|
|
COFFDebugTypesSection = nullptr;
|
|
COFFGlobalTypeHashesSection = nullptr;
|
|
|
|
if (useCompactUnwind(T)) {
|
|
CompactUnwindSection =
|
|
Ctx->getMachOSection("__LD", "__compact_unwind", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getReadOnly());
|
|
|
|
if (T.isX86())
|
|
CompactUnwindDwarfEHFrameOnly = 0x04000000; // UNWIND_X86_64_MODE_DWARF
|
|
else if (T.getArch() == Triple::aarch64 || T.getArch() == Triple::aarch64_32)
|
|
CompactUnwindDwarfEHFrameOnly = 0x03000000; // UNWIND_ARM64_MODE_DWARF
|
|
else if (T.getArch() == Triple::arm || T.getArch() == Triple::thumb)
|
|
CompactUnwindDwarfEHFrameOnly = 0x04000000; // UNWIND_ARM_MODE_DWARF
|
|
}
|
|
|
|
// 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");
|
|
DwarfAccelObjCSection =
|
|
Ctx->getMachOSection("__DWARF", "__apple_objc", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata(), "objc_begin");
|
|
// 16 character section limit...
|
|
DwarfAccelNamespaceSection =
|
|
Ctx->getMachOSection("__DWARF", "__apple_namespac", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata(), "namespac_begin");
|
|
DwarfAccelTypesSection =
|
|
Ctx->getMachOSection("__DWARF", "__apple_types", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata(), "types_begin");
|
|
|
|
DwarfSwiftASTSection =
|
|
Ctx->getMachOSection("__DWARF", "__swift_ast", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata());
|
|
|
|
DwarfAbbrevSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_abbrev", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata(), "section_abbrev");
|
|
DwarfInfoSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_info", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata(), "section_info");
|
|
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());
|
|
DwarfPubNamesSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_pubnames", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata());
|
|
DwarfPubTypesSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_pubtypes", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata());
|
|
DwarfGnuPubNamesSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_gnu_pubn", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata());
|
|
DwarfGnuPubTypesSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_gnu_pubt", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata());
|
|
DwarfStrSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_str", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata(), "info_string");
|
|
DwarfStrOffSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_str_offs", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata(), "section_str_off");
|
|
DwarfAddrSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_addr", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata(), "section_info");
|
|
DwarfLocSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_loc", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata(), "section_debug_loc");
|
|
DwarfLoclistsSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_loclists", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata(), "section_debug_loc");
|
|
|
|
DwarfARangesSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_aranges", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata());
|
|
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");
|
|
DwarfMacroSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_macro", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata(), "debug_macro");
|
|
DwarfDebugInlineSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_inlined", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata());
|
|
DwarfCUIndexSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_cu_index", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata());
|
|
DwarfTUIndexSection =
|
|
Ctx->getMachOSection("__DWARF", "__debug_tu_index", MachO::S_ATTR_DEBUG,
|
|
SectionKind::getMetadata());
|
|
StackMapSection = Ctx->getMachOSection("__LLVM_STACKMAPS", "__llvm_stackmaps",
|
|
0, SectionKind::getMetadata());
|
|
|
|
FaultMapSection = Ctx->getMachOSection("__LLVM_FAULTMAPS", "__llvm_faultmaps",
|
|
0, SectionKind::getMetadata());
|
|
|
|
RemarksSection = Ctx->getMachOSection(
|
|
"__LLVM", "__remarks", MachO::S_ATTR_DEBUG, SectionKind::getMetadata());
|
|
|
|
TLSExtraDataSection = TLSTLVSection;
|
|
}
|
|
|
|
void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {
|
|
switch (T.getArch()) {
|
|
case Triple::mips:
|
|
case Triple::mipsel:
|
|
case Triple::mips64:
|
|
case Triple::mips64el:
|
|
// We cannot use DW_EH_PE_sdata8 for the large PositionIndependent case
|
|
// since there is no R_MIPS_PC64 relocation (only a 32-bit version).
|
|
if (PositionIndependent && !Large)
|
|
FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
|
|
else
|
|
FDECFIEncoding = Ctx->getAsmInfo()->getCodePointerSize() == 4
|
|
? dwarf::DW_EH_PE_sdata4
|
|
: 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);
|
|
break;
|
|
case Triple::bpfel:
|
|
case Triple::bpfeb:
|
|
FDECFIEncoding = dwarf::DW_EH_PE_sdata8;
|
|
break;
|
|
case Triple::hexagon:
|
|
FDECFIEncoding =
|
|
PositionIndependent ? dwarf::DW_EH_PE_pcrel : dwarf::DW_EH_PE_absptr;
|
|
break;
|
|
default:
|
|
FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
|
|
break;
|
|
}
|
|
|
|
unsigned EHSectionType = T.getArch() == Triple::x86_64
|
|
? ELF::SHT_X86_64_UNWIND
|
|
: ELF::SHT_PROGBITS;
|
|
|
|
// Solaris requires different flags for .eh_frame to seemingly every other
|
|
// platform.
|
|
unsigned EHSectionFlags = ELF::SHF_ALLOC;
|
|
if (T.isOSSolaris() && T.getArch() != Triple::x86_64)
|
|
EHSectionFlags |= ELF::SHF_WRITE;
|
|
|
|
// ELF
|
|
BSSSection = Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
|
|
ELF::SHF_WRITE | ELF::SHF_ALLOC);
|
|
|
|
TextSection = Ctx->getELFSection(".text", ELF::SHT_PROGBITS,
|
|
ELF::SHF_EXECINSTR | ELF::SHF_ALLOC);
|
|
|
|
DataSection = Ctx->getELFSection(".data", ELF::SHT_PROGBITS,
|
|
ELF::SHF_WRITE | ELF::SHF_ALLOC);
|
|
|
|
ReadOnlySection =
|
|
Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
|
|
|
|
TLSDataSection =
|
|
Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
|
|
ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
|
|
|
|
TLSBSSSection = Ctx->getELFSection(
|
|
".tbss", ELF::SHT_NOBITS, ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
|
|
|
|
DataRelROSection = Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
|
|
ELF::SHF_ALLOC | ELF::SHF_WRITE);
|
|
|
|
MergeableConst4Section =
|
|
Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
|
|
ELF::SHF_ALLOC | ELF::SHF_MERGE, 4, "");
|
|
|
|
MergeableConst8Section =
|
|
Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
|
|
ELF::SHF_ALLOC | ELF::SHF_MERGE, 8, "");
|
|
|
|
MergeableConst16Section =
|
|
Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
|
|
ELF::SHF_ALLOC | ELF::SHF_MERGE, 16, "");
|
|
|
|
MergeableConst32Section =
|
|
Ctx->getELFSection(".rodata.cst32", ELF::SHT_PROGBITS,
|
|
ELF::SHF_ALLOC | ELF::SHF_MERGE, 32, "");
|
|
|
|
// Exception Handling Sections.
|
|
|
|
// FIXME: We're emitting LSDA info into a readonly section on ELF, even though
|
|
// it contains relocatable pointers. In PIC mode, this is probably a big
|
|
// runtime hit for C++ apps. Either the contents of the LSDA need to be
|
|
// adjusted or this should be a data section.
|
|
LSDASection = Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
|
|
ELF::SHF_ALLOC);
|
|
|
|
COFFDebugSymbolsSection = nullptr;
|
|
COFFDebugTypesSection = nullptr;
|
|
|
|
unsigned DebugSecType = ELF::SHT_PROGBITS;
|
|
|
|
// 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.isMIPS())
|
|
DebugSecType = ELF::SHT_MIPS_DWARF;
|
|
|
|
// Debug Info Sections.
|
|
DwarfAbbrevSection =
|
|
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);
|
|
DwarfPubTypesSection =
|
|
Ctx->getELFSection(".debug_pubtypes", DebugSecType, 0);
|
|
DwarfGnuPubNamesSection =
|
|
Ctx->getELFSection(".debug_gnu_pubnames", DebugSecType, 0);
|
|
DwarfGnuPubTypesSection =
|
|
Ctx->getELFSection(".debug_gnu_pubtypes", DebugSecType, 0);
|
|
DwarfStrSection =
|
|
Ctx->getELFSection(".debug_str", DebugSecType,
|
|
ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, "");
|
|
DwarfLocSection = Ctx->getELFSection(".debug_loc", DebugSecType, 0);
|
|
DwarfARangesSection =
|
|
Ctx->getELFSection(".debug_aranges", DebugSecType, 0);
|
|
DwarfRangesSection =
|
|
Ctx->getELFSection(".debug_ranges", DebugSecType, 0);
|
|
DwarfMacinfoSection =
|
|
Ctx->getELFSection(".debug_macinfo", DebugSecType, 0);
|
|
DwarfMacroSection = Ctx->getELFSection(".debug_macro", DebugSecType, 0);
|
|
|
|
// 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 =
|
|
Ctx->getELFSection(".apple_objc", ELF::SHT_PROGBITS, 0);
|
|
DwarfAccelNamespaceSection =
|
|
Ctx->getELFSection(".apple_namespaces", ELF::SHT_PROGBITS, 0);
|
|
DwarfAccelTypesSection =
|
|
Ctx->getELFSection(".apple_types", ELF::SHT_PROGBITS, 0);
|
|
|
|
// String Offset and Address Sections
|
|
DwarfStrOffSection =
|
|
Ctx->getELFSection(".debug_str_offsets", DebugSecType, 0);
|
|
DwarfAddrSection = Ctx->getELFSection(".debug_addr", DebugSecType, 0);
|
|
DwarfRnglistsSection = Ctx->getELFSection(".debug_rnglists", DebugSecType, 0);
|
|
DwarfLoclistsSection = Ctx->getELFSection(".debug_loclists", DebugSecType, 0);
|
|
|
|
// Fission Sections
|
|
DwarfInfoDWOSection =
|
|
Ctx->getELFSection(".debug_info.dwo", DebugSecType, ELF::SHF_EXCLUDE);
|
|
DwarfTypesDWOSection =
|
|
Ctx->getELFSection(".debug_types.dwo", DebugSecType, ELF::SHF_EXCLUDE);
|
|
DwarfAbbrevDWOSection =
|
|
Ctx->getELFSection(".debug_abbrev.dwo", DebugSecType, ELF::SHF_EXCLUDE);
|
|
DwarfStrDWOSection = Ctx->getELFSection(
|
|
".debug_str.dwo", DebugSecType,
|
|
ELF::SHF_MERGE | ELF::SHF_STRINGS | ELF::SHF_EXCLUDE, 1, "");
|
|
DwarfLineDWOSection =
|
|
Ctx->getELFSection(".debug_line.dwo", DebugSecType, ELF::SHF_EXCLUDE);
|
|
DwarfLocDWOSection =
|
|
Ctx->getELFSection(".debug_loc.dwo", DebugSecType, ELF::SHF_EXCLUDE);
|
|
DwarfStrOffDWOSection = Ctx->getELFSection(".debug_str_offsets.dwo",
|
|
DebugSecType, ELF::SHF_EXCLUDE);
|
|
DwarfRnglistsDWOSection =
|
|
Ctx->getELFSection(".debug_rnglists.dwo", DebugSecType, ELF::SHF_EXCLUDE);
|
|
DwarfMacinfoDWOSection =
|
|
Ctx->getELFSection(".debug_macinfo.dwo", DebugSecType, ELF::SHF_EXCLUDE);
|
|
DwarfMacroDWOSection =
|
|
Ctx->getELFSection(".debug_macro.dwo", DebugSecType, ELF::SHF_EXCLUDE);
|
|
|
|
DwarfLoclistsDWOSection =
|
|
Ctx->getELFSection(".debug_loclists.dwo", DebugSecType, ELF::SHF_EXCLUDE);
|
|
|
|
// DWP Sections
|
|
DwarfCUIndexSection =
|
|
Ctx->getELFSection(".debug_cu_index", DebugSecType, 0);
|
|
DwarfTUIndexSection =
|
|
Ctx->getELFSection(".debug_tu_index", DebugSecType, 0);
|
|
|
|
StackMapSection =
|
|
Ctx->getELFSection(".llvm_stackmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
|
|
|
|
FaultMapSection =
|
|
Ctx->getELFSection(".llvm_faultmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
|
|
|
|
EHFrameSection =
|
|
Ctx->getELFSection(".eh_frame", EHSectionType, EHSectionFlags);
|
|
|
|
StackSizesSection = Ctx->getELFSection(".stack_sizes", ELF::SHT_PROGBITS, 0);
|
|
}
|
|
|
|
void MCObjectFileInfo::initCOFFMCObjectFileInfo(const Triple &T) {
|
|
EHFrameSection =
|
|
Ctx->getCOFFSection(".eh_frame", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getData());
|
|
|
|
// Set the `IMAGE_SCN_MEM_16BIT` flag when compiling for thumb mode. This is
|
|
// used to indicate to the linker that the text segment contains thumb instructions
|
|
// and to set the ISA selection bit for calls accordingly.
|
|
const bool IsThumb = T.getArch() == Triple::thumb;
|
|
|
|
CommDirectiveSupportsAlignment = true;
|
|
|
|
// COFF
|
|
BSSSection = Ctx->getCOFFSection(
|
|
".bss", COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
|
|
SectionKind::getBSS());
|
|
TextSection = Ctx->getCOFFSection(
|
|
".text",
|
|
(IsThumb ? COFF::IMAGE_SCN_MEM_16BIT : (COFF::SectionCharacteristics)0) |
|
|
COFF::IMAGE_SCN_CNT_CODE | COFF::IMAGE_SCN_MEM_EXECUTE |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getText());
|
|
DataSection = Ctx->getCOFFSection(
|
|
".data", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
|
|
COFF::IMAGE_SCN_MEM_WRITE,
|
|
SectionKind::getData());
|
|
ReadOnlySection = Ctx->getCOFFSection(
|
|
".rdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getReadOnly());
|
|
|
|
if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::aarch64) {
|
|
// On Windows 64 with SEH, the LSDA is emitted into the .xdata section
|
|
LSDASection = nullptr;
|
|
} else {
|
|
LSDASection = Ctx->getCOFFSection(".gcc_except_table",
|
|
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getReadOnly());
|
|
}
|
|
|
|
// Debug info.
|
|
COFFDebugSymbolsSection =
|
|
Ctx->getCOFFSection(".debug$S", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
|
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ),
|
|
SectionKind::getMetadata());
|
|
COFFDebugTypesSection =
|
|
Ctx->getCOFFSection(".debug$T", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
|
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ),
|
|
SectionKind::getMetadata());
|
|
COFFGlobalTypeHashesSection = Ctx->getCOFFSection(
|
|
".debug$H",
|
|
(COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ),
|
|
SectionKind::getMetadata());
|
|
|
|
DwarfAbbrevSection = Ctx->getCOFFSection(
|
|
".debug_abbrev",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "section_abbrev");
|
|
DwarfInfoSection = Ctx->getCOFFSection(
|
|
".debug_info",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "section_info");
|
|
DwarfLineSection = Ctx->getCOFFSection(
|
|
".debug_line",
|
|
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 |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata());
|
|
DwarfPubNamesSection = Ctx->getCOFFSection(
|
|
".debug_pubnames",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata());
|
|
DwarfPubTypesSection = Ctx->getCOFFSection(
|
|
".debug_pubtypes",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata());
|
|
DwarfGnuPubNamesSection = Ctx->getCOFFSection(
|
|
".debug_gnu_pubnames",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata());
|
|
DwarfGnuPubTypesSection = Ctx->getCOFFSection(
|
|
".debug_gnu_pubtypes",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata());
|
|
DwarfStrSection = Ctx->getCOFFSection(
|
|
".debug_str",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "info_string");
|
|
DwarfStrOffSection = Ctx->getCOFFSection(
|
|
".debug_str_offsets",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "section_str_off");
|
|
DwarfLocSection = Ctx->getCOFFSection(
|
|
".debug_loc",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "section_debug_loc");
|
|
DwarfLoclistsSection = Ctx->getCOFFSection(
|
|
".debug_loclists",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "section_debug_loclists");
|
|
DwarfARangesSection = Ctx->getCOFFSection(
|
|
".debug_aranges",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata());
|
|
DwarfRangesSection = Ctx->getCOFFSection(
|
|
".debug_ranges",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "debug_range");
|
|
DwarfRnglistsSection = Ctx->getCOFFSection(
|
|
".debug_rnglists",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "debug_rnglists");
|
|
DwarfMacinfoSection = Ctx->getCOFFSection(
|
|
".debug_macinfo",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "debug_macinfo");
|
|
DwarfMacroSection = Ctx->getCOFFSection(
|
|
".debug_macro",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "debug_macro");
|
|
DwarfMacinfoDWOSection = Ctx->getCOFFSection(
|
|
".debug_macinfo.dwo",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "debug_macinfo.dwo");
|
|
DwarfMacroDWOSection = Ctx->getCOFFSection(
|
|
".debug_macro.dwo",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "debug_macro.dwo");
|
|
DwarfInfoDWOSection = Ctx->getCOFFSection(
|
|
".debug_info.dwo",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "section_info_dwo");
|
|
DwarfTypesDWOSection = Ctx->getCOFFSection(
|
|
".debug_types.dwo",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "section_types_dwo");
|
|
DwarfAbbrevDWOSection = Ctx->getCOFFSection(
|
|
".debug_abbrev.dwo",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "section_abbrev_dwo");
|
|
DwarfStrDWOSection = Ctx->getCOFFSection(
|
|
".debug_str.dwo",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "skel_string");
|
|
DwarfLineDWOSection = Ctx->getCOFFSection(
|
|
".debug_line.dwo",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata());
|
|
DwarfLocDWOSection = Ctx->getCOFFSection(
|
|
".debug_loc.dwo",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "skel_loc");
|
|
DwarfStrOffDWOSection = Ctx->getCOFFSection(
|
|
".debug_str_offsets.dwo",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "section_str_off_dwo");
|
|
DwarfAddrSection = Ctx->getCOFFSection(
|
|
".debug_addr",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "addr_sec");
|
|
DwarfCUIndexSection = Ctx->getCOFFSection(
|
|
".debug_cu_index",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata());
|
|
DwarfTUIndexSection = Ctx->getCOFFSection(
|
|
".debug_tu_index",
|
|
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 |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "names_begin");
|
|
DwarfAccelNamespaceSection = Ctx->getCOFFSection(
|
|
".apple_namespaces",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "namespac_begin");
|
|
DwarfAccelTypesSection = Ctx->getCOFFSection(
|
|
".apple_types",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "types_begin");
|
|
DwarfAccelObjCSection = Ctx->getCOFFSection(
|
|
".apple_objc",
|
|
COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getMetadata(), "objc_begin");
|
|
|
|
DrectveSection = Ctx->getCOFFSection(
|
|
".drectve", COFF::IMAGE_SCN_LNK_INFO | COFF::IMAGE_SCN_LNK_REMOVE,
|
|
SectionKind::getMetadata());
|
|
|
|
PDataSection = Ctx->getCOFFSection(
|
|
".pdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getData());
|
|
|
|
XDataSection = Ctx->getCOFFSection(
|
|
".xdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getData());
|
|
|
|
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());
|
|
|
|
GLJMPSection = Ctx->getCOFFSection(".gljmp$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,
|
|
SectionKind::getData());
|
|
|
|
StackMapSection = Ctx->getCOFFSection(".llvm_stackmaps",
|
|
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
|
COFF::IMAGE_SCN_MEM_READ,
|
|
SectionKind::getReadOnly());
|
|
}
|
|
|
|
void MCObjectFileInfo::initWasmMCObjectFileInfo(const Triple &T) {
|
|
TextSection = Ctx->getWasmSection(".text", SectionKind::getText());
|
|
DataSection = Ctx->getWasmSection(".data", SectionKind::getData());
|
|
|
|
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());
|
|
DwarfMacinfoSection =
|
|
Ctx->getWasmSection(".debug_macinfo", SectionKind::getMetadata());
|
|
DwarfMacroSection =
|
|
Ctx->getWasmSection(".debug_macro", 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());
|
|
DwarfFrameSection = Ctx->getWasmSection(".debug_frame", SectionKind::getMetadata());
|
|
DwarfPubNamesSection = Ctx->getWasmSection(".debug_pubnames", SectionKind::getMetadata());
|
|
DwarfPubTypesSection = Ctx->getWasmSection(".debug_pubtypes", SectionKind::getMetadata());
|
|
|
|
DwarfDebugNamesSection =
|
|
Ctx->getWasmSection(".debug_names", SectionKind::getMetadata());
|
|
DwarfStrOffSection =
|
|
Ctx->getWasmSection(".debug_str_offsets", SectionKind::getMetadata());
|
|
DwarfAddrSection =
|
|
Ctx->getWasmSection(".debug_addr", SectionKind::getMetadata());
|
|
DwarfRnglistsSection =
|
|
Ctx->getWasmSection(".debug_rnglists", SectionKind::getMetadata());
|
|
DwarfLoclistsSection =
|
|
Ctx->getWasmSection(".debug_loclists", SectionKind::getMetadata());
|
|
|
|
// Wasm use data section for LSDA.
|
|
// TODO Consider putting each function's exception table in a separate
|
|
// section, as in -function-sections, to facilitate lld's --gc-section.
|
|
LSDASection = Ctx->getWasmSection(".rodata.gcc_except_table",
|
|
SectionKind::getReadOnlyWithRel());
|
|
|
|
// TODO: Define more sections.
|
|
}
|
|
|
|
void MCObjectFileInfo::initXCOFFMCObjectFileInfo(const Triple &T) {
|
|
// The default csect for program code. Functions without a specified section
|
|
// get placed into this csect. The choice of csect name is not a property of
|
|
// the ABI or object file format. For example, the XL compiler uses an unnamed
|
|
// csect for program code.
|
|
TextSection =
|
|
Ctx->getXCOFFSection(".text", XCOFF::StorageMappingClass::XMC_PR,
|
|
XCOFF::XTY_SD, SectionKind::getText());
|
|
|
|
DataSection =
|
|
Ctx->getXCOFFSection(".data", XCOFF::StorageMappingClass::XMC_RW,
|
|
XCOFF::XTY_SD, SectionKind::getData());
|
|
|
|
ReadOnlySection =
|
|
Ctx->getXCOFFSection(".rodata", XCOFF::StorageMappingClass::XMC_RO,
|
|
XCOFF::XTY_SD, SectionKind::getReadOnly());
|
|
|
|
TOCBaseSection =
|
|
Ctx->getXCOFFSection("TOC", XCOFF::StorageMappingClass::XMC_TC0,
|
|
XCOFF::XTY_SD, SectionKind::getData());
|
|
|
|
// The TOC-base always has 0 size, but 4 byte alignment.
|
|
TOCBaseSection->setAlignment(Align(4));
|
|
|
|
// DWARF sections for XCOFF are not csects. They are special STYP_DWARF
|
|
// sections, and the individual DWARF sections are distinguished by their
|
|
// section subtype.
|
|
// TODO: Populate the DWARF sections appropriately.
|
|
DwarfAbbrevSection = nullptr; // SSUBTYP_DWABREV
|
|
DwarfInfoSection = nullptr; // SSUBTYP_DWINFO
|
|
DwarfLineSection = nullptr; // SSUBTYP_DWLINE
|
|
DwarfFrameSection = nullptr; // SSUBTYP_DWFRAME
|
|
DwarfPubNamesSection = nullptr; // SSUBTYP_DWPBNMS
|
|
DwarfPubTypesSection = nullptr; // SSUBTYP_DWPBTYP
|
|
DwarfStrSection = nullptr; // SSUBTYP_DWSTR
|
|
DwarfLocSection = nullptr; // SSUBTYP_DWLOC
|
|
DwarfARangesSection = nullptr; // SSUBTYP_DWARNGE
|
|
DwarfRangesSection = nullptr; // SSUBTYP_DWRNGES
|
|
DwarfMacinfoSection = nullptr; // SSUBTYP_DWMAC
|
|
}
|
|
|
|
void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple, bool PIC,
|
|
MCContext &ctx,
|
|
bool LargeCodeModel) {
|
|
PositionIndependent = PIC;
|
|
Ctx = &ctx;
|
|
|
|
// Common.
|
|
CommDirectiveSupportsAlignment = true;
|
|
SupportsWeakOmittedEHFrame = true;
|
|
SupportsCompactUnwindWithoutEHFrame = false;
|
|
OmitDwarfIfHaveCompactUnwind = false;
|
|
|
|
FDECFIEncoding = dwarf::DW_EH_PE_absptr;
|
|
|
|
CompactUnwindDwarfEHFrameOnly = 0;
|
|
|
|
EHFrameSection = nullptr; // Created on demand.
|
|
CompactUnwindSection = nullptr; // Used only by selected targets.
|
|
DwarfAccelNamesSection = nullptr; // Used only by selected targets.
|
|
DwarfAccelObjCSection = nullptr; // Used only by selected targets.
|
|
DwarfAccelNamespaceSection = nullptr; // Used only by selected targets.
|
|
DwarfAccelTypesSection = nullptr; // Used only by selected targets.
|
|
|
|
TT = TheTriple;
|
|
|
|
switch (TT.getObjectFormat()) {
|
|
case Triple::MachO:
|
|
Env = IsMachO;
|
|
initMachOMCObjectFileInfo(TT);
|
|
break;
|
|
case Triple::COFF:
|
|
if (!TT.isOSWindows())
|
|
report_fatal_error(
|
|
"Cannot initialize MC for non-Windows COFF object files.");
|
|
|
|
Env = IsCOFF;
|
|
initCOFFMCObjectFileInfo(TT);
|
|
break;
|
|
case Triple::ELF:
|
|
Env = IsELF;
|
|
initELFMCObjectFileInfo(TT, LargeCodeModel);
|
|
break;
|
|
case Triple::Wasm:
|
|
Env = IsWasm;
|
|
initWasmMCObjectFileInfo(TT);
|
|
break;
|
|
case Triple::GOFF:
|
|
report_fatal_error("Cannot initialize MC for GOFF object file format");
|
|
break;
|
|
case Triple::XCOFF:
|
|
Env = IsXCOFF;
|
|
initXCOFFMCObjectFileInfo(TT);
|
|
break;
|
|
case Triple::UnknownObjectFormat:
|
|
report_fatal_error("Cannot initialize MC for unknown object file format.");
|
|
break;
|
|
}
|
|
}
|
|
|
|
MCSection *MCObjectFileInfo::getDwarfComdatSection(const char *Name,
|
|
uint64_t Hash) const {
|
|
switch (TT.getObjectFormat()) {
|
|
case Triple::ELF:
|
|
return Ctx->getELFSection(Name, ELF::SHT_PROGBITS, ELF::SHF_GROUP, 0,
|
|
utostr(Hash));
|
|
case Triple::MachO:
|
|
case Triple::COFF:
|
|
case Triple::Wasm:
|
|
case Triple::GOFF:
|
|
case Triple::XCOFF:
|
|
case Triple::UnknownObjectFormat:
|
|
report_fatal_error("Cannot get DWARF comdat section for this object file "
|
|
"format: not implemented.");
|
|
break;
|
|
}
|
|
llvm_unreachable("Unknown ObjectFormatType");
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
return Ctx->getELFSection(".stack_sizes", ELF::SHT_PROGBITS, Flags, 0,
|
|
GroupName, MCSection::NonUniqueID,
|
|
cast<MCSymbolELF>(TextSec.getBeginSymbol()));
|
|
}
|