LLVM 24.0.0git
TargetLoweringObjectFileImpl.cpp
Go to the documentation of this file.
1//===- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info ---===//
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//
9// This file implements classes used to handle lowerings specific to common
10// object file formats.
11//
12//===----------------------------------------------------------------------===//
13
18#include "llvm/ADT/StringRef.h"
31#include "llvm/IR/Comdat.h"
32#include "llvm/IR/Constants.h"
33#include "llvm/IR/DataLayout.h"
37#include "llvm/IR/Function.h"
38#include "llvm/IR/GlobalAlias.h"
40#include "llvm/IR/GlobalValue.h"
42#include "llvm/IR/Mangler.h"
43#include "llvm/IR/Metadata.h"
44#include "llvm/IR/Module.h"
45#include "llvm/IR/Type.h"
46#include "llvm/MC/MCAsmInfo.h"
48#include "llvm/MC/MCContext.h"
49#include "llvm/MC/MCExpr.h"
57#include "llvm/MC/MCStreamer.h"
58#include "llvm/MC/MCSymbol.h"
59#include "llvm/MC/MCSymbolELF.h"
61#include "llvm/MC/MCValue.h"
62#include "llvm/MC/SectionKind.h"
64#include "llvm/Support/Base64.h"
68#include "llvm/Support/Format.h"
69#include "llvm/Support/Path.h"
73#include <cassert>
74#include <string>
75
76using namespace llvm;
77using namespace dwarf;
78
80 "jumptable-in-function-section", cl::Hidden, cl::init(false),
81 cl::desc("Putting Jump Table in function section"));
82
83static void GetObjCImageInfo(Module &M, unsigned &Version, unsigned &Flags,
84 StringRef &Section) {
86 M.getModuleFlagsMetadata(ModuleFlags);
87
88 for (const auto &MFE: ModuleFlags) {
89 // Ignore flags with 'Require' behaviour.
90 if (MFE.Behavior == Module::Require)
91 continue;
92
93 StringRef Key = MFE.Key->getString();
94 if (Key == "Objective-C Image Info Version") {
95 Version = mdconst::extract<ConstantInt>(MFE.Val)->getZExtValue();
96 } else if (Key == "Objective-C Garbage Collection" ||
97 Key == "Objective-C GC Only" ||
98 Key == "Objective-C Is Simulated" ||
99 Key == "Objective-C Class Properties" ||
100 Key == "Objective-C Image Swift Version") {
101 Flags |= mdconst::extract<ConstantInt>(MFE.Val)->getZExtValue();
102 } else if (Key == "Objective-C Image Info Section") {
103 Section = cast<MDString>(MFE.Val)->getString();
104 }
105 // Backend generates L_OBJC_IMAGE_INFO from Swift ABI version + major + minor +
106 // "Objective-C Garbage Collection".
107 else if (Key == "Swift ABI Version") {
108 Flags |= (mdconst::extract<ConstantInt>(MFE.Val)->getZExtValue()) << 8;
109 } else if (Key == "Swift Major Version") {
110 Flags |= (mdconst::extract<ConstantInt>(MFE.Val)->getZExtValue()) << 24;
111 } else if (Key == "Swift Minor Version") {
112 Flags |= (mdconst::extract<ConstantInt>(MFE.Val)->getZExtValue()) << 16;
113 }
114 }
115}
116
117//===----------------------------------------------------------------------===//
118// ELF
119//===----------------------------------------------------------------------===//
120
122 const TargetMachine &TgtM) {
124
125 const CodeModel::Model CM = TgtM.getCodeModel();
127
128 switch (TgtM.getTargetTriple().getArch()) {
129 case Triple::arm:
130 case Triple::armeb:
131 case Triple::thumb:
132 case Triple::thumbeb:
133 if (Ctx.getAsmInfo().getExceptionHandlingType() == ExceptionHandling::ARM)
134 break;
135 // Fallthrough if not using EHABI
136 [[fallthrough]];
137 case Triple::ppc:
138 case Triple::ppcle:
139 case Triple::x86:
152 break;
153 case Triple::x86_64: {
154 // The large EH encoding forces 64-bit-wide EH pointers regardless of the
155 // code model, so treat it like the Large code model when selecting
156 // encodings below.
157 const CodeModel::Model EHCM =
159 if (isPositionIndependent()) {
162 ((EHCM == CodeModel::Small || EHCM == CodeModel::Medium)
169 ((EHCM == CodeModel::Small || EHCM == CodeModel::Medium)
172 } else {
174 (EHCM == CodeModel::Small || EHCM == CodeModel::Medium)
181 }
182 break;
183 }
184 case Triple::hexagon:
188 if (isPositionIndependent()) {
192 }
193 break;
194 case Triple::aarch64:
197 // The small model guarantees static code/data size < 4GB, but not where it
198 // will be in memory. Most of these could end up >2GB away so even a signed
199 // pc-relative 32-bit address is insufficient, theoretically.
200 //
201 // Use DW_EH_PE_indirect even for -fno-pic to avoid copy relocations.
203 (TgtM.getTargetTriple().getEnvironment() == Triple::GNUILP32
208 break;
209 case Triple::lanai:
213 break;
214 case Triple::mips:
215 case Triple::mipsel:
216 case Triple::mips64:
217 case Triple::mips64el:
218 // MIPS uses indirect pointer to refer personality functions and types, so
219 // that the eh_frame section can be read-only. DW.ref.personality will be
220 // generated for relocation.
222 // FIXME: The N64 ABI probably ought to use DW_EH_PE_sdata8 but we can't
223 // identify N64 from just a triple.
226
227 // FreeBSD must be explicit about the data size and using pcrel since it's
228 // assembler/linker won't do the automatic conversion that the Linux tools
229 // do.
233 }
234 break;
235 case Triple::ppc64:
236 case Triple::ppc64le:
242 break;
243 case Triple::sparcel:
244 case Triple::sparc:
245 if (isPositionIndependent()) {
251 } else {
255 }
257 break;
258 case Triple::riscv32:
259 case Triple::riscv64:
268 break;
269 case Triple::sparcv9:
271 if (isPositionIndependent()) {
276 } else {
279 }
280 break;
281 case Triple::systemz:
282 // All currently-defined code models guarantee that 4-byte PC-relative
283 // values will be in range.
284 if (isPositionIndependent()) {
290 } else {
294 }
295 break;
303 break;
304 default:
305 break;
306 }
307}
308
311 collectUsedGlobalVariables(M, Vec, false);
312 for (GlobalValue *GV : Vec)
313 if (auto *GO = dyn_cast<GlobalObject>(GV))
314 Used.insert(GO);
315}
316
318 Module &M) const {
319 auto &C = getContext();
320
321 emitLinkerDirectives(Streamer, M);
322
323 if (NamedMDNode *DependentLibraries = M.getNamedMetadata("llvm.dependent-libraries")) {
324 auto *S = C.getELFSection(".deplibs", ELF::SHT_LLVM_DEPENDENT_LIBRARIES,
326
327 Streamer.switchSection(S);
328
329 for (const auto *Operand : DependentLibraries->operands()) {
330 Streamer.emitBytes(
331 cast<MDString>(cast<MDNode>(Operand)->getOperand(0))->getString());
332 Streamer.emitInt8(0);
333 }
334 }
335
336 emitPseudoProbeDescMetadata(Streamer, M);
337
338 if (NamedMDNode *LLVMStats = M.getNamedMetadata("llvm.stats")) {
339 // Emit the metadata for llvm statistics into .llvm_stats section, which is
340 // formatted as a list of key/value pair, the value is base64 encoded.
341 auto *S = C.getObjectFileInfo()->getLLVMStatsSection();
342 Streamer.switchSection(S);
343 for (const auto *Operand : LLVMStats->operands()) {
344 const auto *MD = cast<MDNode>(Operand);
345 assert(MD->getNumOperands() % 2 == 0 &&
346 ("Operand num should be even for a list of key/value pair"));
347 for (size_t I = 0; I < MD->getNumOperands(); I += 2) {
348 // Encode the key string size.
349 auto *Key = cast<MDString>(MD->getOperand(I));
350 Streamer.emitULEB128IntValue(Key->getString().size());
351 Streamer.emitBytes(Key->getString());
352 // Encode the value into a Base64 string.
353 std::string Value = encodeBase64(
354 Twine(mdconst::dyn_extract<ConstantInt>(MD->getOperand(I + 1))
355 ->getZExtValue())
356 .str());
357 Streamer.emitULEB128IntValue(Value.size());
358 Streamer.emitBytes(Value);
359 }
360 }
361 }
362
363 unsigned Version = 0;
364 unsigned Flags = 0;
365 StringRef Section;
366
367 GetObjCImageInfo(M, Version, Flags, Section);
368 if (!Section.empty()) {
369 auto *S = C.getELFSection(Section, ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
370 Streamer.switchSection(S);
371 Streamer.emitLabel(C.getOrCreateSymbol(StringRef("OBJC_IMAGE_INFO")));
372 Streamer.emitInt32(Version);
373 Streamer.emitInt32(Flags);
374 Streamer.addBlankLine();
375 }
376
377 emitCGProfileMetadata(Streamer, M);
378}
379
381 Module &M) const {
382 auto &C = getContext();
383 if (NamedMDNode *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
384 auto *S = C.getELFSection(".linker-options", ELF::SHT_LLVM_LINKER_OPTIONS,
386
387 Streamer.switchSection(S);
388
389 for (const auto *Operand : LinkerOptions->operands()) {
390 if (cast<MDNode>(Operand)->getNumOperands() != 2)
391 report_fatal_error("invalid llvm.linker.options");
392 for (const auto &Option : cast<MDNode>(Operand)->operands()) {
393 Streamer.emitBytes(cast<MDString>(Option)->getString());
394 Streamer.emitInt8(0);
395 }
396 }
397 }
398}
399
401 const GlobalValue *GV, const TargetMachine &TM,
402 MachineModuleInfo *MMI) const {
403 unsigned Encoding = getPersonalityEncoding();
404 if ((Encoding & 0x80) == DW_EH_PE_indirect)
405 return getContext().getOrCreateSymbol(StringRef("DW.ref.") +
406 TM.getSymbol(GV)->getName());
407 if ((Encoding & 0x70) == DW_EH_PE_absptr)
408 return TM.getSymbol(GV);
409 report_fatal_error("We do not support this DWARF encoding yet!");
410}
411
413 MCStreamer &Streamer, const DataLayout &DL, const MCSymbol *Sym,
414 const MachineModuleInfo *MMI) const {
415 SmallString<64> NameData("DW.ref.");
416 NameData += Sym->getName();
417 auto *Label =
418 static_cast<MCSymbolELF *>(getContext().getOrCreateSymbol(NameData));
419 Streamer.emitSymbolAttribute(Label, MCSA_Hidden);
420 Streamer.emitSymbolAttribute(Label, MCSA_Weak);
421 unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
422 MCSection *Sec = getContext().getELFNamedSection(".data", Label->getName(),
423 ELF::SHT_PROGBITS, Flags, 0);
424 unsigned Size = DL.getPointerSize();
425 Streamer.switchSection(Sec);
426 Streamer.emitValueToAlignment(DL.getPointerABIAlignment(0));
429 Streamer.emitELFSize(Label, E);
430 Streamer.emitLabel(Label);
431
432 emitPersonalityValueImpl(Streamer, DL, Sym, MMI);
433}
434
436 MCStreamer &Streamer, const DataLayout &DL, const MCSymbol *Sym,
437 const MachineModuleInfo *MMI) const {
438 Streamer.emitSymbolValue(Sym, DL.getPointerSize());
439}
440
442 const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM,
443 MachineModuleInfo *MMI, MCStreamer &Streamer) const {
444 if (Encoding & DW_EH_PE_indirect) {
446
447 MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", TM);
448
449 // Add information about the stub reference to ELFMMI so that the stub
450 // gets emitted by the asmprinter.
452 if (!StubSym.getPointer()) {
453 MCSymbol *Sym = TM.getSymbol(GV);
455 }
456
459 Encoding & ~DW_EH_PE_indirect, Streamer);
460 }
461
463 MMI, Streamer);
464}
465
467 // N.B.: The defaults used in here are not the same ones used in MC.
468 // We follow gcc, MC follows gas. For example, given ".section .eh_frame",
469 // both gas and MC will produce a section with no flags. Given
470 // section(".eh_frame") gcc will produce:
471 //
472 // .section .eh_frame,"a",@progbits
473
474 if (Name == getInstrProfSectionName(IPSK_covmap, Triple::ELF,
475 /*AddSegmentInfo=*/false) ||
476 Name == getInstrProfSectionName(IPSK_covfun, Triple::ELF,
477 /*AddSegmentInfo=*/false) ||
478 Name == getInstrProfSectionName(IPSK_covdata, Triple::ELF,
479 /*AddSegmentInfo=*/false) ||
480 Name == getInstrProfSectionName(IPSK_covname, Triple::ELF,
481 /*AddSegmentInfo=*/false) ||
482 Name == ".llvmbc" || Name == ".llvmcmd")
484
485 if (!Name.starts_with(".")) return K;
486
487 // Default implementation based on some magic section names.
488 if (Name == ".bss" || Name.starts_with(".bss.") ||
489 Name.starts_with(".gnu.linkonce.b.") ||
490 Name.starts_with(".llvm.linkonce.b.") || Name == ".sbss" ||
491 Name.starts_with(".sbss.") || Name.starts_with(".gnu.linkonce.sb.") ||
492 Name.starts_with(".llvm.linkonce.sb."))
493 return SectionKind::getBSS();
494
495 if (Name == ".tdata" || Name.starts_with(".tdata.") ||
496 Name.starts_with(".gnu.linkonce.td.") ||
497 Name.starts_with(".llvm.linkonce.td."))
499
500 if (Name == ".tbss" || Name.starts_with(".tbss.") ||
501 Name.starts_with(".gnu.linkonce.tb.") ||
502 Name.starts_with(".llvm.linkonce.tb."))
504
505 return K;
506}
507
509 return SectionName.consume_front(Prefix) &&
510 (SectionName.empty() || SectionName[0] == '.');
511}
512
513static unsigned getELFSectionType(StringRef Name, SectionKind K) {
514 // Use SHT_NOTE for section whose name starts with ".note" to allow
515 // emitting ELF notes from C variable declaration.
516 // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77609
517 if (Name.starts_with(".note"))
518 return ELF::SHT_NOTE;
519
520 if (hasPrefix(Name, ".init_array"))
521 return ELF::SHT_INIT_ARRAY;
522
523 if (hasPrefix(Name, ".fini_array"))
524 return ELF::SHT_FINI_ARRAY;
525
526 if (hasPrefix(Name, ".preinit_array"))
528
529 if (hasPrefix(Name, ".llvm.offloading"))
531 if (Name == ".llvm.lto")
532 return ELF::SHT_LLVM_LTO;
533
534 if (K.isBSS() || K.isThreadBSS())
535 return ELF::SHT_NOBITS;
536
537 return ELF::SHT_PROGBITS;
538}
539
540static unsigned getELFSectionFlags(SectionKind K, const Triple &T) {
541 unsigned Flags = 0;
542
543 if (!K.isMetadata() && !K.isExclude())
544 Flags |= ELF::SHF_ALLOC;
545
546 if (K.isExclude())
547 Flags |= ELF::SHF_EXCLUDE;
548
549 if (K.isText())
550 Flags |= ELF::SHF_EXECINSTR;
551
552 if (K.isExecuteOnly()) {
553 if (T.isAArch64())
555 else if (T.isARM() || T.isThumb())
556 Flags |= ELF::SHF_ARM_PURECODE;
557 }
558
559 if (K.isWriteable())
560 Flags |= ELF::SHF_WRITE;
561
562 if (K.isThreadLocal())
563 Flags |= ELF::SHF_TLS;
564
565 if (K.isMergeableCString() || K.isMergeableConst())
566 Flags |= ELF::SHF_MERGE;
567
568 if (K.isMergeableCString())
569 Flags |= ELF::SHF_STRINGS;
570
571 return Flags;
572}
573
574static const Comdat *getELFComdat(const GlobalValue *GV) {
575 const Comdat *C = GV->getComdat();
576 if (!C)
577 return nullptr;
578
579 if (C->getSelectionKind() != Comdat::Any &&
580 C->getSelectionKind() != Comdat::NoDeduplicate)
581 report_fatal_error("ELF COMDATs only support SelectionKind::Any and "
582 "SelectionKind::NoDeduplicate, '" +
583 C->getName() + "' cannot be lowered.");
584
585 return C;
586}
587
589 const TargetMachine &TM) {
590 MDNode *MD = GO->getMetadata(LLVMContext::MD_associated);
591 if (!MD)
592 return nullptr;
593
594 auto *VM = cast<ValueAsMetadata>(MD->getOperand(0).get());
595 auto *OtherGV = dyn_cast<GlobalValue>(VM->getValue());
596 return OtherGV ? static_cast<const MCSymbolELF *>(TM.getSymbol(OtherGV))
597 : nullptr;
598}
599
600static unsigned getEntrySizeForKind(SectionKind Kind) {
601 if (Kind.isMergeable1ByteCString())
602 return 1;
603 else if (Kind.isMergeable2ByteCString())
604 return 2;
605 else if (Kind.isMergeable4ByteCString())
606 return 4;
607 else if (Kind.isMergeableConst4())
608 return 4;
609 else if (Kind.isMergeableConst8())
610 return 8;
611 else if (Kind.isMergeableConst16())
612 return 16;
613 else if (Kind.isMergeableConst32())
614 return 32;
615 else {
616 // We shouldn't have mergeable C strings or mergeable constants that we
617 // didn't handle above.
618 assert(!Kind.isMergeableCString() && "unknown string width");
619 assert(!Kind.isMergeableConst() && "unknown data width");
620 return 0;
621 }
622}
623
624/// Return the section prefix name used by options FunctionsSections and
625/// DataSections.
627 if (Kind.isText())
628 return IsLarge ? ".ltext" : ".text";
629 if (Kind.isReadOnly())
630 return IsLarge ? ".lrodata" : ".rodata";
631 if (Kind.isBSS())
632 return IsLarge ? ".lbss" : ".bss";
633 if (Kind.isThreadData())
634 return ".tdata";
635 if (Kind.isThreadBSS())
636 return ".tbss";
637 if (Kind.isData())
638 return IsLarge ? ".ldata" : ".data";
639 if (Kind.isReadOnlyWithRel())
640 return IsLarge ? ".ldata.rel.ro" : ".data.rel.ro";
641 llvm_unreachable("Unknown section kind");
642}
643
644static SmallString<128>
646 Mangler &Mang, const TargetMachine &TM,
647 bool UniqueSectionName,
648 const MachineJumpTableEntry *JTE) {
649 SmallString<128> Name =
651 unsigned EntrySize = getEntrySizeForKind(Kind);
652 if (Kind.isMergeableCString()) {
653 // We also need alignment here.
654 // FIXME: this is getting the alignment of the character, not the
655 // alignment of the global!
656 Align Alignment = GO->getDataLayout().getPreferredAlign(
658
659 Name += ".str";
660 Name += utostr(EntrySize);
661 Name += ".";
662 Name += utostr(Alignment.value());
663 } else if (Kind.isMergeableConst()) {
664 Name += ".cst";
665 Name += utostr(EntrySize);
666 }
667
668 bool HasPrefix = false;
669 if (const auto *F = dyn_cast<Function>(GO)) {
670 // Jump table hotness takes precedence over its enclosing function's hotness
671 // if it's known. The function's section prefix is used if jump table entry
672 // hotness is unknown.
673 if (JTE && JTE->Hotness != MachineFunctionDataHotness::Unknown) {
675 raw_svector_ostream(Name) << ".hot";
676 } else {
678 "Hotness must be cold");
679 raw_svector_ostream(Name) << ".unlikely";
680 }
681 HasPrefix = true;
682 } else if (std::optional<StringRef> Prefix = F->getSectionPrefix()) {
683 raw_svector_ostream(Name) << '.' << *Prefix;
684 HasPrefix = true;
685 }
686 } else if (const auto *GV = dyn_cast<GlobalVariable>(GO)) {
687 if (std::optional<StringRef> Prefix = GV->getSectionPrefix()) {
688 raw_svector_ostream(Name) << '.' << *Prefix;
689 HasPrefix = true;
690 }
691 }
692
693 if (UniqueSectionName) {
694 Name.push_back('.');
695 TM.getNameWithPrefix(Name, GO, Mang, /*MayAlwaysUsePrivate*/true);
696 } else if (HasPrefix)
697 // For distinguishing between .text.${text-section-prefix}. (with trailing
698 // dot) and .text.${function-name}
699 Name.push_back('.');
700 return Name;
701}
702
703namespace {
704class LoweringDiagnosticInfo : public DiagnosticInfo {
705 const Twine &Msg;
706
707public:
708 LoweringDiagnosticInfo(const Twine &DiagMsg LLVM_LIFETIME_BOUND,
709 DiagnosticSeverity Severity = DS_Error)
710 : DiagnosticInfo(DK_Lowering, Severity), Msg(DiagMsg) {}
711 void print(DiagnosticPrinter &DP) const override { DP << Msg; }
712};
713}
714
715/// Calculate an appropriate unique ID for a section, and update Flags,
716/// EntrySize and NextUniqueID where appropriate.
717static unsigned
719 SectionKind Kind, const TargetMachine &TM,
720 MCContext &Ctx, Mangler &Mang, unsigned &Flags,
721 unsigned &EntrySize, unsigned &NextUniqueID,
722 const bool Retain, const bool ForceUnique) {
723 // Increment uniqueID if we are forced to emit a unique section.
724 // This works perfectly fine with section attribute or pragma section as the
725 // sections with the same name are grouped together by the assembler.
726 if (ForceUnique)
727 return NextUniqueID++;
728
729 // A section can have at most one associated section. Put each global with
730 // MD_associated in a unique section.
731 const bool Associated = GO->getMetadata(LLVMContext::MD_associated);
732 if (Associated) {
733 Flags |= ELF::SHF_LINK_ORDER;
734 return NextUniqueID++;
735 }
736
737 if (Retain) {
738 if (TM.getTargetTriple().isOSSolaris())
740 else if (Ctx.getAsmInfo().useIntegratedAssembler() ||
741 Ctx.getAsmInfo().binutilsIsAtLeast(2, 36))
742 Flags |= ELF::SHF_GNU_RETAIN;
743 return NextUniqueID++;
744 }
745
746 // If two symbols with differing sizes end up in the same mergeable section
747 // that section can be assigned an incorrect entry size. To avoid this we
748 // usually put symbols of the same size into distinct mergeable sections with
749 // the same name. Doing so relies on the ",unique ," assembly feature. This
750 // feature is not available until binutils version 2.35
751 // (https://sourceware.org/bugzilla/show_bug.cgi?id=25380).
752 const bool SupportsUnique = Ctx.getAsmInfo().useIntegratedAssembler() ||
753 Ctx.getAsmInfo().binutilsIsAtLeast(2, 35);
754 if (!SupportsUnique) {
755 Flags &= ~ELF::SHF_MERGE;
756 EntrySize = 0;
758 }
759
760 const bool SymbolMergeable = Flags & ELF::SHF_MERGE;
761 const bool SeenSectionNameBefore =
762 Ctx.isELFGenericMergeableSection(SectionName);
763 // If this is the first occurrence of this section name, treat it as the
764 // generic section
765 if (!SymbolMergeable && !SeenSectionNameBefore) {
767 return NextUniqueID++;
768 else
770 }
771
772 // Symbols must be placed into sections with compatible entry sizes. Generate
773 // unique sections for symbols that have not been assigned to compatible
774 // sections.
775 const auto PreviousID =
776 Ctx.getELFUniqueIDForEntsize(SectionName, Flags, EntrySize);
777 if (PreviousID &&
778 (!TM.getSeparateNamedSections() || *PreviousID == MCSection::NonUniqueID))
779 return *PreviousID;
780
781 // If the user has specified the same section name as would be created
782 // implicitly for this symbol e.g. .rodata.str1.1, then we don't need
783 // to unique the section as the entry size for this symbol will be
784 // compatible with implicitly created sections.
785 SmallString<128> ImplicitSectionNameStem =
786 getELFSectionNameForGlobal(GO, Kind, Mang, TM, false, /*MJTE=*/nullptr);
787 if (SymbolMergeable &&
788 Ctx.isELFImplicitMergeableSectionNamePrefix(SectionName) &&
789 SectionName.starts_with(ImplicitSectionNameStem))
791
792 // We have seen this section name before, but with different flags or entity
793 // size. Create a new unique ID.
794 return NextUniqueID++;
795}
796
797static std::tuple<StringRef, bool, unsigned, unsigned, unsigned>
800 StringRef Group = "";
801 bool IsComdat = false;
802 unsigned Flags = 0;
803 if (const Comdat *C = getELFComdat(GO)) {
804 Flags |= ELF::SHF_GROUP;
805 Group = C->getName();
806 IsComdat = C->getSelectionKind() == Comdat::Any;
807 }
808 if (TM.isLargeGlobalValue(GO))
809 Flags |= ELF::SHF_X86_64_LARGE;
810
811 unsigned Type, EntrySize;
812 if (MDNode *MD = GO->getMetadata(LLVMContext::MD_elf_section_properties)) {
813 Type = cast<ConstantAsMetadata>(MD->getOperand(0))
814 ->getValue()
815 ->getUniqueInteger()
816 .getZExtValue();
817 EntrySize = cast<ConstantAsMetadata>(MD->getOperand(1))
818 ->getValue()
819 ->getUniqueInteger()
820 .getZExtValue();
821 } else {
823 EntrySize = getEntrySizeForKind(Kind);
824 }
825
826 return {Group, IsComdat, Flags, Type, EntrySize};
827}
828
830 SectionKind Kind,
831 const TargetMachine &TM,
832 MCContext &Ctx, Mangler &Mang,
833 unsigned &NextUniqueID,
834 bool Retain, bool ForceUnique) {
837
838 // Infer section flags from the section name if we can.
840
841 unsigned Flags = getELFSectionFlags(Kind, TM.getTargetTriple());
842 auto [Group, IsComdat, ExtraFlags, Type, EntrySize] =
843 getGlobalObjectInfo(GO, TM, SectionName, Kind);
844 Flags |= ExtraFlags;
845
847 GO, SectionName, Kind, TM, Ctx, Mang, Flags, EntrySize, NextUniqueID,
848 Retain, ForceUnique);
849
850 const MCSymbolELF *LinkedToSym = getLinkedToSymbol(GO, TM);
851 MCSectionELF *Section =
852 Ctx.getELFSection(SectionName, Type, Flags, EntrySize, Group, IsComdat,
853 UniqueID, LinkedToSym);
854 // Make sure that we did not get some other section with incompatible sh_link.
855 // This should not be possible due to UniqueID code above.
856 assert(Section->getLinkedToSymbol() == LinkedToSym &&
857 "Associated symbol mismatch between sections");
858
859 if (!(Ctx.getAsmInfo().useIntegratedAssembler() ||
860 Ctx.getAsmInfo().binutilsIsAtLeast(2, 35))) {
861 // If we are using GNU as before 2.35, then this symbol might have
862 // been placed in an incompatible mergeable section. Emit an error if this
863 // is the case to avoid creating broken output.
864 if ((Section->getFlags() & ELF::SHF_MERGE) &&
865 (Section->getEntrySize() != getEntrySizeForKind(Kind)))
866 GO->getContext().diagnose(LoweringDiagnosticInfo(
867 "Symbol '" + GO->getName() + "' from module '" +
868 (GO->getParent() ? GO->getParent()->getSourceFileName() : "unknown") +
869 "' required a section with entry-size=" +
870 Twine(getEntrySizeForKind(Kind)) + " but was placed in section '" +
871 SectionName + "' with entry-size=" + Twine(Section->getEntrySize()) +
872 ": Explicit assignment by pragma or attribute of an incompatible "
873 "symbol to this section?"));
874 }
875
876 return Section;
877}
878
880 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
882 NextUniqueID, Used.count(GO),
883 /* ForceUnique = */false);
884}
885
887 MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang,
888 const TargetMachine &TM, bool EmitUniqueSection, unsigned Flags,
889 unsigned *NextUniqueID, const MCSymbolELF *AssociatedSymbol,
890 const MachineJumpTableEntry *MJTE = nullptr) {
891 bool UniqueSectionName = false;
893 if (EmitUniqueSection) {
894 if (TM.getUniqueSectionNames()) {
895 UniqueSectionName = true;
896 } else {
897 UniqueID = *NextUniqueID;
898 (*NextUniqueID)++;
899 }
900 }
901 SmallString<128> Name =
902 getELFSectionNameForGlobal(GO, Kind, Mang, TM, UniqueSectionName, MJTE);
903
904 auto [Group, IsComdat, ExtraFlags, Type, EntrySize] =
905 getGlobalObjectInfo(GO, TM, Name, Kind);
906 Flags |= ExtraFlags;
907
908 // Use 0 as the unique ID for execute-only text.
909 if (Kind.isExecuteOnly())
910 UniqueID = 0;
911 return Ctx.getELFSection(Name, Type, Flags, EntrySize, Group, IsComdat,
912 UniqueID, AssociatedSymbol);
913}
914
916 MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang,
917 const TargetMachine &TM, bool Retain, bool EmitUniqueSection,
918 unsigned Flags, unsigned *NextUniqueID) {
919 const MCSymbolELF *LinkedToSym = getLinkedToSymbol(GO, TM);
920 if (LinkedToSym) {
921 EmitUniqueSection = true;
922 Flags |= ELF::SHF_LINK_ORDER;
923 }
924 if (Retain) {
925 if (TM.getTargetTriple().isOSSolaris()) {
926 EmitUniqueSection = true;
928 } else if (Ctx.getAsmInfo().useIntegratedAssembler() ||
929 Ctx.getAsmInfo().binutilsIsAtLeast(2, 36)) {
930 EmitUniqueSection = true;
931 Flags |= ELF::SHF_GNU_RETAIN;
932 }
933 }
934 if (GO->hasMetadata(LLVMContext::MD_elf_section_properties))
935 EmitUniqueSection = true;
936
938 Ctx, GO, Kind, Mang, TM, EmitUniqueSection, Flags,
939 NextUniqueID, LinkedToSym);
940 assert(Section->getLinkedToSymbol() == LinkedToSym);
941 return Section;
942}
943
945 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
946 unsigned Flags = getELFSectionFlags(Kind, TM.getTargetTriple());
947
948 // If we have -ffunction-section or -fdata-section then we should emit the
949 // global value to a uniqued section specifically for it.
950 bool EmitUniqueSection = false;
951 if (!(Flags & ELF::SHF_MERGE) && !Kind.isCommon()) {
952 if (Kind.isText())
953 EmitUniqueSection = TM.getFunctionSections();
954 else
955 EmitUniqueSection = TM.getDataSections();
956 }
957 EmitUniqueSection |= GO->hasComdat();
958 return selectELFSectionForGlobal(getContext(), GO, Kind, getMangler(), TM,
959 Used.count(GO), EmitUniqueSection, Flags,
960 &NextUniqueID);
961}
962
964 const Function &F, const TargetMachine &TM) const {
966 unsigned Flags = getELFSectionFlags(Kind, TM.getTargetTriple());
967 // If the function's section names is pre-determined via pragma or a
968 // section attribute, call selectExplicitSectionGlobal.
969 if (F.hasSection())
971 &F, Kind, TM, getContext(), getMangler(), NextUniqueID,
972 Used.count(&F), /* ForceUnique = */true);
973
975 getContext(), &F, Kind, getMangler(), TM, Used.count(&F),
976 /*EmitUniqueSection=*/true, Flags, &NextUniqueID);
977}
978
983
985 const Function &F, const TargetMachine &TM,
986 const MachineJumpTableEntry *JTE) const {
987 // If the function can be removed, produce a unique section so that
988 // the table doesn't prevent the removal.
989 const Comdat *C = F.getComdat();
990 bool EmitUniqueSection = TM.getFunctionSections() || C;
991 if (!EmitUniqueSection && !TM.getEnableStaticDataPartitioning())
992 return ReadOnlySection;
993
995 getMangler(), TM, EmitUniqueSection,
996 ELF::SHF_ALLOC, &NextUniqueID,
997 /* AssociatedSymbol */ nullptr, JTE);
998}
999
1001 const Function &F, const MCSymbol &FnSym, const TargetMachine &TM) const {
1002 // If neither COMDAT nor function sections, use the monolithic LSDA section.
1003 // Re-use this path if LSDASection is null as in the Arm EHABI.
1004 if (!LSDASection || (!F.hasComdat() && !TM.getFunctionSections()))
1005 return LSDASection;
1006
1007 const auto *LSDA = static_cast<const MCSectionELF *>(LSDASection);
1008 unsigned Flags = LSDA->getFlags();
1009 const MCSymbolELF *LinkedToSym = nullptr;
1010 StringRef Group;
1011 bool IsComdat = false;
1012 if (const Comdat *C = getELFComdat(&F)) {
1013 Flags |= ELF::SHF_GROUP;
1014 Group = C->getName();
1015 IsComdat = C->getSelectionKind() == Comdat::Any;
1016 }
1017 // Use SHF_LINK_ORDER to facilitate --gc-sections if we can use GNU ld>=2.36
1018 // or LLD, which support mixed SHF_LINK_ORDER & non-SHF_LINK_ORDER.
1019 if (TM.getFunctionSections() &&
1020 (getContext().getAsmInfo().useIntegratedAssembler() &&
1021 getContext().getAsmInfo().binutilsIsAtLeast(2, 36))) {
1022 Flags |= ELF::SHF_LINK_ORDER;
1023 LinkedToSym = static_cast<const MCSymbolELF *>(&FnSym);
1024 }
1025
1026 // Append the function name as the suffix like GCC, assuming
1027 // -funique-section-names applies to .gcc_except_table sections.
1028 return getContext().getELFSection(
1029 (TM.getUniqueSectionNames() ? LSDA->getName() + "." + F.getName()
1030 : LSDA->getName()),
1031 LSDA->getType(), Flags, 0, Group, IsComdat, MCSection::NonUniqueID,
1032 LinkedToSym);
1033}
1034
1036 bool UsesLabelDifference, const Function &F) const {
1037 // We can always create relative relocations, so use another section
1038 // that can be marked non-executable.
1039 return false;
1040}
1041
1042/// Given a mergeable constant with the specified size and relocation
1043/// information, return a section that it should be placed in.
1045 SectionKind Kind,
1046 const Constant *C) const {
1047 if (!TM)
1048 return false;
1049 if (TM->getCodeModel() == CodeModel::Large)
1050 return TM->getTargetTriple().getArch() == Triple::x86_64;
1051 if (Kind.isMergeableCString() && C) {
1052 assert(C->getType()->isSized());
1053 return TM->isLargeDataSize(DL.getTypeAllocSize(C->getType()));
1054 }
1055 // Globals generated by the compiler, e.g. constant pool entries, are always
1056 // small under the x86-64 medium code model.
1057 return false;
1058}
1059
1061 const DataLayout &DL, SectionKind Kind, const Constant *C,
1062 StringRef SectionSuffix) const {
1063 auto &Context = getContext();
1064 unsigned MergeableCstFlags = ELF::SHF_ALLOC;
1065 if (Kind.isMergeableConst() || Kind.isMergeableCString())
1066 MergeableCstFlags |= ELF::SHF_MERGE;
1067 bool IsLarge = isLargeConstant(DL, Kind, C);
1068 if (IsLarge)
1069 MergeableCstFlags |= ELF::SHF_X86_64_LARGE;
1070
1071 StringRef CstPrefix = IsLarge ? ".lrodata" : ".rodata";
1072 SmallString<32> SectionSuffixStr;
1073 if (!SectionSuffix.empty()) {
1074 SectionSuffixStr.push_back('.');
1075 SectionSuffixStr += SectionSuffix;
1076 SectionSuffixStr.push_back('.');
1077 }
1078
1079 if (Kind.isMergeableConst4())
1080 return Context.getELFSection(CstPrefix + ".cst4" + SectionSuffixStr,
1081 ELF::SHT_PROGBITS, MergeableCstFlags, 4);
1082 if (Kind.isMergeableConst8())
1083 return Context.getELFSection(CstPrefix + ".cst8" + SectionSuffixStr,
1084 ELF::SHT_PROGBITS, MergeableCstFlags, 8);
1085 if (Kind.isMergeableConst16())
1086 return Context.getELFSection(CstPrefix + ".cst16" + SectionSuffixStr,
1087 ELF::SHT_PROGBITS, MergeableCstFlags, 16);
1088 if (Kind.isMergeableConst32())
1089 return Context.getELFSection(CstPrefix + ".cst32" + SectionSuffixStr,
1090 ELF::SHT_PROGBITS, MergeableCstFlags, 32);
1091 if (Kind.isReadOnly())
1092 return Context.getELFSection(CstPrefix + SectionSuffixStr,
1094
1095 assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
1096 return Context.getELFSection(".data.rel.ro" + SectionSuffixStr,
1099}
1100
1102 const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment,
1103 const Function *F) const {
1104 return getSectionForConstantImpl(DL, Kind, C, "");
1105}
1106
1108 const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment,
1109 const Function *F, StringRef SectionSuffix) const {
1110 if (SectionSuffix.empty())
1111 return getSectionForConstant(DL, Kind, C, Alignment, F);
1112
1113 return getSectionForConstantImpl(DL, Kind, C, SectionSuffix);
1114}
1115
1116/// Returns a unique section for the given machine basic block.
1118 const Function &F, const MachineBasicBlock &MBB,
1119 const TargetMachine &TM) const {
1120 assert(MBB.isBeginSection() && "Basic block does not start a section!");
1122
1123 // For cold sections use the .text.split. prefix along with the parent
1124 // function name. All cold blocks for the same function go to the same
1125 // section. Similarly all exception blocks are grouped by symbol name
1126 // under the .text.eh prefix. For regular sections, we either use a unique
1127 // name, or a unique ID for the section.
1128 SmallString<128> Name;
1129 StringRef FunctionSectionName = MBB.getParent()->getSection()->getName();
1130 if (FunctionSectionName == ".text" ||
1131 FunctionSectionName.starts_with(".text.")) {
1132 // Function is in a regular .text section.
1133 StringRef FunctionName = MBB.getParent()->getName();
1134 if (MBB.getSectionID() == MBBSectionID::ColdSectionID) {
1136 Name += FunctionName;
1137 } else if (MBB.getSectionID() == MBBSectionID::ExceptionSectionID) {
1138 Name += ".text.eh.";
1139 Name += FunctionName;
1140 } else {
1141 Name += FunctionSectionName;
1142 if (TM.getUniqueBasicBlockSectionNames()) {
1143 if (!Name.ends_with("."))
1144 Name += ".";
1145 Name += MBB.getSymbol()->getName();
1146 } else {
1147 UniqueID = NextUniqueID++;
1148 }
1149 }
1150 } else {
1151 // If the original function has a custom non-dot-text section, then emit
1152 // all basic block sections into that section too, each with a unique id.
1153 Name = FunctionSectionName;
1154 UniqueID = NextUniqueID++;
1155 }
1156
1157 unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_EXECINSTR;
1158 std::string GroupName;
1159 if (F.hasComdat()) {
1160 Flags |= ELF::SHF_GROUP;
1161 GroupName = F.getComdat()->getName().str();
1162 }
1163 return getContext().getELFSection(Name, ELF::SHT_PROGBITS, Flags,
1164 0 /* Entry Size */, GroupName,
1165 F.hasComdat(), UniqueID, nullptr);
1166}
1167
1168static MCSectionELF *getStaticStructorSection(MCContext &Ctx, bool UseInitArray,
1169 bool IsCtor, unsigned Priority,
1170 const MCSymbol *KeySym) {
1171 std::string Name;
1172 unsigned Type;
1173 unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE;
1174 StringRef Comdat = KeySym ? KeySym->getName() : "";
1175
1176 if (KeySym)
1177 Flags |= ELF::SHF_GROUP;
1178
1179 if (UseInitArray) {
1180 if (IsCtor) {
1182 Name = ".init_array";
1183 } else {
1185 Name = ".fini_array";
1186 }
1187 if (Priority != 65535) {
1188 Name += '.';
1189 Name += utostr(Priority);
1190 }
1191 } else {
1192 // The default scheme is .ctor / .dtor, so we have to invert the priority
1193 // numbering.
1194 if (IsCtor)
1195 Name = ".ctors";
1196 else
1197 Name = ".dtors";
1198 if (Priority != 65535)
1199 raw_string_ostream(Name) << format(".%05u", 65535 - Priority);
1201 }
1202
1203 return Ctx.getELFSection(Name, Type, Flags, 0, Comdat, /*IsComdat=*/true);
1204}
1205
1207 unsigned Priority, const MCSymbol *KeySym) const {
1208 return getStaticStructorSection(getContext(), UseInitArray, true, Priority,
1209 KeySym);
1210}
1211
1213 unsigned Priority, const MCSymbol *KeySym) const {
1214 return getStaticStructorSection(getContext(), UseInitArray, false, Priority,
1215 KeySym);
1216}
1217
1219 const MCSymbol *LHS, const MCSymbol *RHS, int64_t Addend,
1220 std::optional<int64_t> PCRelativeOffset) const {
1221 auto &Ctx = getContext();
1222 const MCExpr *Res;
1223 // Return a relocatable expression with the PLT specifier, %plt(GV) or
1224 // %plt(GV-RHS).
1225 if (PCRelativeOffset && PLTPCRelativeSpecifier) {
1226 Res = MCSymbolRefExpr::create(LHS, Ctx);
1227 // The current location is RHS plus *PCRelativeOffset. Compensate for it.
1228 Addend += *PCRelativeOffset;
1229 if (Addend)
1230 Res = MCBinaryExpr::createAdd(Res, MCConstantExpr::create(Addend, Ctx),
1231 Ctx);
1233 }
1234
1236 return nullptr;
1239 MCSymbolRefExpr::create(RHS, Ctx), Ctx);
1240 if (Addend)
1241 Res =
1242 MCBinaryExpr::createAdd(Res, MCConstantExpr::create(Addend, Ctx), Ctx);
1243 return Res;
1244}
1245
1246// Reference the PLT entry of a function, optionally with a subtrahend (`RHS`).
1248 const MCSymbol *LHS, const MCSymbol *RHS, int64_t Addend,
1249 std::optional<int64_t> PCRelativeOffset, const TargetMachine &TM) const {
1250 if (RHS)
1251 return lowerSymbolDifference(LHS, RHS, Addend, PCRelativeOffset);
1252
1253 // Only the legacy MCSymbolRefExpr::VariantKind approach is implemented.
1254 // Reference LHS@plt or LHS@plt - RHS.
1257 return nullptr;
1258}
1259
1261 // Use ".GCC.command.line" since this feature is to support clang's
1262 // -frecord-gcc-switches which in turn attempts to mimic GCC's switch of the
1263 // same name.
1264 return getContext().getELFSection(".GCC.command.line", ELF::SHT_PROGBITS,
1266}
1267
1268void
1270 UseInitArray = UseInitArray_;
1271 MCContext &Ctx = getContext();
1272 if (!UseInitArray) {
1273 StaticCtorSection = Ctx.getELFSection(".ctors", ELF::SHT_PROGBITS,
1275
1276 StaticDtorSection = Ctx.getELFSection(".dtors", ELF::SHT_PROGBITS,
1278 return;
1279 }
1280
1281 StaticCtorSection = Ctx.getELFSection(".init_array", ELF::SHT_INIT_ARRAY,
1283 StaticDtorSection = Ctx.getELFSection(".fini_array", ELF::SHT_FINI_ARRAY,
1285}
1286
1287//===----------------------------------------------------------------------===//
1288// MachO
1289//===----------------------------------------------------------------------===//
1290
1294
1296 const TargetMachine &TM) {
1298 if (TM.getRelocationModel() == Reloc::Static) {
1299 StaticCtorSection = Ctx.getMachOSection("__TEXT", "__constructor", 0,
1301 StaticDtorSection = Ctx.getMachOSection("__TEXT", "__destructor", 0,
1303 } else {
1304 StaticCtorSection = Ctx.getMachOSection("__DATA", "__mod_init_func",
1307 StaticDtorSection = Ctx.getMachOSection("__DATA", "__mod_term_func",
1310 }
1311
1317}
1318
1320 unsigned Priority, const MCSymbol *KeySym) const {
1321 return StaticDtorSection;
1322 // In userspace, we lower global destructors via atexit(), but kernel/kext
1323 // environments do not provide this function so we still need to support the
1324 // legacy way here.
1325 // See the -disable-atexit-based-global-dtor-lowering CodeGen flag for more
1326 // context.
1327}
1328
1330 Module &M) const {
1331 // Emit the linker options if present.
1332 emitLinkerDirectives(Streamer, M);
1333
1334 emitPseudoProbeDescMetadata(Streamer, M);
1335
1336 unsigned VersionVal = 0;
1337 unsigned ImageInfoFlags = 0;
1338 StringRef SectionVal;
1339
1340 GetObjCImageInfo(M, VersionVal, ImageInfoFlags, SectionVal);
1341 emitCGProfileMetadata(Streamer, M);
1342
1343 // The section is mandatory. If we don't have it, then we don't have GC info.
1344 if (SectionVal.empty())
1345 return;
1346
1347 StringRef Segment, Section;
1348 unsigned TAA = 0, StubSize = 0;
1349 bool TAAParsed;
1351 SectionVal, Segment, Section, TAA, TAAParsed, StubSize)) {
1352 // If invalid, report the error with report_fatal_error.
1353 report_fatal_error("Invalid section specifier '" + Section +
1354 "': " + toString(std::move(E)) + ".");
1355 }
1356
1357 // Get the section.
1359 Segment, Section, TAA, StubSize, SectionKind::getData());
1360 Streamer.switchSection(S);
1361 Streamer.emitLabel(getContext().
1362 getOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO")));
1363 Streamer.emitInt32(VersionVal);
1364 Streamer.emitInt32(ImageInfoFlags);
1365 Streamer.addBlankLine();
1366}
1367
1369 Module &M) const {
1370 if (auto *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
1371 for (const auto *Option : LinkerOptions->operands()) {
1372 SmallVector<std::string, 4> StrOptions;
1373 for (const auto &Piece : cast<MDNode>(Option)->operands())
1374 StrOptions.push_back(std::string(cast<MDString>(Piece)->getString()));
1375 Streamer.emitLinkerOptions(StrOptions);
1376 }
1377 }
1378}
1379
1380static void checkMachOComdat(const GlobalValue *GV) {
1381 const Comdat *C = GV->getComdat();
1382 if (!C)
1383 return;
1384
1385 report_fatal_error("MachO doesn't support COMDATs, '" + C->getName() +
1386 "' cannot be lowered.");
1387}
1388
1390 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1391
1394
1395 // Parse the section specifier and create it if valid.
1396 StringRef Segment, Section;
1397 unsigned TAA = 0, StubSize = 0;
1398 bool TAAParsed;
1399
1400 checkMachOComdat(GO);
1401
1403 SectionName, Segment, Section, TAA, TAAParsed, StubSize)) {
1404 // If invalid, report the error with report_fatal_error.
1405 report_fatal_error("Global variable '" + GO->getName() +
1406 "' has an invalid section specifier '" +
1407 GO->getSection() + "': " + toString(std::move(E)) + ".");
1408 }
1409
1410 // Get the section.
1411 MCSectionMachO *S =
1412 getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
1413
1414 // If TAA wasn't set by ParseSectionSpecifier() above,
1415 // use the value returned by getMachOSection() as a default.
1416 if (!TAAParsed)
1417 TAA = S->getTypeAndAttributes();
1418
1419 // Okay, now that we got the section, verify that the TAA & StubSize agree.
1420 // If the user declared multiple globals with different section flags, we need
1421 // to reject it here.
1422 if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
1423 // If invalid, report the error with report_fatal_error.
1424 report_fatal_error("Global variable '" + GO->getName() +
1425 "' section type or attributes does not match previous"
1426 " section specifier");
1427 }
1428
1429 return S;
1430}
1431
1433 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1434 checkMachOComdat(GO);
1435
1436 // Handle thread local data.
1437 if (Kind.isThreadBSS()) return TLSBSSSection;
1438 if (Kind.isThreadData()) return TLSDataSection;
1439
1440 if (Kind.isText())
1442
1443 // If this is weak/linkonce, put this in a coalescable section, either in text
1444 // or data depending on if it is writable.
1445 if (GO->isWeakForLinker()) {
1446 if (Kind.isReadOnly())
1447 return ConstTextCoalSection;
1448 if (Kind.isReadOnlyWithRel())
1449 return ConstDataCoalSection;
1450 return DataCoalSection;
1451 }
1452
1453 // FIXME: Alignment check should be handled by section classifier.
1454 if (Kind.isMergeable1ByteCString() &&
1456 cast<GlobalVariable>(GO)) < Align(32))
1457 return CStringSection;
1458
1459 // Do not put 16-bit arrays in the UString section if they have an
1460 // externally visible label, this runs into issues with certain linker
1461 // versions.
1462 if (Kind.isMergeable2ByteCString() && !GO->hasExternalLinkage() &&
1464 cast<GlobalVariable>(GO)) < Align(32))
1465 return UStringSection;
1466
1467 // With MachO only variables whose corresponding symbol starts with 'l' or
1468 // 'L' can be merged, so we only try merging GVs with private linkage.
1469 if (GO->hasPrivateLinkage() && Kind.isMergeableConst()) {
1470 if (Kind.isMergeableConst4())
1472 if (Kind.isMergeableConst8())
1474 if (Kind.isMergeableConst16())
1476 }
1477
1478 // Otherwise, if it is readonly, but not something we can specially optimize,
1479 // just drop it in .const.
1480 if (Kind.isReadOnly())
1481 return ReadOnlySection;
1482
1483 // If this is marked const, put it into a const section. But if the dynamic
1484 // linker needs to write to it, put it in the data segment.
1485 if (Kind.isReadOnlyWithRel())
1486 return ConstDataSection;
1487
1488 // Put zero initialized globals with strong external linkage in the
1489 // DATA, __common section with the .zerofill directive.
1490 if (Kind.isBSSExtern())
1491 return DataCommonSection;
1492
1493 // Put zero initialized globals with local linkage in __DATA,__bss directive
1494 // with the .zerofill directive (aka .lcomm).
1495 if (Kind.isBSSLocal())
1496 return DataBSSSection;
1497
1498 // Otherwise, just drop the variable in the normal data section.
1499 return DataSection;
1500}
1501
1503 const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment,
1504 const Function *F) const {
1505 // If this constant requires a relocation, we have to put it in the data
1506 // segment, not in the text segment.
1507 if (Kind.isData() || Kind.isReadOnlyWithRel())
1508 return ConstDataSection;
1509
1510 if (Kind.isMergeableConst4())
1512 if (Kind.isMergeableConst8())
1514 if (Kind.isMergeableConst16())
1516 return ReadOnlySection; // .const
1517}
1518
1523
1525 const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM,
1526 MachineModuleInfo *MMI, MCStreamer &Streamer) const {
1527 // The mach-o version of this method defaults to returning a stub reference.
1528
1529 if (Encoding & DW_EH_PE_indirect) {
1530 MachineModuleInfoMachO &MachOMMI =
1532
1533 MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", TM);
1534
1535 // Add information about the stub reference to MachOMMI so that the stub
1536 // gets emitted by the asmprinter.
1537 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
1538 if (!StubSym.getPointer()) {
1539 MCSymbol *Sym = TM.getSymbol(GV);
1541 }
1542
1545 Encoding & ~DW_EH_PE_indirect, Streamer);
1546 }
1547
1549 MMI, Streamer);
1550}
1551
1553 const GlobalValue *GV, const TargetMachine &TM,
1554 MachineModuleInfo *MMI) const {
1555 // The mach-o version of this method defaults to returning a stub reference.
1556 MachineModuleInfoMachO &MachOMMI =
1558
1559 MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", TM);
1560
1561 // Add information about the stub reference to MachOMMI so that the stub
1562 // gets emitted by the asmprinter.
1563 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
1564 if (!StubSym.getPointer()) {
1565 MCSymbol *Sym = TM.getSymbol(GV);
1567 }
1568
1569 return SSym;
1570}
1571
1573 const GlobalValue *GV, const MCSymbol *Sym, const MCValue &MV,
1574 int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const {
1575 // Although MachO 32-bit targets do not explicitly have a GOTPCREL relocation
1576 // as 64-bit do, we replace the GOT equivalent by accessing the final symbol
1577 // through a non_lazy_ptr stub instead. One advantage is that it allows the
1578 // computation of deltas to final external symbols. Example:
1579 //
1580 // _extgotequiv:
1581 // .long _extfoo
1582 //
1583 // _delta:
1584 // .long _extgotequiv-_delta
1585 //
1586 // is transformed to:
1587 //
1588 // _delta:
1589 // .long L_extfoo$non_lazy_ptr-(_delta+0)
1590 //
1591 // .section __IMPORT,__pointers,non_lazy_symbol_pointers
1592 // L_extfoo$non_lazy_ptr:
1593 // .indirect_symbol _extfoo
1594 // .long 0
1595 //
1596 // The indirect symbol table (and sections of non_lazy_symbol_pointers type)
1597 // may point to both local (same translation unit) and global (other
1598 // translation units) symbols. Example:
1599 //
1600 // .section __DATA,__pointers,non_lazy_symbol_pointers
1601 // L1:
1602 // .indirect_symbol _myGlobal
1603 // .long 0
1604 // L2:
1605 // .indirect_symbol _myLocal
1606 // .long _myLocal
1607 //
1608 // If the symbol is local, instead of the symbol's index, the assembler
1609 // places the constant INDIRECT_SYMBOL_LOCAL into the indirect symbol table.
1610 // Then the linker will notice the constant in the table and will look at the
1611 // content of the symbol.
1612 MachineModuleInfoMachO &MachOMMI =
1614 MCContext &Ctx = getContext();
1615
1616 // The offset must consider the original displacement from the base symbol
1617 // since 32-bit targets don't have a GOTPCREL to fold the PC displacement.
1618 Offset = -MV.getConstant();
1619 const MCSymbol *BaseSym = MV.getSubSym();
1620
1621 // Access the final symbol via sym$non_lazy_ptr and generate the appropriated
1622 // non_lazy_ptr stubs.
1623 SmallString<128> Name;
1624 StringRef Suffix = "$non_lazy_ptr";
1626 Name += Sym->getName();
1627 Name += Suffix;
1628 MCSymbol *Stub = Ctx.getOrCreateSymbol(Name);
1629
1630 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(Stub);
1631
1632 if (!StubSym.getPointer())
1633 StubSym = MachineModuleInfoImpl::StubValueTy(const_cast<MCSymbol *>(Sym),
1634 !GV->hasLocalLinkage());
1635
1636 const MCExpr *BSymExpr = MCSymbolRefExpr::create(BaseSym, Ctx);
1637 const MCExpr *LHS = MCSymbolRefExpr::create(Stub, Ctx);
1638
1639 if (!Offset)
1640 return MCBinaryExpr::createSub(LHS, BSymExpr, Ctx);
1641
1642 const MCExpr *RHS =
1644 return MCBinaryExpr::createSub(LHS, RHS, Ctx);
1645}
1646
1647static bool canUsePrivateLabel(const MCAsmInfo &AsmInfo,
1648 const MCSection &Section) {
1650 return true;
1651
1652 // FIXME: we should be able to use private labels for sections that can't be
1653 // dead-stripped (there's no issue with blocking atomization there), but `ld
1654 // -r` sometimes drops the no_dead_strip attribute from sections so for safety
1655 // we don't allow it.
1656 return false;
1657}
1658
1660 SmallVectorImpl<char> &OutName, const GlobalValue *GV,
1661 const TargetMachine &TM) const {
1662 bool CannotUsePrivateLabel = true;
1663 if (auto *GO = GV->getAliaseeObject()) {
1665 const MCSection *TheSection = SectionForGlobal(GO, GOKind, TM);
1666 CannotUsePrivateLabel = !canUsePrivateLabel(TM.getMCAsmInfo(), *TheSection);
1667 }
1668 getMangler().getNameWithPrefix(OutName, GV, CannotUsePrivateLabel);
1669}
1670
1671//===----------------------------------------------------------------------===//
1672// COFF
1673//===----------------------------------------------------------------------===//
1674
1675static unsigned
1677 unsigned Flags = 0;
1679
1680 if (K.isMetadata())
1681 Flags |=
1683 else if (K.isExclude())
1684 Flags |=
1686 else if (K.isText())
1687 Flags |=
1692 else if (K.isBSS())
1693 Flags |=
1697 else if (K.isThreadLocal())
1698 Flags |=
1702 else if (K.isReadOnly() || K.isReadOnlyWithRel())
1703 Flags |=
1706 else if (K.isWriteable())
1707 Flags |=
1711
1712 return Flags;
1713}
1714
1716 const Comdat *C = GV->getComdat();
1717 assert(C && "expected GV to have a Comdat!");
1718
1719 StringRef ComdatGVName = C->getName();
1720 const GlobalValue *ComdatGV = GV->getParent()->getNamedValue(ComdatGVName);
1721 if (!ComdatGV)
1722 report_fatal_error("Associative COMDAT symbol '" + ComdatGVName +
1723 "' does not exist.");
1724
1725 if (ComdatGV->getComdat() != C)
1726 report_fatal_error("Associative COMDAT symbol '" + ComdatGVName +
1727 "' is not a key for its COMDAT.");
1728
1729 return ComdatGV;
1730}
1731
1732static int getSelectionForCOFF(const GlobalValue *GV) {
1733 if (const Comdat *C = GV->getComdat()) {
1734 const GlobalValue *ComdatKey = getComdatGVForCOFF(GV);
1735 if (const auto *GA = dyn_cast<GlobalAlias>(ComdatKey))
1736 ComdatKey = GA->getAliaseeObject();
1737 if (ComdatKey == GV) {
1738 switch (C->getSelectionKind()) {
1739 case Comdat::Any:
1741 case Comdat::ExactMatch:
1743 case Comdat::Largest:
1747 case Comdat::SameSize:
1749 }
1750 } else {
1752 }
1753 }
1754 return 0;
1755}
1756
1758 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1760 if (Name == getInstrProfSectionName(IPSK_covmap, Triple::COFF,
1761 /*AddSegmentInfo=*/false) ||
1762 Name == getInstrProfSectionName(IPSK_covfun, Triple::COFF,
1763 /*AddSegmentInfo=*/false) ||
1764 Name == getInstrProfSectionName(IPSK_covdata, Triple::COFF,
1765 /*AddSegmentInfo=*/false) ||
1766 Name == getInstrProfSectionName(IPSK_covname, Triple::COFF,
1767 /*AddSegmentInfo=*/false) ||
1768 Name == ".llvmbc" || Name == ".llvmcmd")
1769 Kind = SectionKind::getMetadata();
1770 int Selection = 0;
1771 unsigned Characteristics = getCOFFSectionFlags(Kind, TM);
1772 StringRef COMDATSymName = "";
1773 if (GO->hasComdat()) {
1775 const GlobalValue *ComdatGV;
1777 ComdatGV = getComdatGVForCOFF(GO);
1778 else
1779 ComdatGV = GO;
1780
1781 if (!ComdatGV->hasPrivateLinkage()) {
1782 MCSymbol *Sym = TM.getSymbol(ComdatGV);
1783 COMDATSymName = Sym->getName();
1784 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1785 } else {
1786 Selection = 0;
1787 }
1788 }
1789
1790 return getContext().getCOFFSection(Name, Characteristics, COMDATSymName,
1791 Selection);
1792}
1793
1795 if (Kind.isText())
1796 return ".text";
1797 if (Kind.isBSS())
1798 return ".bss";
1799 if (Kind.isThreadLocal())
1800 return ".tls$";
1801 if (Kind.isReadOnly() || Kind.isReadOnlyWithRel())
1802 return ".rdata";
1803 return ".data";
1804}
1805
1807 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1808 // If we have -ffunction-sections then we should emit the global value to a
1809 // uniqued section specifically for it.
1810 bool EmitUniquedSection;
1811 if (Kind.isText())
1812 EmitUniquedSection = TM.getFunctionSections();
1813 else
1814 EmitUniquedSection = TM.getDataSections();
1815
1816 if ((EmitUniquedSection && !Kind.isCommon()) || GO->hasComdat()) {
1818
1819 unsigned Characteristics = getCOFFSectionFlags(Kind, TM);
1820
1821 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1823 if (!Selection)
1825 const GlobalValue *ComdatGV;
1826 if (GO->hasComdat())
1827 ComdatGV = getComdatGVForCOFF(GO);
1828 else
1829 ComdatGV = GO;
1830
1832 if (EmitUniquedSection)
1833 UniqueID = NextUniqueID++;
1834
1835 if (!ComdatGV->hasPrivateLinkage()) {
1836 MCSymbol *Sym = TM.getSymbol(ComdatGV);
1837 StringRef COMDATSymName = Sym->getName();
1838
1839 if (const auto *F = dyn_cast<Function>(GO))
1840 if (std::optional<StringRef> Prefix = F->getSectionPrefix())
1841 raw_svector_ostream(Name) << '$' << *Prefix;
1842
1843 // Append "$symbol" to the section name *before* IR-level mangling is
1844 // applied when targetting mingw. This is what GCC does, and the ld.bfd
1845 // COFF linker will not properly handle comdats otherwise.
1846 if (getContext().getTargetTriple().isOSCygMing())
1847 raw_svector_ostream(Name) << '$' << ComdatGV->getName();
1848
1849 return getContext().getCOFFSection(Name, Characteristics, COMDATSymName,
1851 } else {
1852 SmallString<256> TmpData;
1853 getMangler().getNameWithPrefix(TmpData, GO, /*CannotUsePrivateLabel=*/true);
1854 return getContext().getCOFFSection(Name, Characteristics, TmpData,
1856 }
1857 }
1858
1859 if (Kind.isText())
1860 return TextSection;
1861
1862 if (Kind.isThreadLocal())
1863 return TLSDataSection;
1864
1865 if (Kind.isReadOnly() || Kind.isReadOnlyWithRel())
1866 return ReadOnlySection;
1867
1868 // Note: we claim that common symbols are put in BSSSection, but they are
1869 // really emitted with the magic .comm directive, which creates a symbol table
1870 // entry but not a section.
1871 if (Kind.isBSS() || Kind.isCommon())
1872 return BSSSection;
1873
1874 return DataSection;
1875}
1876
1878 SmallVectorImpl<char> &OutName, const GlobalValue *GV,
1879 const TargetMachine &TM) const {
1880 bool CannotUsePrivateLabel = false;
1881 if (GV->hasPrivateLinkage() &&
1882 ((isa<Function>(GV) && TM.getFunctionSections()) ||
1883 (isa<GlobalVariable>(GV) && TM.getDataSections())))
1884 CannotUsePrivateLabel = true;
1885
1886 getMangler().getNameWithPrefix(OutName, GV, CannotUsePrivateLabel);
1887}
1888
1890 const Function &F, const TargetMachine &TM) const {
1891 // If the function can be removed, produce a unique section so that
1892 // the table doesn't prevent the removal.
1893 const Comdat *C = F.getComdat();
1894 bool EmitUniqueSection = TM.getFunctionSections() || C;
1895 if (!EmitUniqueSection)
1896 return ReadOnlySection;
1897
1898 // FIXME: we should produce a symbol for F instead.
1899 if (F.hasPrivateLinkage())
1900 return ReadOnlySection;
1901
1902 MCSymbol *Sym = TM.getSymbol(&F);
1903 StringRef COMDATSymName = Sym->getName();
1904
1907 unsigned Characteristics = getCOFFSectionFlags(Kind, TM);
1908 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1909 unsigned UniqueID = NextUniqueID++;
1910
1911 return getContext().getCOFFSection(SecName, Characteristics, COMDATSymName,
1913 UniqueID);
1914}
1915
1917 bool UsesLabelDifference, const Function &F) const {
1918 if (TM->getTargetTriple().getArch() == Triple::x86_64) {
1920 // We can always create relative relocations, so use another section
1921 // that can be marked non-executable.
1922 return false;
1923 }
1924 }
1926 UsesLabelDifference, F);
1927}
1928
1930 Module &M) const {
1931 emitLinkerDirectives(Streamer, M);
1932
1933 unsigned Version = 0;
1934 unsigned Flags = 0;
1935 StringRef Section;
1936
1937 GetObjCImageInfo(M, Version, Flags, Section);
1938 if (!Section.empty()) {
1939 auto &C = getContext();
1940 auto *S = C.getCOFFSection(Section, COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1942 Streamer.switchSection(S);
1943 Streamer.emitLabel(C.getOrCreateSymbol(StringRef("OBJC_IMAGE_INFO")));
1944 Streamer.emitInt32(Version);
1945 Streamer.emitInt32(Flags);
1946 Streamer.addBlankLine();
1947 }
1948
1949 emitCGProfileMetadata(Streamer, M);
1950 emitPseudoProbeDescMetadata(Streamer, M, [](MCStreamer &Streamer) {
1951 if (MCSymbol *Sym =
1952 static_cast<MCSectionCOFF *>(Streamer.getCurrentSectionOnly())
1953 ->getCOMDATSymbol())
1954 if (Sym->isUndefined()) {
1955 // COMDAT symbol must be external to perform deduplication.
1956 Streamer.emitSymbolAttribute(Sym, MCSA_Global);
1957 Streamer.emitLabel(Sym);
1958 }
1959 });
1960}
1961
1963 MCStreamer &Streamer, Module &M) const {
1964 if (NamedMDNode *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
1965 // Emit the linker options to the linker .drectve section. According to the
1966 // spec, this section is a space-separated string containing flags for
1967 // linker.
1969 Streamer.switchSection(Sec);
1970 for (const auto *Option : LinkerOptions->operands()) {
1971 for (const auto &Piece : cast<MDNode>(Option)->operands()) {
1972 // Lead with a space for consistency with our dllexport implementation.
1973 std::string Directive(" ");
1974 Directive.append(std::string(cast<MDString>(Piece)->getString()));
1975 Streamer.emitBytes(Directive);
1976 }
1977 }
1978 }
1979
1980 // Emit /EXPORT: flags for each exported global as necessary.
1981 std::string Flags;
1982 for (const GlobalValue &GV : M.global_values()) {
1983 raw_string_ostream OS(Flags);
1984 emitLinkerFlagsForGlobalCOFF(OS, &GV, getContext().getTargetTriple(),
1985 getMangler());
1986 if (!Flags.empty()) {
1987 Streamer.switchSection(getDrectveSection());
1988 Streamer.emitBytes(Flags);
1989 }
1990 Flags.clear();
1991 }
1992
1993 // Emit /INCLUDE: flags for each used global as necessary.
1994 if (const auto *LU = M.getNamedGlobal("llvm.used")) {
1995 assert(LU->hasInitializer() && "expected llvm.used to have an initializer");
1996 assert(isa<ArrayType>(LU->getValueType()) &&
1997 "expected llvm.used to be an array type");
1998 if (const auto *A = cast<ConstantArray>(LU->getInitializer())) {
1999 for (const Value *Op : A->operands()) {
2000 const auto *GV = cast<GlobalValue>(Op->stripPointerCasts());
2001 // Global symbols with internal or private linkage are not visible to
2002 // the linker, and thus would cause an error when the linker tried to
2003 // preserve the symbol due to the `/include:` directive.
2004 if (GV->hasLocalLinkage())
2005 continue;
2006
2007 raw_string_ostream OS(Flags);
2008 emitLinkerFlagsForUsedCOFF(OS, GV, getContext().getTargetTriple(),
2009 getMangler());
2010
2011 if (!Flags.empty()) {
2012 Streamer.switchSection(getDrectveSection());
2013 Streamer.emitBytes(Flags);
2014 }
2015 Flags.clear();
2016 }
2017 }
2018 }
2019}
2020
2022 const TargetMachine &TM) {
2024 this->TM = &TM;
2025 const Triple &T = TM.getTargetTriple();
2026 if (T.isWindowsMSVCEnvironment() || T.isWindowsItaniumEnvironment()) {
2028 Ctx.getCOFFSection(".CRT$XCU", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
2031 Ctx.getCOFFSection(".CRT$XTX", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
2033 } else {
2034 StaticCtorSection = Ctx.getCOFFSection(
2037 StaticDtorSection = Ctx.getCOFFSection(
2040 }
2041}
2042
2044 const Triple &T, bool IsCtor,
2045 unsigned Priority,
2046 const MCSymbol *KeySym,
2048 if (T.isWindowsMSVCEnvironment() || T.isWindowsItaniumEnvironment()) {
2049 // If the priority is the default, use .CRT$XCU, possibly associative.
2050 if (Priority == 65535)
2051 return Ctx.getAssociativeCOFFSection(Default, KeySym, 0);
2052
2053 // Otherwise, we need to compute a new section name. Low priorities should
2054 // run earlier. The linker will sort sections ASCII-betically, and we need a
2055 // string that sorts between .CRT$XCA and .CRT$XCU. In the general case, we
2056 // make a name like ".CRT$XCT12345", since that runs before .CRT$XCU. Really
2057 // low priorities need to sort before 'L', since the CRT uses that
2058 // internally, so we use ".CRT$XCA00001" for them. We have a contract with
2059 // the frontend that "init_seg(compiler)" corresponds to priority 200 and
2060 // "init_seg(lib)" corresponds to priority 400, and those respectively use
2061 // 'C' and 'L' without the priority suffix. Priorities between 200 and 400
2062 // use 'C' with the priority as a suffix.
2063 SmallString<24> Name;
2064 char LastLetter = 'T';
2065 bool AddPrioritySuffix = Priority != 200 && Priority != 400;
2066 if (Priority < 200)
2067 LastLetter = 'A';
2068 else if (Priority < 400)
2069 LastLetter = 'C';
2070 else if (Priority == 400)
2071 LastLetter = 'L';
2072 raw_svector_ostream OS(Name);
2073 OS << ".CRT$X" << (IsCtor ? "C" : "T") << LastLetter;
2074 if (AddPrioritySuffix)
2075 OS << format("%05u", Priority);
2076 MCSectionCOFF *Sec = Ctx.getCOFFSection(
2078 return Ctx.getAssociativeCOFFSection(Sec, KeySym, 0);
2079 }
2080
2081 std::string Name = IsCtor ? ".ctors" : ".dtors";
2082 if (Priority != 65535)
2083 raw_string_ostream(Name) << format(".%05u", 65535 - Priority);
2084
2085 return Ctx.getAssociativeCOFFSection(
2086 Ctx.getCOFFSection(Name, COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
2089 KeySym, 0);
2090}
2091
2093 unsigned Priority, const MCSymbol *KeySym) const {
2095 getContext(), getContext().getTargetTriple(), true, Priority, KeySym,
2096 static_cast<MCSectionCOFF *>(StaticCtorSection));
2097}
2098
2100 unsigned Priority, const MCSymbol *KeySym) const {
2102 getContext(), getContext().getTargetTriple(), false, Priority, KeySym,
2103 static_cast<MCSectionCOFF *>(StaticDtorSection));
2104}
2105
2107 const GlobalValue *LHS, const GlobalValue *RHS, int64_t Addend,
2108 std::optional<int64_t> PCRelativeOffset, const TargetMachine &TM) const {
2109 const Triple &T = TM.getTargetTriple();
2110 if (T.isOSCygMing())
2111 return nullptr;
2112
2113 // Our symbols should exist in address space zero, cowardly no-op if
2114 // otherwise.
2115 if (LHS->getType()->getPointerAddressSpace() != 0 ||
2116 RHS->getType()->getPointerAddressSpace() != 0)
2117 return nullptr;
2118
2119 // Both ptrtoint instructions must wrap global objects:
2120 // - Only global variables are eligible for image relative relocations.
2121 // - The subtrahend refers to the special symbol __ImageBase, a GlobalVariable.
2122 // We expect __ImageBase to be a global variable without a section, externally
2123 // defined.
2124 //
2125 // It should look something like this: @__ImageBase = external constant i8
2126 if (!isa<GlobalObject>(LHS) || !isa<GlobalVariable>(RHS) ||
2127 LHS->isThreadLocal() || RHS->isThreadLocal() ||
2128 RHS->getName() != "__ImageBase" || !RHS->hasExternalLinkage() ||
2129 cast<GlobalVariable>(RHS)->hasInitializer() || RHS->hasSection())
2130 return nullptr;
2131
2132 const MCExpr *Res = MCSymbolRefExpr::create(
2133 TM.getSymbol(LHS), MCSymbolRefExpr::VK_COFF_IMGREL32, getContext());
2134 if (Addend != 0)
2136 Res, MCConstantExpr::create(Addend, getContext()), getContext());
2137 return Res;
2138}
2139
2140static std::string APIntToHexString(const APInt &AI) {
2141 unsigned Width = (AI.getBitWidth() / 8) * 2;
2142 std::string HexString = toString(AI, 16, /*Signed=*/false);
2143 llvm::transform(HexString, HexString.begin(), tolower);
2144 unsigned Size = HexString.size();
2145 assert(Width >= Size && "hex string is too large!");
2146 HexString.insert(HexString.begin(), Width - Size, '0');
2147
2148 return HexString;
2149}
2150
2151static std::string scalarConstantToHexString(const Constant *C) {
2152 Type *Ty = C->getType();
2153 if (isa<UndefValue>(C)) {
2154 return APIntToHexString(APInt::getZero(Ty->getPrimitiveSizeInBits()));
2155 } else if (const auto *CFP = dyn_cast<ConstantFP>(C)) {
2156 if (CFP->getType()->isFloatingPointTy())
2157 return APIntToHexString(CFP->getValueAPF().bitcastToAPInt());
2158
2159 std::string HexString;
2160 unsigned NumElements =
2161 cast<FixedVectorType>(CFP->getType())->getNumElements();
2162 for (unsigned I = 0; I < NumElements; ++I)
2163 HexString += APIntToHexString(CFP->getValueAPF().bitcastToAPInt());
2164 return HexString;
2165 } else if (const auto *CI = dyn_cast<ConstantInt>(C)) {
2166 if (CI->getType()->isIntegerTy())
2167 return APIntToHexString(CI->getValue());
2168
2169 std::string HexString;
2170 unsigned NumElements =
2171 cast<FixedVectorType>(CI->getType())->getNumElements();
2172 for (unsigned I = 0; I < NumElements; ++I)
2173 HexString += APIntToHexString(CI->getValue());
2174 return HexString;
2175 } else {
2176 unsigned NumElements;
2177 if (auto *VTy = dyn_cast<VectorType>(Ty))
2178 NumElements = cast<FixedVectorType>(VTy)->getNumElements();
2179 else
2180 NumElements = Ty->getArrayNumElements();
2181 std::string HexString;
2182 for (int I = NumElements - 1, E = -1; I != E; --I)
2183 HexString += scalarConstantToHexString(C->getAggregateElement(I));
2184 return HexString;
2185 }
2186}
2187
2189 const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment,
2190 const Function *F) const {
2191 if (Kind.isMergeableConst() && C &&
2192 getContext().getAsmInfo().hasCOFFComdatConstants()) {
2193 // This creates comdat sections with the given symbol name, but unless
2194 // AsmPrinter::GetCPISymbol actually makes the symbol global, the symbol
2195 // will be created with a null storage class, which makes GNU binutils
2196 // error out.
2197 const unsigned Characteristics = COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
2200 std::string COMDATSymName;
2201 if (Kind.isMergeableConst4()) {
2202 if (Alignment <= 4) {
2203 COMDATSymName = "__real@" + scalarConstantToHexString(C);
2204 Alignment = Align(4);
2205 }
2206 } else if (Kind.isMergeableConst8()) {
2207 if (Alignment <= 8) {
2208 COMDATSymName = "__real@" + scalarConstantToHexString(C);
2209 Alignment = Align(8);
2210 }
2211 } else if (Kind.isMergeableConst16()) {
2212 // FIXME: These may not be appropriate for non-x86 architectures.
2213 if (Alignment <= 16) {
2214 COMDATSymName = "__xmm@" + scalarConstantToHexString(C);
2215 Alignment = Align(16);
2216 }
2217 } else if (Kind.isMergeableConst32()) {
2218 if (Alignment <= 32) {
2219 COMDATSymName = "__ymm@" + scalarConstantToHexString(C);
2220 Alignment = Align(32);
2221 }
2222 }
2223
2224 if (!COMDATSymName.empty())
2225 return getContext().getCOFFSection(".rdata", Characteristics,
2226 COMDATSymName,
2228 }
2229
2230 return TargetLoweringObjectFile::getSectionForConstant(DL, Kind, C, Alignment,
2231 F);
2232}
2233
2234//===----------------------------------------------------------------------===//
2235// Wasm
2236//===----------------------------------------------------------------------===//
2237
2238static const Comdat *getWasmComdat(const GlobalValue *GV) {
2239 const Comdat *C = GV->getComdat();
2240 if (!C)
2241 return nullptr;
2242
2243 if (C->getSelectionKind() != Comdat::Any)
2244 report_fatal_error("WebAssembly COMDATs only support "
2245 "SelectionKind::Any, '" + C->getName() + "' cannot be "
2246 "lowered.");
2247
2248 return C;
2249}
2250
2251static unsigned getWasmSectionFlags(SectionKind K, bool Retain) {
2252 unsigned Flags = 0;
2253
2254 if (K.isThreadLocal())
2255 Flags |= wasm::WASM_SEG_FLAG_TLS;
2256
2257 if (K.isMergeableCString())
2259
2260 if (Retain)
2262
2263 // TODO(sbc): Add suport for K.isMergeableConst()
2264
2265 return Flags;
2266}
2267
2270 collectUsedGlobalVariables(M, Vec, false);
2271 for (GlobalValue *GV : Vec)
2272 if (auto *GO = dyn_cast<GlobalObject>(GV))
2273 Used.insert(GO);
2274}
2275
2277 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2278 // We don't support explict section names for functions in the wasm object
2279 // format. Each function has to be in its own unique section.
2280 if (isa<Function>(GO)) {
2281 return SelectSectionForGlobal(GO, Kind, TM);
2282 }
2283
2284 StringRef Name = GO->getSection();
2285
2286 // Certain data sections we treat as named custom sections rather than
2287 // segments within the data section.
2288 // This could be avoided if all data segements (the wasm sense) were
2289 // represented as their own sections (in the llvm sense).
2290 // TODO(sbc): https://github.com/WebAssembly/tool-conventions/issues/138
2291 if (Name == getInstrProfSectionName(IPSK_covmap, Triple::Wasm,
2292 /*AddSegmentInfo=*/false) ||
2293 Name == getInstrProfSectionName(IPSK_covfun, Triple::Wasm,
2294 /*AddSegmentInfo=*/false) ||
2295 Name == ".llvmbc" || Name == ".llvmcmd")
2296 Kind = SectionKind::getMetadata();
2297
2298 StringRef Group = "";
2299 if (const Comdat *C = getWasmComdat(GO)) {
2300 Group = C->getName();
2301 }
2302
2303 unsigned Flags = getWasmSectionFlags(Kind, Used.count(GO));
2304 MCSectionWasm *Section = getContext().getWasmSection(Name, Kind, Flags, Group,
2306
2307 return Section;
2308}
2309
2310static MCSectionWasm *
2312 SectionKind Kind, Mangler &Mang,
2313 const TargetMachine &TM, bool EmitUniqueSection,
2314 unsigned *NextUniqueID, bool Retain) {
2315 StringRef Group = "";
2316 if (const Comdat *C = getWasmComdat(GO)) {
2317 Group = C->getName();
2318 }
2319
2320 bool UniqueSectionNames = TM.getUniqueSectionNames();
2321 SmallString<128> Name = getSectionPrefixForGlobal(Kind, /*IsLarge=*/false);
2322
2323 if (const auto *F = dyn_cast<Function>(GO)) {
2324 const auto &OptionalPrefix = F->getSectionPrefix();
2325 if (OptionalPrefix)
2326 raw_svector_ostream(Name) << '.' << *OptionalPrefix;
2327 }
2328
2329 if (EmitUniqueSection && UniqueSectionNames) {
2330 Name.push_back('.');
2331 TM.getNameWithPrefix(Name, GO, Mang, true);
2332 }
2334 if (EmitUniqueSection && !UniqueSectionNames) {
2335 UniqueID = *NextUniqueID;
2336 (*NextUniqueID)++;
2337 }
2338
2339 unsigned Flags = getWasmSectionFlags(Kind, Retain);
2340 return Ctx.getWasmSection(Name, Kind, Flags, Group, UniqueID);
2341}
2342
2344 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2345
2346 if (Kind.isCommon())
2347 report_fatal_error("mergable sections not supported yet on wasm");
2348
2349 // If we have -ffunction-section or -fdata-section then we should emit the
2350 // global value to a uniqued section specifically for it.
2351 bool EmitUniqueSection = false;
2352 if (Kind.isText())
2353 EmitUniqueSection = TM.getFunctionSections();
2354 else
2355 EmitUniqueSection = TM.getDataSections();
2356 EmitUniqueSection |= GO->hasComdat();
2357 bool Retain = Used.count(GO);
2358 EmitUniqueSection |= Retain;
2359
2360 return selectWasmSectionForGlobal(getContext(), GO, Kind, getMangler(), TM,
2361 EmitUniqueSection, &NextUniqueID, Retain);
2362}
2363
2365 bool UsesLabelDifference, const Function &F) const {
2366 // We can always create relative relocations, so use another section
2367 // that can be marked non-executable.
2368 return false;
2369}
2370
2374
2375 // We don't use PersonalityEncoding and LSDAEncoding because we don't emit
2376 // .cfi directives. We use TTypeEncoding to encode typeinfo global variables.
2378}
2379
2381 unsigned Priority, const MCSymbol *KeySym) const {
2382 return Priority == UINT16_MAX ?
2384 getContext().getWasmSection(".init_array." + utostr(Priority),
2386}
2387
2389 unsigned Priority, const MCSymbol *KeySym) const {
2390 report_fatal_error("@llvm.global_dtors should have been lowered already");
2391}
2392
2393//===----------------------------------------------------------------------===//
2394// XCOFF
2395//===----------------------------------------------------------------------===//
2397 const MachineFunction *MF) {
2398 if (!MF->getLandingPads().empty())
2399 return true;
2400
2401 const Function &F = MF->getFunction();
2402 if (!F.hasPersonalityFn() || !F.needsUnwindTableEntry())
2403 return false;
2404
2405 const GlobalValue *Per =
2406 dyn_cast<GlobalValue>(F.getPersonalityFn()->stripPointerCasts());
2407 assert(Per && "Personality routine is not a GlobalValue type.");
2409 return false;
2410
2411 return true;
2412}
2413
2415 const MachineFunction *MF) {
2416 const Function &F = MF->getFunction();
2417 if (!F.hasStackProtectorFnAttr())
2418 return false;
2419 // FIXME: check presence of canary word
2420 // There are cases that the stack protectors are not really inserted even if
2421 // the attributes are on.
2422 return true;
2423}
2424
2425MCSymbol *
2427 auto *EHInfoSym =
2428 static_cast<MCSymbolXCOFF *>(MF->getContext().getOrCreateSymbol(
2429 "__ehinfo." + Twine(MF->getFunctionNumber())));
2430 EHInfoSym->setEHInfo();
2431 return EHInfoSym;
2432}
2433
2434MCSymbol *
2436 const TargetMachine &TM) const {
2437 // We always use a qualname symbol for a GV that represents
2438 // a declaration, a function descriptor, or a common symbol. An IFunc is
2439 // lowered as a special trampoline function which has an entry point and a
2440 // descriptor.
2441 // If a GV represents a GlobalVariable and -fdata-sections is enabled, we
2442 // also return a qualname so that a label symbol could be avoided.
2443 // It is inherently ambiguous when the GO represents the address of a
2444 // function, as the GO could either represent a function descriptor or a
2445 // function entry point. We choose to always return a function descriptor
2446 // here.
2447 if (const GlobalObject *GO = dyn_cast<GlobalObject>(GV)) {
2448 if (GO->isDeclarationForLinker())
2449 return static_cast<const MCSectionXCOFF *>(
2451 ->getQualNameSymbol();
2452
2453 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV))
2454 if (GVar->hasAttribute("toc-data"))
2455 return static_cast<const MCSectionXCOFF *>(
2457 ->getQualNameSymbol();
2458
2459 if (isa<GlobalIFunc>(GO))
2460 return static_cast<const MCSectionXCOFF *>(
2462 ->getQualNameSymbol();
2463
2464 SectionKind GOKind = getKindForGlobal(GO, TM);
2465 if (GOKind.isText())
2466 return static_cast<const MCSectionXCOFF *>(
2468 ->getQualNameSymbol();
2469 if ((TM.getDataSections() && !GO->hasSection()) || GO->hasCommonLinkage() ||
2470 GOKind.isBSSLocal() || GOKind.isThreadBSSLocal())
2471 return static_cast<const MCSectionXCOFF *>(
2472 SectionForGlobal(GO, GOKind, TM))
2473 ->getQualNameSymbol();
2474 }
2475
2476 // For all other cases, fall back to getSymbol to return the unqualified name.
2477 return nullptr;
2478}
2479
2481 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2482 if (!GO->hasSection())
2483 report_fatal_error("#pragma clang section is not yet supported");
2484
2486
2487 // Handle the XCOFF::TD case first, then deal with the rest.
2488 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GO))
2489 if (GVar->hasAttribute("toc-data"))
2490 return getContext().getXCOFFSection(
2491 SectionName, Kind,
2493 /* MultiSymbolsAllowed*/ true);
2494
2495 XCOFF::StorageMappingClass MappingClass;
2496 if (Kind.isText())
2497 MappingClass = XCOFF::XMC_PR;
2498 else if (Kind.isData() || Kind.isBSS())
2499 MappingClass = XCOFF::XMC_RW;
2500 else if (Kind.isReadOnlyWithRel())
2501 MappingClass =
2502 TM.Options.XCOFFReadOnlyPointers ? XCOFF::XMC_RO : XCOFF::XMC_RW;
2503 else if (Kind.isReadOnly())
2504 MappingClass = XCOFF::XMC_RO;
2505 else
2506 report_fatal_error("XCOFF other section types not yet implemented.");
2507
2508 return getContext().getXCOFFSection(
2509 SectionName, Kind, XCOFF::CsectProperties(MappingClass, XCOFF::XTY_SD),
2510 /* MultiSymbolsAllowed*/ true);
2511}
2512
2514 const GlobalObject *GO, const TargetMachine &TM) const {
2516 "Tried to get ER section for a defined global.");
2517
2518 SmallString<128> Name;
2519 getNameWithPrefix(Name, GO, TM);
2520
2521 // AIX TLS local-dynamic does not need the external reference for the
2522 // "_$TLSML" symbol.
2524 GO->hasName() && GO->getName() == "_$TLSML") {
2525 return getContext().getXCOFFSection(
2526 Name, SectionKind::getData(),
2528 }
2529
2532 if (GO->isThreadLocal())
2533 SMC = XCOFF::XMC_UL;
2534
2535 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GO))
2536 if (GVar->hasAttribute("toc-data"))
2537 SMC = XCOFF::XMC_TD;
2538
2539 // Externals go into a csect of type ER.
2540 return getContext().getXCOFFSection(
2543}
2544
2546 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2547 // Handle the XCOFF::TD case first, then deal with the rest.
2548 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GO))
2549 if (GVar->hasAttribute("toc-data")) {
2550 SmallString<128> Name;
2551 getNameWithPrefix(Name, GO, TM);
2552 XCOFF::SymbolType symType =
2554 return getContext().getXCOFFSection(
2555 Name, Kind, XCOFF::CsectProperties(XCOFF::XMC_TD, symType),
2556 /* MultiSymbolsAllowed*/ true);
2557 }
2558
2559 // Common symbols go into a csect with matching name which will get mapped
2560 // into the .bss section.
2561 // Zero-initialized local TLS symbols go into a csect with matching name which
2562 // will get mapped into the .tbss section.
2563 if (Kind.isBSSLocal() || GO->hasCommonLinkage() || Kind.isThreadBSSLocal()) {
2564 SmallString<128> Name;
2565 getNameWithPrefix(Name, GO, TM);
2566 XCOFF::StorageMappingClass SMC = Kind.isBSSLocal() ? XCOFF::XMC_BS
2567 : Kind.isCommon() ? XCOFF::XMC_RW
2568 : XCOFF::XMC_UL;
2569 return getContext().getXCOFFSection(
2570 Name, Kind, XCOFF::CsectProperties(SMC, XCOFF::XTY_CM));
2571 }
2572
2573 if (Kind.isText()) {
2574 if (TM.getFunctionSections()) {
2575 return static_cast<const MCSymbolXCOFF *>(
2577 ->getRepresentedCsect();
2578 }
2579 return TextSection;
2580 }
2581
2582 if (TM.Options.XCOFFReadOnlyPointers && Kind.isReadOnlyWithRel()) {
2583 if (!TM.getDataSections())
2585 "ReadOnlyPointers is supported only if data sections is turned on");
2586
2587 SmallString<128> Name;
2588 getNameWithPrefix(Name, GO, TM);
2589 return getContext().getXCOFFSection(
2592 }
2593
2594 // For BSS kind, zero initialized data must be emitted to the .data section
2595 // because external linkage control sections that get mapped to the .bss
2596 // section will be linked as tentative definitions, which is only appropriate
2597 // for SectionKind::Common.
2598 if (Kind.isData() || Kind.isReadOnlyWithRel() || Kind.isBSS()) {
2599 if (TM.getDataSections()) {
2600 SmallString<128> Name;
2601 getNameWithPrefix(Name, GO, TM);
2602 return getContext().getXCOFFSection(
2603 Name, SectionKind::getData(),
2605 }
2606 return DataSection;
2607 }
2608
2609 if (Kind.isReadOnly()) {
2610 if (TM.getDataSections()) {
2611 SmallString<128> Name;
2612 getNameWithPrefix(Name, GO, TM);
2613 return getContext().getXCOFFSection(
2616 }
2617 return ReadOnlySection;
2618 }
2619
2620 // External/weak TLS data and initialized local TLS data are not eligible
2621 // to be put into common csect. If data sections are enabled, thread
2622 // data are emitted into separate sections. Otherwise, thread data
2623 // are emitted into the .tdata section.
2624 if (Kind.isThreadLocal()) {
2625 if (TM.getDataSections()) {
2626 SmallString<128> Name;
2627 getNameWithPrefix(Name, GO, TM);
2628 return getContext().getXCOFFSection(
2630 }
2631 return TLSDataSection;
2632 }
2633
2634 report_fatal_error("XCOFF other section types not yet implemented.");
2635}
2636
2638 const Function &F, const TargetMachine &TM) const {
2639 assert (!F.getComdat() && "Comdat not supported on XCOFF.");
2640
2641 if (!TM.getFunctionSections())
2642 return ReadOnlySection;
2643
2644 // If the function can be removed, produce a unique section so that
2645 // the table doesn't prevent the removal.
2646 SmallString<128> NameStr(".rodata.jmp..");
2647 getNameWithPrefix(NameStr, &F, TM);
2648 return getContext().getXCOFFSection(
2649 NameStr, SectionKind::getReadOnly(),
2651}
2652
2654 bool UsesLabelDifference, const Function &F) const {
2655 return false;
2656}
2657
2658/// Given a mergeable constant with the specified size and relocation
2659/// information, return a section that it should be placed in.
2661 const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment,
2662 const Function *F) const {
2663 // TODO: Enable emiting constant pool to unique sections when we support it.
2664 if (Alignment > Align(16))
2665 report_fatal_error("Alignments greater than 16 not yet supported.");
2666
2667 if (Alignment == Align(8)) {
2668 assert(ReadOnly8Section && "Section should always be initialized.");
2669 return ReadOnly8Section;
2670 }
2671
2672 if (Alignment == Align(16)) {
2673 assert(ReadOnly16Section && "Section should always be initialized.");
2674 return ReadOnly16Section;
2675 }
2676
2677 return ReadOnlySection;
2678}
2679
2681 const TargetMachine &TgtM) {
2685 (TgtM.getTargetTriple().isArch32Bit() ? dwarf::DW_EH_PE_sdata4
2688 LSDAEncoding = 0;
2690
2691 // AIX debug for thread local location is not ready. And for integrated as
2692 // mode, the relocatable address for the thread local variable will cause
2693 // linker error. So disable the location attribute generation for thread local
2694 // variables for now.
2695 // FIXME: when TLS debug on AIX is ready, remove this setting.
2697}
2698
2700 unsigned Priority, const MCSymbol *KeySym) const {
2701 report_fatal_error("no static constructor section on AIX");
2702}
2703
2705 unsigned Priority, const MCSymbol *KeySym) const {
2706 report_fatal_error("no static destructor section on AIX");
2707}
2708
2711 assert(!isa<GlobalIFunc>(GV) && "GlobalIFunc is not supported on AIX.");
2712
2713 switch (GV->getLinkage()) {
2716 return XCOFF::C_HIDEXT;
2720 return XCOFF::C_EXT;
2726 return XCOFF::C_WEAKEXT;
2729 "There is no mapping that implements AppendingLinkage for XCOFF.");
2730 }
2731 llvm_unreachable("Unknown linkage type!");
2732}
2733
2735 const GlobalValue *Func, const TargetMachine &TM) const {
2736 assert((isa<Function>(Func) || isa<GlobalIFunc>(Func) ||
2737 (isa<GlobalAlias>(Func) &&
2739 cast<GlobalAlias>(Func)->getAliaseeObject()))) &&
2740 "Func must be a function or an alias which has a function as base "
2741 "object.");
2742
2743 SmallString<128> NameStr;
2744 NameStr.push_back('.');
2745 getNameWithPrefix(NameStr, Func, TM);
2746
2747 // When -function-sections is enabled and explicit section is not specified,
2748 // it's not necessary to emit function entry point label any more. We will use
2749 // function entry point csect instead. And for function delcarations, the
2750 // undefined symbols gets treated as csect with XTY_ER property.
2751 if (((TM.getFunctionSections() && !Func->hasSection()) ||
2752 Func->isDeclarationForLinker()) &&
2753 (isa<Function>(Func) || isa<GlobalIFunc>(Func))) {
2754 return getContext()
2756 NameStr, SectionKind::getText(),
2757 XCOFF::CsectProperties(XCOFF::XMC_PR, Func->isDeclarationForLinker()
2759 : XCOFF::XTY_SD))
2761 }
2762
2763 return getContext().getOrCreateSymbol(NameStr);
2764}
2765
2767 const GlobalObject *F, const TargetMachine &TM) const {
2769 "F must be a function or ifunc object.");
2770 SmallString<128> NameStr;
2771 getNameWithPrefix(NameStr, F, TM);
2772 return getContext().getXCOFFSection(
2773 NameStr, SectionKind::getData(),
2775}
2776
2778 const MCSymbol *Sym, const TargetMachine &TM) const {
2779 const XCOFF::StorageMappingClass SMC = [](const MCSymbol *Sym,
2780 const TargetMachine &TM) {
2781 auto *XSym = static_cast<const MCSymbolXCOFF *>(Sym);
2782
2783 // The "_$TLSML" symbol for TLS local-dynamic mode requires XMC_TC,
2784 // otherwise the AIX assembler will complain.
2785 if (XSym->getSymbolTableName() == "_$TLSML")
2786 return XCOFF::XMC_TC;
2787
2788 // Use large code model toc entries for ehinfo symbols as they are
2789 // never referenced directly. The runtime loads their TOC entry
2790 // addresses from the trace-back table.
2791 if (XSym->isEHInfo())
2792 return XCOFF::XMC_TE;
2793
2794 // If the symbol does not have a code model specified use the module value.
2795 if (!XSym->hasPerSymbolCodeModel())
2796 return TM.getCodeModel() == CodeModel::Large ? XCOFF::XMC_TE
2797 : XCOFF::XMC_TC;
2798
2799 return XSym->getPerSymbolCodeModel() == MCSymbolXCOFF::CM_Large
2801 : XCOFF::XMC_TC;
2802 }(Sym, TM);
2803
2804 return getContext().getXCOFFSection(
2805 static_cast<const MCSymbolXCOFF *>(Sym)->getSymbolTableName(),
2807}
2808
2810 const Function &F, const MCSymbol &FnSym, const TargetMachine &TM) const {
2811 auto *LSDA = static_cast<MCSectionXCOFF *>(LSDASection);
2812 if (TM.getFunctionSections()) {
2813 // If option -ffunction-sections is on, append the function name to the
2814 // name of the LSDA csect so that each function has its own LSDA csect.
2815 // This helps the linker to garbage-collect EH info of unused functions.
2816 SmallString<128> NameStr = LSDA->getName();
2817 raw_svector_ostream(NameStr) << '.' << F.getName();
2818 LSDA = getContext().getXCOFFSection(NameStr, LSDA->getKind(),
2819 LSDA->getCsectProp());
2820 }
2821 return LSDA;
2822}
2823//===----------------------------------------------------------------------===//
2824// GOFF
2825//===----------------------------------------------------------------------===//
2827
2829 // Construct the default names for the root SD and the ADA PR symbol.
2830 StringRef FileName = sys::path::stem(M.getSourceFileName());
2831 if (FileName.size() > 1 && FileName.starts_with('<') &&
2832 FileName.ends_with('>'))
2833 FileName = FileName.substr(1, FileName.size() - 2);
2834 DefaultRootSDName = Twine(FileName).concat("#C").str();
2835 DefaultADAPRName = Twine(FileName).concat("#S").str();
2836 MCSectionGOFF *RootSD =
2837 static_cast<MCSectionGOFF *>(TextSection)->getParent();
2838 MCSectionGOFF *ADAPR = static_cast<MCSectionGOFF *>(ADASection);
2839 RootSD->setName(DefaultRootSDName);
2840 ADAPR->setName(DefaultADAPRName);
2841 // Initialize the label for the text section.
2842 MCSymbolGOFF *TextLD = static_cast<MCSymbolGOFF *>(
2843 getContext().getOrCreateSymbol(RootSD->getName()));
2846 TextLD->setExternal(false);
2847 TextLD->setWeak(false);
2848 TextLD->setADA(ADAPR);
2849 TextSection->setBeginSymbol(TextLD);
2850 // Initialize the label for the ADA section.
2851 MCSymbolGOFF *ADASym = static_cast<MCSymbolGOFF *>(
2853 ADAPR->setBeginSymbol(ADASym);
2854}
2855
2857 bool UsesLabelDifference, const Function &F) const {
2858 return true;
2859}
2860
2865
2867 const Function &F, const MCSymbol &FnSym, const TargetMachine &TM) const {
2868 std::string Name = ".gcc_exception_table." + F.getName().str();
2869
2870 MCSectionGOFF *WSA = getContext().getGOFFSection(
2875 static_cast<MCSectionGOFF *>(TextSection)->getParent());
2876 WSA->setAlignment(Align(4)); // Fullword
2877 return getContext().getGOFFSection(SectionKind::getData(), Name,
2881 WSA);
2882}
2883
2885 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2886 auto *Symbol = TM.getSymbol(GO);
2887
2888 if (Kind.isBSS() || Kind.isData()) {
2889 GOFF::ESDBindingScope PRBindingScope =
2890 GO->hasExternalLinkage()
2894 GOFF::ESDBindingScope SDBindingScope =
2897 MaybeAlign Alignment;
2898 if (auto *F = dyn_cast<Function>(GO))
2899 Alignment = F->getAlign();
2900 else if (auto *V = dyn_cast<GlobalVariable>(GO))
2901 Alignment = V->getAlign();
2902 MCSectionGOFF *SD = getContext().getGOFFSection(
2903 SectionKind::getMetadata(), Symbol->getName(),
2904 GOFF::SDAttr{GOFF::ESD_TA_Unspecified, SDBindingScope});
2905 MCSectionGOFF *ED = getContext().getGOFFSection(
2910 SD);
2911 ED->setAlignment(Alignment.value_or(llvm::Align(8)));
2912 return getContext().getGOFFSection(Kind, Symbol->getName(),
2913 GOFF::PRAttr{false, GOFF::ESD_EXE_DATA,
2914 GOFF::ESD_LT_XPLink,
2915 PRBindingScope, 0},
2916 ED);
2917 }
2918 return TextSection;
2919}
2920
2921MCSection *
2923 // XL C/C++ compilers on z/OS support priorities from min-int to max-int, with
2924 // sinit as source priority 0. For clang, sinit has source priority 65535.
2925 // For GOFF, the priority sortkey field is an unsigned value. So, we
2926 // add min-int to get sorting to work properly but also subtract the
2927 // clang sinit (65535) value so internally xl sinit and clang sinit have
2928 // the same unsigned GOFF priority sortkey field value (i.e. 0x80000000).
2929 static constexpr const uint32_t ClangDefaultSinitPriority = 65535;
2930 uint32_t Prio = Priority + (0x80000000 - ClangDefaultSinitPriority);
2931
2932 std::string Name(".xtor");
2933 if (Priority != ClangDefaultSinitPriority)
2934 Name = llvm::Twine(Name).concat(".").concat(llvm::utostr(Priority)).str();
2935
2936 MCContext &Ctx = getContext();
2937 MCSectionGOFF *SInit = Ctx.getGOFFSection(
2943 static_cast<const MCSectionGOFF *>(TextSection)->getParent());
2944
2945 MCSectionGOFF *Xtor = Ctx.getGOFFSection(
2946 SectionKind::getData(), Name,
2948 GOFF::ESD_BSC_Section, Prio},
2949 SInit);
2950 return Xtor;
2951}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
amdgpu AMDGPU DAG DAG Pattern Instruction Selection
static bool isThumb(const MCSubtargetInfo &STI)
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static const Function * getParent(const Value *V)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_LIFETIME_BOUND
Definition Compiler.h:452
This file contains the declarations for the subclasses of Constant, which represent the different fla...
@ Default
This file contains constants used for implementing Dwarf debug support.
Module.h This file contains the declarations for the Module class.
This file declares the MCSectionGOFF class, which contains all of the necessary machine code sections...
This file contains the MCSymbolGOFF class.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file contains the declarations for metadata subclasses.
#define T
const char * Msg
This file defines the SmallString class.
This file defines the SmallVector class.
This file contains some functions that are useful when dealing with strings.
static bool canUsePrivateLabel(const MCAsmInfo &AsmInfo, const MCSection &Section)
static MCSection * selectExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM, MCContext &Ctx, Mangler &Mang, unsigned &NextUniqueID, bool Retain, bool ForceUnique)
static int getSelectionForCOFF(const GlobalValue *GV)
static MCSectionCOFF * getCOFFStaticStructorSection(MCContext &Ctx, const Triple &T, bool IsCtor, unsigned Priority, const MCSymbol *KeySym, MCSectionCOFF *Default)
static unsigned getEntrySizeForKind(SectionKind Kind)
static void GetObjCImageInfo(Module &M, unsigned &Version, unsigned &Flags, StringRef &Section)
static const GlobalValue * getComdatGVForCOFF(const GlobalValue *GV)
static unsigned getCOFFSectionFlags(SectionKind K, const TargetMachine &TM)
static unsigned getELFSectionType(StringRef Name, SectionKind K)
static bool hasPrefix(StringRef SectionName, StringRef Prefix)
static MCSectionWasm * selectWasmSectionForGlobal(MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang, const TargetMachine &TM, bool EmitUniqueSection, unsigned *NextUniqueID, bool Retain)
static const MCSymbolELF * getLinkedToSymbol(const GlobalObject *GO, const TargetMachine &TM)
static unsigned calcUniqueIDUpdateFlagsAndSize(const GlobalObject *GO, StringRef SectionName, SectionKind Kind, const TargetMachine &TM, MCContext &Ctx, Mangler &Mang, unsigned &Flags, unsigned &EntrySize, unsigned &NextUniqueID, const bool Retain, const bool ForceUnique)
Calculate an appropriate unique ID for a section, and update Flags, EntrySize and NextUniqueID where ...
static SectionKind getELFKindForNamedSection(StringRef Name, SectionKind K)
static const Comdat * getWasmComdat(const GlobalValue *GV)
static MCSectionELF * getStaticStructorSection(MCContext &Ctx, bool UseInitArray, bool IsCtor, unsigned Priority, const MCSymbol *KeySym)
static std::tuple< StringRef, bool, unsigned, unsigned, unsigned > getGlobalObjectInfo(const GlobalObject *GO, const TargetMachine &TM, StringRef SectionName, SectionKind Kind)
static unsigned getWasmSectionFlags(SectionKind K, bool Retain)
static void checkMachOComdat(const GlobalValue *GV)
static std::string APIntToHexString(const APInt &AI)
static unsigned getELFSectionFlags(SectionKind K, const Triple &T)
static SmallString< 128 > getELFSectionNameForGlobal(const GlobalObject *GO, SectionKind Kind, Mangler &Mang, const TargetMachine &TM, bool UniqueSectionName, const MachineJumpTableEntry *JTE)
static cl::opt< bool > JumpTableInFunctionSection("jumptable-in-function-section", cl::Hidden, cl::init(false), cl::desc("Putting Jump Table in function section"))
static StringRef getSectionPrefixForGlobal(SectionKind Kind, bool IsLarge)
Return the section prefix name used by options FunctionsSections and DataSections.
static std::string scalarConstantToHexString(const Constant *C)
static StringRef getCOFFSectionNameForUniqueGlobal(SectionKind Kind)
static const Comdat * getELFComdat(const GlobalValue *GV)
static MCSectionELF * selectELFSectionForGlobal(MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang, const TargetMachine &TM, bool EmitUniqueSection, unsigned Flags, unsigned *NextUniqueID, const MCSymbolELF *AssociatedSymbol, const MachineJumpTableEntry *MJTE=nullptr)
Class for arbitrary precision integers.
Definition APInt.h:78
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1513
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
@ Largest
The linker will choose the largest COMDAT.
Definition Comdat.h:39
@ SameSize
The data referenced by the COMDAT must be the same size.
Definition Comdat.h:41
@ Any
The linker may choose any COMDAT.
Definition Comdat.h:37
@ NoDeduplicate
No deduplication is performed.
Definition Comdat.h:40
@ ExactMatch
The data referenced by the COMDAT must be the same.
Definition Comdat.h:38
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
StringRef getInternalSymbolPrefix() const
Definition DataLayout.h:308
LLVM_ABI Align getPreferredAlign(const GlobalVariable *GV) const
Returns the preferred alignment of the specified global.
This is the base abstract class for diagnostic reporting in the backend.
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
StringRef getSection() const
Get the custom section of this global if it has one.
bool hasMetadata() const
Return true if this GlobalObject has any metadata attached to it.
bool hasComdat() const
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this GlobalObject.
bool hasSection() const
Check if this global has a custom object file section.
bool hasExternalLinkage() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
LinkageTypes getLinkage() const
bool hasLocalLinkage() const
bool hasDefaultVisibility() const
bool hasPrivateLinkage() const
LLVM_ABI const Comdat * getComdat() const
Definition Globals.cpp:274
ThreadLocalMode getThreadLocalMode() const
bool isDeclarationForLinker() const
Module * getParent()
Get the module that this global value is contained inside of...
LLVM_ABI const GlobalObject * getAliaseeObject() const
Definition Globals.cpp:521
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
Definition Globals.cpp:205
bool hasCommonLinkage() const
static bool isWeakForLinker(LinkageTypes Linkage)
Whether the definition of this global may be replaced at link time.
@ PrivateLinkage
Like Internal, but omit from symbol table.
Definition GlobalValue.h:61
@ CommonLinkage
Tentative definitions.
Definition GlobalValue.h:63
@ InternalLinkage
Rename collisions when linking (static functions).
Definition GlobalValue.h:60
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
Definition GlobalValue.h:55
@ WeakODRLinkage
Same, but only replaced by something equivalent.
Definition GlobalValue.h:58
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
Definition GlobalValue.h:57
@ AppendingLinkage
Special purpose, only applies to global arrays.
Definition GlobalValue.h:59
@ AvailableExternallyLinkage
Available for inspection, not emission.
Definition GlobalValue.h:54
@ ExternalWeakLinkage
ExternalWeak linkage description.
Definition GlobalValue.h:62
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
Definition GlobalValue.h:56
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
static bool isSectionAtomizableBySymbols(const MCSection &Section)
True if the section is atomized using the symbols in it.
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition MCAsmInfo.h:67
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.h:342
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition MCExpr.h:427
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Definition MCExpr.cpp:212
Context object for machine code objects.
Definition MCContext.h:83
LLVM_ABI MCSectionMachO * getMachOSection(StringRef Segment, StringRef Section, unsigned TypeAndAttributes, unsigned Reserved2, SectionKind K, const char *BeginSymName=nullptr)
Return the MCSection for the specified mach-o section.
LLVM_ABI MCSectionCOFF * getCOFFSection(StringRef Section, unsigned Characteristics, StringRef COMDATSymName, int Selection, unsigned UniqueID=MCSection::NonUniqueID)
MCSectionWasm * getWasmSection(const Twine &Section, SectionKind K, unsigned Flags=0)
Definition MCContext.h:638
LLVM_ABI MCSectionELF * getELFNamedSection(const Twine &Prefix, const Twine &Suffix, unsigned Type, unsigned Flags, unsigned EntrySize=0)
Get a section with the provided group identifier.
MCSectionELF * getELFSection(const Twine &Section, unsigned Type, unsigned Flags)
Definition MCContext.h:550
LLVM_ABI MCSectionXCOFF * getXCOFFSection(StringRef Section, SectionKind K, std::optional< XCOFF::CsectProperties > CsectProp=std::nullopt, bool MultiSymbolsAllowed=false, std::optional< XCOFF::DwarfSectionSubtypeFlags > DwarfSubtypeFlags=std::nullopt)
LLVM_ABI MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
MCSection * TLSBSSSection
Section directive for Thread Local uninitialized data.
MCSection * TextSection
Section directive for standard text.
MCSection * TLSDataSection
Section directive for Thread Local data. ELF, MachO, COFF, and Wasm.
MCSection * LSDASection
If exception handling is supported by the target, this is the section the Language Specific Data Area...
MCSection * FourByteConstantSection
MCSection * getDrectveSection() const
bool isPositionIndependent() const
MCSection * SixteenByteConstantSection
MCSection * ReadOnlySection
Section that is readonly and can contain arbitrary initialized data.
MCSection * BSSSection
Section that is default initialized to zero.
MCSection * EightByteConstantSection
MCContext & getContext() const
MCSection * DataSection
Section directive for standard data.
This represents a section on Windows.
MCSymbol * getCOMDATSymbol() const
This represents a section on linux, lots of unix variants and some bare metal systems.
unsigned getFlags() const
void setName(StringRef SectionName)
MCSectionGOFF * getParent() const
This represents a section on a Mach-O system (used by Mac OS X).
static Error ParseSectionSpecifier(StringRef Spec, StringRef &Segment, StringRef &Section, unsigned &TAA, bool &TAAParsed, unsigned &StubSize)
Parse the section specifier indicated by "Spec".
unsigned getTypeAndAttributes() const
unsigned getStubSize() const
This represents a section on wasm.
MCSymbolXCOFF * getQualNameSymbol() const
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition MCSection.h:580
void setAlignment(Align Value)
Definition MCSection.h:665
static constexpr unsigned NonUniqueID
Definition MCSection.h:585
void setBeginSymbol(MCSymbol *Sym)
Definition MCSection.h:657
StringRef getName() const
Definition MCSection.h:650
static const MCSpecifierExpr * create(const MCExpr *Expr, Spec S, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.cpp:743
Streaming machine code generation interface.
Definition MCStreamer.h:222
virtual void addBlankLine()
Emit a blank line to a .s file to pretty it up.
Definition MCStreamer.h:425
virtual bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute)=0
Add the given Attribute to Symbol.
virtual void emitELFSize(MCSymbol *Symbol, const MCExpr *Value)
Emit an ELF .size directive.
void emitSymbolValue(const MCSymbol *Sym, unsigned Size, bool IsSectionRelative=false)
Special case of EmitValue that avoids the client having to pass in a MCExpr for MCSymbols.
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
virtual void emitValueToAlignment(Align Alignment, int64_t Fill=0, uint8_t FillLen=1, unsigned MaxBytesToEmit=0)
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
unsigned emitULEB128IntValue(uint64_t Value, unsigned PadTo=0)
Special case of EmitULEB128Value that avoids the client having to pass in a MCExpr for constant integ...
virtual void emitLinkerOptions(ArrayRef< std::string > Kind)
Emit the given list Options of strings as linker options into the output.
Definition MCStreamer.h:509
virtual void switchSection(MCSection *Section, uint32_t Subsec=0)
Set the current section where code is being emitted to Section.
void emitInt32(uint64_t Value)
Definition MCStreamer.h:769
MCSection * getCurrentSectionOnly() const
Definition MCStreamer.h:438
void emitInt8(uint64_t Value)
Definition MCStreamer.h:767
virtual void emitBytes(StringRef Data)
Emit the bytes in Data into the output.
void setWeak(bool Value=true)
void setExternal(bool Value) const
void setCodeData(GOFF::ESDExecutable Value)
void setADA(MCSectionGOFF *AssociatedDataArea)
void setLinkage(GOFF::ESDLinkageType Value)
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.h:213
void setEHInfo() const
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
StringRef getName() const
getName - Get the symbol name.
Definition MCSymbol.h:188
int64_t getConstant() const
Definition MCValue.h:44
const MCSymbol * getSubSym() const
Definition MCValue.h:51
Metadata node.
Definition Metadata.h:1069
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1426
Metadata * get() const
Definition Metadata.h:920
unsigned getFunctionNumber() const
getFunctionNumber - Return a unique ID for the current function.
MCContext & getContext() const
Function & getFunction()
Return the LLVM function that this machine code represents.
const std::vector< LandingPadInfo > & getLandingPads() const
Return a reference to the landing pad info for the current function.
MachineModuleInfoELF - This is a MachineModuleInfoImpl implementation for ELF targets.
StubValueTy & getGVStubEntry(MCSymbol *Sym)
PointerIntPair< MCSymbol *, 1, bool > StubValueTy
MachineModuleInfoMachO - This is a MachineModuleInfoImpl implementation for MachO targets.
StubValueTy & getGVStubEntry(MCSymbol *Sym)
This class contains meta information specific to a module.
const Module * getModule() const
Ty & getObjFileInfo()
Keep track of various per-module pieces of information for backends that would like to do so.
LLVM_ABI void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV, bool CannotUsePrivateLabel) const
Print the appropriate prefix and the specified global variable's name.
Definition Mangler.cpp:121
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
@ Require
Adds a requirement that another module flag be present and have a specified value after linking is pe...
Definition Module.h:133
const std::string & getSourceFileName() const
Get the module's original source file name.
Definition Module.h:305
GlobalValue * getNamedValue(StringRef Name) const
Return the global value in the module with the specified name, of arbitrary type.
Definition Module.cpp:177
const DataLayout & getDataLayout() const
Get the data layout for the module's target platform.
Definition Module.h:320
A tuple of MDNodes.
Definition Metadata.h:1755
PointerTy getPointer() const
SectionKind - This is a simple POD value that classifies the properties of a section.
Definition SectionKind.h:22
static SectionKind getThreadData()
static SectionKind getMetadata()
bool isThreadBSSLocal() const
static SectionKind getText()
bool isBSSLocal() const
static SectionKind getData()
bool isText() const
static SectionKind getBSS()
static SectionKind getThreadBSS()
static SectionKind getReadOnly()
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition StringRef.h:597
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition StringRef.h:258
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
constexpr size_t size() const
Get the string size.
Definition StringRef.h:144
bool ends_with(StringRef Suffix) const
Check if this string ends with the given Suffix.
Definition StringRef.h:270
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
void Initialize(MCContext &Ctx, const TargetMachine &TM) override
This method must be called before any actual lowering is done.
void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override
Emit Obj-C garbage collection and linker options.
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
MCSection * getStaticCtorSection(unsigned Priority, const MCSymbol *KeySym) const override
void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override
Process linker options metadata and emit platform-specific bits.
const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, int64_t Addend, std::optional< int64_t > PCRelativeOffset, const TargetMachine &TM) const override
bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const override
void getNameWithPrefix(SmallVectorImpl< char > &OutName, const GlobalValue *GV, const TargetMachine &TM) const override
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment, const Function *F) const override
Given a mergeable constant with the specified size and relocation information, return a section that ...
MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const override
MCSection * getSectionForJumpTable(const Function &F, const TargetMachine &TM) const override
MCSection * getUniqueSectionForFunction(const Function &F, const TargetMachine &TM) const override
void Initialize(MCContext &Ctx, const TargetMachine &TM) override
This method must be called before any actual lowering is done.
MCSection * getStaticCtorSection(unsigned Priority, const MCSymbol *KeySym) const override
MCSection * getSectionForJumpTable(const Function &F, const TargetMachine &TM) const override
MCSection * getSectionForConstantImpl(const DataLayout &DL, SectionKind Kind, const Constant *C, StringRef SectionSuffix) const
void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override
Emit Obj-C garbage collection and linker options.
void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override
Process linker options metadata and emit platform-specific bits.
MCSymbol * getCFIPersonalitySymbol(const GlobalValue *GV, const TargetMachine &TM, MachineModuleInfo *MMI) const override
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment, const Function *F) const override
Given a constant with the SectionKind, return a section that it should be placed in.
MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const override
void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &DL, const MCSymbol *Sym, const MachineModuleInfo *MMI) const override
const MCExpr * getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM, MachineModuleInfo *MMI, MCStreamer &Streamer) const override
Return an MCExpr to use for a reference to the specified type info global variable from exception han...
void getModuleMetadata(Module &M) override
Get the module-level metadata that the platform cares about.
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
const MCExpr * lowerSymbolDifference(const MCSymbol *LHS, const MCSymbol *RHS, int64_t Addend, std::optional< int64_t > PCRelativeOffset) const
const MCExpr * lowerDSOLocalEquivalent(const MCSymbol *LHS, const MCSymbol *RHS, int64_t Addend, std::optional< int64_t > PCRelativeOffset, const TargetMachine &TM) const override
MCSection * getSectionForCommandLines() const override
If supported, return the section to use for the llvm.commandline metadata.
MCSection * getSectionForLSDA(const Function &F, const MCSymbol &FnSym, const TargetMachine &TM) const override
virtual void emitPersonalityValueImpl(MCStreamer &Streamer, const DataLayout &DL, const MCSymbol *Sym, const MachineModuleInfo *MMI) const
bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const override
bool isLargeConstant(const DataLayout &DL, SectionKind Kind, const Constant *C) const
Given a mergeable constant with the specified size and relocation information, return a section that ...
MCSection * getSectionForMachineBasicBlock(const Function &F, const MachineBasicBlock &MBB, const TargetMachine &TM) const override
Returns a unique section for the given machine basic block.
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
MCSection * getStaticXtorSection(unsigned Priority) const
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
MCSection * getSectionForLSDA(const Function &F, const MCSymbol &FnSym, const TargetMachine &TM) const override
void getModuleMetadata(Module &M) override
Get the module-level metadata that the platform cares about.
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const override
void getNameWithPrefix(SmallVectorImpl< char > &OutName, const GlobalValue *GV, const TargetMachine &TM) const override
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment, const Function *F) const override
Given a constant with the SectionKind, return a section that it should be placed in.
MCSymbol * getCFIPersonalitySymbol(const GlobalValue *GV, const TargetMachine &TM, MachineModuleInfo *MMI) const override
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override
Process linker options metadata and emit platform-specific bits.
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
const MCExpr * getIndirectSymViaGOTPCRel(const GlobalValue *GV, const MCSymbol *Sym, const MCValue &MV, int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const override
Get MachO PC relative GOT entry relocation.
void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override
Emit the module flags that specify the garbage collection information.
void Initialize(MCContext &Ctx, const TargetMachine &TM) override
This method must be called before any actual lowering is done.
MCSection * getSectionForCommandLines() const override
If supported, return the section to use for the llvm.commandline metadata.
MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const override
const MCExpr * getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM, MachineModuleInfo *MMI, MCStreamer &Streamer) const override
The mach-o version of this method defaults to returning a stub reference.
void getModuleMetadata(Module &M) override
Get the module-level metadata that the platform cares about.
MCSection * getStaticCtorSection(unsigned Priority, const MCSymbol *KeySym) const override
bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const override
MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const override
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
static bool ShouldSetSSPCanaryBitInTB(const MachineFunction *MF)
void Initialize(MCContext &Ctx, const TargetMachine &TM) override
This method must be called before any actual lowering is done.
MCSection * getSectionForTOCEntry(const MCSymbol *Sym, const TargetMachine &TM) const override
On targets that support TOC entries, return a section for the entry given the symbol it refers to.
MCSection * getSectionForExternalReference(const GlobalObject *GO, const TargetMachine &TM) const override
For external functions, this will always return a function descriptor csect.
MCSymbol * getFunctionEntryPointSymbol(const GlobalValue *Func, const TargetMachine &TM) const override
If supported, return the function entry point symbol.
bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const override
MCSection * getSectionForJumpTable(const Function &F, const TargetMachine &TM) const override
static MCSymbol * getEHInfoTableSymbol(const MachineFunction *MF)
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment, const Function *F) const override
Given a constant with the SectionKind, return a section that it should be placed in.
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
MCSection * getStaticCtorSection(unsigned Priority, const MCSymbol *KeySym) const override
static XCOFF::StorageClass getStorageClassForGlobal(const GlobalValue *GV)
MCSymbol * getTargetSymbol(const GlobalValue *GV, const TargetMachine &TM) const override
For functions, this will always return a function descriptor symbol.
MCSection * getSectionForFunctionDescriptor(const GlobalObject *F, const TargetMachine &TM) const override
On targets that use separate function descriptor symbols, return a section for the descriptor given i...
static bool ShouldEmitEHBlock(const MachineFunction *MF)
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const override
MCSection * getSectionForLSDA(const Function &F, const MCSymbol &FnSym, const TargetMachine &TM) const override
For functions, this will return the LSDA section.
void emitCGProfileMetadata(MCStreamer &Streamer, Module &M) const
Emit Call Graph Profile metadata.
virtual void getNameWithPrefix(SmallVectorImpl< char > &OutName, const GlobalValue *GV, const TargetMachine &TM) const
MCSection * StaticDtorSection
This section contains the static destructor pointer list.
unsigned PersonalityEncoding
PersonalityEncoding, LSDAEncoding, TTypeEncoding - Some encoding values for EH.
static SectionKind getKindForGlobal(const GlobalObject *GO, const TargetMachine &TM)
Classify the specified global variable into a set of target independent categories embodied in Sectio...
virtual bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const
virtual void Initialize(MCContext &ctx, const TargetMachine &TM)
This method must be called before any actual lowering is done.
MCSection * StaticCtorSection
This section contains the static constructor pointer list.
virtual MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment, const Function *F) const
Given a constant with the SectionKind, return a section that it should be placed in.
static StringRef getCustomSectionName(const GlobalObject *GO, const TargetMachine &TM)
Return the section name specified by 'pragma clang section' or the section attribute.
MCSymbol * getSymbolWithGlobalValueBase(const GlobalValue *GV, StringRef Suffix, const TargetMachine &TM) const
Return the MCSymbol for a private symbol with global value name as its base, with the specified suffi...
virtual const MCExpr * getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM, MachineModuleInfo *MMI, MCStreamer &Streamer) const
Return an MCExpr to use for a reference to the specified global variable from exception handling info...
void emitPseudoProbeDescMetadata(MCStreamer &Streamer, Module &M, std::function< void(MCStreamer &Streamer)> COMDATSymEmitter=nullptr) const
Emit pseudo_probe_desc metadata.
const MCExpr * getTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding, MCStreamer &Streamer) const
MCSection * SectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const
This method computes the appropriate section to emit the specified global variable or function defini...
Primary interface to the complete machine description for the target machine.
const Triple & getTargetTriple() const
bool getSeparateNamedSections() const
bool getUniqueSectionNames() const
TargetOptions Options
MCSymbol * getSymbol(const GlobalValue *GV) const
CodeModel::Model getCodeModel() const
Returns the code model.
bool isLargeGlobalValue(const GlobalValue *GV) const
void getNameWithPrefix(SmallVectorImpl< char > &Name, const GlobalValue *GV, Mangler &Mang, bool MayAlwaysUsePrivate=false) const
unsigned UseInitArray
UseInitArray - Use .init_array instead of .ctors for static constructors.
MCTargetOptions MCOptions
Machine level options.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
@ loongarch32
Definition Triple.h:65
@ loongarch64
Definition Triple.h:66
bool isOSSolaris() const
Definition Triple.h:752
ArchType getArch() const
Get the parsed architecture type of this triple.
Definition Triple.h:512
bool isOSFreeBSD() const
Definition Triple.h:746
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
Definition Twine.cpp:17
Twine concat(const Twine &Suffix) const
Definition Twine.h:497
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM Value Representation.
Definition Value.h:75
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
bool hasName() const
Definition Value.h:261
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
A raw_ostream that writes to an std::string.
A raw_ostream that writes to an SmallVector or SmallString.
CallInst * Retain
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
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_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_NODUPLICATES
Definition COFF.h:455
@ IMAGE_COMDAT_SELECT_LARGEST
Definition COFF.h:460
@ IMAGE_COMDAT_SELECT_SAME_SIZE
Definition COFF.h:457
@ IMAGE_COMDAT_SELECT_ASSOCIATIVE
Definition COFF.h:459
@ IMAGE_COMDAT_SELECT_EXACT_MATCH
Definition COFF.h:458
@ IMAGE_COMDAT_SELECT_ANY
Definition COFF.h:456
@ SHF_MERGE
Definition ELF.h:1264
@ SHF_STRINGS
Definition ELF.h:1267
@ SHF_AARCH64_PURECODE
Definition ELF.h:1356
@ SHF_EXCLUDE
Definition ELF.h:1292
@ SHF_ALLOC
Definition ELF.h:1258
@ SHF_LINK_ORDER
Definition ELF.h:1273
@ SHF_GROUP
Definition ELF.h:1280
@ SHF_SUNW_NODISCARD
Definition ELF.h:1299
@ SHF_X86_64_LARGE
Definition ELF.h:1321
@ SHF_GNU_RETAIN
Definition ELF.h:1289
@ SHF_WRITE
Definition ELF.h:1255
@ SHF_TLS
Definition ELF.h:1283
@ SHF_ARM_PURECODE
Definition ELF.h:1353
@ SHF_EXECINSTR
Definition ELF.h:1261
@ SHT_LLVM_DEPENDENT_LIBRARIES
Definition ELF.h:1187
@ SHT_PROGBITS
Definition ELF.h:1156
@ SHT_LLVM_LINKER_OPTIONS
Definition ELF.h:1184
@ SHT_NOBITS
Definition ELF.h:1163
@ SHT_LLVM_OFFLOADING
Definition ELF.h:1195
@ SHT_LLVM_LTO
Definition ELF.h:1196
@ SHT_PREINIT_ARRAY
Definition ELF.h:1169
@ SHT_INIT_ARRAY
Definition ELF.h:1167
@ SHT_NOTE
Definition ELF.h:1162
@ SHT_FINI_ARRAY
Definition ELF.h:1168
@ ESD_LB_Deferred
Definition GOFF.h:129
@ ESD_LB_Initial
Definition GOFF.h:128
constexpr StringLiteral CLASS_WSA
@ ESD_BA_Merge
Definition GOFF.h:99
@ ESD_TS_ByteOriented
Definition GOFF.h:92
@ ESD_EXE_CODE
Definition GOFF.h:112
@ ESD_EXE_DATA
Definition GOFF.h:111
@ ESD_RQ_0
Definition GOFF.h:69
@ ESD_ALIGN_Doubleword
Definition GOFF.h:148
ESDBindingScope
Definition GOFF.h:134
@ ESD_BSC_Library
Definition GOFF.h:138
@ ESD_BSC_Unspecified
Definition GOFF.h:135
@ ESD_BSC_ImportExport
Definition GOFF.h:139
@ ESD_BSC_Section
Definition GOFF.h:136
constexpr StringLiteral CLASS_SINIT
@ ESD_LT_XPLink
Definition GOFF.h:142
@ ESD_NS_Parts
Definition GOFF.h:65
@ ESD_RMODE_64
Definition GOFF.h:88
@ S_MOD_TERM_FUNC_POINTERS
S_MOD_TERM_FUNC_POINTERS - Section with only function pointers for termination.
Definition MachO.h:150
@ S_MOD_INIT_FUNC_POINTERS
S_MOD_INIT_FUNC_POINTERS - Section with only function pointers for initialization.
Definition MachO.h:147
@ C_WEAKEXT
Definition XCOFF.h:200
StorageMappingClass
Storage Mapping Class definitions.
Definition XCOFF.h:104
@ XMC_TE
Symbol mapped at the end of TOC.
Definition XCOFF.h:129
@ XMC_DS
Descriptor csect.
Definition XCOFF.h:122
@ 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_UA
Unclassified - Treated as Read Write.
Definition XCOFF.h:123
@ XMC_TD
Scalar data item in the TOC.
Definition XCOFF.h:121
@ XMC_UL
Uninitialized thread-local variable.
Definition XCOFF.h:128
@ XMC_PR
Program Code.
Definition XCOFF.h:106
@ XMC_BS
BSS class (uninitialized static internal)
Definition XCOFF.h:124
@ XMC_TC
General TOC item.
Definition XCOFF.h:120
@ XTY_CM
Common csect definition. For uninitialized storage.
Definition XCOFF.h:246
@ XTY_SD
Csect definition for initialized storage.
Definition XCOFF.h:243
@ XTY_ER
External reference.
Definition XCOFF.h:242
initializer< Ty > init(const Ty &Val)
Calculates the starting offsets for various sections within the .debug_names section.
Definition Dwarf.h:35
@ DW_EH_PE_datarel
Definition Dwarf.h:964
@ 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
@ DW_EH_PE_udata4
Definition Dwarf.h:955
@ DW_EH_PE_udata8
Definition Dwarf.h:956
@ DW_EH_PE_indirect
Definition Dwarf.h:967
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
Definition Metadata.h:696
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:668
LLVM_ABI StringRef stem(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get stem.
Definition Path.cpp:596
@ WASM_SEG_FLAG_RETAIN
Definition Wasm.h:240
@ WASM_SEG_FLAG_TLS
Definition Wasm.h:239
@ WASM_SEG_FLAG_STRINGS
Definition Wasm.h:238
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:578
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
std::string utostr(uint64_t X, bool isNeg=false)
bool isa_and_nonnull(const Y &Val)
Definition Casting.h:676
LLVM_ABI std::string getInstrProfSectionName(InstrProfSectKind IPSK, Triple::ObjectFormatType OF, bool AddSegmentInfo=true)
Return the name of the profile section corresponding to IPSK.
@ DK_Lowering
bool isNoOpWithoutInvoke(EHPersonality Pers)
Return true if this personality may be safely removed if there are no invoke instructions remaining i...
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
Definition STLExtras.h:2026
std::string encodeBase64(InputBytes const &Bytes)
Definition Base64.h:24
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
LLVM_ABI void emitLinkerFlagsForUsedCOFF(raw_ostream &OS, const GlobalValue *GV, const Triple &T, Mangler &M)
Definition Mangler.cpp:278
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition Format.h:102
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
DWARFExpression::Operation Op
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
DiagnosticSeverity
Defines the different supported severity of a diagnostic.
LLVM_ABI void emitLinkerFlagsForGlobalCOFF(raw_ostream &OS, const GlobalValue *GV, const Triple &TT, Mangler &Mangler)
Definition Mangler.cpp:214
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI cl::opt< std::string > BBSectionsColdTextPrefix
@ MCSA_Weak
.weak
@ MCSA_Global
.type _foo, @gnu_unique_object
@ MCSA_ELF_TypeObject
.type _foo, STT_OBJECT # aka @object
@ MCSA_Hidden
.hidden (ELF)
LLVM_ABI GlobalVariable * collectUsedGlobalVariables(const Module &M, SmallVectorImpl< GlobalValue * > &Vec, bool CompilerUsed)
Given "llvm.used" or "llvm.compiler.used" as a global name, collect the initializer elements of that ...
Definition Module.cpp:930
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
LLVM_ABI static const MBBSectionID ExceptionSectionID
LLVM_ABI static const MBBSectionID ColdSectionID
MachineJumpTableEntry - One jump table in the jump table info.
MachineFunctionDataHotness Hotness
The hotness of MJTE is inferred from the hotness of the source basic block(s) that reference it.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106