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()) {
81 break;
84 break;
88 break;
89 }
90
92
93 TextSection // .text
94 = Ctx->getMachOSection("__TEXT", "__text",
97 DataSection // .data
98 = Ctx->getMachOSection("__DATA", "__data", 0, SectionKind::getData());
99
100 // BSSSection might not be expected initialized on msvc.
101 BSSSection = nullptr;
102
103 TLSDataSection // .tdata
104 = Ctx->getMachOSection("__DATA", "__thread_data",
107 TLSBSSSection // .tbss
108 = Ctx->getMachOSection("__DATA", "__thread_bss",
111
112 // TODO: Verify datarel below.
113 TLSTLVSection // .tlv
114 = Ctx->getMachOSection("__DATA", "__thread_vars",
117
118 TLSThreadInitSection = Ctx->getMachOSection(
119 "__DATA", "__thread_init", MachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
121
122 CStringSection // .cstring
123 = Ctx->getMachOSection("__TEXT", "__cstring",
127 = Ctx->getMachOSection("__TEXT","__ustring", 0,
129 FourByteConstantSection // .literal4
130 = Ctx->getMachOSection("__TEXT", "__literal4",
133 EightByteConstantSection // .literal8
134 = Ctx->getMachOSection("__TEXT", "__literal8",
137
138 SixteenByteConstantSection // .literal16
139 = Ctx->getMachOSection("__TEXT", "__literal16",
142
143 ReadOnlySection // .const
144 = Ctx->getMachOSection("__TEXT", "__const", 0,
146
147 // If the target is not powerpc, map the coal sections to the non-coal
148 // sections.
149 //
150 // "__TEXT/__textcoal_nt" => section "__TEXT/__text"
151 // "__TEXT/__const_coal" => section "__TEXT/__const"
152 // "__DATA/__datacoal_nt" => section "__DATA/__data"
153 Triple::ArchType ArchTy = T.getArch();
154
155 ConstDataSection // .const_data
156 = Ctx->getMachOSection("__DATA", "__const", 0,
158
159 if (ArchTy == Triple::ppc || ArchTy == Triple::ppc64) {
161 = Ctx->getMachOSection("__TEXT", "__textcoal_nt",
166 = Ctx->getMachOSection("__TEXT", "__const_coal",
169 DataCoalSection = Ctx->getMachOSection(
170 "__DATA", "__datacoal_nt", MachO::S_COALESCED, SectionKind::getData());
172 } else {
177 }
178
180 = Ctx->getMachOSection("__DATA","__common",
184 = Ctx->getMachOSection("__DATA","__bss", MachO::S_ZEROFILL,
186
187
189 = Ctx->getMachOSection("__DATA", "__la_symbol_ptr",
193 = Ctx->getMachOSection("__DATA", "__nl_symbol_ptr",
196
198 = Ctx->getMachOSection("__DATA", "__thread_ptr",
201
202 AddrSigSection = Ctx->getMachOSection("__DATA", "__llvm_addrsig", 0,
204
205 // Exception Handling.
206 LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
208
209 COFFDebugSymbolsSection = nullptr;
210 COFFDebugTypesSection = nullptr;
212
213 if (useCompactUnwind(T)) {
215 Ctx->getMachOSection("__LD", "__compact_unwind", MachO::S_ATTR_DEBUG,
217
218 if (T.isX86())
219 CompactUnwindDwarfEHFrameOnly = 0x04000000; // UNWIND_X86_64_MODE_DWARF
220 else if (T.getArch() == Triple::aarch64 || T.getArch() == Triple::aarch64_32)
221 CompactUnwindDwarfEHFrameOnly = 0x03000000; // UNWIND_ARM64_MODE_DWARF
222 else if (T.getArch() == Triple::arm || T.getArch() == Triple::thumb)
223 CompactUnwindDwarfEHFrameOnly = 0x04000000; // UNWIND_ARM_MODE_DWARF
224 }
225
226 // Debug Information.
228 Ctx->getMachOSection("__DWARF", "__debug_names", MachO::S_ATTR_DEBUG,
229 SectionKind::getMetadata(), "debug_names_begin");
231 Ctx->getMachOSection("__DWARF", "__apple_names", MachO::S_ATTR_DEBUG,
232 SectionKind::getMetadata(), "names_begin");
234 Ctx->getMachOSection("__DWARF", "__apple_objc", MachO::S_ATTR_DEBUG,
235 SectionKind::getMetadata(), "objc_begin");
236 // 16 character section limit...
238 Ctx->getMachOSection("__DWARF", "__apple_namespac", MachO::S_ATTR_DEBUG,
239 SectionKind::getMetadata(), "namespac_begin");
241 Ctx->getMachOSection("__DWARF", "__apple_types", MachO::S_ATTR_DEBUG,
242 SectionKind::getMetadata(), "types_begin");
243
245 Ctx->getMachOSection("__DWARF", "__swift_ast", MachO::S_ATTR_DEBUG,
247
249 Ctx->getMachOSection("__DWARF", "__debug_abbrev", MachO::S_ATTR_DEBUG,
250 SectionKind::getMetadata(), "section_abbrev");
252 Ctx->getMachOSection("__DWARF", "__debug_info", MachO::S_ATTR_DEBUG,
253 SectionKind::getMetadata(), "section_info");
255 Ctx->getMachOSection("__DWARF", "__debug_line", MachO::S_ATTR_DEBUG,
256 SectionKind::getMetadata(), "section_line");
258 Ctx->getMachOSection("__DWARF", "__debug_line_str", MachO::S_ATTR_DEBUG,
259 SectionKind::getMetadata(), "section_line_str");
261 Ctx->getMachOSection("__DWARF", "__debug_frame", MachO::S_ATTR_DEBUG,
262 SectionKind::getMetadata(), "section_frame");
264 Ctx->getMachOSection("__DWARF", "__debug_pubnames", MachO::S_ATTR_DEBUG,
267 Ctx->getMachOSection("__DWARF", "__debug_pubtypes", MachO::S_ATTR_DEBUG,
270 Ctx->getMachOSection("__DWARF", "__debug_gnu_pubn", MachO::S_ATTR_DEBUG,
273 Ctx->getMachOSection("__DWARF", "__debug_gnu_pubt", MachO::S_ATTR_DEBUG,
276 Ctx->getMachOSection("__DWARF", "__debug_str", MachO::S_ATTR_DEBUG,
277 SectionKind::getMetadata(), "info_string");
279 Ctx->getMachOSection("__DWARF", "__debug_str_offs", MachO::S_ATTR_DEBUG,
280 SectionKind::getMetadata(), "section_str_off");
282 Ctx->getMachOSection("__DWARF", "__debug_addr", MachO::S_ATTR_DEBUG,
283 SectionKind::getMetadata(), "section_info");
285 Ctx->getMachOSection("__DWARF", "__debug_loc", MachO::S_ATTR_DEBUG,
286 SectionKind::getMetadata(), "section_debug_loc");
288 Ctx->getMachOSection("__DWARF", "__debug_loclists", MachO::S_ATTR_DEBUG,
289 SectionKind::getMetadata(), "section_debug_loc");
290
292 Ctx->getMachOSection("__DWARF", "__debug_aranges", MachO::S_ATTR_DEBUG,
295 Ctx->getMachOSection("__DWARF", "__debug_ranges", MachO::S_ATTR_DEBUG,
296 SectionKind::getMetadata(), "debug_range");
298 Ctx->getMachOSection("__DWARF", "__debug_rnglists", MachO::S_ATTR_DEBUG,
299 SectionKind::getMetadata(), "debug_range");
301 Ctx->getMachOSection("__DWARF", "__debug_macinfo", MachO::S_ATTR_DEBUG,
302 SectionKind::getMetadata(), "debug_macinfo");
304 Ctx->getMachOSection("__DWARF", "__debug_macro", MachO::S_ATTR_DEBUG,
305 SectionKind::getMetadata(), "debug_macro");
307 Ctx->getMachOSection("__DWARF", "__debug_inlined", MachO::S_ATTR_DEBUG,
310 Ctx->getMachOSection("__DWARF", "__debug_cu_index", MachO::S_ATTR_DEBUG,
313 Ctx->getMachOSection("__DWARF", "__debug_tu_index", MachO::S_ATTR_DEBUG,
315 StackMapSection = Ctx->getMachOSection("__LLVM_STACKMAPS", "__llvm_stackmaps",
317
318 FaultMapSection = Ctx->getMachOSection("__LLVM_FAULTMAPS", "__llvm_faultmaps",
320
321 RemarksSection = Ctx->getMachOSection(
322 "__LLVM", "__remarks", MachO::S_ATTR_DEBUG, SectionKind::getMetadata());
323
325 Ctx->getMachOSection("__PSEUDO_PROBE", "__probes",
329 Ctx->getMachOSection("__PSEUDO_PROBE", "__probe_descs",
332
333 // The architecture of dsymutil makes it very difficult to copy the Swift
334 // reflection metadata sections into the __TEXT segment, so dsymutil creates
335 // these sections in the __DWARF segment instead.
336 if (!Ctx->getSwift5ReflectionSegmentName().empty()) {
337#define HANDLE_SWIFT_SECTION(KIND, MACHO, ELF, COFF) \
338 Swift5ReflectionSections \
339 [llvm::binaryformat::Swift5ReflectionSectionKind::KIND] = \
340 Ctx->getMachOSection(Ctx->getSwift5ReflectionSegmentName().data(), \
341 MACHO, 0, SectionKind::getMetadata());
342#include "llvm/BinaryFormat/Swift.def"
343 }
344
346}
347
348void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {
349 switch (T.getArch()) {
350 case Triple::mips:
351 case Triple::mipsel:
352 case Triple::mips64:
353 case Triple::mips64el:
354 // We cannot use DW_EH_PE_sdata8 for the large PositionIndependent case
355 // since there is no R_MIPS_PC64 relocation (only a 32-bit version).
356 // In fact DW_EH_PE_sdata4 is enough for us now, and GNU ld doesn't
357 // support pcrel|sdata8 well. Let's use sdata4 for now.
358 if (PositionIndependent)
360 else
361 FDECFIEncoding = Ctx->getAsmInfo()->getCodePointerSize() == 4
364 break;
365 case Triple::ppc64:
366 case Triple::ppc64le:
367 case Triple::aarch64:
369 case Triple::x86_64:
372 break;
373 case Triple::bpfel:
374 case Triple::bpfeb:
376 break;
377 case Triple::hexagon:
379 PositionIndependent ? dwarf::DW_EH_PE_pcrel : dwarf::DW_EH_PE_absptr;
380 break;
381 case Triple::xtensa:
383 break;
384 default:
386 break;
387 }
388
389 unsigned EHSectionType = T.getArch() == Triple::x86_64
392 switch (T.getArch()) {
393 case Triple::x86_64:
394 SFrameABIArch = sframe::ABI::AMD64EndianLittle;
395 break;
396 case Triple::aarch64:
397 SFrameABIArch = sframe::ABI::AArch64EndianLittle;
398 break;
400 SFrameABIArch = sframe::ABI::AArch64EndianBig;
401 break;
402 default:
403 break;
404 }
405
406 // Solaris requires different flags for .eh_frame to seemingly every other
407 // platform.
408 unsigned EHSectionFlags = ELF::SHF_ALLOC;
409 if (T.isOSSolaris() && T.getArch() != Triple::x86_64)
410 EHSectionFlags |= ELF::SHF_WRITE;
411
412 // ELF
413 BSSSection = Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
415
416 TextSection = Ctx->getELFSection(".text", ELF::SHT_PROGBITS,
418
419 DataSection = Ctx->getELFSection(".data", ELF::SHT_PROGBITS,
421
423 Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
424
426 Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
428
429 TLSBSSSection = Ctx->getELFSection(
431
432 DataRelROSection = Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
434
436 Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
438
440 Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
442
444 Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
446
448 Ctx->getELFSection(".rodata.cst32", ELF::SHT_PROGBITS,
450
451 // Exception Handling Sections.
452
453 // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
454 // it contains relocatable pointers. In PIC mode, this is probably a big
455 // runtime hit for C++ apps. Either the contents of the LSDA need to be
456 // adjusted or this should be a data section.
457 LSDASection = Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
459
460 COFFDebugSymbolsSection = nullptr;
461 COFFDebugTypesSection = nullptr;
462
463 unsigned DebugSecType = ELF::SHT_PROGBITS;
464
465 // MIPS .debug_* sections should have SHT_MIPS_DWARF section type
466 // to distinguish among sections contain DWARF and ECOFF debug formats.
467 // Sections with ECOFF debug format are obsoleted and marked by SHT_PROGBITS.
468 if (T.isMIPS())
469 DebugSecType = ELF::SHT_MIPS_DWARF;
470
471 // Debug Info Sections.
473 Ctx->getELFSection(".debug_abbrev", DebugSecType, 0);
474 DwarfInfoSection = Ctx->getELFSection(".debug_info", DebugSecType, 0);
475 DwarfLineSection = Ctx->getELFSection(".debug_line", DebugSecType, 0);
477 Ctx->getELFSection(".debug_line_str", DebugSecType,
479 DwarfFrameSection = Ctx->getELFSection(".debug_frame", DebugSecType, 0);
481 Ctx->getELFSection(".debug_pubnames", DebugSecType, 0);
483 Ctx->getELFSection(".debug_pubtypes", DebugSecType, 0);
485 Ctx->getELFSection(".debug_gnu_pubnames", DebugSecType, 0);
487 Ctx->getELFSection(".debug_gnu_pubtypes", DebugSecType, 0);
489 Ctx->getELFSection(".debug_str", DebugSecType,
491 DwarfLocSection = Ctx->getELFSection(".debug_loc", DebugSecType, 0);
493 Ctx->getELFSection(".debug_aranges", DebugSecType, 0);
495 Ctx->getELFSection(".debug_ranges", DebugSecType, 0);
497 Ctx->getELFSection(".debug_macinfo", DebugSecType, 0);
498 DwarfMacroSection = Ctx->getELFSection(".debug_macro", DebugSecType, 0);
499
500 // DWARF5 Experimental Debug Info
501
502 // Accelerator Tables
504 Ctx->getELFSection(".debug_names", ELF::SHT_PROGBITS, 0);
506 Ctx->getELFSection(".apple_names", ELF::SHT_PROGBITS, 0);
508 Ctx->getELFSection(".apple_objc", ELF::SHT_PROGBITS, 0);
510 Ctx->getELFSection(".apple_namespaces", ELF::SHT_PROGBITS, 0);
512 Ctx->getELFSection(".apple_types", ELF::SHT_PROGBITS, 0);
513
514 // String Offset and Address Sections
516 Ctx->getELFSection(".debug_str_offsets", DebugSecType, 0);
517 DwarfAddrSection = Ctx->getELFSection(".debug_addr", DebugSecType, 0);
518 DwarfRnglistsSection = Ctx->getELFSection(".debug_rnglists", DebugSecType, 0);
519 DwarfLoclistsSection = Ctx->getELFSection(".debug_loclists", DebugSecType, 0);
520
521 // Fission Sections
523 Ctx->getELFSection(".debug_info.dwo", DebugSecType, ELF::SHF_EXCLUDE);
525 Ctx->getELFSection(".debug_types.dwo", DebugSecType, ELF::SHF_EXCLUDE);
527 Ctx->getELFSection(".debug_abbrev.dwo", DebugSecType, ELF::SHF_EXCLUDE);
528 DwarfStrDWOSection = Ctx->getELFSection(
529 ".debug_str.dwo", DebugSecType,
532 Ctx->getELFSection(".debug_line.dwo", DebugSecType, ELF::SHF_EXCLUDE);
534 Ctx->getELFSection(".debug_loc.dwo", DebugSecType, ELF::SHF_EXCLUDE);
535 DwarfStrOffDWOSection = Ctx->getELFSection(".debug_str_offsets.dwo",
536 DebugSecType, ELF::SHF_EXCLUDE);
538 Ctx->getELFSection(".debug_rnglists.dwo", DebugSecType, ELF::SHF_EXCLUDE);
540 Ctx->getELFSection(".debug_macinfo.dwo", DebugSecType, ELF::SHF_EXCLUDE);
542 Ctx->getELFSection(".debug_macro.dwo", DebugSecType, ELF::SHF_EXCLUDE);
543
545 Ctx->getELFSection(".debug_loclists.dwo", DebugSecType, ELF::SHF_EXCLUDE);
546
547 // DWP Sections
549 Ctx->getELFSection(".debug_cu_index", DebugSecType, 0);
551 Ctx->getELFSection(".debug_tu_index", DebugSecType, 0);
552
554 Ctx->getELFSection(".llvm_stackmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
555
557 Ctx->getELFSection(".llvm_faultmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
558
560 Ctx->getELFSection(".eh_frame", EHSectionType, EHSectionFlags);
561
563 Ctx->getELFSection(".sframe", ELF::SHT_GNU_SFRAME, ELF::SHF_ALLOC);
564
566 Ctx->getELFSection(".llvm.callgraph", ELF::SHT_LLVM_CALL_GRAPH, 0);
567
568 StackSizesSection = Ctx->getELFSection(".stack_sizes", ELF::SHT_PROGBITS, 0);
569
570 PseudoProbeSection = Ctx->getELFSection(".pseudo_probe", DebugSecType, 0);
572 Ctx->getELFSection(".pseudo_probe_desc", DebugSecType, 0);
573
574 LLVMStatsSection = Ctx->getELFSection(".llvm_stats", ELF::SHT_PROGBITS, 0);
575}
576
577void MCObjectFileInfo::initGOFFMCObjectFileInfo(const Triple &T) {
578 MCSectionGOFF *RootSDSection = Ctx->getGOFFSection(
581
582 MCSectionGOFF *ADAEDSection = Ctx->getGOFFSection(
584 GOFF::EDAttr{false, GOFF::ESD_RMODE_64, GOFF::ESD_NS_Parts,
588 RootSDSection);
589 ADASection = Ctx->getGOFFSection(SectionKind::getData(), "#S",
590 GOFF::PRAttr{false, GOFF::ESD_EXE_DATA,
593 ADAEDSection);
594
595 TextSection = Ctx->getGOFFSection(
601 RootSDSection);
602
603 MCSectionGOFF *PPA2ListEDSection = Ctx->getGOFFSection(
605 GOFF::EDAttr{true, GOFF::ESD_RMODE_64, GOFF::ESD_NS_Parts,
609 RootSDSection);
610 PPA2ListSection = Ctx->getGOFFSection(SectionKind::getData(), ".&ppa2",
611 GOFF::PRAttr{true, GOFF::ESD_EXE_DATA,
614 PPA2ListEDSection);
615
616 IDRLSection = Ctx->getGOFFSection(
617 SectionKind::getData(), "B_IDRL",
622 RootSDSection);
623
624 // Debug Info Sections. The ED name is the same used by the XL compiler.
625 auto InitDebugSection = [this,
626 RootSDSection](StringRef EDName,
627 StringRef LDName) -> MCSectionGOFF * {
628 MCSectionGOFF *ED = Ctx->getGOFFSection(
629 SectionKind::getMetadata(), EDName,
630 GOFF::EDAttr{false, GOFF::ESD_RMODE_64, GOFF::ESD_NS_Parts,
634 RootSDSection);
635 // At least for llc, this function is called twice! (See function
636 // compileModule() in llc.cpp). Since the context is not cleared, the
637 // already allocated section is returned above. We only add the begin symbol
638 // if it is not yet set to avoid an assertion.
639 MCSymbolGOFF *LD = static_cast<MCSymbolGOFF *>(ED->getBeginSymbol());
640 if (!LD) {
641 LD = static_cast<MCSymbolGOFF *>(getContext().getOrCreateSymbol(LDName));
642 LD->setCodeData(GOFF::ESD_EXE_DATA);
643 LD->setWeak(false);
644 LD->setLinkage(GOFF::ESD_LT_XPLink);
645 LD->setExternal(false);
646 ED->setBeginSymbol(LD);
647 } else
648 assert(LD->getName() == LDName && "Wrong label name");
649 return ED;
650 };
651 DwarfAbbrevSection = InitDebugSection("D_ABREV", ".debug_abbrev");
652 DwarfInfoSection = InitDebugSection("D_INFO", ".debug_info");
653 DwarfLineSection = InitDebugSection("D_LINE", ".debug_line");
654 DwarfFrameSection = InitDebugSection("D_FRAME", ".debug_frame");
655 DwarfPubNamesSection = InitDebugSection("D_PBNMS", ".debug_pubnames");
656 DwarfPubTypesSection = InitDebugSection("D_PTYPES", ".debug_pubtypes");
657 DwarfStrSection = InitDebugSection("D_STR", ".debug_str");
658 DwarfLocSection = InitDebugSection("D_LOC", ".debug_loc");
659 DwarfARangesSection = InitDebugSection("D_ARNGE", ".debug_aranges");
660 DwarfRangesSection = InitDebugSection("D_RNGES", ".debug_ranges");
661 DwarfMacinfoSection = InitDebugSection("D_MACIN", ".debug_macinfo");
662
663 // DWARF 5 sections.
664 DwarfDebugNamesSection = InitDebugSection("D_NAMES", ".debug_names");
665 DwarfStrOffSection = InitDebugSection("D_STROFFS", ".debug_str_offsets");
666 DwarfAddrSection = InitDebugSection("D_ADDR", ".debug_addr");
667 DwarfRnglistsSection = InitDebugSection("D_RNGLISTS", ".debug_rnglists");
668 DwarfLoclistsSection = InitDebugSection("D_LOCLISTS", ".debug_loclists");
669 DwarfLineStrSection = InitDebugSection("D_LINESTR", ".debug_line_str");
670
671 // Special GNU sections.
672 DwarfGnuPubNamesSection = InitDebugSection("D_GPBNMS", ".debug_gnu_pubnames");
674 InitDebugSection("D_GPTYPES", ".debug_gnu_pubtypes");
675
676 // Accelerator Tables.
677 DwarfAccelNamesSection = InitDebugSection("D_APPLNMS", ".apple_names");
679 InitDebugSection("D_APPLNMSP", ".apple_namespaces");
680 DwarfAccelTypesSection = InitDebugSection("D_APPLTYPS", ".apple_types");
681 DwarfAccelObjCSection = InitDebugSection("D_APPLOBJC", ".apple_objc");
682}
683
684void MCObjectFileInfo::initCOFFMCObjectFileInfo(const Triple &T) {
686 Ctx->getCOFFSection(".eh_frame", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
688
689 // Set the `IMAGE_SCN_MEM_16BIT` flag when compiling for thumb mode. This is
690 // used to indicate to the linker that the text segment contains thumb instructions
691 // and to set the ISA selection bit for calls accordingly.
692 const bool IsThumb = T.getArch() == Triple::thumb;
693
694 // COFF
695 BSSSection = Ctx->getCOFFSection(
698 TextSection = Ctx->getCOFFSection(
699 ".text",
703 DataSection = Ctx->getCOFFSection(
707 Ctx->getCOFFSection(".rdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
709
710 if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::aarch64 ||
711 T.getArch() == Triple::arm || T.getArch() == Triple::thumb) {
712 // On Windows with SEH, the LSDA is emitted into the .xdata section
713 LSDASection = nullptr;
714 } else {
715 LSDASection = Ctx->getCOFFSection(".gcc_except_table",
718 }
719
720 if (T.getArch() == Triple::aarch64) {
722 Ctx->getCOFFSection(".impcall", COFF::IMAGE_SCN_LNK_INFO);
723 } else if (T.getArch() == Triple::x86_64) {
724 // Import Call Optimization on x64 leverages the same metadata as the
725 // retpoline mitigation, hence the unusual section name.
727 Ctx->getCOFFSection(".retplne", COFF::IMAGE_SCN_LNK_INFO);
728 }
729
730 // Debug info.
732 Ctx->getCOFFSection(".debug$S", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
736 Ctx->getCOFFSection(".debug$T", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
740 Ctx->getCOFFSection(".debug$H", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
743
744 DwarfAbbrevSection = Ctx->getCOFFSection(
745 ".debug_abbrev", COFF::IMAGE_SCN_MEM_DISCARDABLE |
748 DwarfInfoSection = Ctx->getCOFFSection(
749 ".debug_info", COFF::IMAGE_SCN_MEM_DISCARDABLE |
752 DwarfLineSection = Ctx->getCOFFSection(
753 ".debug_line", COFF::IMAGE_SCN_MEM_DISCARDABLE |
756 DwarfLineStrSection = Ctx->getCOFFSection(
757 ".debug_line_str", COFF::IMAGE_SCN_MEM_DISCARDABLE |
760 DwarfFrameSection = Ctx->getCOFFSection(
761 ".debug_frame", COFF::IMAGE_SCN_MEM_DISCARDABLE |
764 DwarfPubNamesSection = Ctx->getCOFFSection(
765 ".debug_pubnames", COFF::IMAGE_SCN_MEM_DISCARDABLE |
768 DwarfPubTypesSection = Ctx->getCOFFSection(
769 ".debug_pubtypes", COFF::IMAGE_SCN_MEM_DISCARDABLE |
772 DwarfGnuPubNamesSection = Ctx->getCOFFSection(
773 ".debug_gnu_pubnames", COFF::IMAGE_SCN_MEM_DISCARDABLE |
776 DwarfGnuPubTypesSection = Ctx->getCOFFSection(
777 ".debug_gnu_pubtypes", COFF::IMAGE_SCN_MEM_DISCARDABLE |
780 DwarfStrSection = Ctx->getCOFFSection(
781 ".debug_str", COFF::IMAGE_SCN_MEM_DISCARDABLE |
784 DwarfStrOffSection = Ctx->getCOFFSection(
785 ".debug_str_offsets", COFF::IMAGE_SCN_MEM_DISCARDABLE |
788 DwarfLocSection = Ctx->getCOFFSection(
789 ".debug_loc", COFF::IMAGE_SCN_MEM_DISCARDABLE |
792 DwarfLoclistsSection = Ctx->getCOFFSection(
793 ".debug_loclists", COFF::IMAGE_SCN_MEM_DISCARDABLE |
796 DwarfARangesSection = Ctx->getCOFFSection(
797 ".debug_aranges", COFF::IMAGE_SCN_MEM_DISCARDABLE |
800 DwarfRangesSection = Ctx->getCOFFSection(
801 ".debug_ranges", COFF::IMAGE_SCN_MEM_DISCARDABLE |
804 DwarfRnglistsSection = Ctx->getCOFFSection(
805 ".debug_rnglists", COFF::IMAGE_SCN_MEM_DISCARDABLE |
808 DwarfMacinfoSection = Ctx->getCOFFSection(
809 ".debug_macinfo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
812 DwarfMacroSection = Ctx->getCOFFSection(
813 ".debug_macro", COFF::IMAGE_SCN_MEM_DISCARDABLE |
816 DwarfMacinfoDWOSection = Ctx->getCOFFSection(
817 ".debug_macinfo.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
820 DwarfMacroDWOSection = Ctx->getCOFFSection(
821 ".debug_macro.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
824 DwarfInfoDWOSection = Ctx->getCOFFSection(
825 ".debug_info.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
828 DwarfTypesDWOSection = Ctx->getCOFFSection(
829 ".debug_types.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
832 DwarfAbbrevDWOSection = Ctx->getCOFFSection(
833 ".debug_abbrev.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
836 DwarfStrDWOSection = Ctx->getCOFFSection(
837 ".debug_str.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
840 DwarfLineDWOSection = Ctx->getCOFFSection(
841 ".debug_line.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
844 DwarfLocDWOSection = Ctx->getCOFFSection(
845 ".debug_loc.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
848 DwarfLoclistsDWOSection = Ctx->getCOFFSection(
849 ".debug_loclists.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
852 DwarfStrOffDWOSection = Ctx->getCOFFSection(
853 ".debug_str_offsets.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
856 DwarfRnglistsDWOSection = Ctx->getCOFFSection(
857 ".debug_rnglists.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE |
860 DwarfAddrSection = Ctx->getCOFFSection(
861 ".debug_addr", COFF::IMAGE_SCN_MEM_DISCARDABLE |
864 DwarfCUIndexSection = Ctx->getCOFFSection(
865 ".debug_cu_index", COFF::IMAGE_SCN_MEM_DISCARDABLE |
868 DwarfTUIndexSection = Ctx->getCOFFSection(
869 ".debug_tu_index", COFF::IMAGE_SCN_MEM_DISCARDABLE |
872 DwarfDebugNamesSection = Ctx->getCOFFSection(
873 ".debug_names", COFF::IMAGE_SCN_MEM_DISCARDABLE |
876 DwarfAccelNamesSection = Ctx->getCOFFSection(
877 ".apple_names", COFF::IMAGE_SCN_MEM_DISCARDABLE |
880 DwarfAccelNamespaceSection = Ctx->getCOFFSection(
881 ".apple_namespaces", COFF::IMAGE_SCN_MEM_DISCARDABLE |
884 DwarfAccelTypesSection = Ctx->getCOFFSection(
885 ".apple_types", COFF::IMAGE_SCN_MEM_DISCARDABLE |
888 DwarfAccelObjCSection = Ctx->getCOFFSection(
889 ".apple_objc", COFF::IMAGE_SCN_MEM_DISCARDABLE |
892
893 DrectveSection = Ctx->getCOFFSection(
895
897 Ctx->getCOFFSection(".pdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
899
901 Ctx->getCOFFSection(".xdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
903
904 SXDataSection = Ctx->getCOFFSection(".sxdata", COFF::IMAGE_SCN_LNK_INFO);
905
907 Ctx->getCOFFSection(".gehcont$y", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
909
911 Ctx->getCOFFSection(".gfids$y", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
913
915 Ctx->getCOFFSection(".giats$y", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
917
919 Ctx->getCOFFSection(".gljmp$y", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
921
922 TLSDataSection = Ctx->getCOFFSection(
925
926 StackMapSection = Ctx->getCOFFSection(".llvm_stackmaps",
929
930 // Set IMAGE_SCN_MEM_DISCARDABLE so that lld will not truncate section name.
931 PseudoProbeSection = Ctx->getCOFFSection(
932 ".pseudo_probe", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
935 PseudoProbeDescSection = Ctx->getCOFFSection(
936 ".pseudo_probe_desc", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
939}
940
941void MCObjectFileInfo::initSPIRVMCObjectFileInfo(const Triple &T) {
942 // Put everything in a single binary section.
943 TextSection = Ctx->getSPIRVSection();
944}
945
946void MCObjectFileInfo::initWasmMCObjectFileInfo(const Triple &T) {
947 TextSection = Ctx->getWasmSection(".text", SectionKind::getText());
948 DataSection = Ctx->getWasmSection(".data", SectionKind::getData());
949
951 Ctx->getWasmSection(".debug_line", SectionKind::getMetadata());
953 Ctx->getWasmSection(".debug_line_str", SectionKind::getMetadata(),
955 DwarfStrSection = Ctx->getWasmSection(
958 Ctx->getWasmSection(".debug_loc", SectionKind::getMetadata());
960 Ctx->getWasmSection(".debug_abbrev", SectionKind::getMetadata());
961 DwarfARangesSection = Ctx->getWasmSection(".debug_aranges", SectionKind::getMetadata());
963 Ctx->getWasmSection(".debug_ranges", SectionKind::getMetadata());
965 Ctx->getWasmSection(".debug_macinfo", SectionKind::getMetadata());
967 Ctx->getWasmSection(".debug_macro", SectionKind::getMetadata());
968 DwarfCUIndexSection = Ctx->getWasmSection(".debug_cu_index", SectionKind::getMetadata());
969 DwarfTUIndexSection = Ctx->getWasmSection(".debug_tu_index", SectionKind::getMetadata());
971 Ctx->getWasmSection(".debug_info", SectionKind::getMetadata());
972 DwarfFrameSection = Ctx->getWasmSection(".debug_frame", SectionKind::getMetadata());
973 DwarfPubNamesSection = Ctx->getWasmSection(".debug_pubnames", SectionKind::getMetadata());
974 DwarfPubTypesSection = Ctx->getWasmSection(".debug_pubtypes", SectionKind::getMetadata());
976 Ctx->getWasmSection(".debug_gnu_pubnames", SectionKind::getMetadata());
978 Ctx->getWasmSection(".debug_gnu_pubtypes", SectionKind::getMetadata());
979
981 Ctx->getWasmSection(".debug_names", SectionKind::getMetadata());
983 Ctx->getWasmSection(".debug_str_offsets", SectionKind::getMetadata());
985 Ctx->getWasmSection(".debug_addr", SectionKind::getMetadata());
987 Ctx->getWasmSection(".debug_rnglists", SectionKind::getMetadata());
989 Ctx->getWasmSection(".debug_loclists", SectionKind::getMetadata());
990
991 // Fission Sections
993 Ctx->getWasmSection(".debug_info.dwo", SectionKind::getMetadata());
995 Ctx->getWasmSection(".debug_types.dwo", SectionKind::getMetadata());
997 Ctx->getWasmSection(".debug_abbrev.dwo", SectionKind::getMetadata());
999 Ctx->getWasmSection(".debug_str.dwo", SectionKind::getMetadata(),
1002 Ctx->getWasmSection(".debug_line.dwo", SectionKind::getMetadata());
1004 Ctx->getWasmSection(".debug_loc.dwo", SectionKind::getMetadata());
1006 Ctx->getWasmSection(".debug_str_offsets.dwo", SectionKind::getMetadata());
1008 Ctx->getWasmSection(".debug_rnglists.dwo", SectionKind::getMetadata());
1010 Ctx->getWasmSection(".debug_macinfo.dwo", SectionKind::getMetadata());
1012 Ctx->getWasmSection(".debug_macro.dwo", SectionKind::getMetadata());
1013
1015 Ctx->getWasmSection(".debug_loclists.dwo", SectionKind::getMetadata());
1016
1017 // DWP Sections
1019 Ctx->getWasmSection(".debug_cu_index", SectionKind::getMetadata());
1021 Ctx->getWasmSection(".debug_tu_index", SectionKind::getMetadata());
1022
1023 // Wasm use data section for LSDA.
1024 // TODO Consider putting each function's exception table in a separate
1025 // section, as in -function-sections, to facilitate lld's --gc-section.
1026 LSDASection = Ctx->getWasmSection(".rodata.gcc_except_table",
1028
1029 // TODO: Define more sections.
1030}
1031
1032void MCObjectFileInfo::initXCOFFMCObjectFileInfo(const Triple &T) {
1033 // The default csect for program code. Functions without a specified section
1034 // get placed into this csect. The choice of csect name is not a property of
1035 // the ABI or object file format, but various tools rely on the section
1036 // name being empty (considering named symbols to be "user symbol names").
1037 TextSection = Ctx->getXCOFFSection(
1038 "..text..", // Use a non-null name to work around an AIX assembler bug...
1040 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_PR, XCOFF::XTY_SD),
1041 /* MultiSymbolsAllowed*/ true);
1042
1043 // ... but use a null name when generating the symbol table.
1044 MCSectionXCOFF *TS = static_cast<MCSectionXCOFF *>(TextSection);
1046 TS->setSymbolTableName("");
1047
1048 DataSection = Ctx->getXCOFFSection(
1049 ".data", SectionKind::getData(),
1050 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RW, XCOFF::XTY_SD),
1051 /* MultiSymbolsAllowed*/ true);
1052
1053 ReadOnlySection = Ctx->getXCOFFSection(
1054 ".rodata", SectionKind::getReadOnly(),
1055 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD),
1056 /* MultiSymbolsAllowed*/ true);
1057 ReadOnlySection->setAlignment(Align(4));
1058
1059 ReadOnly8Section = Ctx->getXCOFFSection(
1060 ".rodata.8", SectionKind::getReadOnly(),
1061 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD),
1062 /* MultiSymbolsAllowed*/ true);
1063 ReadOnly8Section->setAlignment(Align(8));
1064
1065 ReadOnly16Section = Ctx->getXCOFFSection(
1066 ".rodata.16", SectionKind::getReadOnly(),
1067 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD),
1068 /* MultiSymbolsAllowed*/ true);
1069 ReadOnly16Section->setAlignment(Align(16));
1070
1071 TLSDataSection = Ctx->getXCOFFSection(
1072 ".tdata", SectionKind::getThreadData(),
1073 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_TL, XCOFF::XTY_SD),
1074 /* MultiSymbolsAllowed*/ true);
1075
1076 TOCBaseSection = Ctx->getXCOFFSection(
1077 "TOC", SectionKind::getData(),
1078 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_TC0,
1079 XCOFF::XTY_SD));
1080
1081 // The TOC-base always has 0 size, but 4 byte alignment.
1082 TOCBaseSection->setAlignment(Align(4));
1083
1084 LSDASection = Ctx->getXCOFFSection(
1085 ".gcc_except_table", SectionKind::getReadOnly(),
1086 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RO,
1087 XCOFF::XTY_SD));
1088
1089 CompactUnwindSection = Ctx->getXCOFFSection(
1090 ".eh_info_table", SectionKind::getData(),
1091 XCOFF::CsectProperties(XCOFF::StorageMappingClass::XMC_RW,
1092 XCOFF::XTY_SD));
1093
1094 // DWARF sections for XCOFF are not csects. They are special STYP_DWARF
1095 // sections, and the individual DWARF sections are distinguished by their
1096 // section subtype.
1097 DwarfAbbrevSection = Ctx->getXCOFFSection(
1098 ".dwabrev", SectionKind::getMetadata(),
1099 /* CsectProperties */ std::nullopt,
1100 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWABREV);
1101
1102 DwarfInfoSection = Ctx->getXCOFFSection(
1103 ".dwinfo", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1104 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWINFO);
1105
1106 DwarfLineSection = Ctx->getXCOFFSection(
1107 ".dwline", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1108 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWLINE);
1109
1110 DwarfFrameSection = Ctx->getXCOFFSection(
1111 ".dwframe", SectionKind::getMetadata(),
1112 /* CsectProperties */ std::nullopt,
1113 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWFRAME);
1114
1115 DwarfPubNamesSection = Ctx->getXCOFFSection(
1116 ".dwpbnms", SectionKind::getMetadata(),
1117 /* CsectProperties */ std::nullopt,
1118 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWPBNMS);
1119
1120 DwarfPubTypesSection = Ctx->getXCOFFSection(
1121 ".dwpbtyp", SectionKind::getMetadata(),
1122 /* CsectProperties */ std::nullopt,
1123 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWPBTYP);
1124
1125 DwarfStrSection = Ctx->getXCOFFSection(
1126 ".dwstr", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1127 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWSTR);
1128
1129 DwarfLocSection = Ctx->getXCOFFSection(
1130 ".dwloc", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1131 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWLOC);
1132
1133 DwarfARangesSection = Ctx->getXCOFFSection(
1134 ".dwarnge", SectionKind::getMetadata(),
1135 /* CsectProperties */ std::nullopt,
1136 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWARNGE);
1137
1138 DwarfRangesSection = Ctx->getXCOFFSection(
1139 ".dwrnges", SectionKind::getMetadata(),
1140 /* CsectProperties */ std::nullopt,
1141 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWRNGES);
1142
1143 DwarfMacinfoSection = Ctx->getXCOFFSection(
1144 ".dwmac", SectionKind::getMetadata(), /* CsectProperties */ std::nullopt,
1145 /* MultiSymbolsAllowed */ true, XCOFF::SSUBTYP_DWMAC);
1146}
1147
1148void MCObjectFileInfo::initDXContainerObjectFileInfo(const Triple &T) {
1149 // At the moment the DXBC section should end up empty.
1150 TextSection = Ctx->getDXContainerSection("DXBC", SectionKind::getText());
1151}
1152
1154
1156 bool LargeCodeModel) {
1157 PositionIndependent = PIC;
1158 Ctx = &MCCtx;
1159
1160 // Common.
1163
1165
1167
1168 EHFrameSection = nullptr; // Created on demand.
1169 SFrameSection = nullptr; // Created on demand.
1170 CompactUnwindSection = nullptr; // Used only by selected targets.
1171 DwarfAccelNamesSection = nullptr; // Used only by selected targets.
1172 DwarfAccelObjCSection = nullptr; // Used only by selected targets.
1173 DwarfAccelNamespaceSection = nullptr; // Used only by selected targets.
1174 DwarfAccelTypesSection = nullptr; // Used only by selected targets.
1175
1176 const Triple &TheTriple = Ctx->getTargetTriple();
1177 switch (Ctx->getObjectFileType()) {
1178 case MCContext::IsMachO:
1179 initMachOMCObjectFileInfo(TheTriple);
1180 break;
1181 case MCContext::IsCOFF:
1182 initCOFFMCObjectFileInfo(TheTriple);
1183 break;
1184 case MCContext::IsELF:
1185 initELFMCObjectFileInfo(TheTriple, LargeCodeModel);
1186 break;
1187 case MCContext::IsGOFF:
1188 initGOFFMCObjectFileInfo(TheTriple);
1189 break;
1190 case MCContext::IsSPIRV:
1191 initSPIRVMCObjectFileInfo(TheTriple);
1192 break;
1193 case MCContext::IsWasm:
1194 initWasmMCObjectFileInfo(TheTriple);
1195 break;
1196 case MCContext::IsXCOFF:
1197 initXCOFFMCObjectFileInfo(TheTriple);
1198 break;
1200 initDXContainerObjectFileInfo(TheTriple);
1201 break;
1202 }
1203}
1204
1205MCSection *MCObjectFileInfo::getDwarfComdatSection(const char *Name,
1206 uint64_t Hash) const {
1207 switch (Ctx->getTargetTriple().getObjectFormat()) {
1208 case Triple::ELF:
1209 return Ctx->getELFSection(Name, ELF::SHT_PROGBITS, ELF::SHF_GROUP, 0,
1210 utostr(Hash), /*IsComdat=*/true);
1211 case Triple::Wasm:
1212 return Ctx->getWasmSection(Name, SectionKind::getMetadata(), 0,
1214 case Triple::MachO:
1215 case Triple::COFF:
1216 case Triple::GOFF:
1217 case Triple::SPIRV:
1218 case Triple::XCOFF:
1221 report_fatal_error("Cannot get DWARF comdat section for this object file "
1222 "format: not implemented.");
1223 break;
1224 }
1225 llvm_unreachable("Unknown ObjectFormatType");
1226}
1227
1228MCSection *
1230 if (Ctx->getObjectFileType() != MCContext::IsELF)
1231 return CallGraphSection;
1232
1233 const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
1234 unsigned Flags = ELF::SHF_LINK_ORDER;
1235 StringRef GroupName;
1236 if (const MCSymbol *Group = ElfSec.getGroup()) {
1237 GroupName = Group->getName();
1238 Flags |= ELF::SHF_GROUP;
1239 }
1240
1241 return Ctx->getELFSection(
1242 ".llvm.callgraph", ELF::SHT_LLVM_CALL_GRAPH, Flags, 0, GroupName,
1243 /*IsComdat=*/true, ElfSec.getUniqueID(),
1244 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1245}
1246
1247MCSection *
1249 if ((Ctx->getObjectFileType() != MCContext::IsELF) ||
1250 Ctx->getTargetTriple().isPS4())
1251 return StackSizesSection;
1252
1253 const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
1254 unsigned Flags = ELF::SHF_LINK_ORDER;
1255 StringRef GroupName;
1256 if (const MCSymbol *Group = ElfSec.getGroup()) {
1257 GroupName = Group->getName();
1258 Flags |= ELF::SHF_GROUP;
1259 }
1260
1261 return Ctx->getELFSection(
1262 ".stack_sizes", ELF::SHT_PROGBITS, Flags, 0, GroupName, true,
1263 ElfSec.getUniqueID(),
1264 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1265}
1266
1267MCSection *
1269 if (Ctx->getObjectFileType() != MCContext::IsELF)
1270 return nullptr;
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 // Use the text section's begin symbol and unique ID to create a separate
1281 // .llvm_bb_addr_map section associated with every unique text section.
1282 return Ctx->getELFSection(
1283 ".llvm_bb_addr_map", ELF::SHT_LLVM_BB_ADDR_MAP, Flags, 0, GroupName, true,
1284 ElfSec.getUniqueID(),
1285 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1286}
1287
1288MCSection *
1290 if (Ctx->getObjectFileType() != MCContext::IsELF)
1291 return nullptr;
1292
1293 const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
1294 unsigned Flags = ELF::SHF_LINK_ORDER | ELF::SHF_ALLOC;
1295 StringRef GroupName;
1296 if (const MCSymbol *Group = ElfSec.getGroup()) {
1297 GroupName = Group->getName();
1298 Flags |= ELF::SHF_GROUP;
1299 }
1300
1301 return Ctx->getELFSection(
1302 ".kcfi_traps", ELF::SHT_PROGBITS, Flags, 0, GroupName,
1303 /*IsComdat=*/true, ElfSec.getUniqueID(),
1304 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1305}
1306
1307MCSection *
1309 auto ObjFileType = Ctx->getObjectFileType();
1310 if (ObjFileType == MCContext::IsELF) {
1311 const auto &ElfSec = static_cast<const MCSectionELF &>(TextSec);
1312 unsigned Flags = ELF::SHF_LINK_ORDER;
1313 StringRef GroupName;
1314 if (const MCSymbol *Group = ElfSec.getGroup()) {
1315 GroupName = Group->getName();
1316 Flags |= ELF::SHF_GROUP;
1317 }
1318 return Ctx->getELFSection(
1319 PseudoProbeSection->getName(), ELF::SHT_PROGBITS, Flags, 0, GroupName,
1320 true, ElfSec.getUniqueID(),
1321 static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
1322 } else if (ObjFileType == MCContext::IsCOFF) {
1323 StringRef COMDATSymName = "";
1324 int Selection = 0;
1325 unsigned Characteristics =
1326 static_cast<MCSectionCOFF *>(PseudoProbeSection)->getCharacteristics();
1327 const auto &COFFSec = static_cast<const MCSectionCOFF &>(TextSec);
1328 if (const MCSymbol *COMDATSym = COFFSec.getCOMDATSymbol()) {
1329 // Associate .pseudo_probe to its function section.
1330 COMDATSymName = COMDATSym->getName();
1331 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1333 }
1334 return Ctx->getCOFFSection(PseudoProbeSection->getName(), Characteristics,
1335 COMDATSymName, Selection, COFFSec.getUniqueID());
1336 }
1337
1338 return PseudoProbeSection;
1339}
1340
1341MCSection *
1343 if (!Ctx->getTargetTriple().supportsCOMDAT() || FuncName.empty())
1345
1346 // Create a separate comdat group for each function's descriptor in order
1347 // for the linker to deduplicate. The duplication, must be from different
1348 // tranlation unit, can come from:
1349 // 1. Inline functions defined in header files;
1350 // 2. ThinLTO imported funcions;
1351 // 3. Weak-linkage definitions.
1352 // Use a concatenation of the section name and the function name as the
1353 // group name so that descriptor-only groups won't be folded with groups of
1354 // code.
1355 auto ObjFileType = Ctx->getObjectFileType();
1356 if (ObjFileType == MCContext::IsELF) {
1357 auto *S = static_cast<MCSectionELF *>(PseudoProbeDescSection);
1358 auto Flags = S->getFlags() | ELF::SHF_GROUP;
1359 return Ctx->getELFSection(S->getName(), S->getType(), Flags,
1360 S->getEntrySize(), S->getName() + "_" + FuncName,
1361 /*IsComdat=*/true);
1362 } else if (ObjFileType == MCContext::IsCOFF) {
1363 auto *S = static_cast<MCSectionCOFF *>(PseudoProbeDescSection);
1364 unsigned Characteristics =
1365 S->getCharacteristics() | COFF::IMAGE_SCN_LNK_COMDAT;
1366 std::string COMDATSymName = (S->getName() + "_" + FuncName).str();
1367 return Ctx->getCOFFSection(S->getName(), Characteristics, COMDATSymName,
1369 }
1370
1372}
1373
1377
1379 const MCSection *TextSec) const {
1380 if (Ctx->getObjectFileType() != MCContext::IsELF)
1381 return nullptr;
1382
1383 // SHF_WRITE for relocations, and let user post-process data in-place.
1385
1386 if (!TextSec)
1387 TextSec = getTextSection();
1388
1389 StringRef GroupName;
1390 const auto &ElfSec = static_cast<const MCSectionELF &>(*TextSec);
1391 if (const MCSymbol *Group = ElfSec.getGroup()) {
1392 GroupName = Group->getName();
1393 Flags |= ELF::SHF_GROUP;
1394 }
1395 return Ctx->getELFSection(
1396 Name, ELF::SHT_PROGBITS, Flags, 0, GroupName, true, ElfSec.getUniqueID(),
1397 static_cast<const MCSymbolELF *>(TextSec->getBeginSymbol()));
1398}
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) 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:516
static constexpr unsigned NonUniqueID
Definition MCSection.h:521
void setBeginSymbol(MCSymbol *Sym)
Definition MCSection.h:593
MCSymbol * getBeginSymbol()
Definition MCSection.h:589
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()
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:140
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
@ UnknownObjectFormat
Definition Triple.h:327
#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:1253
@ SHF_STRINGS
Definition ELF.h:1256
@ SHF_EXCLUDE
Definition ELF.h:1281
@ SHF_ALLOC
Definition ELF.h:1247
@ SHF_LINK_ORDER
Definition ELF.h:1262
@ SHF_GROUP
Definition ELF.h:1269
@ SHF_WRITE
Definition ELF.h:1244
@ SHF_TLS
Definition ELF.h:1272
@ SHF_EXECINSTR
Definition ELF.h:1250
@ SHT_PROGBITS
Definition ELF.h:1146
@ SHT_NOBITS
Definition ELF.h:1153
@ SHT_LLVM_CALL_GRAPH
Definition ELF.h:1189
@ SHT_MIPS_DWARF
Definition ELF.h:1225
@ SHT_LLVM_BB_ADDR_MAP
Definition ELF.h:1184
@ SHT_GNU_SFRAME
Definition ELF.h:1193
@ SHT_X86_64_UNWIND
Definition ELF.h:1221
@ 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
@ ESD_ALIGN_Doubleword
Definition GOFF.h:148
@ ESD_ALIGN_Quadword
Definition GOFF.h:149
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:879
@ DW_EH_PE_sdata4
Definition Dwarf.h:876
@ DW_EH_PE_sdata8
Definition Dwarf.h:877
@ DW_EH_PE_absptr
Definition Dwarf.h:868
@ 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)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163