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 // Check if '#pragma clang section' name is applicable.
832 // Note that pragma directive overrides -ffunction-section, -fdata-section
833 // and so section name is exactly as user specified and not uniqued.
835 if (GV && GV->hasImplicitSection()) {
836 auto Attrs = GV->getAttributes();
837 if (Attrs.hasAttribute("bss-section") && Kind.isBSS())
838 return Attrs.getAttribute("bss-section").getValueAsString();
839 else if (Attrs.hasAttribute("rodata-section") && Kind.isReadOnly())
840 return Attrs.getAttribute("rodata-section").getValueAsString();
841 else if (Attrs.hasAttribute("relro-section") && Kind.isReadOnlyWithRel())
842 return Attrs.getAttribute("relro-section").getValueAsString();
843 else if (Attrs.hasAttribute("data-section") && Kind.isData())
844 return Attrs.getAttribute("data-section").getValueAsString();
845 }
846
847 return GO->getSection();
848}
849
851 SectionKind Kind,
852 const TargetMachine &TM,
853 MCContext &Ctx, Mangler &Mang,
854 unsigned &NextUniqueID,
855 bool Retain, bool ForceUnique) {
857
858 // Infer section flags from the section name if we can.
860
861 unsigned Flags = getELFSectionFlags(Kind, TM.getTargetTriple());
862 auto [Group, IsComdat, ExtraFlags, Type, EntrySize] =
863 getGlobalObjectInfo(GO, TM, SectionName, Kind);
864 Flags |= ExtraFlags;
865
867 GO, SectionName, Kind, TM, Ctx, Mang, Flags, EntrySize, NextUniqueID,
868 Retain, ForceUnique);
869
870 const MCSymbolELF *LinkedToSym = getLinkedToSymbol(GO, TM);
871 MCSectionELF *Section =
872 Ctx.getELFSection(SectionName, Type, Flags, EntrySize, Group, IsComdat,
873 UniqueID, LinkedToSym);
874 // Make sure that we did not get some other section with incompatible sh_link.
875 // This should not be possible due to UniqueID code above.
876 assert(Section->getLinkedToSymbol() == LinkedToSym &&
877 "Associated symbol mismatch between sections");
878
879 if (!(Ctx.getAsmInfo().useIntegratedAssembler() ||
880 Ctx.getAsmInfo().binutilsIsAtLeast(2, 35))) {
881 // If we are using GNU as before 2.35, then this symbol might have
882 // been placed in an incompatible mergeable section. Emit an error if this
883 // is the case to avoid creating broken output.
884 if ((Section->getFlags() & ELF::SHF_MERGE) &&
885 (Section->getEntrySize() != getEntrySizeForKind(Kind)))
886 GO->getContext().diagnose(LoweringDiagnosticInfo(
887 "Symbol '" + GO->getName() + "' from module '" +
888 (GO->getParent() ? GO->getParent()->getSourceFileName() : "unknown") +
889 "' required a section with entry-size=" +
890 Twine(getEntrySizeForKind(Kind)) + " but was placed in section '" +
891 SectionName + "' with entry-size=" + Twine(Section->getEntrySize()) +
892 ": Explicit assignment by pragma or attribute of an incompatible "
893 "symbol to this section?"));
894 }
895
896 return Section;
897}
898
900 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
902 NextUniqueID, Used.count(GO),
903 /* ForceUnique = */false);
904}
905
907 MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang,
908 const TargetMachine &TM, bool EmitUniqueSection, unsigned Flags,
909 unsigned *NextUniqueID, const MCSymbolELF *AssociatedSymbol,
910 const MachineJumpTableEntry *MJTE = nullptr) {
911 bool UniqueSectionName = false;
913 if (EmitUniqueSection) {
914 if (TM.getUniqueSectionNames()) {
915 UniqueSectionName = true;
916 } else {
917 UniqueID = *NextUniqueID;
918 (*NextUniqueID)++;
919 }
920 }
921 SmallString<128> Name =
922 getELFSectionNameForGlobal(GO, Kind, Mang, TM, UniqueSectionName, MJTE);
923
924 auto [Group, IsComdat, ExtraFlags, Type, EntrySize] =
925 getGlobalObjectInfo(GO, TM, Name, Kind);
926 Flags |= ExtraFlags;
927
928 // Use 0 as the unique ID for execute-only text.
929 if (Kind.isExecuteOnly())
930 UniqueID = 0;
931 return Ctx.getELFSection(Name, Type, Flags, EntrySize, Group, IsComdat,
932 UniqueID, AssociatedSymbol);
933}
934
936 MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang,
937 const TargetMachine &TM, bool Retain, bool EmitUniqueSection,
938 unsigned Flags, unsigned *NextUniqueID) {
939 const MCSymbolELF *LinkedToSym = getLinkedToSymbol(GO, TM);
940 if (LinkedToSym) {
941 EmitUniqueSection = true;
942 Flags |= ELF::SHF_LINK_ORDER;
943 }
944 if (Retain) {
945 if (TM.getTargetTriple().isOSSolaris()) {
946 EmitUniqueSection = true;
948 } else if (Ctx.getAsmInfo().useIntegratedAssembler() ||
949 Ctx.getAsmInfo().binutilsIsAtLeast(2, 36)) {
950 EmitUniqueSection = true;
951 Flags |= ELF::SHF_GNU_RETAIN;
952 }
953 }
954 if (GO->hasMetadata(LLVMContext::MD_elf_section_properties))
955 EmitUniqueSection = true;
956
958 Ctx, GO, Kind, Mang, TM, EmitUniqueSection, Flags,
959 NextUniqueID, LinkedToSym);
960 assert(Section->getLinkedToSymbol() == LinkedToSym);
961 return Section;
962}
963
965 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
966 unsigned Flags = getELFSectionFlags(Kind, TM.getTargetTriple());
967
968 // If we have -ffunction-section or -fdata-section then we should emit the
969 // global value to a uniqued section specifically for it.
970 bool EmitUniqueSection = false;
971 if (!(Flags & ELF::SHF_MERGE) && !Kind.isCommon()) {
972 if (Kind.isText())
973 EmitUniqueSection = TM.getFunctionSections();
974 else
975 EmitUniqueSection = TM.getDataSections();
976 }
977 EmitUniqueSection |= GO->hasComdat();
978 return selectELFSectionForGlobal(getContext(), GO, Kind, getMangler(), TM,
979 Used.count(GO), EmitUniqueSection, Flags,
980 &NextUniqueID);
981}
982
984 const Function &F, const TargetMachine &TM) const {
986 unsigned Flags = getELFSectionFlags(Kind, TM.getTargetTriple());
987 // If the function's section names is pre-determined via pragma or a
988 // section attribute, call selectExplicitSectionGlobal.
989 if (F.hasSection())
991 &F, Kind, TM, getContext(), getMangler(), NextUniqueID,
992 Used.count(&F), /* ForceUnique = */true);
993
995 getContext(), &F, Kind, getMangler(), TM, Used.count(&F),
996 /*EmitUniqueSection=*/true, Flags, &NextUniqueID);
997}
998
1000 const Function &F, const TargetMachine &TM) const {
1001 return getSectionForJumpTable(F, TM, /*JTE=*/nullptr);
1002}
1003
1005 const Function &F, const TargetMachine &TM,
1006 const MachineJumpTableEntry *JTE) const {
1007 // If the function can be removed, produce a unique section so that
1008 // the table doesn't prevent the removal.
1009 const Comdat *C = F.getComdat();
1010 bool EmitUniqueSection = TM.getFunctionSections() || C;
1011 if (!EmitUniqueSection && !TM.getEnableStaticDataPartitioning())
1012 return ReadOnlySection;
1013
1015 getMangler(), TM, EmitUniqueSection,
1016 ELF::SHF_ALLOC, &NextUniqueID,
1017 /* AssociatedSymbol */ nullptr, JTE);
1018}
1019
1021 const Function &F, const MCSymbol &FnSym, const TargetMachine &TM) const {
1022 // If neither COMDAT nor function sections, use the monolithic LSDA section.
1023 // Re-use this path if LSDASection is null as in the Arm EHABI.
1024 if (!LSDASection || (!F.hasComdat() && !TM.getFunctionSections()))
1025 return LSDASection;
1026
1027 const auto *LSDA = static_cast<const MCSectionELF *>(LSDASection);
1028 unsigned Flags = LSDA->getFlags();
1029 const MCSymbolELF *LinkedToSym = nullptr;
1030 StringRef Group;
1031 bool IsComdat = false;
1032 if (const Comdat *C = getELFComdat(&F)) {
1033 Flags |= ELF::SHF_GROUP;
1034 Group = C->getName();
1035 IsComdat = C->getSelectionKind() == Comdat::Any;
1036 }
1037 // Use SHF_LINK_ORDER to facilitate --gc-sections if we can use GNU ld>=2.36
1038 // or LLD, which support mixed SHF_LINK_ORDER & non-SHF_LINK_ORDER.
1039 if (TM.getFunctionSections() &&
1040 (getContext().getAsmInfo().useIntegratedAssembler() &&
1041 getContext().getAsmInfo().binutilsIsAtLeast(2, 36))) {
1042 Flags |= ELF::SHF_LINK_ORDER;
1043 LinkedToSym = static_cast<const MCSymbolELF *>(&FnSym);
1044 }
1045
1046 // Append the function name as the suffix like GCC, assuming
1047 // -funique-section-names applies to .gcc_except_table sections.
1048 return getContext().getELFSection(
1049 (TM.getUniqueSectionNames() ? LSDA->getName() + "." + F.getName()
1050 : LSDA->getName()),
1051 LSDA->getType(), Flags, 0, Group, IsComdat, MCSection::NonUniqueID,
1052 LinkedToSym);
1053}
1054
1056 bool UsesLabelDifference, const Function &F) const {
1057 // We can always create relative relocations, so use another section
1058 // that can be marked non-executable.
1059 return false;
1060}
1061
1062/// Given a mergeable constant with the specified size and relocation
1063/// information, return a section that it should be placed in.
1065 const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment,
1066 const Function *F) const {
1067 if (Kind.isMergeableConst4() && MergeableConst4Section)
1069 if (Kind.isMergeableConst8() && MergeableConst8Section)
1071 if (Kind.isMergeableConst16() && MergeableConst16Section)
1073 if (Kind.isMergeableConst32() && MergeableConst32Section)
1075 if (Kind.isReadOnly())
1076 return ReadOnlySection;
1077
1078 assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
1079 return DataRelROSection;
1080}
1081
1083 const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment,
1084 const Function *F, StringRef SectionSuffix) const {
1085 // TODO: Share code between this function and
1086 // MCObjectInfo::initELFMCObjectFileInfo.
1087 if (SectionSuffix.empty())
1088 return getSectionForConstant(DL, Kind, C, Alignment, F);
1089
1090 auto &Context = getContext();
1091 StringRef CstPrefix = ".rodata";
1092 unsigned MergeableCstFlags = ELF::SHF_ALLOC | ELF::SHF_MERGE;
1093 if (TM->getCodeModel() == CodeModel::Large &&
1094 TM->getTargetTriple().getArch() == Triple::x86_64) {
1095 MergeableCstFlags |= ELF::SHF_X86_64_LARGE;
1096 CstPrefix = ".lrodata";
1097 }
1098
1099 if (Kind.isMergeableConst4() && MergeableConst4Section)
1100 return Context.getELFSection(CstPrefix + ".cst4." + SectionSuffix + ".",
1101 ELF::SHT_PROGBITS, MergeableCstFlags, 4);
1102 if (Kind.isMergeableConst8() && MergeableConst8Section)
1103 return Context.getELFSection(CstPrefix + ".cst8." + SectionSuffix + ".",
1104 ELF::SHT_PROGBITS, MergeableCstFlags, 8);
1105 if (Kind.isMergeableConst16() && MergeableConst16Section)
1106 return Context.getELFSection(CstPrefix + ".cst16." + SectionSuffix + ".",
1107 ELF::SHT_PROGBITS, MergeableCstFlags, 16);
1108 if (Kind.isMergeableConst32() && MergeableConst32Section)
1109 return Context.getELFSection(CstPrefix + ".cst32." + SectionSuffix + ".",
1110 ELF::SHT_PROGBITS, MergeableCstFlags, 32);
1111 if (Kind.isReadOnly())
1112 return Context.getELFSection(".rodata." + SectionSuffix + ".",
1114
1115 assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
1116 return Context.getELFSection(".data.rel.ro." + SectionSuffix + ".",
1119}
1120
1121/// Returns a unique section for the given machine basic block.
1123 const Function &F, const MachineBasicBlock &MBB,
1124 const TargetMachine &TM) const {
1125 assert(MBB.isBeginSection() && "Basic block does not start a section!");
1127
1128 // For cold sections use the .text.split. prefix along with the parent
1129 // function name. All cold blocks for the same function go to the same
1130 // section. Similarly all exception blocks are grouped by symbol name
1131 // under the .text.eh prefix. For regular sections, we either use a unique
1132 // name, or a unique ID for the section.
1133 SmallString<128> Name;
1134 StringRef FunctionSectionName = MBB.getParent()->getSection()->getName();
1135 if (FunctionSectionName == ".text" ||
1136 FunctionSectionName.starts_with(".text.")) {
1137 // Function is in a regular .text section.
1138 StringRef FunctionName = MBB.getParent()->getName();
1139 if (MBB.getSectionID() == MBBSectionID::ColdSectionID) {
1141 Name += FunctionName;
1142 } else if (MBB.getSectionID() == MBBSectionID::ExceptionSectionID) {
1143 Name += ".text.eh.";
1144 Name += FunctionName;
1145 } else {
1146 Name += FunctionSectionName;
1147 if (TM.getUniqueBasicBlockSectionNames()) {
1148 if (!Name.ends_with("."))
1149 Name += ".";
1150 Name += MBB.getSymbol()->getName();
1151 } else {
1152 UniqueID = NextUniqueID++;
1153 }
1154 }
1155 } else {
1156 // If the original function has a custom non-dot-text section, then emit
1157 // all basic block sections into that section too, each with a unique id.
1158 Name = FunctionSectionName;
1159 UniqueID = NextUniqueID++;
1160 }
1161
1162 unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_EXECINSTR;
1163 std::string GroupName;
1164 if (F.hasComdat()) {
1165 Flags |= ELF::SHF_GROUP;
1166 GroupName = F.getComdat()->getName().str();
1167 }
1168 return getContext().getELFSection(Name, ELF::SHT_PROGBITS, Flags,
1169 0 /* Entry Size */, GroupName,
1170 F.hasComdat(), UniqueID, nullptr);
1171}
1172
1173static MCSectionELF *getStaticStructorSection(MCContext &Ctx, bool UseInitArray,
1174 bool IsCtor, unsigned Priority,
1175 const MCSymbol *KeySym) {
1176 std::string Name;
1177 unsigned Type;
1178 unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE;
1179 StringRef Comdat = KeySym ? KeySym->getName() : "";
1180
1181 if (KeySym)
1182 Flags |= ELF::SHF_GROUP;
1183
1184 if (UseInitArray) {
1185 if (IsCtor) {
1187 Name = ".init_array";
1188 } else {
1190 Name = ".fini_array";
1191 }
1192 if (Priority != 65535) {
1193 Name += '.';
1194 Name += utostr(Priority);
1195 }
1196 } else {
1197 // The default scheme is .ctor / .dtor, so we have to invert the priority
1198 // numbering.
1199 if (IsCtor)
1200 Name = ".ctors";
1201 else
1202 Name = ".dtors";
1203 if (Priority != 65535)
1204 raw_string_ostream(Name) << format(".%05u", 65535 - Priority);
1206 }
1207
1208 return Ctx.getELFSection(Name, Type, Flags, 0, Comdat, /*IsComdat=*/true);
1209}
1210
1212 unsigned Priority, const MCSymbol *KeySym) const {
1213 return getStaticStructorSection(getContext(), UseInitArray, true, Priority,
1214 KeySym);
1215}
1216
1218 unsigned Priority, const MCSymbol *KeySym) const {
1219 return getStaticStructorSection(getContext(), UseInitArray, false, Priority,
1220 KeySym);
1221}
1222
1224 const MCSymbol *LHS, const MCSymbol *RHS, int64_t Addend,
1225 std::optional<int64_t> PCRelativeOffset) const {
1226 auto &Ctx = getContext();
1227 const MCExpr *Res;
1228 // Return a relocatable expression with the PLT specifier, %plt(GV) or
1229 // %plt(GV-RHS).
1230 if (PCRelativeOffset && PLTPCRelativeSpecifier) {
1231 Res = MCSymbolRefExpr::create(LHS, Ctx);
1232 // The current location is RHS plus *PCRelativeOffset. Compensate for it.
1233 Addend += *PCRelativeOffset;
1234 if (Addend)
1235 Res = MCBinaryExpr::createAdd(Res, MCConstantExpr::create(Addend, Ctx),
1236 Ctx);
1238 }
1239
1241 return nullptr;
1244 MCSymbolRefExpr::create(RHS, Ctx), Ctx);
1245 if (Addend)
1246 Res =
1247 MCBinaryExpr::createAdd(Res, MCConstantExpr::create(Addend, Ctx), Ctx);
1248 return Res;
1249}
1250
1251// Reference the PLT entry of a function, optionally with a subtrahend (`RHS`).
1253 const MCSymbol *LHS, const MCSymbol *RHS, int64_t Addend,
1254 std::optional<int64_t> PCRelativeOffset, const TargetMachine &TM) const {
1255 if (RHS)
1256 return lowerSymbolDifference(LHS, RHS, Addend, PCRelativeOffset);
1257
1258 // Only the legacy MCSymbolRefExpr::VariantKind approach is implemented.
1259 // Reference LHS@plt or LHS@plt - RHS.
1262 return nullptr;
1263}
1264
1266 // Use ".GCC.command.line" since this feature is to support clang's
1267 // -frecord-gcc-switches which in turn attempts to mimic GCC's switch of the
1268 // same name.
1269 return getContext().getELFSection(".GCC.command.line", ELF::SHT_PROGBITS,
1271}
1272
1273void
1275 UseInitArray = UseInitArray_;
1276 MCContext &Ctx = getContext();
1277 if (!UseInitArray) {
1278 StaticCtorSection = Ctx.getELFSection(".ctors", ELF::SHT_PROGBITS,
1280
1281 StaticDtorSection = Ctx.getELFSection(".dtors", ELF::SHT_PROGBITS,
1283 return;
1284 }
1285
1286 StaticCtorSection = Ctx.getELFSection(".init_array", ELF::SHT_INIT_ARRAY,
1288 StaticDtorSection = Ctx.getELFSection(".fini_array", ELF::SHT_FINI_ARRAY,
1290}
1291
1292//===----------------------------------------------------------------------===//
1293// MachO
1294//===----------------------------------------------------------------------===//
1295
1299
1301 const TargetMachine &TM) {
1303 if (TM.getRelocationModel() == Reloc::Static) {
1304 StaticCtorSection = Ctx.getMachOSection("__TEXT", "__constructor", 0,
1306 StaticDtorSection = Ctx.getMachOSection("__TEXT", "__destructor", 0,
1308 } else {
1309 StaticCtorSection = Ctx.getMachOSection("__DATA", "__mod_init_func",
1312 StaticDtorSection = Ctx.getMachOSection("__DATA", "__mod_term_func",
1315 }
1316
1322}
1323
1325 unsigned Priority, const MCSymbol *KeySym) const {
1326 return StaticDtorSection;
1327 // In userspace, we lower global destructors via atexit(), but kernel/kext
1328 // environments do not provide this function so we still need to support the
1329 // legacy way here.
1330 // See the -disable-atexit-based-global-dtor-lowering CodeGen flag for more
1331 // context.
1332}
1333
1335 Module &M) const {
1336 // Emit the linker options if present.
1337 emitLinkerDirectives(Streamer, M);
1338
1339 emitPseudoProbeDescMetadata(Streamer, M);
1340
1341 unsigned VersionVal = 0;
1342 unsigned ImageInfoFlags = 0;
1343 StringRef SectionVal;
1344
1345 GetObjCImageInfo(M, VersionVal, ImageInfoFlags, SectionVal);
1346 emitCGProfileMetadata(Streamer, M);
1347
1348 // The section is mandatory. If we don't have it, then we don't have GC info.
1349 if (SectionVal.empty())
1350 return;
1351
1352 StringRef Segment, Section;
1353 unsigned TAA = 0, StubSize = 0;
1354 bool TAAParsed;
1356 SectionVal, Segment, Section, TAA, TAAParsed, StubSize)) {
1357 // If invalid, report the error with report_fatal_error.
1358 report_fatal_error("Invalid section specifier '" + Section +
1359 "': " + toString(std::move(E)) + ".");
1360 }
1361
1362 // Get the section.
1364 Segment, Section, TAA, StubSize, SectionKind::getData());
1365 Streamer.switchSection(S);
1366 Streamer.emitLabel(getContext().
1367 getOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO")));
1368 Streamer.emitInt32(VersionVal);
1369 Streamer.emitInt32(ImageInfoFlags);
1370 Streamer.addBlankLine();
1371}
1372
1374 Module &M) const {
1375 if (auto *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
1376 for (const auto *Option : LinkerOptions->operands()) {
1377 SmallVector<std::string, 4> StrOptions;
1378 for (const auto &Piece : cast<MDNode>(Option)->operands())
1379 StrOptions.push_back(std::string(cast<MDString>(Piece)->getString()));
1380 Streamer.emitLinkerOptions(StrOptions);
1381 }
1382 }
1383}
1384
1385static void checkMachOComdat(const GlobalValue *GV) {
1386 const Comdat *C = GV->getComdat();
1387 if (!C)
1388 return;
1389
1390 report_fatal_error("MachO doesn't support COMDATs, '" + C->getName() +
1391 "' cannot be lowered.");
1392}
1393
1395 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1396
1398
1399 // Parse the section specifier and create it if valid.
1400 StringRef Segment, Section;
1401 unsigned TAA = 0, StubSize = 0;
1402 bool TAAParsed;
1403
1404 checkMachOComdat(GO);
1405
1407 SectionName, Segment, Section, TAA, TAAParsed, StubSize)) {
1408 // If invalid, report the error with report_fatal_error.
1409 report_fatal_error("Global variable '" + GO->getName() +
1410 "' has an invalid section specifier '" +
1411 GO->getSection() + "': " + toString(std::move(E)) + ".");
1412 }
1413
1414 // Get the section.
1415 MCSectionMachO *S =
1416 getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
1417
1418 // If TAA wasn't set by ParseSectionSpecifier() above,
1419 // use the value returned by getMachOSection() as a default.
1420 if (!TAAParsed)
1421 TAA = S->getTypeAndAttributes();
1422
1423 // Okay, now that we got the section, verify that the TAA & StubSize agree.
1424 // If the user declared multiple globals with different section flags, we need
1425 // to reject it here.
1426 if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
1427 // If invalid, report the error with report_fatal_error.
1428 report_fatal_error("Global variable '" + GO->getName() +
1429 "' section type or attributes does not match previous"
1430 " section specifier");
1431 }
1432
1433 return S;
1434}
1435
1437 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1438 checkMachOComdat(GO);
1439
1440 // Handle thread local data.
1441 if (Kind.isThreadBSS()) return TLSBSSSection;
1442 if (Kind.isThreadData()) return TLSDataSection;
1443
1444 if (Kind.isText())
1446
1447 // If this is weak/linkonce, put this in a coalescable section, either in text
1448 // or data depending on if it is writable.
1449 if (GO->isWeakForLinker()) {
1450 if (Kind.isReadOnly())
1451 return ConstTextCoalSection;
1452 if (Kind.isReadOnlyWithRel())
1453 return ConstDataCoalSection;
1454 return DataCoalSection;
1455 }
1456
1457 // FIXME: Alignment check should be handled by section classifier.
1458 if (Kind.isMergeable1ByteCString() &&
1460 cast<GlobalVariable>(GO)) < Align(32))
1461 return CStringSection;
1462
1463 // Do not put 16-bit arrays in the UString section if they have an
1464 // externally visible label, this runs into issues with certain linker
1465 // versions.
1466 if (Kind.isMergeable2ByteCString() && !GO->hasExternalLinkage() &&
1468 cast<GlobalVariable>(GO)) < Align(32))
1469 return UStringSection;
1470
1471 // With MachO only variables whose corresponding symbol starts with 'l' or
1472 // 'L' can be merged, so we only try merging GVs with private linkage.
1473 if (GO->hasPrivateLinkage() && Kind.isMergeableConst()) {
1474 if (Kind.isMergeableConst4())
1476 if (Kind.isMergeableConst8())
1478 if (Kind.isMergeableConst16())
1480 }
1481
1482 // Otherwise, if it is readonly, but not something we can specially optimize,
1483 // just drop it in .const.
1484 if (Kind.isReadOnly())
1485 return ReadOnlySection;
1486
1487 // If this is marked const, put it into a const section. But if the dynamic
1488 // linker needs to write to it, put it in the data segment.
1489 if (Kind.isReadOnlyWithRel())
1490 return ConstDataSection;
1491
1492 // Put zero initialized globals with strong external linkage in the
1493 // DATA, __common section with the .zerofill directive.
1494 if (Kind.isBSSExtern())
1495 return DataCommonSection;
1496
1497 // Put zero initialized globals with local linkage in __DATA,__bss directive
1498 // with the .zerofill directive (aka .lcomm).
1499 if (Kind.isBSSLocal())
1500 return DataBSSSection;
1501
1502 // Otherwise, just drop the variable in the normal data section.
1503 return DataSection;
1504}
1505
1507 const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment,
1508 const Function *F) const {
1509 // If this constant requires a relocation, we have to put it in the data
1510 // segment, not in the text segment.
1511 if (Kind.isData() || Kind.isReadOnlyWithRel())
1512 return ConstDataSection;
1513
1514 if (Kind.isMergeableConst4())
1516 if (Kind.isMergeableConst8())
1518 if (Kind.isMergeableConst16())
1520 return ReadOnlySection; // .const
1521}
1522
1527
1529 const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM,
1530 MachineModuleInfo *MMI, MCStreamer &Streamer) const {
1531 // The mach-o version of this method defaults to returning a stub reference.
1532
1533 if (Encoding & DW_EH_PE_indirect) {
1534 MachineModuleInfoMachO &MachOMMI =
1536
1537 MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", TM);
1538
1539 // Add information about the stub reference to MachOMMI so that the stub
1540 // gets emitted by the asmprinter.
1541 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
1542 if (!StubSym.getPointer()) {
1543 MCSymbol *Sym = TM.getSymbol(GV);
1545 }
1546
1549 Encoding & ~DW_EH_PE_indirect, Streamer);
1550 }
1551
1553 MMI, Streamer);
1554}
1555
1557 const GlobalValue *GV, const TargetMachine &TM,
1558 MachineModuleInfo *MMI) const {
1559 // The mach-o version of this method defaults to returning a stub reference.
1560 MachineModuleInfoMachO &MachOMMI =
1562
1563 MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", TM);
1564
1565 // Add information about the stub reference to MachOMMI so that the stub
1566 // gets emitted by the asmprinter.
1567 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
1568 if (!StubSym.getPointer()) {
1569 MCSymbol *Sym = TM.getSymbol(GV);
1571 }
1572
1573 return SSym;
1574}
1575
1577 const GlobalValue *GV, const MCSymbol *Sym, const MCValue &MV,
1578 int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const {
1579 // Although MachO 32-bit targets do not explicitly have a GOTPCREL relocation
1580 // as 64-bit do, we replace the GOT equivalent by accessing the final symbol
1581 // through a non_lazy_ptr stub instead. One advantage is that it allows the
1582 // computation of deltas to final external symbols. Example:
1583 //
1584 // _extgotequiv:
1585 // .long _extfoo
1586 //
1587 // _delta:
1588 // .long _extgotequiv-_delta
1589 //
1590 // is transformed to:
1591 //
1592 // _delta:
1593 // .long L_extfoo$non_lazy_ptr-(_delta+0)
1594 //
1595 // .section __IMPORT,__pointers,non_lazy_symbol_pointers
1596 // L_extfoo$non_lazy_ptr:
1597 // .indirect_symbol _extfoo
1598 // .long 0
1599 //
1600 // The indirect symbol table (and sections of non_lazy_symbol_pointers type)
1601 // may point to both local (same translation unit) and global (other
1602 // translation units) symbols. Example:
1603 //
1604 // .section __DATA,__pointers,non_lazy_symbol_pointers
1605 // L1:
1606 // .indirect_symbol _myGlobal
1607 // .long 0
1608 // L2:
1609 // .indirect_symbol _myLocal
1610 // .long _myLocal
1611 //
1612 // If the symbol is local, instead of the symbol's index, the assembler
1613 // places the constant INDIRECT_SYMBOL_LOCAL into the indirect symbol table.
1614 // Then the linker will notice the constant in the table and will look at the
1615 // content of the symbol.
1616 MachineModuleInfoMachO &MachOMMI =
1618 MCContext &Ctx = getContext();
1619
1620 // The offset must consider the original displacement from the base symbol
1621 // since 32-bit targets don't have a GOTPCREL to fold the PC displacement.
1622 Offset = -MV.getConstant();
1623 const MCSymbol *BaseSym = MV.getSubSym();
1624
1625 // Access the final symbol via sym$non_lazy_ptr and generate the appropriated
1626 // non_lazy_ptr stubs.
1627 SmallString<128> Name;
1628 StringRef Suffix = "$non_lazy_ptr";
1630 Name += Sym->getName();
1631 Name += Suffix;
1632 MCSymbol *Stub = Ctx.getOrCreateSymbol(Name);
1633
1634 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(Stub);
1635
1636 if (!StubSym.getPointer())
1637 StubSym = MachineModuleInfoImpl::StubValueTy(const_cast<MCSymbol *>(Sym),
1638 !GV->hasLocalLinkage());
1639
1640 const MCExpr *BSymExpr = MCSymbolRefExpr::create(BaseSym, Ctx);
1641 const MCExpr *LHS = MCSymbolRefExpr::create(Stub, Ctx);
1642
1643 if (!Offset)
1644 return MCBinaryExpr::createSub(LHS, BSymExpr, Ctx);
1645
1646 const MCExpr *RHS =
1648 return MCBinaryExpr::createSub(LHS, RHS, Ctx);
1649}
1650
1651static bool canUsePrivateLabel(const MCAsmInfo &AsmInfo,
1652 const MCSection &Section) {
1654 return true;
1655
1656 // FIXME: we should be able to use private labels for sections that can't be
1657 // dead-stripped (there's no issue with blocking atomization there), but `ld
1658 // -r` sometimes drops the no_dead_strip attribute from sections so for safety
1659 // we don't allow it.
1660 return false;
1661}
1662
1664 SmallVectorImpl<char> &OutName, const GlobalValue *GV,
1665 const TargetMachine &TM) const {
1666 bool CannotUsePrivateLabel = true;
1667 if (auto *GO = GV->getAliaseeObject()) {
1669 const MCSection *TheSection = SectionForGlobal(GO, GOKind, TM);
1670 CannotUsePrivateLabel = !canUsePrivateLabel(TM.getMCAsmInfo(), *TheSection);
1671 }
1672 getMangler().getNameWithPrefix(OutName, GV, CannotUsePrivateLabel);
1673}
1674
1675//===----------------------------------------------------------------------===//
1676// COFF
1677//===----------------------------------------------------------------------===//
1678
1679static unsigned
1681 unsigned Flags = 0;
1683
1684 if (K.isMetadata())
1685 Flags |=
1687 else if (K.isExclude())
1688 Flags |=
1690 else if (K.isText())
1691 Flags |=
1696 else if (K.isBSS())
1697 Flags |=
1701 else if (K.isThreadLocal())
1702 Flags |=
1706 else if (K.isReadOnly() || K.isReadOnlyWithRel())
1707 Flags |=
1710 else if (K.isWriteable())
1711 Flags |=
1715
1716 return Flags;
1717}
1718
1720 const Comdat *C = GV->getComdat();
1721 assert(C && "expected GV to have a Comdat!");
1722
1723 StringRef ComdatGVName = C->getName();
1724 const GlobalValue *ComdatGV = GV->getParent()->getNamedValue(ComdatGVName);
1725 if (!ComdatGV)
1726 report_fatal_error("Associative COMDAT symbol '" + ComdatGVName +
1727 "' does not exist.");
1728
1729 if (ComdatGV->getComdat() != C)
1730 report_fatal_error("Associative COMDAT symbol '" + ComdatGVName +
1731 "' is not a key for its COMDAT.");
1732
1733 return ComdatGV;
1734}
1735
1736static int getSelectionForCOFF(const GlobalValue *GV) {
1737 if (const Comdat *C = GV->getComdat()) {
1738 const GlobalValue *ComdatKey = getComdatGVForCOFF(GV);
1739 if (const auto *GA = dyn_cast<GlobalAlias>(ComdatKey))
1740 ComdatKey = GA->getAliaseeObject();
1741 if (ComdatKey == GV) {
1742 switch (C->getSelectionKind()) {
1743 case Comdat::Any:
1745 case Comdat::ExactMatch:
1747 case Comdat::Largest:
1751 case Comdat::SameSize:
1753 }
1754 } else {
1756 }
1757 }
1758 return 0;
1759}
1760
1762 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1763 StringRef Name = handlePragmaClangSection(GO, Kind);
1764 if (Name == getInstrProfSectionName(IPSK_covmap, Triple::COFF,
1765 /*AddSegmentInfo=*/false) ||
1766 Name == getInstrProfSectionName(IPSK_covfun, Triple::COFF,
1767 /*AddSegmentInfo=*/false) ||
1768 Name == getInstrProfSectionName(IPSK_covdata, Triple::COFF,
1769 /*AddSegmentInfo=*/false) ||
1770 Name == getInstrProfSectionName(IPSK_covname, Triple::COFF,
1771 /*AddSegmentInfo=*/false) ||
1772 Name == ".llvmbc" || Name == ".llvmcmd")
1773 Kind = SectionKind::getMetadata();
1774 int Selection = 0;
1775 unsigned Characteristics = getCOFFSectionFlags(Kind, TM);
1776 StringRef COMDATSymName = "";
1777 if (GO->hasComdat()) {
1779 const GlobalValue *ComdatGV;
1781 ComdatGV = getComdatGVForCOFF(GO);
1782 else
1783 ComdatGV = GO;
1784
1785 if (!ComdatGV->hasPrivateLinkage()) {
1786 MCSymbol *Sym = TM.getSymbol(ComdatGV);
1787 COMDATSymName = Sym->getName();
1788 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1789 } else {
1790 Selection = 0;
1791 }
1792 }
1793
1794 return getContext().getCOFFSection(Name, Characteristics, COMDATSymName,
1795 Selection);
1796}
1797
1799 if (Kind.isText())
1800 return ".text";
1801 if (Kind.isBSS())
1802 return ".bss";
1803 if (Kind.isThreadLocal())
1804 return ".tls$";
1805 if (Kind.isReadOnly() || Kind.isReadOnlyWithRel())
1806 return ".rdata";
1807 return ".data";
1808}
1809
1811 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1812 // If we have -ffunction-sections then we should emit the global value to a
1813 // uniqued section specifically for it.
1814 bool EmitUniquedSection;
1815 if (Kind.isText())
1816 EmitUniquedSection = TM.getFunctionSections();
1817 else
1818 EmitUniquedSection = TM.getDataSections();
1819
1820 if ((EmitUniquedSection && !Kind.isCommon()) || GO->hasComdat()) {
1822
1823 unsigned Characteristics = getCOFFSectionFlags(Kind, TM);
1824
1825 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1827 if (!Selection)
1829 const GlobalValue *ComdatGV;
1830 if (GO->hasComdat())
1831 ComdatGV = getComdatGVForCOFF(GO);
1832 else
1833 ComdatGV = GO;
1834
1836 if (EmitUniquedSection)
1837 UniqueID = NextUniqueID++;
1838
1839 if (!ComdatGV->hasPrivateLinkage()) {
1840 MCSymbol *Sym = TM.getSymbol(ComdatGV);
1841 StringRef COMDATSymName = Sym->getName();
1842
1843 if (const auto *F = dyn_cast<Function>(GO))
1844 if (std::optional<StringRef> Prefix = F->getSectionPrefix())
1845 raw_svector_ostream(Name) << '$' << *Prefix;
1846
1847 // Append "$symbol" to the section name *before* IR-level mangling is
1848 // applied when targetting mingw. This is what GCC does, and the ld.bfd
1849 // COFF linker will not properly handle comdats otherwise.
1850 if (getContext().getTargetTriple().isOSCygMing())
1851 raw_svector_ostream(Name) << '$' << ComdatGV->getName();
1852
1853 return getContext().getCOFFSection(Name, Characteristics, COMDATSymName,
1855 } else {
1856 SmallString<256> TmpData;
1857 getMangler().getNameWithPrefix(TmpData, GO, /*CannotUsePrivateLabel=*/true);
1858 return getContext().getCOFFSection(Name, Characteristics, TmpData,
1860 }
1861 }
1862
1863 if (Kind.isText())
1864 return TextSection;
1865
1866 if (Kind.isThreadLocal())
1867 return TLSDataSection;
1868
1869 if (Kind.isReadOnly() || Kind.isReadOnlyWithRel())
1870 return ReadOnlySection;
1871
1872 // Note: we claim that common symbols are put in BSSSection, but they are
1873 // really emitted with the magic .comm directive, which creates a symbol table
1874 // entry but not a section.
1875 if (Kind.isBSS() || Kind.isCommon())
1876 return BSSSection;
1877
1878 return DataSection;
1879}
1880
1882 SmallVectorImpl<char> &OutName, const GlobalValue *GV,
1883 const TargetMachine &TM) const {
1884 bool CannotUsePrivateLabel = false;
1885 if (GV->hasPrivateLinkage() &&
1886 ((isa<Function>(GV) && TM.getFunctionSections()) ||
1887 (isa<GlobalVariable>(GV) && TM.getDataSections())))
1888 CannotUsePrivateLabel = true;
1889
1890 getMangler().getNameWithPrefix(OutName, GV, CannotUsePrivateLabel);
1891}
1892
1894 const Function &F, const TargetMachine &TM) const {
1895 // If the function can be removed, produce a unique section so that
1896 // the table doesn't prevent the removal.
1897 const Comdat *C = F.getComdat();
1898 bool EmitUniqueSection = TM.getFunctionSections() || C;
1899 if (!EmitUniqueSection)
1900 return ReadOnlySection;
1901
1902 // FIXME: we should produce a symbol for F instead.
1903 if (F.hasPrivateLinkage())
1904 return ReadOnlySection;
1905
1906 MCSymbol *Sym = TM.getSymbol(&F);
1907 StringRef COMDATSymName = Sym->getName();
1908
1911 unsigned Characteristics = getCOFFSectionFlags(Kind, TM);
1912 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1913 unsigned UniqueID = NextUniqueID++;
1914
1915 return getContext().getCOFFSection(SecName, Characteristics, COMDATSymName,
1917 UniqueID);
1918}
1919
1921 bool UsesLabelDifference, const Function &F) const {
1922 if (TM->getTargetTriple().getArch() == Triple::x86_64) {
1924 // We can always create relative relocations, so use another section
1925 // that can be marked non-executable.
1926 return false;
1927 }
1928 }
1930 UsesLabelDifference, F);
1931}
1932
1934 Module &M) const {
1935 emitLinkerDirectives(Streamer, M);
1936
1937 unsigned Version = 0;
1938 unsigned Flags = 0;
1939 StringRef Section;
1940
1941 GetObjCImageInfo(M, Version, Flags, Section);
1942 if (!Section.empty()) {
1943 auto &C = getContext();
1944 auto *S = C.getCOFFSection(Section, COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1946 Streamer.switchSection(S);
1947 Streamer.emitLabel(C.getOrCreateSymbol(StringRef("OBJC_IMAGE_INFO")));
1948 Streamer.emitInt32(Version);
1949 Streamer.emitInt32(Flags);
1950 Streamer.addBlankLine();
1951 }
1952
1953 emitCGProfileMetadata(Streamer, M);
1954 emitPseudoProbeDescMetadata(Streamer, M, [](MCStreamer &Streamer) {
1955 if (MCSymbol *Sym =
1956 static_cast<MCSectionCOFF *>(Streamer.getCurrentSectionOnly())
1957 ->getCOMDATSymbol())
1958 if (Sym->isUndefined()) {
1959 // COMDAT symbol must be external to perform deduplication.
1960 Streamer.emitSymbolAttribute(Sym, MCSA_Global);
1961 Streamer.emitLabel(Sym);
1962 }
1963 });
1964}
1965
1967 MCStreamer &Streamer, Module &M) const {
1968 if (NamedMDNode *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
1969 // Emit the linker options to the linker .drectve section. According to the
1970 // spec, this section is a space-separated string containing flags for
1971 // linker.
1973 Streamer.switchSection(Sec);
1974 for (const auto *Option : LinkerOptions->operands()) {
1975 for (const auto &Piece : cast<MDNode>(Option)->operands()) {
1976 // Lead with a space for consistency with our dllexport implementation.
1977 std::string Directive(" ");
1978 Directive.append(std::string(cast<MDString>(Piece)->getString()));
1979 Streamer.emitBytes(Directive);
1980 }
1981 }
1982 }
1983
1984 // Emit /EXPORT: flags for each exported global as necessary.
1985 std::string Flags;
1986 for (const GlobalValue &GV : M.global_values()) {
1987 raw_string_ostream OS(Flags);
1988 emitLinkerFlagsForGlobalCOFF(OS, &GV, getContext().getTargetTriple(),
1989 getMangler());
1990 if (!Flags.empty()) {
1991 Streamer.switchSection(getDrectveSection());
1992 Streamer.emitBytes(Flags);
1993 }
1994 Flags.clear();
1995 }
1996
1997 // Emit /INCLUDE: flags for each used global as necessary.
1998 if (const auto *LU = M.getNamedGlobal("llvm.used")) {
1999 assert(LU->hasInitializer() && "expected llvm.used to have an initializer");
2000 assert(isa<ArrayType>(LU->getValueType()) &&
2001 "expected llvm.used to be an array type");
2002 if (const auto *A = cast<ConstantArray>(LU->getInitializer())) {
2003 for (const Value *Op : A->operands()) {
2004 const auto *GV = cast<GlobalValue>(Op->stripPointerCasts());
2005 // Global symbols with internal or private linkage are not visible to
2006 // the linker, and thus would cause an error when the linker tried to
2007 // preserve the symbol due to the `/include:` directive.
2008 if (GV->hasLocalLinkage())
2009 continue;
2010
2011 raw_string_ostream OS(Flags);
2012 emitLinkerFlagsForUsedCOFF(OS, GV, getContext().getTargetTriple(),
2013 getMangler());
2014
2015 if (!Flags.empty()) {
2016 Streamer.switchSection(getDrectveSection());
2017 Streamer.emitBytes(Flags);
2018 }
2019 Flags.clear();
2020 }
2021 }
2022 }
2023}
2024
2026 const TargetMachine &TM) {
2028 this->TM = &TM;
2029 const Triple &T = TM.getTargetTriple();
2030 if (T.isWindowsMSVCEnvironment() || T.isWindowsItaniumEnvironment()) {
2032 Ctx.getCOFFSection(".CRT$XCU", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
2035 Ctx.getCOFFSection(".CRT$XTX", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
2037 } else {
2038 StaticCtorSection = Ctx.getCOFFSection(
2041 StaticDtorSection = Ctx.getCOFFSection(
2044 }
2045}
2046
2048 const Triple &T, bool IsCtor,
2049 unsigned Priority,
2050 const MCSymbol *KeySym,
2052 if (T.isWindowsMSVCEnvironment() || T.isWindowsItaniumEnvironment()) {
2053 // If the priority is the default, use .CRT$XCU, possibly associative.
2054 if (Priority == 65535)
2055 return Ctx.getAssociativeCOFFSection(Default, KeySym, 0);
2056
2057 // Otherwise, we need to compute a new section name. Low priorities should
2058 // run earlier. The linker will sort sections ASCII-betically, and we need a
2059 // string that sorts between .CRT$XCA and .CRT$XCU. In the general case, we
2060 // make a name like ".CRT$XCT12345", since that runs before .CRT$XCU. Really
2061 // low priorities need to sort before 'L', since the CRT uses that
2062 // internally, so we use ".CRT$XCA00001" for them. We have a contract with
2063 // the frontend that "init_seg(compiler)" corresponds to priority 200 and
2064 // "init_seg(lib)" corresponds to priority 400, and those respectively use
2065 // 'C' and 'L' without the priority suffix. Priorities between 200 and 400
2066 // use 'C' with the priority as a suffix.
2067 SmallString<24> Name;
2068 char LastLetter = 'T';
2069 bool AddPrioritySuffix = Priority != 200 && Priority != 400;
2070 if (Priority < 200)
2071 LastLetter = 'A';
2072 else if (Priority < 400)
2073 LastLetter = 'C';
2074 else if (Priority == 400)
2075 LastLetter = 'L';
2076 raw_svector_ostream OS(Name);
2077 OS << ".CRT$X" << (IsCtor ? "C" : "T") << LastLetter;
2078 if (AddPrioritySuffix)
2079 OS << format("%05u", Priority);
2080 MCSectionCOFF *Sec = Ctx.getCOFFSection(
2082 return Ctx.getAssociativeCOFFSection(Sec, KeySym, 0);
2083 }
2084
2085 std::string Name = IsCtor ? ".ctors" : ".dtors";
2086 if (Priority != 65535)
2087 raw_string_ostream(Name) << format(".%05u", 65535 - Priority);
2088
2089 return Ctx.getAssociativeCOFFSection(
2090 Ctx.getCOFFSection(Name, COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
2093 KeySym, 0);
2094}
2095
2097 unsigned Priority, const MCSymbol *KeySym) const {
2099 getContext(), getContext().getTargetTriple(), true, Priority, KeySym,
2100 static_cast<MCSectionCOFF *>(StaticCtorSection));
2101}
2102
2104 unsigned Priority, const MCSymbol *KeySym) const {
2106 getContext(), getContext().getTargetTriple(), false, Priority, KeySym,
2107 static_cast<MCSectionCOFF *>(StaticDtorSection));
2108}
2109
2111 const GlobalValue *LHS, const GlobalValue *RHS, int64_t Addend,
2112 std::optional<int64_t> PCRelativeOffset, const TargetMachine &TM) const {
2113 const Triple &T = TM.getTargetTriple();
2114 if (T.isOSCygMing())
2115 return nullptr;
2116
2117 // Our symbols should exist in address space zero, cowardly no-op if
2118 // otherwise.
2119 if (LHS->getType()->getPointerAddressSpace() != 0 ||
2120 RHS->getType()->getPointerAddressSpace() != 0)
2121 return nullptr;
2122
2123 // Both ptrtoint instructions must wrap global objects:
2124 // - Only global variables are eligible for image relative relocations.
2125 // - The subtrahend refers to the special symbol __ImageBase, a GlobalVariable.
2126 // We expect __ImageBase to be a global variable without a section, externally
2127 // defined.
2128 //
2129 // It should look something like this: @__ImageBase = external constant i8
2130 if (!isa<GlobalObject>(LHS) || !isa<GlobalVariable>(RHS) ||
2131 LHS->isThreadLocal() || RHS->isThreadLocal() ||
2132 RHS->getName() != "__ImageBase" || !RHS->hasExternalLinkage() ||
2133 cast<GlobalVariable>(RHS)->hasInitializer() || RHS->hasSection())
2134 return nullptr;
2135
2136 const MCExpr *Res = MCSymbolRefExpr::create(
2137 TM.getSymbol(LHS), MCSymbolRefExpr::VK_COFF_IMGREL32, getContext());
2138 if (Addend != 0)
2140 Res, MCConstantExpr::create(Addend, getContext()), getContext());
2141 return Res;
2142}
2143
2144static std::string APIntToHexString(const APInt &AI) {
2145 unsigned Width = (AI.getBitWidth() / 8) * 2;
2146 std::string HexString = toString(AI, 16, /*Signed=*/false);
2147 llvm::transform(HexString, HexString.begin(), tolower);
2148 unsigned Size = HexString.size();
2149 assert(Width >= Size && "hex string is too large!");
2150 HexString.insert(HexString.begin(), Width - Size, '0');
2151
2152 return HexString;
2153}
2154
2155static std::string scalarConstantToHexString(const Constant *C) {
2156 Type *Ty = C->getType();
2157 if (isa<UndefValue>(C)) {
2158 return APIntToHexString(APInt::getZero(Ty->getPrimitiveSizeInBits()));
2159 } else if (const auto *CFP = dyn_cast<ConstantFP>(C)) {
2160 if (CFP->getType()->isFloatingPointTy())
2161 return APIntToHexString(CFP->getValueAPF().bitcastToAPInt());
2162
2163 std::string HexString;
2164 unsigned NumElements =
2165 cast<FixedVectorType>(CFP->getType())->getNumElements();
2166 for (unsigned I = 0; I < NumElements; ++I)
2167 HexString += APIntToHexString(CFP->getValueAPF().bitcastToAPInt());
2168 return HexString;
2169 } else if (const auto *CI = dyn_cast<ConstantInt>(C)) {
2170 if (CI->getType()->isIntegerTy())
2171 return APIntToHexString(CI->getValue());
2172
2173 std::string HexString;
2174 unsigned NumElements =
2175 cast<FixedVectorType>(CI->getType())->getNumElements();
2176 for (unsigned I = 0; I < NumElements; ++I)
2177 HexString += APIntToHexString(CI->getValue());
2178 return HexString;
2179 } else {
2180 unsigned NumElements;
2181 if (auto *VTy = dyn_cast<VectorType>(Ty))
2182 NumElements = cast<FixedVectorType>(VTy)->getNumElements();
2183 else
2184 NumElements = Ty->getArrayNumElements();
2185 std::string HexString;
2186 for (int I = NumElements - 1, E = -1; I != E; --I)
2187 HexString += scalarConstantToHexString(C->getAggregateElement(I));
2188 return HexString;
2189 }
2190}
2191
2193 const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment,
2194 const Function *F) const {
2195 if (Kind.isMergeableConst() && C &&
2196 getContext().getAsmInfo().hasCOFFComdatConstants()) {
2197 // This creates comdat sections with the given symbol name, but unless
2198 // AsmPrinter::GetCPISymbol actually makes the symbol global, the symbol
2199 // will be created with a null storage class, which makes GNU binutils
2200 // error out.
2201 const unsigned Characteristics = COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
2204 std::string COMDATSymName;
2205 if (Kind.isMergeableConst4()) {
2206 if (Alignment <= 4) {
2207 COMDATSymName = "__real@" + scalarConstantToHexString(C);
2208 Alignment = Align(4);
2209 }
2210 } else if (Kind.isMergeableConst8()) {
2211 if (Alignment <= 8) {
2212 COMDATSymName = "__real@" + scalarConstantToHexString(C);
2213 Alignment = Align(8);
2214 }
2215 } else if (Kind.isMergeableConst16()) {
2216 // FIXME: These may not be appropriate for non-x86 architectures.
2217 if (Alignment <= 16) {
2218 COMDATSymName = "__xmm@" + scalarConstantToHexString(C);
2219 Alignment = Align(16);
2220 }
2221 } else if (Kind.isMergeableConst32()) {
2222 if (Alignment <= 32) {
2223 COMDATSymName = "__ymm@" + scalarConstantToHexString(C);
2224 Alignment = Align(32);
2225 }
2226 }
2227
2228 if (!COMDATSymName.empty())
2229 return getContext().getCOFFSection(".rdata", Characteristics,
2230 COMDATSymName,
2232 }
2233
2234 return TargetLoweringObjectFile::getSectionForConstant(DL, Kind, C, Alignment,
2235 F);
2236}
2237
2238//===----------------------------------------------------------------------===//
2239// Wasm
2240//===----------------------------------------------------------------------===//
2241
2242static const Comdat *getWasmComdat(const GlobalValue *GV) {
2243 const Comdat *C = GV->getComdat();
2244 if (!C)
2245 return nullptr;
2246
2247 if (C->getSelectionKind() != Comdat::Any)
2248 report_fatal_error("WebAssembly COMDATs only support "
2249 "SelectionKind::Any, '" + C->getName() + "' cannot be "
2250 "lowered.");
2251
2252 return C;
2253}
2254
2255static unsigned getWasmSectionFlags(SectionKind K, bool Retain) {
2256 unsigned Flags = 0;
2257
2258 if (K.isThreadLocal())
2259 Flags |= wasm::WASM_SEG_FLAG_TLS;
2260
2261 if (K.isMergeableCString())
2263
2264 if (Retain)
2266
2267 // TODO(sbc): Add suport for K.isMergeableConst()
2268
2269 return Flags;
2270}
2271
2274 collectUsedGlobalVariables(M, Vec, false);
2275 for (GlobalValue *GV : Vec)
2276 if (auto *GO = dyn_cast<GlobalObject>(GV))
2277 Used.insert(GO);
2278}
2279
2281 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2282 // We don't support explict section names for functions in the wasm object
2283 // format. Each function has to be in its own unique section.
2284 if (isa<Function>(GO)) {
2285 return SelectSectionForGlobal(GO, Kind, TM);
2286 }
2287
2288 StringRef Name = GO->getSection();
2289
2290 // Certain data sections we treat as named custom sections rather than
2291 // segments within the data section.
2292 // This could be avoided if all data segements (the wasm sense) were
2293 // represented as their own sections (in the llvm sense).
2294 // TODO(sbc): https://github.com/WebAssembly/tool-conventions/issues/138
2295 if (Name == getInstrProfSectionName(IPSK_covmap, Triple::Wasm,
2296 /*AddSegmentInfo=*/false) ||
2297 Name == getInstrProfSectionName(IPSK_covfun, Triple::Wasm,
2298 /*AddSegmentInfo=*/false) ||
2299 Name == ".llvmbc" || Name == ".llvmcmd")
2300 Kind = SectionKind::getMetadata();
2301
2302 StringRef Group = "";
2303 if (const Comdat *C = getWasmComdat(GO)) {
2304 Group = C->getName();
2305 }
2306
2307 unsigned Flags = getWasmSectionFlags(Kind, Used.count(GO));
2308 MCSectionWasm *Section = getContext().getWasmSection(Name, Kind, Flags, Group,
2310
2311 return Section;
2312}
2313
2314static MCSectionWasm *
2316 SectionKind Kind, Mangler &Mang,
2317 const TargetMachine &TM, bool EmitUniqueSection,
2318 unsigned *NextUniqueID, bool Retain) {
2319 StringRef Group = "";
2320 if (const Comdat *C = getWasmComdat(GO)) {
2321 Group = C->getName();
2322 }
2323
2324 bool UniqueSectionNames = TM.getUniqueSectionNames();
2325 SmallString<128> Name = getSectionPrefixForGlobal(Kind, /*IsLarge=*/false);
2326
2327 if (const auto *F = dyn_cast<Function>(GO)) {
2328 const auto &OptionalPrefix = F->getSectionPrefix();
2329 if (OptionalPrefix)
2330 raw_svector_ostream(Name) << '.' << *OptionalPrefix;
2331 }
2332
2333 if (EmitUniqueSection && UniqueSectionNames) {
2334 Name.push_back('.');
2335 TM.getNameWithPrefix(Name, GO, Mang, true);
2336 }
2338 if (EmitUniqueSection && !UniqueSectionNames) {
2339 UniqueID = *NextUniqueID;
2340 (*NextUniqueID)++;
2341 }
2342
2343 unsigned Flags = getWasmSectionFlags(Kind, Retain);
2344 return Ctx.getWasmSection(Name, Kind, Flags, Group, UniqueID);
2345}
2346
2348 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2349
2350 if (Kind.isCommon())
2351 report_fatal_error("mergable sections not supported yet on wasm");
2352
2353 // If we have -ffunction-section or -fdata-section then we should emit the
2354 // global value to a uniqued section specifically for it.
2355 bool EmitUniqueSection = false;
2356 if (Kind.isText())
2357 EmitUniqueSection = TM.getFunctionSections();
2358 else
2359 EmitUniqueSection = TM.getDataSections();
2360 EmitUniqueSection |= GO->hasComdat();
2361 bool Retain = Used.count(GO);
2362 EmitUniqueSection |= Retain;
2363
2364 return selectWasmSectionForGlobal(getContext(), GO, Kind, getMangler(), TM,
2365 EmitUniqueSection, &NextUniqueID, Retain);
2366}
2367
2369 bool UsesLabelDifference, const Function &F) const {
2370 // We can always create relative relocations, so use another section
2371 // that can be marked non-executable.
2372 return false;
2373}
2374
2378
2379 // We don't use PersonalityEncoding and LSDAEncoding because we don't emit
2380 // .cfi directives. We use TTypeEncoding to encode typeinfo global variables.
2382}
2383
2385 unsigned Priority, const MCSymbol *KeySym) const {
2386 return Priority == UINT16_MAX ?
2388 getContext().getWasmSection(".init_array." + utostr(Priority),
2390}
2391
2393 unsigned Priority, const MCSymbol *KeySym) const {
2394 report_fatal_error("@llvm.global_dtors should have been lowered already");
2395}
2396
2397//===----------------------------------------------------------------------===//
2398// XCOFF
2399//===----------------------------------------------------------------------===//
2401 const MachineFunction *MF) {
2402 if (!MF->getLandingPads().empty())
2403 return true;
2404
2405 const Function &F = MF->getFunction();
2406 if (!F.hasPersonalityFn() || !F.needsUnwindTableEntry())
2407 return false;
2408
2409 const GlobalValue *Per =
2410 dyn_cast<GlobalValue>(F.getPersonalityFn()->stripPointerCasts());
2411 assert(Per && "Personality routine is not a GlobalValue type.");
2413 return false;
2414
2415 return true;
2416}
2417
2419 const MachineFunction *MF) {
2420 const Function &F = MF->getFunction();
2421 if (!F.hasStackProtectorFnAttr())
2422 return false;
2423 // FIXME: check presence of canary word
2424 // There are cases that the stack protectors are not really inserted even if
2425 // the attributes are on.
2426 return true;
2427}
2428
2429MCSymbol *
2431 auto *EHInfoSym =
2432 static_cast<MCSymbolXCOFF *>(MF->getContext().getOrCreateSymbol(
2433 "__ehinfo." + Twine(MF->getFunctionNumber())));
2434 EHInfoSym->setEHInfo();
2435 return EHInfoSym;
2436}
2437
2438MCSymbol *
2440 const TargetMachine &TM) const {
2441 // We always use a qualname symbol for a GV that represents
2442 // a declaration, a function descriptor, or a common symbol. An IFunc is
2443 // lowered as a special trampoline function which has an entry point and a
2444 // descriptor.
2445 // If a GV represents a GlobalVariable and -fdata-sections is enabled, we
2446 // also return a qualname so that a label symbol could be avoided.
2447 // It is inherently ambiguous when the GO represents the address of a
2448 // function, as the GO could either represent a function descriptor or a
2449 // function entry point. We choose to always return a function descriptor
2450 // here.
2451 if (const GlobalObject *GO = dyn_cast<GlobalObject>(GV)) {
2452 if (GO->isDeclarationForLinker())
2453 return static_cast<const MCSectionXCOFF *>(
2455 ->getQualNameSymbol();
2456
2457 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV))
2458 if (GVar->hasAttribute("toc-data"))
2459 return static_cast<const MCSectionXCOFF *>(
2461 ->getQualNameSymbol();
2462
2463 if (isa<GlobalIFunc>(GO))
2464 return static_cast<const MCSectionXCOFF *>(
2466 ->getQualNameSymbol();
2467
2468 SectionKind GOKind = getKindForGlobal(GO, TM);
2469 if (GOKind.isText())
2470 return static_cast<const MCSectionXCOFF *>(
2472 ->getQualNameSymbol();
2473 if ((TM.getDataSections() && !GO->hasSection()) || GO->hasCommonLinkage() ||
2474 GOKind.isBSSLocal() || GOKind.isThreadBSSLocal())
2475 return static_cast<const MCSectionXCOFF *>(
2476 SectionForGlobal(GO, GOKind, TM))
2477 ->getQualNameSymbol();
2478 }
2479
2480 // For all other cases, fall back to getSymbol to return the unqualified name.
2481 return nullptr;
2482}
2483
2485 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2486 if (!GO->hasSection())
2487 report_fatal_error("#pragma clang section is not yet supported");
2488
2490
2491 // Handle the XCOFF::TD case first, then deal with the rest.
2492 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GO))
2493 if (GVar->hasAttribute("toc-data"))
2494 return getContext().getXCOFFSection(
2495 SectionName, Kind,
2497 /* MultiSymbolsAllowed*/ true);
2498
2499 XCOFF::StorageMappingClass MappingClass;
2500 if (Kind.isText())
2501 MappingClass = XCOFF::XMC_PR;
2502 else if (Kind.isData() || Kind.isBSS())
2503 MappingClass = XCOFF::XMC_RW;
2504 else if (Kind.isReadOnlyWithRel())
2505 MappingClass =
2506 TM.Options.XCOFFReadOnlyPointers ? XCOFF::XMC_RO : XCOFF::XMC_RW;
2507 else if (Kind.isReadOnly())
2508 MappingClass = XCOFF::XMC_RO;
2509 else
2510 report_fatal_error("XCOFF other section types not yet implemented.");
2511
2512 return getContext().getXCOFFSection(
2513 SectionName, Kind, XCOFF::CsectProperties(MappingClass, XCOFF::XTY_SD),
2514 /* MultiSymbolsAllowed*/ true);
2515}
2516
2518 const GlobalObject *GO, const TargetMachine &TM) const {
2520 "Tried to get ER section for a defined global.");
2521
2522 SmallString<128> Name;
2523 getNameWithPrefix(Name, GO, TM);
2524
2525 // AIX TLS local-dynamic does not need the external reference for the
2526 // "_$TLSML" symbol.
2528 GO->hasName() && GO->getName() == "_$TLSML") {
2529 return getContext().getXCOFFSection(
2530 Name, SectionKind::getData(),
2532 }
2533
2536 if (GO->isThreadLocal())
2537 SMC = XCOFF::XMC_UL;
2538
2539 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GO))
2540 if (GVar->hasAttribute("toc-data"))
2541 SMC = XCOFF::XMC_TD;
2542
2543 // Externals go into a csect of type ER.
2544 return getContext().getXCOFFSection(
2547}
2548
2550 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2551 // Handle the XCOFF::TD case first, then deal with the rest.
2552 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GO))
2553 if (GVar->hasAttribute("toc-data")) {
2554 SmallString<128> Name;
2555 getNameWithPrefix(Name, GO, TM);
2556 XCOFF::SymbolType symType =
2558 return getContext().getXCOFFSection(
2559 Name, Kind, XCOFF::CsectProperties(XCOFF::XMC_TD, symType),
2560 /* MultiSymbolsAllowed*/ true);
2561 }
2562
2563 // Common symbols go into a csect with matching name which will get mapped
2564 // into the .bss section.
2565 // Zero-initialized local TLS symbols go into a csect with matching name which
2566 // will get mapped into the .tbss section.
2567 if (Kind.isBSSLocal() || GO->hasCommonLinkage() || Kind.isThreadBSSLocal()) {
2568 SmallString<128> Name;
2569 getNameWithPrefix(Name, GO, TM);
2570 XCOFF::StorageMappingClass SMC = Kind.isBSSLocal() ? XCOFF::XMC_BS
2571 : Kind.isCommon() ? XCOFF::XMC_RW
2572 : XCOFF::XMC_UL;
2573 return getContext().getXCOFFSection(
2574 Name, Kind, XCOFF::CsectProperties(SMC, XCOFF::XTY_CM));
2575 }
2576
2577 if (Kind.isText()) {
2578 if (TM.getFunctionSections()) {
2579 return static_cast<const MCSymbolXCOFF *>(
2581 ->getRepresentedCsect();
2582 }
2583 return TextSection;
2584 }
2585
2586 if (TM.Options.XCOFFReadOnlyPointers && Kind.isReadOnlyWithRel()) {
2587 if (!TM.getDataSections())
2589 "ReadOnlyPointers is supported only if data sections is turned on");
2590
2591 SmallString<128> Name;
2592 getNameWithPrefix(Name, GO, TM);
2593 return getContext().getXCOFFSection(
2596 }
2597
2598 // For BSS kind, zero initialized data must be emitted to the .data section
2599 // because external linkage control sections that get mapped to the .bss
2600 // section will be linked as tentative definitions, which is only appropriate
2601 // for SectionKind::Common.
2602 if (Kind.isData() || Kind.isReadOnlyWithRel() || Kind.isBSS()) {
2603 if (TM.getDataSections()) {
2604 SmallString<128> Name;
2605 getNameWithPrefix(Name, GO, TM);
2606 return getContext().getXCOFFSection(
2607 Name, SectionKind::getData(),
2609 }
2610 return DataSection;
2611 }
2612
2613 if (Kind.isReadOnly()) {
2614 if (TM.getDataSections()) {
2615 SmallString<128> Name;
2616 getNameWithPrefix(Name, GO, TM);
2617 return getContext().getXCOFFSection(
2620 }
2621 return ReadOnlySection;
2622 }
2623
2624 // External/weak TLS data and initialized local TLS data are not eligible
2625 // to be put into common csect. If data sections are enabled, thread
2626 // data are emitted into separate sections. Otherwise, thread data
2627 // are emitted into the .tdata section.
2628 if (Kind.isThreadLocal()) {
2629 if (TM.getDataSections()) {
2630 SmallString<128> Name;
2631 getNameWithPrefix(Name, GO, TM);
2632 return getContext().getXCOFFSection(
2634 }
2635 return TLSDataSection;
2636 }
2637
2638 report_fatal_error("XCOFF other section types not yet implemented.");
2639}
2640
2642 const Function &F, const TargetMachine &TM) const {
2643 assert (!F.getComdat() && "Comdat not supported on XCOFF.");
2644
2645 if (!TM.getFunctionSections())
2646 return ReadOnlySection;
2647
2648 // If the function can be removed, produce a unique section so that
2649 // the table doesn't prevent the removal.
2650 SmallString<128> NameStr(".rodata.jmp..");
2651 getNameWithPrefix(NameStr, &F, TM);
2652 return getContext().getXCOFFSection(
2653 NameStr, SectionKind::getReadOnly(),
2655}
2656
2658 bool UsesLabelDifference, const Function &F) const {
2659 return false;
2660}
2661
2662/// Given a mergeable constant with the specified size and relocation
2663/// information, return a section that it should be placed in.
2665 const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment,
2666 const Function *F) const {
2667 // TODO: Enable emiting constant pool to unique sections when we support it.
2668 if (Alignment > Align(16))
2669 report_fatal_error("Alignments greater than 16 not yet supported.");
2670
2671 if (Alignment == Align(8)) {
2672 assert(ReadOnly8Section && "Section should always be initialized.");
2673 return ReadOnly8Section;
2674 }
2675
2676 if (Alignment == Align(16)) {
2677 assert(ReadOnly16Section && "Section should always be initialized.");
2678 return ReadOnly16Section;
2679 }
2680
2681 return ReadOnlySection;
2682}
2683
2685 const TargetMachine &TgtM) {
2689 (TgtM.getTargetTriple().isArch32Bit() ? dwarf::DW_EH_PE_sdata4
2692 LSDAEncoding = 0;
2694
2695 // AIX debug for thread local location is not ready. And for integrated as
2696 // mode, the relocatable address for the thread local variable will cause
2697 // linker error. So disable the location attribute generation for thread local
2698 // variables for now.
2699 // FIXME: when TLS debug on AIX is ready, remove this setting.
2701}
2702
2704 unsigned Priority, const MCSymbol *KeySym) const {
2705 report_fatal_error("no static constructor section on AIX");
2706}
2707
2709 unsigned Priority, const MCSymbol *KeySym) const {
2710 report_fatal_error("no static destructor section on AIX");
2711}
2712
2715 assert(!isa<GlobalIFunc>(GV) && "GlobalIFunc is not supported on AIX.");
2716
2717 switch (GV->getLinkage()) {
2720 return XCOFF::C_HIDEXT;
2724 return XCOFF::C_EXT;
2730 return XCOFF::C_WEAKEXT;
2733 "There is no mapping that implements AppendingLinkage for XCOFF.");
2734 }
2735 llvm_unreachable("Unknown linkage type!");
2736}
2737
2739 const GlobalValue *Func, const TargetMachine &TM) const {
2740 assert((isa<Function>(Func) || isa<GlobalIFunc>(Func) ||
2741 (isa<GlobalAlias>(Func) &&
2743 cast<GlobalAlias>(Func)->getAliaseeObject()))) &&
2744 "Func must be a function or an alias which has a function as base "
2745 "object.");
2746
2747 SmallString<128> NameStr;
2748 NameStr.push_back('.');
2749 getNameWithPrefix(NameStr, Func, TM);
2750
2751 // When -function-sections is enabled and explicit section is not specified,
2752 // it's not necessary to emit function entry point label any more. We will use
2753 // function entry point csect instead. And for function delcarations, the
2754 // undefined symbols gets treated as csect with XTY_ER property.
2755 if (((TM.getFunctionSections() && !Func->hasSection()) ||
2756 Func->isDeclarationForLinker()) &&
2757 (isa<Function>(Func) || isa<GlobalIFunc>(Func))) {
2758 return getContext()
2760 NameStr, SectionKind::getText(),
2761 XCOFF::CsectProperties(XCOFF::XMC_PR, Func->isDeclarationForLinker()
2763 : XCOFF::XTY_SD))
2765 }
2766
2767 return getContext().getOrCreateSymbol(NameStr);
2768}
2769
2771 const GlobalObject *F, const TargetMachine &TM) const {
2773 "F must be a function or ifunc object.");
2774 SmallString<128> NameStr;
2775 getNameWithPrefix(NameStr, F, TM);
2776 return getContext().getXCOFFSection(
2777 NameStr, SectionKind::getData(),
2779}
2780
2782 const MCSymbol *Sym, const TargetMachine &TM) const {
2783 const XCOFF::StorageMappingClass SMC = [](const MCSymbol *Sym,
2784 const TargetMachine &TM) {
2785 auto *XSym = static_cast<const MCSymbolXCOFF *>(Sym);
2786
2787 // The "_$TLSML" symbol for TLS local-dynamic mode requires XMC_TC,
2788 // otherwise the AIX assembler will complain.
2789 if (XSym->getSymbolTableName() == "_$TLSML")
2790 return XCOFF::XMC_TC;
2791
2792 // Use large code model toc entries for ehinfo symbols as they are
2793 // never referenced directly. The runtime loads their TOC entry
2794 // addresses from the trace-back table.
2795 if (XSym->isEHInfo())
2796 return XCOFF::XMC_TE;
2797
2798 // If the symbol does not have a code model specified use the module value.
2799 if (!XSym->hasPerSymbolCodeModel())
2800 return TM.getCodeModel() == CodeModel::Large ? XCOFF::XMC_TE
2801 : XCOFF::XMC_TC;
2802
2803 return XSym->getPerSymbolCodeModel() == MCSymbolXCOFF::CM_Large
2805 : XCOFF::XMC_TC;
2806 }(Sym, TM);
2807
2808 return getContext().getXCOFFSection(
2809 static_cast<const MCSymbolXCOFF *>(Sym)->getSymbolTableName(),
2811}
2812
2814 const Function &F, const MCSymbol &FnSym, const TargetMachine &TM) const {
2815 auto *LSDA = static_cast<MCSectionXCOFF *>(LSDASection);
2816 if (TM.getFunctionSections()) {
2817 // If option -ffunction-sections is on, append the function name to the
2818 // name of the LSDA csect so that each function has its own LSDA csect.
2819 // This helps the linker to garbage-collect EH info of unused functions.
2820 SmallString<128> NameStr = LSDA->getName();
2821 raw_svector_ostream(NameStr) << '.' << F.getName();
2822 LSDA = getContext().getXCOFFSection(NameStr, LSDA->getKind(),
2823 LSDA->getCsectProp());
2824 }
2825 return LSDA;
2826}
2827//===----------------------------------------------------------------------===//
2828// GOFF
2829//===----------------------------------------------------------------------===//
2831
2833 // Construct the default names for the root SD and the ADA PR symbol.
2834 StringRef FileName = sys::path::stem(M.getSourceFileName());
2835 if (FileName.size() > 1 && FileName.starts_with('<') &&
2836 FileName.ends_with('>'))
2837 FileName = FileName.substr(1, FileName.size() - 2);
2838 DefaultRootSDName = Twine(FileName).concat("#C").str();
2839 DefaultADAPRName = Twine(FileName).concat("#S").str();
2840 MCSectionGOFF *RootSD =
2841 static_cast<MCSectionGOFF *>(TextSection)->getParent();
2842 MCSectionGOFF *ADAPR = static_cast<MCSectionGOFF *>(ADASection);
2843 RootSD->setName(DefaultRootSDName);
2844 ADAPR->setName(DefaultADAPRName);
2845 // Initialize the label for the text section.
2846 MCSymbolGOFF *TextLD = static_cast<MCSymbolGOFF *>(
2847 getContext().getOrCreateSymbol(RootSD->getName()));
2850 TextLD->setExternal(false);
2851 TextLD->setWeak(false);
2852 TextLD->setADA(ADAPR);
2853 TextSection->setBeginSymbol(TextLD);
2854 // Initialize the label for the ADA section.
2855 MCSymbolGOFF *ADASym = static_cast<MCSymbolGOFF *>(
2857 ADAPR->setBeginSymbol(ADASym);
2858}
2859
2861 bool UsesLabelDifference, const Function &F) const {
2862 return true;
2863}
2864
2869
2871 const Function &F, const MCSymbol &FnSym, const TargetMachine &TM) const {
2872 std::string Name = ".gcc_exception_table." + F.getName().str();
2873
2874 MCSectionGOFF *WSA = getContext().getGOFFSection(
2879 static_cast<MCSectionGOFF *>(TextSection)->getParent());
2880 WSA->setAlignment(Align(4)); // Fullword
2881 return getContext().getGOFFSection(SectionKind::getData(), Name,
2885 WSA);
2886}
2887
2889 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2890 auto *Symbol = TM.getSymbol(GO);
2891
2892 if (Kind.isBSS() || Kind.isData()) {
2893 GOFF::ESDBindingScope PRBindingScope =
2894 GO->hasExternalLinkage()
2898 GOFF::ESDBindingScope SDBindingScope =
2901 MaybeAlign Alignment;
2902 if (auto *F = dyn_cast<Function>(GO))
2903 Alignment = F->getAlign();
2904 else if (auto *V = dyn_cast<GlobalVariable>(GO))
2905 Alignment = V->getAlign();
2906 MCSectionGOFF *SD = getContext().getGOFFSection(
2907 SectionKind::getMetadata(), Symbol->getName(),
2908 GOFF::SDAttr{GOFF::ESD_TA_Unspecified, SDBindingScope});
2909 MCSectionGOFF *ED = getContext().getGOFFSection(
2914 SD);
2915 ED->setAlignment(Alignment.value_or(llvm::Align(8)));
2916 return getContext().getGOFFSection(Kind, Symbol->getName(),
2917 GOFF::PRAttr{false, GOFF::ESD_EXE_DATA,
2918 GOFF::ESD_LT_XPLink,
2919 PRBindingScope, 0},
2920 ED);
2921 }
2922 return TextSection;
2923}
2924
2925MCSection *
2927 // XL C/C++ compilers on z/OS support priorities from min-int to max-int, with
2928 // sinit as source priority 0. For clang, sinit has source priority 65535.
2929 // For GOFF, the priority sortkey field is an unsigned value. So, we
2930 // add min-int to get sorting to work properly but also subtract the
2931 // clang sinit (65535) value so internally xl sinit and clang sinit have
2932 // the same unsigned GOFF priority sortkey field value (i.e. 0x80000000).
2933 static constexpr const uint32_t ClangDefaultSinitPriority = 65535;
2934 uint32_t Prio = Priority + (0x80000000 - ClangDefaultSinitPriority);
2935
2936 std::string Name(".xtor");
2937 if (Priority != ClangDefaultSinitPriority)
2938 Name = llvm::Twine(Name).concat(".").concat(llvm::utostr(Priority)).str();
2939
2940 MCContext &Ctx = getContext();
2941 MCSectionGOFF *SInit = Ctx.getGOFFSection(
2947 static_cast<const MCSectionGOFF *>(TextSection)->getParent());
2948
2949 MCSectionGOFF *Xtor = Ctx.getGOFFSection(
2950 SectionKind::getData(), Name,
2952 GOFF::ESD_BSC_Section, Prio},
2953 SInit);
2954 return Xtor;
2955}
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< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_LIFETIME_BOUND
Definition Compiler.h:446
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 StringRef handlePragmaClangSection(const GlobalObject *GO, SectionKind Kind)
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
AttributeSet getAttributes() const
Return the attribute set for this global.
bool hasImplicitSection() const
Check if section name is present.
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:66
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 * MergeableConst16Section
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 * MergeableConst32Section
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:573
void setAlignment(Align Value)
Definition MCSection.h:658
static constexpr unsigned NonUniqueID
Definition MCSection.h:578
void setBeginSymbol(MCSymbol *Sym)
Definition MCSection.h:650
StringRef getName() const
Definition MCSection.h:643
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:767
MCSection * getCurrentSectionOnly() const
Definition MCStreamer.h:438
void emitInt8(uint64_t Value)
Definition MCStreamer.h:765
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:1753
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
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
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.
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:47
@ loongarch32
Definition Triple.h:64
@ loongarch64
Definition Triple.h:65
bool isOSSolaris() const
Definition Triple.h:751
ArchType getArch() const
Get the parsed architecture type of this triple.
Definition Triple.h:511
bool isOSFreeBSD() const
Definition Triple.h:745
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
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ SHF_MERGE
Definition ELF.h:1262
@ SHF_STRINGS
Definition ELF.h:1265
@ SHF_AARCH64_PURECODE
Definition ELF.h:1354
@ SHF_EXCLUDE
Definition ELF.h:1290
@ SHF_ALLOC
Definition ELF.h:1256
@ SHF_LINK_ORDER
Definition ELF.h:1271
@ SHF_GROUP
Definition ELF.h:1278
@ SHF_SUNW_NODISCARD
Definition ELF.h:1297
@ SHF_X86_64_LARGE
Definition ELF.h:1319
@ SHF_GNU_RETAIN
Definition ELF.h:1287
@ SHF_WRITE
Definition ELF.h:1253
@ SHF_TLS
Definition ELF.h:1281
@ SHF_ARM_PURECODE
Definition ELF.h:1351
@ SHF_EXECINSTR
Definition ELF.h:1259
@ SHT_LLVM_DEPENDENT_LIBRARIES
Definition ELF.h:1186
@ SHT_PROGBITS
Definition ELF.h:1155
@ SHT_LLVM_LINKER_OPTIONS
Definition ELF.h:1183
@ SHT_NOBITS
Definition ELF.h:1162
@ SHT_LLVM_OFFLOADING
Definition ELF.h:1194
@ SHT_LLVM_LTO
Definition ELF.h:1195
@ SHT_PREINIT_ARRAY
Definition ELF.h:1168
@ SHT_INIT_ARRAY
Definition ELF.h:1166
@ SHT_NOTE
Definition ELF.h:1161
@ SHT_FINI_ARRAY
Definition ELF.h:1167
@ 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:887
@ DW_EH_PE_pcrel
Definition Dwarf.h:885
@ DW_EH_PE_sdata4
Definition Dwarf.h:882
@ DW_EH_PE_sdata8
Definition Dwarf.h:883
@ DW_EH_PE_absptr
Definition Dwarf.h:874
@ DW_EH_PE_udata4
Definition Dwarf.h:878
@ DW_EH_PE_udata8
Definition Dwarf.h:879
@ DW_EH_PE_indirect
Definition Dwarf.h:890
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:94
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:908
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