LLVM 23.0.0git
MCObjectFileInfo.cpp
Go to the documentation of this file.
1//===-- MCObjectFileInfo.cpp - Object File Information --------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
16#include "llvm/MC/MCAsmInfo.h"
17#include "llvm/MC/MCContext.h"
19#include "llvm/MC/MCSection.h"
29#include "llvm/MC/SectionKind.h"
31
32using namespace llvm;
33
34static bool useCompactUnwind(const Triple &T) {
35 // Only on darwin.
36 if (!T.isOSDarwin())
37 return false;
38
39 // aarch64 always has it.
40 if (T.getArch() == Triple::aarch64 || T.getArch() == Triple::aarch64_32)
41 return true;
42
43 // armv7k always has it.
44 if (T.isWatchABI())
45 return true;
46
47 // Use it on newer version of OS X.
48 if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6))
49 return true;
50
51 // And the iOS simulator.
52 if (T.isiOS() && T.isX86())
53 return true;
54
55 // The rest of the simulators always have it.
56 if (T.isSimulatorEnvironment())
57 return true;
58
59 // XROS always has it.
60 if (T.isXROS())
61 return true;
62
63 return false;
64}
65
66void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {
67 EHFrameSection = Ctx->getMachOSection(
68 "__TEXT", "__eh_frame",
72
73 if (T.isOSDarwin() &&
74 (T.getArch() == Triple::aarch64 || T.getArch() == Triple::aarch64_32 ||
75 T.isSimulatorEnvironment()))
77
78 switch (Ctx->emitDwarfUnwindInfo()) {
82 break;
85 break;
89 break;
90 }
91
93
94 TextSection // .text
95 = Ctx->getMachOSection("__TEXT", "__text",
98 DataSection // .data
99 = Ctx->getMachOSection("__DATA", "__data", 0, SectionKind::getData());
100
101 // BSSSection might not be expected initialized on msvc.
102 BSSSection = nullptr;
103
104 TLSDataSection // .tdata
105 = Ctx->getMachOSection("__DATA", "__thread_data",
108 TLSBSSSection // .tbss
109 = Ctx->getMachOSection("__DATA", "__thread_bss",
112
113 // TODO: Verify datarel below.
114 TLSTLVSection // .tlv
115 = Ctx->getMachOSection("__DATA", "__thread_vars",
118
119 TLSThreadInitSection = Ctx->getMachOSection(
120 "__DATA", "__thread_init", MachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
122
123 CStringSection // .cstring
124 = Ctx->getMachOSection("__TEXT", "__cstring",
128 = Ctx->getMachOSection("__TEXT","__ustring", 0,
130 FourByteConstantSection // .literal4
131 = Ctx->getMachOSection("__TEXT", "__literal4",
134 EightByteConstantSection // .literal8
135 = Ctx->getMachOSection("__TEXT", "__literal8",
138
139 SixteenByteConstantSection // .literal16
140 = Ctx->getMachOSection("__TEXT", "__literal16",
143
144 ReadOnlySection // .const
145 = Ctx->getMachOSection("__TEXT", "__const", 0,
147
148 // If the target is not powerpc, map the coal sections to the non-coal
149 // sections.
150 //
151 // "__TEXT/__textcoal_nt" => section "__TEXT/__text"
152 // "__TEXT/__const_coal" => section "__TEXT/__const"
153 // "__DATA/__datacoal_nt" => section "__DATA/__data"
154 Triple::ArchType ArchTy = T.getArch();
155
156 ConstDataSection // .const_data
157 = Ctx->getMachOSection("__DATA", "__const", 0,
159
160 if (ArchTy == Triple::ppc || ArchTy == Triple::ppc64) {
162 = Ctx->getMachOSection("__TEXT", "__textcoal_nt",
167 = Ctx->getMachOSection("__TEXT", "__const_coal",
170 DataCoalSection = Ctx->getMachOSection(
171 "__DATA", "__datacoal_nt", MachO::S_COALESCED, SectionKind::getData());
173 } else {
178 }
179
181 = Ctx->getMachOSection("__DATA","__common",
185 = Ctx->getMachOSection("__DATA","__bss", MachO::S_ZEROFILL,
187
188
190 = Ctx->getMachOSection("__DATA", "__la_symbol_ptr",
194 = Ctx->getMachOSection("__DATA", "__nl_symbol_ptr",
197
199 = Ctx->getMachOSection("__DATA", "__thread_ptr",
202
203 AddrSigSection = Ctx->getMachOSection("__DATA", "__llvm_addrsig", 0,
205
206 // Exception Handling.
207 LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
209
210 COFFDebugSymbolsSection = nullptr;
211 COFFDebugTypesSection = nullptr;
213
214 if (useCompactUnwind(T)) {
216 Ctx->getMachOSection("__LD", "__compact_unwind", MachO::S_ATTR_DEBUG,
218
219 if (T.isX86())
220 CompactUnwindDwarfEHFrameOnly = 0x04000000; // UNWIND_X86_64_MODE_DWARF
221 else if (T.getArch() == Triple::aarch64 || T.getArch() == Triple::aarch64_32)
222 CompactUnwindDwarfEHFrameOnly = 0x03000000; // UNWIND_ARM64_MODE_DWARF
223 else if (T.getArch() == Triple::arm || T.getArch() == Triple::thumb)
224 CompactUnwindDwarfEHFrameOnly = 0x04000000; // UNWIND_ARM_MODE_DWARF
225 }
226
227 // Debug Information.
229 Ctx->getMachOSection("__DWARF", "__debug_names", MachO::S_ATTR_DEBUG,
230 SectionKind::getMetadata(), "debug_names_begin");
232 Ctx->getMachOSection("__DWARF", "__apple_names", MachO::S_ATTR_DEBUG,
233 SectionKind::getMetadata(), "names_begin");
235 Ctx->getMachOSection("__DWARF", "__apple_objc", MachO::S_ATTR_DEBUG,
236 SectionKind::getMetadata(), "objc_begin");
237 // 16 character section limit...
239 Ctx->getMachOSection("__DWARF", "__apple_namespac", MachO::S_ATTR_DEBUG,
240 SectionKind::getMetadata(), "namespac_begin");
242 Ctx->getMachOSection("__DWARF", "__apple_types", MachO::S_ATTR_DEBUG,
243 SectionKind::getMetadata(), "types_begin");
244
246 Ctx->getMachOSection("__DWARF", "__swift_ast", MachO::S_ATTR_DEBUG,
248
250 Ctx->getMachOSection("__DWARF", "__debug_abbrev", MachO::S_ATTR_DEBUG,
251 SectionKind::getMetadata(), "section_abbrev");
253 Ctx->getMachOSection("__DWARF", "__debug_info", MachO::S_ATTR_DEBUG,
254 SectionKind::getMetadata(), "section_info");
256 Ctx->getMachOSection("__DWARF", "__debug_line", MachO::S_ATTR_DEBUG,
257 SectionKind::getMetadata(), "section_line");
259 Ctx->getMachOSection("__DWARF", "__debug_line_str", MachO::S_ATTR_DEBUG,
260 SectionKind::getMetadata(), "section_line_str");
262 Ctx->getMachOSection("__DWARF", "__debug_frame", MachO::S_ATTR_DEBUG,
263 SectionKind::getMetadata(), "section_frame");
265 Ctx->getMachOSection("__DWARF", "__debug_pubnames", MachO::S_ATTR_DEBUG,
268 Ctx->getMachOSection("__DWARF", "__debug_pubtypes", MachO::S_ATTR_DEBUG,
271 Ctx->getMachOSection("__DWARF", "__debug_gnu_pubn", MachO::S_ATTR_DEBUG,
274 Ctx->getMachOSection("__DWARF", "__debug_gnu_pubt", MachO::S_ATTR_DEBUG,
277 Ctx->getMachOSection("__DWARF", "__debug_str", MachO::S_ATTR_DEBUG,
278 SectionKind::getMetadata(), "info_string");
280 Ctx->getMachOSection("__DWARF", "__debug_str_offs", MachO::S_ATTR_DEBUG,
281 SectionKind::getMetadata(), "section_str_off");
283 Ctx->getMachOSection("__DWARF", "__debug_addr", MachO::S_ATTR_DEBUG,
284 SectionKind::getMetadata(), "section_info");
286 Ctx->getMachOSection("__DWARF", "__debug_loc", MachO::S_ATTR_DEBUG,
287 SectionKind::getMetadata(), "section_debug_loc");
289 Ctx->getMachOSection("__DWARF", "__debug_loclists", MachO::S_ATTR_DEBUG,
290 SectionKind::getMetadata(), "section_debug_loc");
291
293 Ctx->getMachOSection("__DWARF", "__debug_aranges", MachO::S_ATTR_DEBUG,
296 Ctx->getMachOSection("__DWARF", "__debug_ranges", MachO::S_ATTR_DEBUG,
297 SectionKind::getMetadata(), "debug_range");
299 Ctx->getMachOSection("__DWARF", "__debug_rnglists", MachO::S_ATTR_DEBUG,
300 SectionKind::getMetadata(), "debug_range");
302 Ctx->getMachOSection("__DWARF", "__debug_macinfo", MachO::S_ATTR_DEBUG,
303 SectionKind::getMetadata(), "debug_macinfo");
305 Ctx->getMachOSection("__DWARF", "__debug_macro", MachO::S_ATTR_DEBUG,
306 SectionKind::getMetadata(), "debug_macro");
308 Ctx->getMachOSection("__DWARF", "__debug_inlined", MachO::S_ATTR_DEBUG,
311 Ctx->getMachOSection("__DWARF", "__debug_cu_index", MachO::S_ATTR_DEBUG,
314 Ctx->getMachOSection("__DWARF", "__debug_tu_index", MachO::S_ATTR_DEBUG,
316 StackMapSection = Ctx->getMachOSection("__LLVM_STACKMAPS", "__llvm_stackmaps",
318
319 FaultMapSection = Ctx->getMachOSection("__LLVM_FAULTMAPS", "__llvm_faultmaps",
321
322 RemarksSection = Ctx->getMachOSection(
323 "__LLVM", "__remarks", MachO::S_ATTR_DEBUG, SectionKind::getMetadata());
324
326 Ctx->getMachOSection("__PSEUDO_PROBE", "__probes",
330 Ctx->getMachOSection("__PSEUDO_PROBE", "__probe_descs",
333
334 // The architecture of dsymutil makes it very difficult to copy the Swift
335 // reflection metadata sections into the __TEXT segment, so dsymutil creates
336 // these sections in the __DWARF segment instead.
337 if (!Ctx->getSwift5ReflectionSegmentName().empty()) {
338#define HANDLE_SWIFT_SECTION(KIND, MACHO, ELF, COFF) \
339 Swift5ReflectionSections \
340 [llvm::binaryformat::Swift5ReflectionSectionKind::KIND] = \
341 Ctx->getMachOSection(Ctx->getSwift5ReflectionSegmentName().data(), \
342 MACHO, 0, SectionKind::getMetadata());
343#include "llvm/BinaryFormat/Swift.def"
344 }
345
347}
348
349void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {
350 switch (T.getArch()) {
351 case Triple::mips:
352 case Triple::mipsel:
353 case Triple::mips64:
354 case Triple::mips64el:
355 // We cannot use DW_EH_PE_sdata8 for the large PositionIndependent case
356 // since there is no R_MIPS_PC64 relocation (only a 32-bit version).
357 // In fact DW_EH_PE_sdata4 is enough for us now, and GNU ld doesn't
358 // support pcrel|sdata8 well. Let's use sdata4 for now.
359 if (PositionIndependent)
361 else
362 FDECFIEncoding = Ctx->getAsmInfo().getCodePointerSize() == 4
365 break;
366 case Triple::ppc64:
367 case Triple::ppc64le:
368 case Triple::aarch64:
370 case Triple::x86_64:
372 ((Large || Ctx->getTargetOptions().LargeEHEncoding)
375 break;
376 case Triple::bpfel:
377 case Triple::bpfeb:
379 break;
380 case Triple::hexagon:
382 PositionIndependent ? dwarf::DW_EH_PE_pcrel : dwarf::DW_EH_PE_absptr;
383 break;
384 case Triple::xtensa:
386 break;
387 default:
389 break;
390 }
391
392 unsigned EHSectionType = T.getArch() == Triple::x86_64
395 switch (T.getArch()) {
396 case Triple::x86_64:
397 SFrameABIArch = sframe::ABI::AMD64EndianLittle;
398 break;
399 case Triple::aarch64:
400 SFrameABIArch = sframe::ABI::AArch64EndianLittle;
401 break;
403 SFrameABIArch = sframe::ABI::AArch64EndianBig;
404 break;
405 default:
406 break;
407 }
408
409 // Solaris requires different flags for .eh_frame to seemingly every other
410 // platform.
411 unsigned EHSectionFlags = ELF::SHF_ALLOC;
412 if (T.isOSSolaris() && T.getArch() != Triple::x86_64)
413 EHSectionFlags |= ELF::SHF_WRITE;
414
415 // ELF
416 BSSSection = Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
418
419 TextSection = Ctx->getELFSection(".text", ELF::SHT_PROGBITS,
421
422 DataSection = Ctx->getELFSection(".data", ELF::SHT_PROGBITS,
424
426 Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
427
429 Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
431
432 TLSBSSSection = Ctx->getELFSection(
434
435 DataRelROSection = Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
437
438 unsigned MergeableCstFlags = ELF::SHF_ALLOC | ELF::SHF_MERGE;
439 StringRef CstPrefix = ".rodata";
440 if (Large && T.getArch() == Triple::x86_64) {
441 MergeableCstFlags |= ELF::SHF_X86_64_LARGE;
442 CstPrefix = ".lrodata";
443 }
444
445 MergeableConst4Section = Ctx->getELFSection(
446 CstPrefix + ".cst4", ELF::SHT_PROGBITS, MergeableCstFlags, 4);
447
448 MergeableConst8Section = Ctx->getELFSection(
449 CstPrefix + ".cst8", ELF::SHT_PROGBITS, MergeableCstFlags, 8);
450
451 MergeableConst16Section = Ctx->getELFSection(
452 CstPrefix + ".cst16", ELF::SHT_PROGBITS, MergeableCstFlags, 16);
453
454 MergeableConst32Section = Ctx->getELFSection(
455 CstPrefix + ".cst32", ELF::SHT_PROGBITS, MergeableCstFlags, 32);
456
457 // Exception Handling Sections.
458
459 // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
460 // it contains relocatable pointers. In PIC mode, this is probably a big
461 // runtime hit for C++ apps. Either the contents of the LSDA need to be
462 // adjusted or this should be a data section.
463 LSDASection = Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
465
466 COFFDebugSymbolsSection = nullptr;
467 COFFDebugTypesSection = nullptr;
468
469 unsigned DebugSecType = ELF::SHT_PROGBITS;
470
471 // MIPS .debug_* sections should have SHT_MIPS_DWARF section type
472 // to distinguish among sections contain DWARF and ECOFF debug formats.
473 // Sections with ECOFF debug format are obsoleted and marked by SHT_PROGBITS.
474 if (T.isMIPS())
475 DebugSecType = ELF::SHT_MIPS_DWARF;
476
477 // Debug Info Sections.
479 Ctx->getELFSection(".debug_abbrev", DebugSecType, 0);
480 DwarfInfoSection = Ctx->getELFSection(".debug_info", DebugSecType, 0);
481 DwarfLineSection = Ctx->getELFSection(".debug_line", DebugSecType, 0);
483 Ctx->getELFSection(".debug_line_str", DebugSecType,
485 DwarfFrameSection = Ctx->getELFSection(".debug_frame", DebugSecType, 0);
487 Ctx->getELFSection(".debug_pubnames", DebugSecType, 0);
489 Ctx->getELFSection(".debug_pubtypes", DebugSecType, 0);
491 Ctx->getELFSection(".debug_gnu_pubnames", DebugSecType, 0);
493 Ctx->getELFSection(".debug_gnu_pubtypes", DebugSecType, 0);
495 Ctx->getELFSection(".debug_str", DebugSecType,
497 DwarfLocSection = Ctx->getELFSection(".debug_loc", DebugSecType, 0);
499 Ctx->getELFSection(".debug_aranges", DebugSecType, 0);
501 Ctx->getELFSection(".debug_ranges", DebugSecType, 0);
503 Ctx->getELFSection(".debug_macinfo", DebugSecType, 0);
504 DwarfMacroSection = Ctx->getELFSection(".debug_macro", DebugSecType, 0);
505
506 // DWARF5 Experimental Debug Info
507
508 // Accelerator Tables
510 Ctx->getELFSection(".debug_names", ELF::SHT_PROGBITS, 0);
512 Ctx->getELFSection(".apple_names", ELF::SHT_PROGBITS, 0);
514 Ctx->getELFSection(".apple_objc", ELF::SHT_PROGBITS, 0);
516 Ctx->getELFSection(".apple_namespaces", ELF::SHT_PROGBITS, 0);
518 Ctx->getELFSection(".apple_types", ELF::SHT_PROGBITS, 0);
519
520 // String Offset and Address Sections
522 Ctx->getELFSection(".debug_str_offsets", DebugSecType, 0);
523 DwarfAddrSection = Ctx->getELFSection(".debug_addr", DebugSecType, 0);
524 DwarfRnglistsSection = Ctx->getELFSection(".debug_rnglists", DebugSecType, 0);
525 DwarfLoclistsSection = Ctx->getELFSection(".debug_loclists", DebugSecType, 0);
526
527 // Fission Sections
529 Ctx->getELFSection(".debug_info.dwo", DebugSecType, ELF::SHF_EXCLUDE);
531 Ctx->getELFSection(".debug_types.dwo", DebugSecType, ELF::SHF_EXCLUDE);
533 Ctx->getELFSection(".debug_abbrev.dwo", DebugSecType, ELF::SHF_EXCLUDE);
534 DwarfStrDWOSection = Ctx->getELFSection(
535 ".debug_str.dwo", DebugSecType,
538 Ctx->getELFSection(".debug_line.dwo", DebugSecType, ELF::SHF_EXCLUDE);
540 Ctx->getELFSection(".debug_loc.dwo", DebugSecType, ELF::SHF_EXCLUDE);
541 DwarfStrOffDWOSection = Ctx->getELFSection(".debug_str_offsets.dwo",
542 DebugSecType, ELF::SHF_EXCLUDE);
544 Ctx->getELFSection(".debug_rnglists.dwo", DebugSecType, ELF::SHF_EXCLUDE);
546 Ctx->getELFSection(".debug_macinfo.dwo", DebugSecType, ELF::SHF_EXCLUDE);
548 Ctx->getELFSection(".debug_macro.dwo", DebugSecType, ELF::SHF_EXCLUDE);
549
551 Ctx->getELFSection(".debug_loclists.dwo", DebugSecType, ELF::SHF_EXCLUDE);
552
553 // DWP Sections
555 Ctx->getELFSection(".debug_cu_index", DebugSecType, 0);
557 Ctx->getELFSection(".debug_tu_index", DebugSecType, 0);
558
560 Ctx->getELFSection(".llvm_stackmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
561
563 Ctx->getELFSection(".llvm_faultmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
564
566 Ctx->getELFSection(".eh_frame", EHSectionType, EHSectionFlags);
567
569 Ctx->getELFSection(".sframe", ELF::SHT_GNU_SFRAME, ELF::SHF_ALLOC);
570
572 Ctx->getELFSection(".llvm.callgraph", ELF::SHT_LLVM_CALL_GRAPH, 0);
573
574 StackSizesSection = Ctx->getELFSection(".stack_sizes", ELF::SHT_PROGBITS, 0);
575
576 PseudoProbeSection = Ctx->getELFSection(".pseudo_probe", DebugSecType, 0);
578 Ctx->getELFSection(".pseudo_probe_desc", DebugSecType, 0);
579
580 LLVMStatsSection = Ctx->getELFSection(".llvm_stats", ELF::SHT_PROGBITS, 0);
581}
582
583void MCObjectFileInfo::initGOFFMCObjectFileInfo(const Triple &T) {
584 MCSectionGOFF *RootSDSection = Ctx->getGOFFSection(
587
588 MCSectionGOFF *ADAEDSection = Ctx->getGOFFSection(
590 GOFF::EDAttr{false, GOFF::ESD_RMODE_64, GOFF::ESD_NS_Parts,
593 RootSDSection);
594 ADAEDSection->setAlignment(Align(16)); // Quadword
595 ADASection = Ctx->getGOFFSection(SectionKind::getData(), "#S",
596 GOFF::PRAttr{false, GOFF::ESD_EXE_DATA,
599 ADAEDSection);
600
601 TextSection = Ctx->getGOFFSection(
606 RootSDSection);
607 TextSection->setAlignment(Align(8)); // Doubleword
608
609 MCSectionGOFF *PPA2ListEDSection = Ctx->getGOFFSection(
611 GOFF::EDAttr{true, GOFF::ESD_RMODE_64, GOFF::ESD_NS_Parts,
614 RootSDSection);
615 PPA2ListEDSection->setAlignment(Align(8)); // Doubleword
616 PPA2ListSection = Ctx->getGOFFSection(SectionKind::getData(), ".&ppa2",
617 GOFF::PRAttr{true, GOFF::ESD_EXE_DATA,
620 PPA2ListEDSection);
621
622 IDRLSection = Ctx->getGOFFSection(
623 SectionKind::getData(), "B_IDRL",
627 RootSDSection);
628 IDRLSection->setAlignment(Align(8)); // Doubleword
629
630 // Debug Info Sections. The ED name is the same used by the XL compiler.
631 auto InitDebugSection = [this,
632 RootSDSection](StringRef EDName,
633 StringRef LDName) -> MCSectionGOFF * {
634 MCSectionGOFF *ED = Ctx->getGOFFSection(
635 SectionKind::getMetadata(), EDName,
636 GOFF::EDAttr{false, GOFF::ESD_RMODE_64, GOFF::ESD_NS_Parts,
639 RootSDSection);
640 ED->setAlignment(Align(8)); // Doubleword
641 // At least for llc, this function is called twice! (See function
642 // compileModule() in llc.cpp). Since the context is not cleared, the
643 // already allocated section is returned above. We only add the begin symbol
644 // if it is not yet set to avoid an assertion.
645 MCSymbolGOFF *LD = static_cast<MCSymbolGOFF *>(ED->getBeginSymbol());
646 if (!LD) {
647 LD = static_cast<MCSymbolGOFF *>(getContext().getOrCreateSymbol(LDName));
648 LD->setCodeData(GOFF::ESD_EXE_DATA);
649 LD->setWeak(false);
650 LD->setLinkage(GOFF::ESD_LT_XPLink);
651 LD->setExternal(false);
652 ED->setBeginSymbol(LD);
653 } else
654 assert(LD->getName() == LDName && "Wrong label name");
655 return ED;
656 };
657 DwarfAbbrevSection = InitDebugSection("D_ABREV", ".debug_abbrev");
658 DwarfInfoSection = InitDebugSection("D_INFO", ".debug_info");
659 DwarfLineSection = InitDebugSection("D_LINE", ".debug_line");
660 DwarfFrameSection = InitDebugSection("D_FRAME", ".debug_frame");
661 DwarfPubNamesSection = InitDebugSection("D_PBNMS", ".debug_pubnames");
662 DwarfPubTypesSection = InitDebugSection("D_PTYPES", ".debug_pubtypes");
663 DwarfStrSection = InitDebugSection("D_STR", ".debug_str");
664 DwarfLocSection = InitDebugSection("D_LOC", ".debug_loc");
665 DwarfARangesSection = InitDebugSection("D_ARNGE", ".debug_aranges");
666 DwarfRangesSection = InitDebugSection("D_RNGES", ".debug_ranges");
667 DwarfMacinfoSection = InitDebugSection("D_MACIN", ".debug_macinfo");
668
669 // DWARF 5 sections.
670 DwarfDebugNamesSection = InitDebugSection("D_NAMES", ".debug_names");
671 DwarfStrOffSection = InitDebugSection("D_STROFFS", ".debug_str_offsets");
672 DwarfAddrSection = InitDebugSection("D_ADDR", ".debug_addr");
673 DwarfRnglistsSection = InitDebugSection("D_RNGLISTS", ".debug_rnglists");
674 DwarfLoclistsSection = InitDebugSection("D_LOCLISTS", ".debug_loclists");
675 DwarfLineStrSection = InitDebugSection("D_LINESTR", ".debug_line_str");
676
677 // Special GNU sections.
678 DwarfGnuPubNamesSection = InitDebugSection("D_GPBNMS", ".debug_gnu_pubnames");
680 InitDebugSection("D_GPTYPES", ".debug_gnu_pubtypes");
681
682 // Accelerator Tables.
683 DwarfAccelNamesSection = InitDebugSection("D_APPLNMS", ".apple_names");
685 InitDebugSection("D_APPLNMSP", ".apple_namespaces");
686 DwarfAccelTypesSection = InitDebugSection("D_APPLTYPS", ".apple_types");
687 DwarfAccelObjCSection = InitDebugSection("D_APPLOBJC", ".apple_objc");
688}
689
690void MCObjectFileInfo::initCOFFMCObjectFileInfo(const Triple &T) {
692 Ctx->getCOFFSection(".eh_frame", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
694
695 // Set the `IMAGE_SCN_MEM_16BIT` flag when compiling for thumb mode. This is
696 // used to indicate to the linker that the text segment contains thumb instructions
697 // and to set the ISA selection bit for calls accordingly.
698 const bool IsThumb = T.getArch() == Triple::thumb;
699
700 // COFF
701 BSSSection = Ctx->getCOFFSection(
704 TextSection = Ctx->getCOFFSection(
705 ".text",
709 DataSection = Ctx->getCOFFSection(
713 Ctx->getCOFFSection(".rdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
715
716 if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::aarch64 ||
717 T.getArch() == Triple::arm || T.getArch() == Triple::thumb) {
718 // On Windows with SEH, the LSDA is emitted into the .xdata section
719 LSDASection = nullptr;
720 } else {
721 LSDASection = Ctx->getCOFFSection(".gcc_except_table",
724 }
725
726 if (T.getArch() == Triple::aarch64) {
728 Ctx->getCOFFSection(".impcall", COFF::IMAGE_SCN_LNK_INFO);
729 } else if (T.getArch() == Triple::x86_64) {
730 // Import Call Optimization on x64 leverages the same metadata as the
731 // retpoline mitigation, hence the unusual section name.
733 Ctx->getCOFFSection(".retplne", COFF::IMAGE_SCN_LNK_INFO);
734 }
735
736 // Debug info.
738 Ctx->getCOFFSection(".debug$S", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
742 Ctx->getCOFFSection(".debug$T", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
746 Ctx->getCOFFSection(".debug$H", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
749
750 DwarfAbbrevSection = Ctx->getCOFFSection(
751 ".debug_abbrev", COFF::IMAGE_SCN_MEM_DISCARDABLE |
754 DwarfInfoSection = Ctx->getCOFFSection(
755 ".debug_info", COFF::IMAGE_SCN_MEM_DISCARDABLE |
758 DwarfLineSection = Ctx->getCOFFSection(
759 ".debug_line", COFF::IMAGE_SCN_MEM_DISCARDABLE |
762 DwarfLineStrSection = Ctx->getCOFFSection(
763 ".debug_line_str", COFF::IMAGE_SCN_MEM_DISCARDABLE |
766 DwarfFrameSection = Ctx->getCOFFSection(
767 ".debug_frame", COFF::IMAGE_SCN_MEM_DISCARDABLE |
770 DwarfPubNamesSection = Ctx->getCOFFSection(
771 ".debug_pubnames", COFF::IMAGE_SCN_MEM_DISCARDABLE |
774 DwarfPubTypesSection = Ctx->getCOFFSection(
775 ".debug_pubtypes", COFF::IMAGE_SCN_MEM_DISCARDABLE |
778 DwarfGnuPubNamesSection = Ctx->getCOFFSection(
779 ".debug_gnu_pubnames", COFF::IMAGE_SCN_MEM_DISCARDABLE |
782 DwarfGnuPubTypesSection = Ctx->getCOFFSection(
783 ".debug_gnu_pubtypes", COFF::IMAGE_SCN_MEM_DISCARDABLE |
786 DwarfStrSection = Ctx->getCOFFSection(
787 ".debug_str", COFF::IMAGE_SCN_MEM_DISCARDABLE |
790 DwarfStrOffSection = Ctx->getCOFFSection(
791 ".debug_str_offsets", COFF::IMAGE_SCN_MEM_DISCARDABLE |
794 DwarfLocSection = Ctx->getCOFFSection(
795 ".debug_loc", COFF::IMAGE_SCN_MEM_DISCARDABLE |
798 DwarfLoclistsSection = Ctx->getCOFFSection(
799 ".debug_loclists", COFF::IMAGE_SCN_MEM_DISCARDABLE |
802 DwarfARangesSection = Ctx->getCOFFSection(
803 ".debug_aranges", COFF::IMAGE_SCN_MEM_DISCARDABLE |
806 DwarfRangesSection = Ctx->getCOFFSection(
807 ".debug_ranges", COFF::IMAGE_SCN_MEM_DISCARDABLE |
810 DwarfRnglistsSection = Ctx->getCOFFSection(
811 ".debug_rnglists", COFF::IMAGE_SCN_MEM_DISCARDABLE |
814 DwarfMacinfoSection = Ctx->getCOFFSection(
815 ".debug_macinfo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
818 DwarfMacroSection = Ctx->getCOFFSection(
819 ".debug_macro", COFF::IMAGE_SCN_MEM_DISCARDABLE |
822 DwarfMacinfoDWOSection = Ctx->getCOFFSection(
823 ".debug_macinfo.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
827 DwarfMacroDWOSection = Ctx->getCOFFSection(
828 ".debug_macro.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
832 DwarfInfoDWOSection = Ctx->getCOFFSection(
833 ".debug_info.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
837 DwarfTypesDWOSection = Ctx->getCOFFSection(
838 ".debug_types.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
842 DwarfAbbrevDWOSection = Ctx->getCOFFSection(
843 ".debug_abbrev.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
847 DwarfStrDWOSection = Ctx->getCOFFSection(
848 ".debug_str.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
852 DwarfLineDWOSection = Ctx->getCOFFSection(
853 ".debug_line.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
857 DwarfLocDWOSection = Ctx->getCOFFSection(
858 ".debug_loc.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
862 DwarfLoclistsDWOSection = Ctx->getCOFFSection(
863 ".debug_loclists.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
867 DwarfStrOffDWOSection = Ctx->getCOFFSection(
868 ".debug_str_offsets.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
872 DwarfRnglistsDWOSection = Ctx->getCOFFSection(
873 ".debug_rnglists.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
877 DwarfAddrSection = Ctx->getCOFFSection(
878 ".debug_addr", COFF::IMAGE_SCN_MEM_DISCARDABLE |
881 DwarfCUIndexSection = Ctx->getCOFFSection(
882 ".debug_cu_index", COFF::IMAGE_SCN_MEM_DISCARDABLE |
885 DwarfTUIndexSection = Ctx->getCOFFSection(
886 ".debug_tu_index", COFF::IMAGE_SCN_MEM_DISCARDABLE |
889 DwarfDebugNamesSection = Ctx->getCOFFSection(
890 ".debug_names", COFF::IMAGE_SCN_MEM_DISCARDABLE |
893 DwarfAccelNamesSection = Ctx->getCOFFSection(
894 ".apple_names", COFF::IMAGE_SCN_MEM_DISCARDABLE |
897 DwarfAccelNamespaceSection = Ctx->getCOFFSection(
898 ".apple_namespaces", COFF::IMAGE_SCN_MEM_DISCARDABLE |
901 DwarfAccelTypesSection = Ctx->getCOFFSection(
902 ".apple_types", COFF::IMAGE_SCN_MEM_DISCARDABLE |
905 DwarfAccelObjCSection = Ctx->getCOFFSection(
906 ".apple_objc", COFF::IMAGE_SCN_MEM_DISCARDABLE |
909
910 DrectveSection = Ctx->getCOFFSection(
912
914 Ctx->getCOFFSection(".pdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
916
918 Ctx->getCOFFSection(".xdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
920
921 SXDataSection = Ctx->getCOFFSection(".sxdata", COFF::IMAGE_SCN_LNK_INFO);
922
924 Ctx->getCOFFSection(".gehcont$y", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
926
928 Ctx->getCOFFSection(".gfids$y", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
930
932 Ctx->getCOFFSection(".giats$y", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
934
936 Ctx->getCOFFSection(".gljmp$y", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
938
939 TLSDataSection = Ctx->getCOFFSection(
942
943 StackMapSection = Ctx->getCOFFSection(".llvm_stackmaps",
946
947 // Set IMAGE_SCN_MEM_DISCARDABLE so that lld will not truncate section name.
948 PseudoProbeSection = Ctx->getCOFFSection(
949 ".pseudo_probe", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
952 PseudoProbeDescSection = Ctx->getCOFFSection(
953 ".pseudo_probe_desc", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
956}
957
958void MCObjectFileInfo::initSPIRVMCObjectFileInfo(const Triple &T) {
959 // Put everything in a single binary section.
960 TextSection = Ctx->getSPIRVSection();
961}
962
963void MCObjectFileInfo::initWasmMCObjectFileInfo(const Triple &T) {
964 TextSection = Ctx->getWasmSection(".text", SectionKind::getText());
965 DataSection = Ctx->getWasmSection(".data", SectionKind::getData());
966
968 Ctx->getWasmSection(".debug_line", SectionKind::getMetadata());
970 Ctx->getWasmSection(".debug_line_str", SectionKind::getMetadata(),
972 DwarfStrSection = Ctx->getWasmSection(
975 Ctx->getWasmSection(".debug_loc", SectionKind::getMetadata());
977 Ctx->getWasmSection(".debug_abbrev", SectionKind::getMetadata());
978 DwarfARangesSection = Ctx->getWasmSection(".debug_aranges", SectionKind::getMetadata());
980 Ctx->getWasmSection(".debug_ranges", SectionKind::getMetadata());
982 Ctx->getWasmSection(".debug_macinfo", SectionKind::getMetadata());
984 Ctx->getWasmSection(".debug_macro", SectionKind::getMetadata());
985 DwarfCUIndexSection = Ctx->getWasmSection(".debug_cu_index", SectionKind::getMetadata());
986 DwarfTUIndexSection = Ctx->getWasmSection(".debug_tu_index", SectionKind::getMetadata());
988 Ctx->getWasmSection(".debug_info", SectionKind::getMetadata());
989 DwarfFrameSection = Ctx->getWasmSection(".debug_frame", SectionKind::getMetadata());
990 DwarfPubNamesSection = Ctx->getWasmSection(".debug_pubnames", SectionKind::getMetadata());
991 DwarfPubTypesSection = Ctx->getWasmSection(".debug_pubtypes", SectionKind::getMetadata());
993 Ctx->getWasmSection(".debug_gnu_pubnames", SectionKind::getMetadata());
995 Ctx->getWasmSection(".debug_gnu_pubtypes", SectionKind::getMetadata());
996
998 Ctx->getWasmSection(".debug_names", SectionKind::getMetadata());
1000 Ctx->getWasmSection(".debug_str_offsets", SectionKind::getMetadata());
1002 Ctx->getWasmSection(".debug_addr", SectionKind::getMetadata());
1004 Ctx->getWasmSection(".debug_rnglists", SectionKind::getMetadata());
1006 Ctx->getWasmSection(".debug_loclists", SectionKind::getMetadata());
1007
1008 // Fission Sections
1010 Ctx->getWasmSection(".debug_info.dwo", SectionKind::getMetadata());
1012 Ctx->getWasmSection(".debug_types.dwo", SectionKind::getMetadata());
1014 Ctx->getWasmSection(".debug_abbrev.dwo", SectionKind::getMetadata());
1016 Ctx->getWasmSection(".debug_str.dwo", SectionKind::getMetadata(),
1019 Ctx->getWasmSection(".debug_line.dwo", SectionKind::getMetadata());
1021 Ctx->getWasmSection(".debug_loc.dwo", SectionKind::getMetadata());
1023 Ctx->getWasmSection(".debug_str_offsets.dwo", SectionKind::getMetadata());
1025 Ctx->getWasmSection(".debug_rnglists.dwo", SectionKind::getMetadata());
1027 Ctx->getWasmSection(".debug_macinfo.dwo", SectionKind::getMetadata());
1029 Ctx->getWasmSection(".debug_macro.dwo", SectionKind::getMetadata());
1030
1032 Ctx->getWasmSection(".debug_loclists.dwo", SectionKind::getMetadata());
1033
1034 // DWP Sections
1036 Ctx->getWasmSection(".debug_cu_index", SectionKind::getMetadata());
1038 Ctx->getWasmSection(".debug_tu_index", SectionKind::getMetadata());
1039
1040 // Wasm use data section for LSDA.
1041 // TODO Consider putting each function's exception table in a separate
1042 // section, as in -function-sections, to facilitate lld's --gc-section.
1043 LSDASection = Ctx->getWasmSection(".rodata.gcc_except_table",
1045
1046 // TODO: Define more sections.
1047}
1048
1049void MCObjectFileInfo::initXCOFFMCObjectFileInfo(const Triple &T) {
1050 // The default csect for program code. Functions without a specified section
1051 // get placed into this csect. The choice of csect name is not a property of
1052 // the ABI or object file format, but various tools rely on the section
1053 // name being empty (considering named symbols to be "user symbol names").
1054 TextSection = Ctx->getXCOFFSection(
1055 "..text..", // Use a non-null name to work around an AIX assembler bug...
1057 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_PR, XCOFF::XTY_SD),
1058 /* MultiSymbolsAllowed*/ true);
1059
1060 // ... but use a null name when generating the symbol table.
1061 MCSectionXCOFF *TS = static_cast<MCSectionXCOFF *>(TextSection);
1063 TS->setSymbolTableName("");
1064
1065 DataSection = Ctx->getXCOFFSection(
1066 ".data", SectionKind::getData(),
1067 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RW, XCOFF::XTY_SD),
1068 /* MultiSymbolsAllowed*/ true);
1069
1070 ReadOnlySection = Ctx->getXCOFFSection(
1071 ".rodata", SectionKind::getReadOnly(),
1072 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD),
1073 /* MultiSymbolsAllowed*/ true);
1074 ReadOnlySection->setAlignment(Align(4));
1075
1076 ReadOnly8Section = Ctx->getXCOFFSection(
1077 ".rodata.8", SectionKind::getReadOnly(),
1078 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD),
1079 /* MultiSymbolsAllowed*/ true);
1080 ReadOnly8Section->setAlignment(Align(8));
1081
1082 ReadOnly16Section = Ctx->getXCOFFSection(
1083 ".rodata.16", SectionKind::getReadOnly(),
1084 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD),
1085 /* MultiSymbolsAllowed*/ true);
1086 ReadOnly16Section->setAlignment(Align(16));
1087
1088 TLSDataSection = Ctx->getXCOFFSection(
1089 ".tdata", SectionKind::getThreadData(),
1090 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_TL, XCOFF::XTY_SD),
1091 /* MultiSymbolsAllowed*/ true);
1092
1093 TOCBaseSection = Ctx->getXCOFFSection(
1094 "TOC", SectionKind::getData(),
1095 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_TC0,
1096 XCOFF::XTY_SD));
1097
1098 // The TOC-base always has 0 size, but 4 byte alignment.
1099 TOCBaseSection->setAlignment(Align(4));
1100
1101 LSDASection = Ctx->getXCOFFSection(
1102 ".gcc_except_table", SectionKind::getReadOnly(),
1103 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RO,
1104 XCOFF::XTY_SD));
1105
1106 CompactUnwindSection = Ctx->getXCOFFSection(
1107 ".eh_info_table", SectionKind::getData(),
1108 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RW,
1109 XCOFF::XTY_SD));
1110
1111 // DWARF sections for XCOFF are not csects. They are special STYP_DWARF
1112 // sections, and the individual DWARF sections are distinguished by their
1113 // section subtype.
1114 DwarfAbbrevSection = Ctx->getXCOFFSection(
1115 ".dwabrev", SectionKind::getMetadata(),
1116 /* CsectProperties */ std::nullopt,
1117 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWABREV);
1118
1119 DwarfInfoSection = Ctx->getXCOFFSection(
1120 ".dwinfo", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1121 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWINFO);
1122
1123 DwarfLineSection = Ctx->getXCOFFSection(
1124 ".dwline", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1125 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWLINE);
1126
1127 DwarfFrameSection = Ctx->getXCOFFSection(
1128 ".dwframe", SectionKind::getMetadata(),
1129 /* CsectProperties */ std::nullopt,
1130 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWFRAME);
1131
1132 DwarfPubNamesSection = Ctx->getXCOFFSection(
1133 ".dwpbnms", SectionKind::getMetadata(),
1134 /* CsectProperties */ std::nullopt,
1135 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWPBNMS);
1136
1137 DwarfPubTypesSection = Ctx->getXCOFFSection(
1138 ".dwpbtyp", SectionKind::getMetadata(),
1139 /* CsectProperties */ std::nullopt,
1140 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWPBTYP);
1141
1142 DwarfStrSection = Ctx->getXCOFFSection(
1143 ".dwstr", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1144 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWSTR);
1145
1146 DwarfLocSection = Ctx->getXCOFFSection(
1147 ".dwloc", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1148 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWLOC);
1149
1150 DwarfARangesSection = Ctx->getXCOFFSection(
1151 ".dwarnge", SectionKind::getMetadata(),
1152 /* CsectProperties */ std::nullopt,
1153 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWARNGE);
1154
1155 DwarfRangesSection = Ctx->getXCOFFSection(
1156 ".dwrnges", SectionKind::getMetadata(),
1157 /* CsectProperties */ std::nullopt,
1158 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWRNGES);
1159
1160 DwarfMacinfoSection = Ctx->getXCOFFSection(
1161 ".dwmac", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1162 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWMAC);
1163}
1164
1165void MCObjectFileInfo::initDXContainerObjectFileInfo(const Triple &T) {
1166 // At the moment the DXBC section should end up empty.
1167 TextSection = Ctx->getDXContainerSection("DXBC", SectionKind::getText());
1168}
1169
1171
1173 bool LargeCodeModel) {
1174 PositionIndependent = PIC;
1175 Ctx = &MCCtx;
1176
1177 // Common.
1180
1182
1184
1185 EHFrameSection = nullptr; // Created on demand.
1186 SFrameSection = nullptr; // Created on demand.
1187 CompactUnwindSection = nullptr; // Used only by selected targets.
1188 DwarfAccelNamesSection = nullptr; // Used only by selected targets.
1189 DwarfAccelObjCSection = nullptr; // Used only by selected targets.
1190 DwarfAccelNamespaceSection = nullptr; // Used only by selected targets.
1191 DwarfAccelTypesSection = nullptr; // Used only by selected targets.
1192
1193 const Triple &TheTriple = Ctx->getTargetTriple();
1194 switch (Ctx->getObjectFileType()) {
1195 case MCContext::IsMachO:
1196 initMachOMCObjectFileInfo(TheTriple);
1197 break;
1198 case MCContext::IsCOFF:
1199 initCOFFMCObjectFileInfo(TheTriple);
1200 break;
1201 case MCContext::IsELF:
1202 initELFMCObjectFileInfo(TheTriple, LargeCodeModel);
1203 break;
1204 case MCContext::IsGOFF:
1205 initGOFFMCObjectFileInfo(TheTriple);
1206 break;
1207 case MCContext::IsSPIRV:
1208 initSPIRVMCObjectFileInfo(TheTriple);
1209 break;
1210 case MCContext::IsWasm:
1211 initWasmMCObjectFileInfo(TheTriple);
1212 break;
1213 case MCContext::IsXCOFF:
1214 initXCOFFMCObjectFileInfo(TheTriple);
1215 break;
1217 initDXContainerObjectFileInfo(TheTriple);
1218 break;
1219 }
1220}
1221
1222MCSection *MCObjectFileInfo::getDwarfComdatSection(const char *Name,
1223 uint64_t Hash) const {
1224 switch (Ctx->getTargetTriple().getObjectFormat()) {
1225 case Triple::ELF:
1226 return Ctx->getELFSection(Name, ELF::SHT_PROGBITS, ELF::SHF_GROUP, 0,
1227 utostr(Hash), /*IsComdat=*/true);
1228 case Triple::Wasm:
1229 return Ctx->getWasmSection(Name, SectionKind::getMetadata(), 0,
1231 case Triple::MachO:
1232 case Triple::COFF:
1233 case Triple::GOFF:
1234 case Triple::SPIRV:
1235 case Triple::XCOFF:
1238 report_fatal_error("Cannot get DWARF comdat section for this object file "
1239 "format: not implemented.");
1240 break;
1241 }
1242 llvm_unreachable("Unknown ObjectFormatType");
1243}
1244
1245MCSection *
1247 if (Ctx->getObjectFileType() != MCContext::IsELF)
1248 return CallGraphSection;
1249
1250 const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
1251 unsigned Flags = ELF::SHF_LINK_ORDER;
1252 StringRef GroupName;
1253 if (const MCSymbol *Group = ElfSec.getGroup()) {
1254 GroupName = Group->getName();
1255 Flags |= ELF::SHF_GROUP;
1256 }
1257
1258 return Ctx->getELFSection(
1259 ".llvm.callgraph", ELF::SHT_LLVM_CALL_GRAPH, Flags, 0, GroupName,
1260 /*IsComdat=*/true, ElfSec.getUniqueID(),
1261 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1262}
1263
1264MCSection *
1266 if ((Ctx->getObjectFileType() != MCContext::IsELF) ||
1267 Ctx->getTargetTriple().isPS4())
1268 return StackSizesSection;
1269
1270 const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
1271 unsigned Flags = ELF::SHF_LINK_ORDER;
1272 StringRef GroupName;
1273 if (const MCSymbol *Group = ElfSec.getGroup()) {
1274 GroupName = Group->getName();
1275 Flags |= ELF::SHF_GROUP;
1276 }
1277
1278 return Ctx->getELFSection(
1279 ".stack_sizes", ELF::SHT_PROGBITS, Flags, 0, GroupName, true,
1280 ElfSec.getUniqueID(),
1281 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1282}
1283
1284MCSection *
1286 constexpr StringLiteral Name = ".llvm_bb_addr_map";
1287 if (Ctx->getObjectFileType() == MCContext::IsELF) {
1288 const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
1289 unsigned Flags = ELF::SHF_LINK_ORDER;
1290 StringRef GroupName;
1291 if (const MCSymbol *Group = ElfSec.getGroup()) {
1292 GroupName = Group->getName();
1293 Flags |= ELF::SHF_GROUP;
1294 }
1295
1296 // Use the text section's begin symbol and unique ID to create a separate
1297 // .llvm_bb_addr_map section associated with every unique text section.
1298 return Ctx->getELFSection(
1299 Name, ELF::SHT_LLVM_BB_ADDR_MAP, Flags, 0, GroupName, true,
1300 ElfSec.getUniqueID(),
1301 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1302 } else if (Ctx->getObjectFileType() == MCContext::IsCOFF) {
1303 StringRef COMDATSymName;
1304 int Selection = 0;
1305 unsigned Characteristics = COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1308 const auto &COFFSec = static_cast<const MCSectionCOFF &>(TextSec);
1309 if (const MCSymbol *COMDATSym = COFFSec.getCOMDATSymbol()) {
1310 if (!Ctx->getAsmInfo().hasCOFFAssociativeComdats())
1311 report_fatal_error("BB address map requires associative COMDAT "
1312 "support for COMDAT functions");
1313 COMDATSymName = COMDATSym->getName();
1314 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1316 }
1317 return Ctx->getCOFFSection(Name, Characteristics, COMDATSymName, Selection,
1318 COFFSec.getUniqueID());
1319 }
1320
1321 return nullptr;
1322}
1323
1324MCSection *
1326 if (Ctx->getObjectFileType() != MCContext::IsELF)
1327 return nullptr;
1328
1329 const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
1330 unsigned Flags = ELF::SHF_LINK_ORDER | ELF::SHF_ALLOC;
1331 StringRef GroupName;
1332 if (const MCSymbol *Group = ElfSec.getGroup()) {
1333 GroupName = Group->getName();
1334 Flags |= ELF::SHF_GROUP;
1335 }
1336
1337 return Ctx->getELFSection(
1338 ".kcfi_traps", ELF::SHT_PROGBITS, Flags, 0, GroupName,
1339 /*IsComdat=*/true, ElfSec.getUniqueID(),
1340 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1341}
1342
1343MCSection *
1345 auto ObjFileType = Ctx->getObjectFileType();
1346 if (ObjFileType == MCContext::IsELF) {
1347 const auto &ElfSec = static_cast<const MCSectionELF &>(TextSec);
1348 unsigned Flags = ELF::SHF_LINK_ORDER;
1349 StringRef GroupName;
1350 if (const MCSymbol *Group = ElfSec.getGroup()) {
1351 GroupName = Group->getName();
1352 Flags |= ELF::SHF_GROUP;
1353 }
1354 return Ctx->getELFSection(
1355 PseudoProbeSection->getName(), ELF::SHT_PROGBITS, Flags, 0, GroupName,
1356 true, ElfSec.getUniqueID(),
1357 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1358 } else if (ObjFileType == MCContext::IsCOFF) {
1359 StringRef COMDATSymName = "";
1360 int Selection = 0;
1361 unsigned Characteristics =
1362 static_cast<MCSectionCOFF *>(PseudoProbeSection)->getCharacteristics();
1363 const auto &COFFSec = static_cast<const MCSectionCOFF &>(TextSec);
1364 if (const MCSymbol *COMDATSym = COFFSec.getCOMDATSymbol()) {
1365 // Associate .pseudo_probe to its function section.
1366 COMDATSymName = COMDATSym->getName();
1367 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1369 }
1370 return Ctx->getCOFFSection(PseudoProbeSection->getName(), Characteristics,
1371 COMDATSymName, Selection, COFFSec.getUniqueID());
1372 }
1373
1374 return PseudoProbeSection;
1375}
1376
1377MCSection *
1379 uint64_t FuncHash) const {
1380 if (!Ctx->getTargetTriple().supportsCOMDAT() || FuncName.empty())
1382
1383 // Create a separate comdat group for each function's descriptor in order
1384 // for the linker to deduplicate. The duplication, must be from different
1385 // translation unit, can come from:
1386 // 1. Inline functions defined in header files;
1387 // 2. ThinLTO imported functions;
1388 // 3. Weak-linkage definitions.
1389 // Use a concatenation of the section name, function name, and function hash
1390 // as the group name so that descriptors with different hashes (due to user
1391 // code not following ODR or compiler codegen inconsistencies) get separate
1392 // COMDAT sections instead of being silently dropped (ELF) or causing linker
1393 // errors (COFF). Duplicate GUIDs with mismatching hashes are detected
1394 // during descriptor decoding and reported by llvm-profgen.
1395 auto ObjFileType = Ctx->getObjectFileType();
1396 if (ObjFileType == MCContext::IsELF) {
1397 auto *S = static_cast<MCSectionELF *>(PseudoProbeDescSection);
1398 auto Flags = S->getFlags() | ELF::SHF_GROUP;
1399 return Ctx->getELFSection(
1400 S->getName(), S->getType(), Flags, S->getEntrySize(),
1401 S->getName() + "_" + FuncName + "." + Twine::utohexstr(FuncHash),
1402 /*IsComdat=*/true);
1403 } else if (ObjFileType == MCContext::IsCOFF) {
1404 auto *S = static_cast<MCSectionCOFF *>(PseudoProbeDescSection);
1405 unsigned Characteristics =
1406 S->getCharacteristics() | COFF::IMAGE_SCN_LNK_COMDAT;
1407 std::string COMDATSymName =
1408 (S->getName() + "_" + FuncName + "." + Twine::utohexstr(FuncHash))
1409 .str();
1410 return Ctx->getCOFFSection(S->getName(), Characteristics, COMDATSymName,
1412 }
1413
1415}
1416
1420
1422 const MCSection *TextSec) const {
1423 if (Ctx->getObjectFileType() != MCContext::IsELF)
1424 return nullptr;
1425
1426 // SHF_WRITE for relocations, and let user post-process data in-place.
1428
1429 if (!TextSec)
1430 TextSec = getTextSection();
1431
1432 StringRef GroupName;
1433 const auto &ElfSec = static_cast<const MCSectionELF &>(*TextSec);
1434 if (const MCSymbol *Group = ElfSec.getGroup()) {
1435 GroupName = Group->getName();
1436 Flags |= ELF::SHF_GROUP;
1437 }
1438 return Ctx->getELFSection(
1439 Name, ELF::SHT_PROGBITS, Flags, 0, GroupName, true, ElfSec.getUniqueID(),
1440 static_cast<const MCSymbolELF *>(TextSec->getBeginSymbol()));
1441}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
amdgpu AMDGPU DAG DAG Pattern Instruction Selection
static bool useCompactUnwind(const Triple &T)
This file declares the MCSectionGOFF class, which contains all of the necessary machine code sections...
This file contains the MCSymbolGOFF class.
#define T
PassInstrumentationCallbacks PIC
This file contains data-structure definitions and constants to support unwinding based on ....
This file contains some functions that are useful when dealing with strings.
Context object for machine code objects.
Definition MCContext.h:83
LLVM_ABI MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
MCSection * NonLazySymbolPointerSection
MCSection * TLSBSSSection
Section directive for Thread Local uninitialized data.
MCSection * CallGraphSection
Section containing call graph metadata.
MCSection * DwarfDebugNamesSection
Accelerator table sections.
const MCSection * TLSThreadInitSection
Section for thread local data initialization functions.
MCSection * DwarfStrOffSection
The DWARF v5 string offset and address table sections.
MCSection * MergeableConst16Section
MCSection * COFFGlobalTypeHashesSection
MCSection * SFrameSection
SFrame section.
MCSection * DwarfGnuPubTypesSection
Section for newer gnu pubtypes.
MCSection * getLLVMStatsSection() const
MCSection * TextSection
Section directive for standard text.
MCSection * TLSDataSection
Section directive for Thread Local data. ELF, MachO, COFF, and Wasm.
MCSection * ThreadLocalPointerSection
MCSection * LSDASection
If exception handling is supported by the target, this is the section the Language Specific Data Area...
MCSection * CompactUnwindSection
If exception handling is supported by the target and the target can support a compact representation ...
MCSection * COFFDebugSymbolsSection
MCSection * getPseudoProbeDescSection(StringRef FuncName, uint64_t FuncHash) const
MCSection * DwarfLoclistsSection
The DWARF v5 locations list section.
MCSection * PseudoProbeSection
Section for pseudo probe information used by AutoFDO.
MCSection * FourByteConstantSection
MCSection * getStackSizesSection(const MCSection &TextSec) const
MCSection * DwarfRnglistsSection
The DWARF v5 range list section.
const MCSection * DwarfDebugInlineSection
MCSection * getBBAddrMapSection(const MCSection &TextSec) const
MCSection * LazySymbolPointerSection
MCSection * RemarksSection
Remarks section.
MCSection * getPseudoProbeSection(const MCSection &TextSec) const
MCSection * TLSExtraDataSection
Extra TLS Variable Data section.
MCSection * EHFrameSection
EH frame section.
bool OmitDwarfIfHaveCompactUnwind
OmitDwarfIfHaveCompactUnwind - True if the target object file supports having some functions with com...
MCSection * DrectveSection
COFF specific sections.
MCSection * FaultMapSection
FaultMap section.
MCSection * getKCFITrapSection(const MCSection &TextSec) const
MCSection * TLSTLVSection
Section for thread local structure information.
void initMCObjectFileInfo(MCContext &MCCtx, bool PIC, bool LargeCodeModel=false)
MCSection * DwarfRnglistsDWOSection
The DWARF v5 range and location list sections for fission.
MCSection * ImportCallSection
If import call optimization is supported by the target, this is the section to emit import call data ...
MCSection * MergeableConst32Section
MCSection * SixteenByteConstantSection
MCSection * getPCSection(StringRef Name, const MCSection *TextSec) const
std::optional< sframe::ABI > SFrameABIArch
SFrame ABI architecture byte.
bool SupportsCompactUnwindWithoutEHFrame
True if the target object file supports emitting a compact unwind section without an associated EH fr...
MCSection * ReadOnlySection
Section that is readonly and can contain arbitrary initialized data.
unsigned FDECFIEncoding
FDE CFI encoding.
MCSection * DwarfLoclistsDWOSection
MCSection * getCallGraphSection(const MCSection &TextSec) const
MCSection * BSSSection
Section that is default initialized to zero.
MCSection * EightByteConstantSection
MCSection * StackSizesSection
Section containing metadata on function stack sizes.
unsigned CompactUnwindDwarfEHFrameOnly
Compact unwind encoding indicating that we should emit only an EH frame.
MCSection * getTextSection() const
MCSection * DwarfGnuPubNamesSection
Section for newer gnu pubnames.
MCSection * StackMapSection
StackMap section.
MCContext & getContext() const
MCSection * DwarfAccelNamespaceSection
MCSection * DataSection
Section directive for standard data.
This represents a section on Windows.
This represents a section on linux, lots of unix variants and some bare metal systems.
unsigned getFlags() const
unsigned getUniqueID() const
const MCSymbolELF * getGroup() const
void setSymbolTableName(StringRef STN)
MCSymbolXCOFF * getQualNameSymbol() const
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition MCSection.h:573
void setAlignment(Align Value)
Definition MCSection.h:658
static constexpr unsigned NonUniqueID
Definition MCSection.h:578
void setBeginSymbol(MCSymbol *Sym)
Definition MCSection.h:650
MCSymbol * getBeginSymbol()
Definition MCSection.h:646
void setSymbolTableName(StringRef STN)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
static SectionKind getThreadData()
static SectionKind getMetadata()
static SectionKind getMergeable2ByteCString()
static SectionKind getMergeableConst4()
static SectionKind getText()
static SectionKind getReadOnlyWithRel()
static SectionKind getData()
static SectionKind getMergeableConst8()
static SectionKind getBSS()
static SectionKind getThreadBSS()
static SectionKind getMergeableConst16()
static SectionKind getMergeable1ByteCString()
static SectionKind getReadOnly()
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
Definition StringRef.h:888
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
@ UnknownObjectFormat
Definition Triple.h:418
static Twine utohexstr(uint64_t Val)
Definition Twine.h:385
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
SectionCharacteristics
Definition COFF.h:298
@ IMAGE_SCN_LNK_REMOVE
Definition COFF.h:308
@ IMAGE_SCN_CNT_CODE
Definition COFF.h:303
@ IMAGE_SCN_MEM_READ
Definition COFF.h:336
@ IMAGE_SCN_MEM_EXECUTE
Definition COFF.h:335
@ IMAGE_SCN_CNT_UNINITIALIZED_DATA
Definition COFF.h:305
@ IMAGE_SCN_MEM_DISCARDABLE
Definition COFF.h:331
@ IMAGE_SCN_LNK_INFO
Definition COFF.h:307
@ IMAGE_SCN_MEM_16BIT
Definition COFF.h:312
@ IMAGE_SCN_CNT_INITIALIZED_DATA
Definition COFF.h:304
@ IMAGE_SCN_LNK_COMDAT
Definition COFF.h:309
@ IMAGE_SCN_MEM_WRITE
Definition COFF.h:337
@ IMAGE_COMDAT_SELECT_ASSOCIATIVE
Definition COFF.h:459
@ IMAGE_COMDAT_SELECT_EXACT_MATCH
Definition COFF.h:458
@ SHF_MERGE
Definition ELF.h:1262
@ SHF_STRINGS
Definition ELF.h:1265
@ SHF_EXCLUDE
Definition ELF.h:1290
@ SHF_ALLOC
Definition ELF.h:1256
@ SHF_LINK_ORDER
Definition ELF.h:1271
@ SHF_GROUP
Definition ELF.h:1278
@ SHF_X86_64_LARGE
Definition ELF.h:1319
@ SHF_WRITE
Definition ELF.h:1253
@ SHF_TLS
Definition ELF.h:1281
@ SHF_EXECINSTR
Definition ELF.h:1259
@ SHT_PROGBITS
Definition ELF.h:1155
@ SHT_NOBITS
Definition ELF.h:1162
@ SHT_LLVM_CALL_GRAPH
Definition ELF.h:1198
@ SHT_MIPS_DWARF
Definition ELF.h:1234
@ SHT_LLVM_BB_ADDR_MAP
Definition ELF.h:1193
@ SHT_GNU_SFRAME
Definition ELF.h:1202
@ SHT_X86_64_UNWIND
Definition ELF.h:1230
@ ESD_LB_Deferred
Definition GOFF.h:129
@ ESD_LB_NoLoad
Definition GOFF.h:130
@ ESD_LB_Initial
Definition GOFF.h:128
constexpr StringLiteral CLASS_WSA
@ ESD_BA_Concatenate
Definition GOFF.h:98
@ ESD_BA_Merge
Definition GOFF.h:99
@ ESD_TS_Structured
Definition GOFF.h:93
@ ESD_TS_ByteOriented
Definition GOFF.h:92
@ ESD_EXE_DATA
Definition GOFF.h:111
@ ESD_RQ_1
Definition GOFF.h:70
@ ESD_RQ_0
Definition GOFF.h:69
constexpr StringLiteral CLASS_PPA2
@ ESD_BSC_Section
Definition GOFF.h:136
@ ESD_LT_OS
Definition GOFF.h:142
@ ESD_LT_XPLink
Definition GOFF.h:142
@ ESD_NS_Parts
Definition GOFF.h:65
@ ESD_NS_NormalName
Definition GOFF.h:63
@ ESD_TA_Rent
Definition GOFF.h:106
constexpr StringLiteral CLASS_CODE
@ ESD_RMODE_64
Definition GOFF.h:88
@ S_THREAD_LOCAL_VARIABLE_POINTERS
S_THREAD_LOCAL_VARIABLE_POINTERS - Section with pointers to thread local structures.
Definition MachO.h:175
@ S_16BYTE_LITERALS
S_16BYTE_LITERALS - Section with only 16 byte literals.
Definition MachO.h:160
@ S_THREAD_LOCAL_INIT_FUNCTION_POINTERS
S_THREAD_LOCAL_INIT_FUNCTION_POINTERS - Section with thread local variable initialization pointers to...
Definition MachO.h:178
@ S_COALESCED
S_COALESCED - Section contains symbols that are to be coalesced.
Definition MachO.h:152
@ S_THREAD_LOCAL_ZEROFILL
S_THREAD_LOCAL_ZEROFILL - Thread local zerofill section.
Definition MachO.h:169
@ S_LAZY_SYMBOL_POINTERS
S_LAZY_SYMBOL_POINTERS - Section with lazy symbol pointers.
Definition MachO.h:141
@ S_CSTRING_LITERALS
S_CSTRING_LITERALS - Section with literal C strings.
Definition MachO.h:131
@ S_THREAD_LOCAL_REGULAR
S_THREAD_LOCAL_REGULAR - Thread local data section.
Definition MachO.h:167
@ S_ZEROFILL
S_ZEROFILL - Zero fill on demand section.
Definition MachO.h:129
@ S_NON_LAZY_SYMBOL_POINTERS
S_NON_LAZY_SYMBOL_POINTERS - Section with non-lazy symbol pointers.
Definition MachO.h:139
@ S_4BYTE_LITERALS
S_4BYTE_LITERALS - Section with 4 byte literals.
Definition MachO.h:133
@ S_8BYTE_LITERALS
S_8BYTE_LITERALS - Section with 8 byte literals.
Definition MachO.h:135
@ S_THREAD_LOCAL_VARIABLES
S_THREAD_LOCAL_VARIABLES - Section with thread local variable structure data.
Definition MachO.h:172
@ S_ATTR_DEBUG
S_ATTR_DEBUG - A debug section.
Definition MachO.h:207
@ S_ATTR_NO_DEAD_STRIP
S_ATTR_NO_DEAD_STRIP - No dead stripping.
Definition MachO.h:200
@ S_ATTR_NO_TOC
S_ATTR_NO_TOC - Section contains coalesced symbols that are not to be in a ranlib table of contents.
Definition MachO.h:195
@ S_ATTR_LIVE_SUPPORT
S_ATTR_LIVE_SUPPORT - Blocks are live if they reference live blocks.
Definition MachO.h:202
@ S_ATTR_PURE_INSTRUCTIONS
S_ATTR_PURE_INSTRUCTIONS - Section contains only true machine instructions.
Definition MachO.h:192
@ S_ATTR_STRIP_STATIC_SYMS
S_ATTR_STRIP_STATIC_SYMS - Ok to strip static symbols in this section in files with the MY_DYLDLINK f...
Definition MachO.h:198
@ SSUBTYP_DWARNGE
DWARF aranges section.
Definition XCOFF.h:160
@ SSUBTYP_DWFRAME
DWARF frame section.
Definition XCOFF.h:165
@ SSUBTYP_DWABREV
DWARF abbrev section.
Definition XCOFF.h:161
@ SSUBTYP_DWINFO
DWARF info section.
Definition XCOFF.h:156
@ SSUBTYP_DWRNGES
DWARF ranges section.
Definition XCOFF.h:163
@ SSUBTYP_DWLOC
DWARF loc section.
Definition XCOFF.h:164
@ SSUBTYP_DWMAC
DWARF macinfo section.
Definition XCOFF.h:166
@ SSUBTYP_DWPBNMS
DWARF pubnames section.
Definition XCOFF.h:158
@ SSUBTYP_DWPBTYP
DWARF pubtypes section.
Definition XCOFF.h:159
@ SSUBTYP_DWLINE
DWARF line section.
Definition XCOFF.h:157
@ SSUBTYP_DWSTR
DWARF str section.
Definition XCOFF.h:162
@ XMC_TC0
TOC Anchor for TOC Addressability.
Definition XCOFF.h:119
@ XMC_RW
Read Write Data.
Definition XCOFF.h:118
@ XMC_TL
Initialized thread-local variable.
Definition XCOFF.h:127
@ XMC_RO
Read Only Constant.
Definition XCOFF.h:107
@ XMC_PR
Program Code.
Definition XCOFF.h:106
@ XTY_SD
Csect definition for initialized storage.
Definition XCOFF.h:243
@ DW_EH_PE_pcrel
Definition Dwarf.h:885
@ DW_EH_PE_sdata4
Definition Dwarf.h:882
@ DW_EH_PE_sdata8
Definition Dwarf.h:883
@ DW_EH_PE_absptr
Definition Dwarf.h:874
@ WASM_SEG_FLAG_STRINGS
Definition Wasm.h:238
This is an optimization pass for GlobalISel generic memory operations.
std::string utostr(uint64_t X, bool isNeg=false)
FuncHash
Definition InstrProf.h:78
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163