LLVM 24.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
325 // Emit the pseudoprobe sections in the __LLVM segment. Current ld ignores the
326 // __LLVM and __DWARF segment, so the probe metadata is dropped from the final
327 // linked image on every toolchain.
328 PseudoProbeSection = Ctx->getMachOSection(
329 "__LLVM", "__probes", MachO::S_ATTR_DEBUG | MachO::S_ATTR_NO_DEAD_STRIP,
332 Ctx->getMachOSection("__LLVM", "__probe_descs",
335
336 // The architecture of dsymutil makes it very difficult to copy the Swift
337 // reflection metadata sections into the __TEXT segment, so dsymutil creates
338 // these sections in the __DWARF segment instead.
339 if (!Ctx->getSwift5ReflectionSegmentName().empty()) {
340#define HANDLE_SWIFT_SECTION(KIND, MACHO, ELF, COFF) \
341 Swift5ReflectionSections \
342 [llvm::binaryformat::Swift5ReflectionSectionKind::KIND] = \
343 Ctx->getMachOSection(Ctx->getSwift5ReflectionSegmentName().data(), \
344 MACHO, 0, SectionKind::getMetadata());
345#include "llvm/BinaryFormat/Swift.def"
346 }
347
349}
350
351void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {
352 switch (T.getArch()) {
353 case Triple::mips:
354 case Triple::mipsel:
355 case Triple::mips64:
356 case Triple::mips64el:
357 // We cannot use DW_EH_PE_sdata8 for the large PositionIndependent case
358 // since there is no R_MIPS_PC64 relocation (only a 32-bit version).
359 // In fact DW_EH_PE_sdata4 is enough for us now, and GNU ld doesn't
360 // support pcrel|sdata8 well. Let's use sdata4 for now.
361 if (PositionIndependent)
363 else
364 FDECFIEncoding = Ctx->getAsmInfo().getCodePointerSize() == 4
367 break;
368 case Triple::ppc64:
369 case Triple::ppc64le:
370 case Triple::aarch64:
372 case Triple::x86_64:
374 ((Large || Ctx->getTargetOptions().LargeEHEncoding)
377 break;
378 case Triple::bpfel:
379 case Triple::bpfeb:
381 break;
382 case Triple::hexagon:
384 PositionIndependent ? dwarf::DW_EH_PE_pcrel : dwarf::DW_EH_PE_absptr;
385 break;
386 case Triple::xtensa:
388 break;
389 default:
391 break;
392 }
393
394 unsigned EHSectionType = T.getArch() == Triple::x86_64
397 switch (T.getArch()) {
398 case Triple::x86_64:
399 SFrameABIArch = sframe::ABI::AMD64EndianLittle;
400 break;
401 case Triple::aarch64:
402 SFrameABIArch = sframe::ABI::AArch64EndianLittle;
403 break;
405 SFrameABIArch = sframe::ABI::AArch64EndianBig;
406 break;
407 default:
408 break;
409 }
410
411 // Solaris requires different flags for .eh_frame to seemingly every other
412 // platform.
413 unsigned EHSectionFlags = ELF::SHF_ALLOC;
414 if (T.isOSSolaris() && T.getArch() != Triple::x86_64)
415 EHSectionFlags |= ELF::SHF_WRITE;
416
417 // ELF
418 BSSSection = Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
420
421 TextSection = Ctx->getELFSection(".text", ELF::SHT_PROGBITS,
423
424 DataSection = Ctx->getELFSection(".data", ELF::SHT_PROGBITS,
426
428 Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
429
431 Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
433
434 TLSBSSSection = Ctx->getELFSection(
436
437 DataRelROSection = Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
439
440 unsigned MergeableCstFlags = ELF::SHF_ALLOC | ELF::SHF_MERGE;
441 StringRef CstPrefix = ".rodata";
442 if (Large && T.getArch() == Triple::x86_64) {
443 MergeableCstFlags |= ELF::SHF_X86_64_LARGE;
444 CstPrefix = ".lrodata";
445 }
446
447 MergeableConst4Section = Ctx->getELFSection(
448 CstPrefix + ".cst4", ELF::SHT_PROGBITS, MergeableCstFlags, 4);
449
450 MergeableConst8Section = Ctx->getELFSection(
451 CstPrefix + ".cst8", ELF::SHT_PROGBITS, MergeableCstFlags, 8);
452
453 MergeableConst16Section = Ctx->getELFSection(
454 CstPrefix + ".cst16", ELF::SHT_PROGBITS, MergeableCstFlags, 16);
455
456 MergeableConst32Section = Ctx->getELFSection(
457 CstPrefix + ".cst32", ELF::SHT_PROGBITS, MergeableCstFlags, 32);
458
459 // Exception Handling Sections.
460
461 // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
462 // it contains relocatable pointers. In PIC mode, this is probably a big
463 // runtime hit for C++ apps. Either the contents of the LSDA need to be
464 // adjusted or this should be a data section.
465 LSDASection = Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
467
468 COFFDebugSymbolsSection = nullptr;
469 COFFDebugTypesSection = nullptr;
470
471 unsigned DebugSecType = ELF::SHT_PROGBITS;
472
473 // MIPS .debug_* sections should have SHT_MIPS_DWARF section type
474 // to distinguish among sections contain DWARF and ECOFF debug formats.
475 // Sections with ECOFF debug format are obsoleted and marked by SHT_PROGBITS.
476 if (T.isMIPS())
477 DebugSecType = ELF::SHT_MIPS_DWARF;
478
479 // Debug Info Sections.
481 Ctx->getELFSection(".debug_abbrev", DebugSecType, 0);
482 DwarfInfoSection = Ctx->getELFSection(".debug_info", DebugSecType, 0);
483 DwarfLineSection = Ctx->getELFSection(".debug_line", DebugSecType, 0);
485 Ctx->getELFSection(".debug_line_str", DebugSecType,
487 DwarfFrameSection = Ctx->getELFSection(".debug_frame", DebugSecType, 0);
489 Ctx->getELFSection(".debug_pubnames", DebugSecType, 0);
491 Ctx->getELFSection(".debug_pubtypes", DebugSecType, 0);
493 Ctx->getELFSection(".debug_gnu_pubnames", DebugSecType, 0);
495 Ctx->getELFSection(".debug_gnu_pubtypes", DebugSecType, 0);
497 Ctx->getELFSection(".debug_str", DebugSecType,
499 DwarfLocSection = Ctx->getELFSection(".debug_loc", DebugSecType, 0);
501 Ctx->getELFSection(".debug_aranges", DebugSecType, 0);
503 Ctx->getELFSection(".debug_ranges", DebugSecType, 0);
505 Ctx->getELFSection(".debug_macinfo", DebugSecType, 0);
506 DwarfMacroSection = Ctx->getELFSection(".debug_macro", DebugSecType, 0);
507
508 // DWARF5 Experimental Debug Info
509
510 // Accelerator Tables
512 Ctx->getELFSection(".debug_names", ELF::SHT_PROGBITS, 0);
514 Ctx->getELFSection(".apple_names", ELF::SHT_PROGBITS, 0);
516 Ctx->getELFSection(".apple_objc", ELF::SHT_PROGBITS, 0);
518 Ctx->getELFSection(".apple_namespaces", ELF::SHT_PROGBITS, 0);
520 Ctx->getELFSection(".apple_types", ELF::SHT_PROGBITS, 0);
521
522 // String Offset and Address Sections
524 Ctx->getELFSection(".debug_str_offsets", DebugSecType, 0);
525 DwarfAddrSection = Ctx->getELFSection(".debug_addr", DebugSecType, 0);
526 DwarfRnglistsSection = Ctx->getELFSection(".debug_rnglists", DebugSecType, 0);
527 DwarfLoclistsSection = Ctx->getELFSection(".debug_loclists", DebugSecType, 0);
528
529 // Fission Sections
531 Ctx->getELFSection(".debug_info.dwo", DebugSecType, ELF::SHF_EXCLUDE);
533 Ctx->getELFSection(".debug_types.dwo", DebugSecType, ELF::SHF_EXCLUDE);
535 Ctx->getELFSection(".debug_abbrev.dwo", DebugSecType, ELF::SHF_EXCLUDE);
536 DwarfStrDWOSection = Ctx->getELFSection(
537 ".debug_str.dwo", DebugSecType,
540 Ctx->getELFSection(".debug_line.dwo", DebugSecType, ELF::SHF_EXCLUDE);
542 Ctx->getELFSection(".debug_loc.dwo", DebugSecType, ELF::SHF_EXCLUDE);
543 DwarfStrOffDWOSection = Ctx->getELFSection(".debug_str_offsets.dwo",
544 DebugSecType, ELF::SHF_EXCLUDE);
546 Ctx->getELFSection(".debug_rnglists.dwo", DebugSecType, ELF::SHF_EXCLUDE);
548 Ctx->getELFSection(".debug_macinfo.dwo", DebugSecType, ELF::SHF_EXCLUDE);
550 Ctx->getELFSection(".debug_macro.dwo", DebugSecType, ELF::SHF_EXCLUDE);
551
553 Ctx->getELFSection(".debug_loclists.dwo", DebugSecType, ELF::SHF_EXCLUDE);
554
555 // DWP Sections
557 Ctx->getELFSection(".debug_cu_index", DebugSecType, 0);
559 Ctx->getELFSection(".debug_tu_index", DebugSecType, 0);
560
562 Ctx->getELFSection(".llvm_stackmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
563
565 Ctx->getELFSection(".llvm_faultmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
566
568 Ctx->getELFSection(".eh_frame", EHSectionType, EHSectionFlags);
569
571 Ctx->getELFSection(".sframe", ELF::SHT_GNU_SFRAME, ELF::SHF_ALLOC);
572
574 Ctx->getELFSection(".llvm.callgraph", ELF::SHT_LLVM_CALL_GRAPH, 0);
575
576 StackSizesSection = Ctx->getELFSection(".stack_sizes", ELF::SHT_PROGBITS, 0);
577
578 PseudoProbeSection = Ctx->getELFSection(".pseudo_probe", DebugSecType, 0);
580 Ctx->getELFSection(".pseudo_probe_desc", DebugSecType, 0);
581
582 LLVMStatsSection = Ctx->getELFSection(".llvm_stats", ELF::SHT_PROGBITS, 0);
583}
584
585void MCObjectFileInfo::initGOFFMCObjectFileInfo(const Triple &T) {
586 MCSectionGOFF *RootSDSection = Ctx->getGOFFSection(
589
590 MCSectionGOFF *ADAEDSection = Ctx->getGOFFSection(
592 GOFF::EDAttr{false, GOFF::ESD_RMODE_64, GOFF::ESD_NS_Parts,
595 RootSDSection);
596 ADAEDSection->setAlignment(Align(16)); // Quadword
597 ADASection = Ctx->getGOFFSection(SectionKind::getData(), "#S",
598 GOFF::PRAttr{false, GOFF::ESD_EXE_DATA,
601 ADAEDSection);
602
603 TextSection = Ctx->getGOFFSection(
608 RootSDSection);
609 TextSection->setAlignment(Align(8)); // Doubleword
610
611 MCSectionGOFF *PPA2ListEDSection = Ctx->getGOFFSection(
613 GOFF::EDAttr{true, GOFF::ESD_RMODE_64, GOFF::ESD_NS_Parts,
616 RootSDSection);
617 PPA2ListEDSection->setAlignment(Align(8)); // Doubleword
618 PPA2ListSection = Ctx->getGOFFSection(SectionKind::getData(), ".&ppa2",
619 GOFF::PRAttr{true, GOFF::ESD_EXE_DATA,
622 PPA2ListEDSection);
623
624 IDRLSection = Ctx->getGOFFSection(
625 SectionKind::getData(), "B_IDRL",
629 RootSDSection);
630 IDRLSection->setAlignment(Align(8)); // Doubleword
631
632 // Debug Info Sections. The ED name is the same used by the XL compiler.
633 auto InitDebugSection = [this,
634 RootSDSection](StringRef EDName,
635 StringRef LDName) -> MCSectionGOFF * {
636 MCSectionGOFF *ED = Ctx->getGOFFSection(
637 SectionKind::getMetadata(), EDName,
638 GOFF::EDAttr{false, GOFF::ESD_RMODE_64, GOFF::ESD_NS_Parts,
641 RootSDSection);
642 ED->setAlignment(Align(8)); // Doubleword
643 // At least for llc, this function is called twice! (See function
644 // compileModule() in llc.cpp). Since the context is not cleared, the
645 // already allocated section is returned above. We only add the begin symbol
646 // if it is not yet set to avoid an assertion.
647 MCSymbolGOFF *LD = static_cast<MCSymbolGOFF *>(ED->getBeginSymbol());
648 if (!LD) {
649 LD = static_cast<MCSymbolGOFF *>(getContext().getOrCreateSymbol(LDName));
650 LD->setCodeData(GOFF::ESD_EXE_DATA);
651 LD->setWeak(false);
652 LD->setLinkage(GOFF::ESD_LT_XPLink);
653 LD->setExternal(false);
654 ED->setBeginSymbol(LD);
655 } else
656 assert(LD->getName() == LDName && "Wrong label name");
657 return ED;
658 };
659 DwarfAbbrevSection = InitDebugSection("D_ABREV", ".debug_abbrev");
660 DwarfInfoSection = InitDebugSection("D_INFO", ".debug_info");
661 DwarfLineSection = InitDebugSection("D_LINE", ".debug_line");
662 DwarfFrameSection = InitDebugSection("D_FRAME", ".debug_frame");
663 DwarfPubNamesSection = InitDebugSection("D_PBNMS", ".debug_pubnames");
664 DwarfPubTypesSection = InitDebugSection("D_PTYPES", ".debug_pubtypes");
665 DwarfStrSection = InitDebugSection("D_STR", ".debug_str");
666 DwarfLocSection = InitDebugSection("D_LOC", ".debug_loc");
667 DwarfARangesSection = InitDebugSection("D_ARNGE", ".debug_aranges");
668 DwarfRangesSection = InitDebugSection("D_RNGES", ".debug_ranges");
669 DwarfMacinfoSection = InitDebugSection("D_MACIN", ".debug_macinfo");
670
671 // DWARF 5 sections.
672 DwarfDebugNamesSection = InitDebugSection("D_NAMES", ".debug_names");
673 DwarfStrOffSection = InitDebugSection("D_STROFFS", ".debug_str_offsets");
674 DwarfAddrSection = InitDebugSection("D_ADDR", ".debug_addr");
675 DwarfRnglistsSection = InitDebugSection("D_RNGLISTS", ".debug_rnglists");
676 DwarfLoclistsSection = InitDebugSection("D_LOCLISTS", ".debug_loclists");
677 DwarfLineStrSection = InitDebugSection("D_LINESTR", ".debug_line_str");
678
679 // Special GNU sections.
680 DwarfGnuPubNamesSection = InitDebugSection("D_GPBNMS", ".debug_gnu_pubnames");
682 InitDebugSection("D_GPTYPES", ".debug_gnu_pubtypes");
683
684 // Accelerator Tables.
685 DwarfAccelNamesSection = InitDebugSection("D_APPLNMS", ".apple_names");
687 InitDebugSection("D_APPLNMSP", ".apple_namespaces");
688 DwarfAccelTypesSection = InitDebugSection("D_APPLTYPS", ".apple_types");
689 DwarfAccelObjCSection = InitDebugSection("D_APPLOBJC", ".apple_objc");
690}
691
692void MCObjectFileInfo::initCOFFMCObjectFileInfo(const Triple &T) {
694 Ctx->getCOFFSection(".eh_frame", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
696
697 // Set the `IMAGE_SCN_MEM_16BIT` flag when compiling for thumb mode. This is
698 // used to indicate to the linker that the text segment contains thumb instructions
699 // and to set the ISA selection bit for calls accordingly.
700 const bool IsThumb = T.getArch() == Triple::thumb;
701
702 // COFF
703 BSSSection = Ctx->getCOFFSection(
706 TextSection = Ctx->getCOFFSection(
707 ".text",
711 DataSection = Ctx->getCOFFSection(
715 Ctx->getCOFFSection(".rdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
717
718 if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::aarch64 ||
719 T.getArch() == Triple::arm || T.getArch() == Triple::thumb) {
720 // On Windows with SEH, the LSDA is emitted into the .xdata section
721 LSDASection = nullptr;
722 } else {
723 LSDASection = Ctx->getCOFFSection(".gcc_except_table",
726 }
727
728 if (T.getArch() == Triple::aarch64) {
730 Ctx->getCOFFSection(".impcall", COFF::IMAGE_SCN_LNK_INFO);
731 } else if (T.getArch() == Triple::x86_64) {
732 // Import Call Optimization on x64 leverages the same metadata as the
733 // retpoline mitigation, hence the unusual section name.
735 Ctx->getCOFFSection(".retplne", COFF::IMAGE_SCN_LNK_INFO);
736 }
737
738 // Debug info.
740 Ctx->getCOFFSection(".debug$S", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
744 Ctx->getCOFFSection(".debug$T", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
748 Ctx->getCOFFSection(".debug$H", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
751
752 DwarfAbbrevSection = Ctx->getCOFFSection(
753 ".debug_abbrev", COFF::IMAGE_SCN_MEM_DISCARDABLE |
756 DwarfInfoSection = Ctx->getCOFFSection(
757 ".debug_info", COFF::IMAGE_SCN_MEM_DISCARDABLE |
760 DwarfLineSection = Ctx->getCOFFSection(
761 ".debug_line", COFF::IMAGE_SCN_MEM_DISCARDABLE |
764 DwarfLineStrSection = Ctx->getCOFFSection(
765 ".debug_line_str", COFF::IMAGE_SCN_MEM_DISCARDABLE |
768 DwarfFrameSection = Ctx->getCOFFSection(
769 ".debug_frame", COFF::IMAGE_SCN_MEM_DISCARDABLE |
772 DwarfPubNamesSection = Ctx->getCOFFSection(
773 ".debug_pubnames", COFF::IMAGE_SCN_MEM_DISCARDABLE |
776 DwarfPubTypesSection = Ctx->getCOFFSection(
777 ".debug_pubtypes", COFF::IMAGE_SCN_MEM_DISCARDABLE |
780 DwarfGnuPubNamesSection = Ctx->getCOFFSection(
781 ".debug_gnu_pubnames", COFF::IMAGE_SCN_MEM_DISCARDABLE |
784 DwarfGnuPubTypesSection = Ctx->getCOFFSection(
785 ".debug_gnu_pubtypes", COFF::IMAGE_SCN_MEM_DISCARDABLE |
788 DwarfStrSection = Ctx->getCOFFSection(
789 ".debug_str", COFF::IMAGE_SCN_MEM_DISCARDABLE |
792 DwarfStrOffSection = Ctx->getCOFFSection(
793 ".debug_str_offsets", COFF::IMAGE_SCN_MEM_DISCARDABLE |
796 DwarfLocSection = Ctx->getCOFFSection(
797 ".debug_loc", COFF::IMAGE_SCN_MEM_DISCARDABLE |
800 DwarfLoclistsSection = Ctx->getCOFFSection(
801 ".debug_loclists", COFF::IMAGE_SCN_MEM_DISCARDABLE |
804 DwarfARangesSection = Ctx->getCOFFSection(
805 ".debug_aranges", COFF::IMAGE_SCN_MEM_DISCARDABLE |
808 DwarfRangesSection = Ctx->getCOFFSection(
809 ".debug_ranges", COFF::IMAGE_SCN_MEM_DISCARDABLE |
812 DwarfRnglistsSection = Ctx->getCOFFSection(
813 ".debug_rnglists", COFF::IMAGE_SCN_MEM_DISCARDABLE |
816 DwarfMacinfoSection = Ctx->getCOFFSection(
817 ".debug_macinfo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
820 DwarfMacroSection = Ctx->getCOFFSection(
821 ".debug_macro", COFF::IMAGE_SCN_MEM_DISCARDABLE |
824 DwarfMacinfoDWOSection = Ctx->getCOFFSection(
825 ".debug_macinfo.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
829 DwarfMacroDWOSection = Ctx->getCOFFSection(
830 ".debug_macro.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
834 DwarfInfoDWOSection = Ctx->getCOFFSection(
835 ".debug_info.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
839 DwarfTypesDWOSection = Ctx->getCOFFSection(
840 ".debug_types.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
844 DwarfAbbrevDWOSection = Ctx->getCOFFSection(
845 ".debug_abbrev.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
849 DwarfStrDWOSection = Ctx->getCOFFSection(
850 ".debug_str.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
854 DwarfLineDWOSection = Ctx->getCOFFSection(
855 ".debug_line.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
859 DwarfLocDWOSection = Ctx->getCOFFSection(
860 ".debug_loc.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
864 DwarfLoclistsDWOSection = Ctx->getCOFFSection(
865 ".debug_loclists.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
869 DwarfStrOffDWOSection = Ctx->getCOFFSection(
870 ".debug_str_offsets.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
874 DwarfRnglistsDWOSection = Ctx->getCOFFSection(
875 ".debug_rnglists.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
879 DwarfAddrSection = Ctx->getCOFFSection(
880 ".debug_addr", COFF::IMAGE_SCN_MEM_DISCARDABLE |
883 DwarfCUIndexSection = Ctx->getCOFFSection(
884 ".debug_cu_index", COFF::IMAGE_SCN_MEM_DISCARDABLE |
887 DwarfTUIndexSection = Ctx->getCOFFSection(
888 ".debug_tu_index", COFF::IMAGE_SCN_MEM_DISCARDABLE |
891 DwarfDebugNamesSection = Ctx->getCOFFSection(
892 ".debug_names", COFF::IMAGE_SCN_MEM_DISCARDABLE |
895 DwarfAccelNamesSection = Ctx->getCOFFSection(
896 ".apple_names", COFF::IMAGE_SCN_MEM_DISCARDABLE |
899 DwarfAccelNamespaceSection = Ctx->getCOFFSection(
900 ".apple_namespaces", COFF::IMAGE_SCN_MEM_DISCARDABLE |
903 DwarfAccelTypesSection = Ctx->getCOFFSection(
904 ".apple_types", COFF::IMAGE_SCN_MEM_DISCARDABLE |
907 DwarfAccelObjCSection = Ctx->getCOFFSection(
908 ".apple_objc", COFF::IMAGE_SCN_MEM_DISCARDABLE |
911
912 DrectveSection = Ctx->getCOFFSection(
914
916 Ctx->getCOFFSection(".pdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
918
920 Ctx->getCOFFSection(".xdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
922
923 SXDataSection = Ctx->getCOFFSection(".sxdata", COFF::IMAGE_SCN_LNK_INFO);
924
926 Ctx->getCOFFSection(".gehcont$y", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
928
930 Ctx->getCOFFSection(".gfids$y", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
932
934 Ctx->getCOFFSection(".giats$y", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
936
938 Ctx->getCOFFSection(".gljmp$y", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
940
941 TLSDataSection = Ctx->getCOFFSection(
944
945 StackMapSection = Ctx->getCOFFSection(".llvm_stackmaps",
948
949 // Set IMAGE_SCN_MEM_DISCARDABLE so that lld will not truncate section name.
950 PseudoProbeSection = Ctx->getCOFFSection(
951 ".pseudo_probe", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
954 PseudoProbeDescSection = Ctx->getCOFFSection(
955 ".pseudo_probe_desc", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
958}
959
960void MCObjectFileInfo::initSPIRVMCObjectFileInfo(const Triple &T) {
961 // Put everything in a single binary section.
962 TextSection = Ctx->getSPIRVSection();
963}
964
965void MCObjectFileInfo::initWasmMCObjectFileInfo(const Triple &T) {
966 TextSection = Ctx->getWasmSection(".text", SectionKind::getText());
967 DataSection = Ctx->getWasmSection(".data", SectionKind::getData());
968
970 Ctx->getWasmSection(".debug_line", SectionKind::getMetadata());
972 Ctx->getWasmSection(".debug_line_str", SectionKind::getMetadata(),
974 DwarfStrSection = Ctx->getWasmSection(
977 Ctx->getWasmSection(".debug_loc", SectionKind::getMetadata());
979 Ctx->getWasmSection(".debug_abbrev", SectionKind::getMetadata());
980 DwarfARangesSection = Ctx->getWasmSection(".debug_aranges", SectionKind::getMetadata());
982 Ctx->getWasmSection(".debug_ranges", SectionKind::getMetadata());
984 Ctx->getWasmSection(".debug_macinfo", SectionKind::getMetadata());
986 Ctx->getWasmSection(".debug_macro", SectionKind::getMetadata());
987 DwarfCUIndexSection = Ctx->getWasmSection(".debug_cu_index", SectionKind::getMetadata());
988 DwarfTUIndexSection = Ctx->getWasmSection(".debug_tu_index", SectionKind::getMetadata());
990 Ctx->getWasmSection(".debug_info", SectionKind::getMetadata());
991 DwarfFrameSection = Ctx->getWasmSection(".debug_frame", SectionKind::getMetadata());
992 DwarfPubNamesSection = Ctx->getWasmSection(".debug_pubnames", SectionKind::getMetadata());
993 DwarfPubTypesSection = Ctx->getWasmSection(".debug_pubtypes", SectionKind::getMetadata());
995 Ctx->getWasmSection(".debug_gnu_pubnames", SectionKind::getMetadata());
997 Ctx->getWasmSection(".debug_gnu_pubtypes", SectionKind::getMetadata());
998
1000 Ctx->getWasmSection(".debug_names", SectionKind::getMetadata());
1002 Ctx->getWasmSection(".debug_str_offsets", SectionKind::getMetadata());
1004 Ctx->getWasmSection(".debug_addr", SectionKind::getMetadata());
1006 Ctx->getWasmSection(".debug_rnglists", SectionKind::getMetadata());
1008 Ctx->getWasmSection(".debug_loclists", SectionKind::getMetadata());
1009
1010 // Fission Sections
1012 Ctx->getWasmSection(".debug_info.dwo", SectionKind::getMetadata());
1014 Ctx->getWasmSection(".debug_types.dwo", SectionKind::getMetadata());
1016 Ctx->getWasmSection(".debug_abbrev.dwo", SectionKind::getMetadata());
1018 Ctx->getWasmSection(".debug_str.dwo", SectionKind::getMetadata(),
1021 Ctx->getWasmSection(".debug_line.dwo", SectionKind::getMetadata());
1023 Ctx->getWasmSection(".debug_loc.dwo", SectionKind::getMetadata());
1025 Ctx->getWasmSection(".debug_str_offsets.dwo", SectionKind::getMetadata());
1027 Ctx->getWasmSection(".debug_rnglists.dwo", SectionKind::getMetadata());
1029 Ctx->getWasmSection(".debug_macinfo.dwo", SectionKind::getMetadata());
1031 Ctx->getWasmSection(".debug_macro.dwo", SectionKind::getMetadata());
1032
1034 Ctx->getWasmSection(".debug_loclists.dwo", SectionKind::getMetadata());
1035
1036 // DWP Sections
1038 Ctx->getWasmSection(".debug_cu_index", SectionKind::getMetadata());
1040 Ctx->getWasmSection(".debug_tu_index", SectionKind::getMetadata());
1041
1042 // Wasm use data section for LSDA.
1043 // TODO Consider putting each function's exception table in a separate
1044 // section, as in -function-sections, to facilitate lld's --gc-section.
1045 LSDASection = Ctx->getWasmSection(".rodata.gcc_except_table",
1047
1048 // TODO: Define more sections.
1049}
1050
1051void MCObjectFileInfo::initXCOFFMCObjectFileInfo(const Triple &T) {
1052 // The default csect for program code. Functions without a specified section
1053 // get placed into this csect. The choice of csect name is not a property of
1054 // the ABI or object file format, but various tools rely on the section
1055 // name being empty (considering named symbols to be "user symbol names").
1056 TextSection = Ctx->getXCOFFSection(
1057 "..text..", // Use a non-null name to work around an AIX assembler bug...
1059 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_PR, XCOFF::XTY_SD),
1060 /* MultiSymbolsAllowed*/ true);
1061
1062 // ... but use a null name when generating the symbol table.
1063 MCSectionXCOFF *TS = static_cast<MCSectionXCOFF *>(TextSection);
1065 TS->setSymbolTableName("");
1066
1067 DataSection = Ctx->getXCOFFSection(
1068 ".data", SectionKind::getData(),
1069 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RW, XCOFF::XTY_SD),
1070 /* MultiSymbolsAllowed*/ true);
1071
1072 ReadOnlySection = Ctx->getXCOFFSection(
1073 ".rodata", SectionKind::getReadOnly(),
1074 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD),
1075 /* MultiSymbolsAllowed*/ true);
1076 ReadOnlySection->setAlignment(Align(4));
1077
1078 ReadOnly8Section = Ctx->getXCOFFSection(
1079 ".rodata.8", SectionKind::getReadOnly(),
1080 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD),
1081 /* MultiSymbolsAllowed*/ true);
1082 ReadOnly8Section->setAlignment(Align(8));
1083
1084 ReadOnly16Section = Ctx->getXCOFFSection(
1085 ".rodata.16", SectionKind::getReadOnly(),
1086 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD),
1087 /* MultiSymbolsAllowed*/ true);
1088 ReadOnly16Section->setAlignment(Align(16));
1089
1090 TLSDataSection = Ctx->getXCOFFSection(
1091 ".tdata", SectionKind::getThreadData(),
1092 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_TL, XCOFF::XTY_SD),
1093 /* MultiSymbolsAllowed*/ true);
1094
1095 TOCBaseSection = Ctx->getXCOFFSection(
1096 "TOC", SectionKind::getData(),
1097 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_TC0,
1098 XCOFF::XTY_SD));
1099
1100 // The TOC-base always has 0 size, but 4 byte alignment.
1101 TOCBaseSection->setAlignment(Align(4));
1102
1103 LSDASection = Ctx->getXCOFFSection(
1104 ".gcc_except_table", SectionKind::getReadOnly(),
1105 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RO,
1106 XCOFF::XTY_SD));
1107
1108 CompactUnwindSection = Ctx->getXCOFFSection(
1109 ".eh_info_table", SectionKind::getData(),
1110 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RW,
1111 XCOFF::XTY_SD));
1112
1113 // DWARF sections for XCOFF are not csects. They are special STYP_DWARF
1114 // sections, and the individual DWARF sections are distinguished by their
1115 // section subtype.
1116 DwarfAbbrevSection = Ctx->getXCOFFSection(
1117 ".dwabrev", SectionKind::getMetadata(),
1118 /* CsectProperties */ std::nullopt,
1119 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWABREV);
1120
1121 DwarfInfoSection = Ctx->getXCOFFSection(
1122 ".dwinfo", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1123 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWINFO);
1124
1125 DwarfLineSection = Ctx->getXCOFFSection(
1126 ".dwline", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1127 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWLINE);
1128
1129 DwarfFrameSection = Ctx->getXCOFFSection(
1130 ".dwframe", SectionKind::getMetadata(),
1131 /* CsectProperties */ std::nullopt,
1132 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWFRAME);
1133
1134 DwarfPubNamesSection = Ctx->getXCOFFSection(
1135 ".dwpbnms", SectionKind::getMetadata(),
1136 /* CsectProperties */ std::nullopt,
1137 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWPBNMS);
1138
1139 DwarfPubTypesSection = Ctx->getXCOFFSection(
1140 ".dwpbtyp", SectionKind::getMetadata(),
1141 /* CsectProperties */ std::nullopt,
1142 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWPBTYP);
1143
1144 DwarfStrSection = Ctx->getXCOFFSection(
1145 ".dwstr", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1146 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWSTR);
1147
1148 DwarfLocSection = Ctx->getXCOFFSection(
1149 ".dwloc", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1150 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWLOC);
1151
1152 DwarfARangesSection = Ctx->getXCOFFSection(
1153 ".dwarnge", SectionKind::getMetadata(),
1154 /* CsectProperties */ std::nullopt,
1155 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWARNGE);
1156
1157 DwarfRangesSection = Ctx->getXCOFFSection(
1158 ".dwrnges", SectionKind::getMetadata(),
1159 /* CsectProperties */ std::nullopt,
1160 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWRNGES);
1161
1162 DwarfMacinfoSection = Ctx->getXCOFFSection(
1163 ".dwmac", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1164 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWMAC);
1165}
1166
1167void MCObjectFileInfo::initDXContainerObjectFileInfo(const Triple &T) {
1168 // At the moment the DXBC section should end up empty.
1169 TextSection = Ctx->getDXContainerSection("DXBC", SectionKind::getText());
1170}
1171
1173
1175 bool LargeCodeModel) {
1176 PositionIndependent = PIC;
1177 Ctx = &MCCtx;
1178
1179 // Common.
1182
1184
1186
1187 EHFrameSection = nullptr; // Created on demand.
1188 SFrameSection = nullptr; // Created on demand.
1189 CompactUnwindSection = nullptr; // Used only by selected targets.
1190 DwarfAccelNamesSection = nullptr; // Used only by selected targets.
1191 DwarfAccelObjCSection = nullptr; // Used only by selected targets.
1192 DwarfAccelNamespaceSection = nullptr; // Used only by selected targets.
1193 DwarfAccelTypesSection = nullptr; // Used only by selected targets.
1194
1195 const Triple &TheTriple = Ctx->getTargetTriple();
1196 switch (Ctx->getObjectFileType()) {
1197 case MCContext::IsMachO:
1198 initMachOMCObjectFileInfo(TheTriple);
1199 break;
1200 case MCContext::IsCOFF:
1201 initCOFFMCObjectFileInfo(TheTriple);
1202 break;
1203 case MCContext::IsELF:
1204 initELFMCObjectFileInfo(TheTriple, LargeCodeModel);
1205 break;
1206 case MCContext::IsGOFF:
1207 initGOFFMCObjectFileInfo(TheTriple);
1208 break;
1209 case MCContext::IsSPIRV:
1210 initSPIRVMCObjectFileInfo(TheTriple);
1211 break;
1212 case MCContext::IsWasm:
1213 initWasmMCObjectFileInfo(TheTriple);
1214 break;
1215 case MCContext::IsXCOFF:
1216 initXCOFFMCObjectFileInfo(TheTriple);
1217 break;
1219 initDXContainerObjectFileInfo(TheTriple);
1220 break;
1221 }
1222}
1223
1224MCSection *MCObjectFileInfo::getDwarfComdatSection(const char *Name,
1225 uint64_t Hash) const {
1226 switch (Ctx->getTargetTriple().getObjectFormat()) {
1227 case Triple::ELF:
1228 return Ctx->getELFSection(Name, ELF::SHT_PROGBITS, ELF::SHF_GROUP, 0,
1229 utostr(Hash), /*IsComdat=*/true);
1230 case Triple::Wasm:
1231 return Ctx->getWasmSection(Name, SectionKind::getMetadata(), 0,
1233 case Triple::MachO:
1234 case Triple::COFF:
1235 case Triple::GOFF:
1236 case Triple::SPIRV:
1237 case Triple::XCOFF:
1240 report_fatal_error("Cannot get DWARF comdat section for this object file "
1241 "format: not implemented.");
1242 break;
1243 }
1244 llvm_unreachable("Unknown ObjectFormatType");
1245}
1246
1247MCSection *
1249 if (Ctx->getObjectFileType() != MCContext::IsELF)
1250 return CallGraphSection;
1251
1252 const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
1253 unsigned Flags = ELF::SHF_LINK_ORDER;
1254 StringRef GroupName;
1255 if (const MCSymbol *Group = ElfSec.getGroup()) {
1256 GroupName = Group->getName();
1257 Flags |= ELF::SHF_GROUP;
1258 }
1259
1260 return Ctx->getELFSection(
1261 ".llvm.callgraph", ELF::SHT_LLVM_CALL_GRAPH, Flags, 0, GroupName,
1262 /*IsComdat=*/true, ElfSec.getUniqueID(),
1263 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1264}
1265
1266MCSection *
1268 if ((Ctx->getObjectFileType() != MCContext::IsELF) ||
1269 Ctx->getTargetTriple().isPS4())
1270 return StackSizesSection;
1271
1272 const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
1273 unsigned Flags = ELF::SHF_LINK_ORDER;
1274 StringRef GroupName;
1275 if (const MCSymbol *Group = ElfSec.getGroup()) {
1276 GroupName = Group->getName();
1277 Flags |= ELF::SHF_GROUP;
1278 }
1279
1280 return Ctx->getELFSection(
1281 ".stack_sizes", ELF::SHT_PROGBITS, Flags, 0, GroupName, true,
1282 ElfSec.getUniqueID(),
1283 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1284}
1285
1286MCSection *
1288 constexpr StringLiteral Name = ".llvm_bb_addr_map";
1289 if (Ctx->getObjectFileType() == MCContext::IsELF) {
1290 const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
1291 unsigned Flags = ELF::SHF_LINK_ORDER;
1292 StringRef GroupName;
1293 if (const MCSymbol *Group = ElfSec.getGroup()) {
1294 GroupName = Group->getName();
1295 Flags |= ELF::SHF_GROUP;
1296 }
1297
1298 // Use the text section's begin symbol and unique ID to create a separate
1299 // .llvm_bb_addr_map section associated with every unique text section.
1300 return Ctx->getELFSection(
1301 Name, ELF::SHT_LLVM_BB_ADDR_MAP, Flags, 0, GroupName, true,
1302 ElfSec.getUniqueID(),
1303 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1304 } else if (Ctx->getObjectFileType() == MCContext::IsCOFF) {
1305 StringRef COMDATSymName;
1306 int Selection = 0;
1307 unsigned Characteristics = COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1310 const auto &COFFSec = static_cast<const MCSectionCOFF &>(TextSec);
1311 if (const MCSymbol *COMDATSym = COFFSec.getCOMDATSymbol()) {
1312 if (!Ctx->getAsmInfo().hasCOFFAssociativeComdats())
1313 report_fatal_error("BB address map requires associative COMDAT "
1314 "support for COMDAT functions");
1315 COMDATSymName = COMDATSym->getName();
1316 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1318 }
1319 return Ctx->getCOFFSection(Name, Characteristics, COMDATSymName, Selection,
1320 COFFSec.getUniqueID());
1321 }
1322
1323 return nullptr;
1324}
1325
1326MCSection *
1328 if (Ctx->getObjectFileType() != MCContext::IsELF)
1329 return nullptr;
1330
1331 const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
1332 unsigned Flags = ELF::SHF_LINK_ORDER | ELF::SHF_ALLOC;
1333 StringRef GroupName;
1334 if (const MCSymbol *Group = ElfSec.getGroup()) {
1335 GroupName = Group->getName();
1336 Flags |= ELF::SHF_GROUP;
1337 }
1338
1339 return Ctx->getELFSection(
1340 ".kcfi_traps", ELF::SHT_PROGBITS, Flags, 0, GroupName,
1341 /*IsComdat=*/true, ElfSec.getUniqueID(),
1342 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1343}
1344
1345MCSection *
1347 auto ObjFileType = Ctx->getObjectFileType();
1348 if (ObjFileType == MCContext::IsELF) {
1349 const auto &ElfSec = static_cast<const MCSectionELF &>(TextSec);
1350 unsigned Flags = ELF::SHF_LINK_ORDER;
1351 StringRef GroupName;
1352 if (const MCSymbol *Group = ElfSec.getGroup()) {
1353 GroupName = Group->getName();
1354 Flags |= ELF::SHF_GROUP;
1355 }
1356 return Ctx->getELFSection(
1357 PseudoProbeSection->getName(), ELF::SHT_PROGBITS, Flags, 0, GroupName,
1358 true, ElfSec.getUniqueID(),
1359 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1360 } else if (ObjFileType == MCContext::IsCOFF) {
1361 StringRef COMDATSymName = "";
1362 int Selection = 0;
1363 unsigned Characteristics =
1364 static_cast<MCSectionCOFF *>(PseudoProbeSection)->getCharacteristics();
1365 const auto &COFFSec = static_cast<const MCSectionCOFF &>(TextSec);
1366 if (const MCSymbol *COMDATSym = COFFSec.getCOMDATSymbol()) {
1367 // Associate .pseudo_probe to its function section.
1368 COMDATSymName = COMDATSym->getName();
1369 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1371 }
1372 return Ctx->getCOFFSection(PseudoProbeSection->getName(), Characteristics,
1373 COMDATSymName, Selection, COFFSec.getUniqueID());
1374 }
1375
1376 return PseudoProbeSection;
1377}
1378
1379MCSection *
1381 uint64_t FuncHash) const {
1382 if (!Ctx->getTargetTriple().supportsCOMDAT() || FuncName.empty())
1384
1385 // Create a separate comdat group for each function's descriptor in order
1386 // for the linker to deduplicate. The duplication, must be from different
1387 // translation unit, can come from:
1388 // 1. Inline functions defined in header files;
1389 // 2. ThinLTO imported functions;
1390 // 3. Weak-linkage definitions.
1391 // Use a concatenation of the section name, function name, and function hash
1392 // as the group name so that descriptors with different hashes (due to user
1393 // code not following ODR or compiler codegen inconsistencies) get separate
1394 // COMDAT sections instead of being silently dropped (ELF) or causing linker
1395 // errors (COFF). Duplicate GUIDs with mismatching hashes are detected
1396 // during descriptor decoding and reported by llvm-profgen.
1397 auto ObjFileType = Ctx->getObjectFileType();
1398 if (ObjFileType == MCContext::IsELF) {
1399 auto *S = static_cast<MCSectionELF *>(PseudoProbeDescSection);
1400 auto Flags = S->getFlags() | ELF::SHF_GROUP;
1401 return Ctx->getELFSection(
1402 S->getName(), S->getType(), Flags, S->getEntrySize(),
1403 S->getName() + "_" + FuncName + "." + Twine::utohexstr(FuncHash),
1404 /*IsComdat=*/true);
1405 } else if (ObjFileType == MCContext::IsCOFF) {
1406 auto *S = static_cast<MCSectionCOFF *>(PseudoProbeDescSection);
1407 unsigned Characteristics =
1408 S->getCharacteristics() | COFF::IMAGE_SCN_LNK_COMDAT;
1409 std::string COMDATSymName =
1410 (S->getName() + "_" + FuncName + "." + Twine::utohexstr(FuncHash))
1411 .str();
1412 return Ctx->getCOFFSection(S->getName(), Characteristics, COMDATSymName,
1414 }
1415
1417}
1418
1422
1424 const MCSection *TextSec) const {
1425 if (Ctx->getObjectFileType() != MCContext::IsELF)
1426 return nullptr;
1427
1428 // SHF_WRITE for relocations, and let user post-process data in-place.
1430
1431 if (!TextSec)
1432 TextSec = getTextSection();
1433
1434 StringRef GroupName;
1435 const auto &ElfSec = static_cast<const MCSectionELF &>(*TextSec);
1436 if (const MCSymbol *Group = ElfSec.getGroup()) {
1437 GroupName = Group->getName();
1438 Flags |= ELF::SHF_GROUP;
1439 }
1440 return Ctx->getELFSection(
1441 Name, ELF::SHT_PROGBITS, Flags, 0, GroupName, true, ElfSec.getUniqueID(),
1442 static_cast<const MCSymbolELF *>(TextSec->getBeginSymbol()));
1443}
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:48
@ UnknownObjectFormat
Definition Triple.h:419
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:962
@ DW_EH_PE_sdata4
Definition Dwarf.h:959
@ DW_EH_PE_sdata8
Definition Dwarf.h:960
@ DW_EH_PE_absptr
Definition Dwarf.h:951
@ 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