81 cl::desc(
"Putting Jump Table in function section"));
86 M.getModuleFlagsMetadata(ModuleFlags);
88 for (
const auto &MFE: ModuleFlags) {
94 if (
Key ==
"Objective-C Image Info Version") {
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") {
102 }
else if (
Key ==
"Objective-C Image Info Section") {
107 else if (
Key ==
"Swift ABI Version") {
109 }
else if (
Key ==
"Swift Major Version") {
111 }
else if (
Key ==
"Swift Minor Version") {
313 if (
NamedMDNode *DependentLibraries = M.getNamedMetadata(
"llvm.dependent-libraries")) {
319 for (
const auto *Operand : DependentLibraries->operands()) {
328 if (
NamedMDNode *LLVMStats = M.getNamedMetadata(
"llvm.stats")) {
331 auto *S =
C.getObjectFileInfo()->getLLVMStatsSection();
333 for (
const auto *Operand : LLVMStats->operands()) {
335 assert(MD->getNumOperands() % 2 == 0 &&
336 (
"Operand num should be even for a list of key/value pair"));
337 for (
size_t I = 0;
I < MD->getNumOperands();
I += 2) {
358 if (!Section.empty()) {
373 if (
NamedMDNode *LinkerOptions = M.getNamedMetadata(
"llvm.linker.options")) {
379 for (
const auto *Operand : LinkerOptions->operands()) {
382 for (
const auto &Option :
cast<MDNode>(Operand)->operands()) {
396 TM.getSymbol(GV)->getName());
398 return TM.getSymbol(GV);
414 unsigned Size =
DL.getPointerSize();
472 Name ==
".llvmbc" || Name ==
".llvmcmd")
475 if (!Name.starts_with(
"."))
return K;
478 if (Name ==
".bss" || Name.starts_with(
".bss.") ||
479 Name.starts_with(
".gnu.linkonce.b.") ||
480 Name.starts_with(
".llvm.linkonce.b.") || Name ==
".sbss" ||
481 Name.starts_with(
".sbss.") || Name.starts_with(
".gnu.linkonce.sb.") ||
482 Name.starts_with(
".llvm.linkonce.sb."))
485 if (Name ==
".tdata" || Name.starts_with(
".tdata.") ||
486 Name.starts_with(
".gnu.linkonce.td.") ||
487 Name.starts_with(
".llvm.linkonce.td."))
490 if (Name ==
".tbss" || Name.starts_with(
".tbss.") ||
491 Name.starts_with(
".gnu.linkonce.tb.") ||
492 Name.starts_with(
".llvm.linkonce.tb."))
507 if (Name.starts_with(
".note"))
521 if (Name ==
".llvm.lto")
524 if (K.isBSS() || K.isThreadBSS())
533 if (!K.isMetadata() && !K.isExclude())
542 if (K.isExecuteOnly()) {
545 else if (
T.isARM() ||
T.isThumb())
552 if (K.isThreadLocal())
555 if (K.isMergeableCString() || K.isMergeableConst())
558 if (K.isMergeableCString())
572 "SelectionKind::NoDeduplicate, '" +
573 C->getName() +
"' cannot be lowered.");
591 if (Kind.isMergeable1ByteCString())
593 else if (Kind.isMergeable2ByteCString())
595 else if (Kind.isMergeable4ByteCString())
597 else if (Kind.isMergeableConst4())
599 else if (Kind.isMergeableConst8())
601 else if (Kind.isMergeableConst16())
603 else if (Kind.isMergeableConst32())
608 assert(!Kind.isMergeableCString() &&
"unknown string width");
609 assert(!Kind.isMergeableConst() &&
"unknown data width");
618 return IsLarge ?
".ltext" :
".text";
619 if (Kind.isReadOnly())
620 return IsLarge ?
".lrodata" :
".rodata";
622 return IsLarge ?
".lbss" :
".bss";
623 if (Kind.isThreadData())
625 if (Kind.isThreadBSS())
628 return IsLarge ?
".ldata" :
".data";
629 if (Kind.isReadOnlyWithRel())
630 return IsLarge ?
".ldata.rel.ro" :
".data.rel.ro";
637 bool UniqueSectionName,
642 if (Kind.isMergeableCString()) {
650 Name +=
utostr(EntrySize);
653 }
else if (Kind.isMergeableConst()) {
655 Name +=
utostr(EntrySize);
658 bool HasPrefix =
false;
668 "Hotness must be cold");
672 }
else if (std::optional<StringRef> Prefix =
F->getSectionPrefix()) {
677 if (std::optional<StringRef> Prefix = GV->getSectionPrefix()) {
683 if (UniqueSectionName) {
686 }
else if (HasPrefix)
700 : DiagnosticInfo(
DK_Lowering, Severity), Msg(DiagMsg) {}
701 void print(DiagnosticPrinter &DP)
const override { DP << Msg; }
711 unsigned &EntrySize,
unsigned &NextUniqueID,
712 const bool Retain,
const bool ForceUnique) {
717 return NextUniqueID++;
721 const bool Associated = GO->
getMetadata(LLVMContext::MD_associated);
724 return NextUniqueID++;
730 else if (Ctx.getAsmInfo().useIntegratedAssembler() ||
731 Ctx.getAsmInfo().binutilsIsAtLeast(2, 36))
733 return NextUniqueID++;
742 const bool SupportsUnique = Ctx.getAsmInfo().useIntegratedAssembler() ||
743 Ctx.getAsmInfo().binutilsIsAtLeast(2, 35);
744 if (!SupportsUnique) {
745 Flags &=
~ELF::SHF_MERGE;
751 const bool SeenSectionNameBefore =
755 if (!SymbolMergeable && !SeenSectionNameBefore) {
757 return NextUniqueID++;
765 const auto PreviousID =
766 Ctx.getELFUniqueIDForEntsize(
SectionName, Flags, EntrySize);
777 if (SymbolMergeable &&
778 Ctx.isELFImplicitMergeableSectionNamePrefix(
SectionName) &&
784 return NextUniqueID++;
787static std::tuple<StringRef, bool, unsigned, unsigned, unsigned>
791 bool IsComdat =
false;
795 Group =
C->getName();
801 unsigned Type, EntrySize;
816 return {Group, IsComdat, Flags,
Type, EntrySize};
827 if (Attrs.hasAttribute(
"bss-section") && Kind.isBSS())
828 return Attrs.getAttribute(
"bss-section").getValueAsString();
829 else if (Attrs.hasAttribute(
"rodata-section") && Kind.isReadOnly())
830 return Attrs.getAttribute(
"rodata-section").getValueAsString();
831 else if (Attrs.hasAttribute(
"relro-section") && Kind.isReadOnlyWithRel())
832 return Attrs.getAttribute(
"relro-section").getValueAsString();
833 else if (Attrs.hasAttribute(
"data-section") && Kind.isData())
834 return Attrs.getAttribute(
"data-section").getValueAsString();
844 unsigned &NextUniqueID,
845 bool Retain,
bool ForceUnique) {
852 auto [Group, IsComdat, ExtraFlags,
Type, EntrySize] =
857 GO,
SectionName, Kind, TM, Ctx, Mang, Flags, EntrySize, NextUniqueID,
862 Ctx.getELFSection(
SectionName,
Type, Flags, EntrySize, Group, IsComdat,
866 assert(Section->getLinkedToSymbol() == LinkedToSym &&
867 "Associated symbol mismatch between sections");
869 if (!(Ctx.getAsmInfo().useIntegratedAssembler() ||
870 Ctx.getAsmInfo().binutilsIsAtLeast(2, 35))) {
877 "Symbol '" + GO->
getName() +
"' from module '" +
879 "' required a section with entry-size=" +
882 ": Explicit assignment by pragma or attribute of an incompatible "
883 "symbol to this section?"));
892 NextUniqueID, Used.count(GO),
898 const TargetMachine &TM,
bool EmitUniqueSection,
unsigned Flags,
899 unsigned *NextUniqueID,
const MCSymbolELF *AssociatedSymbol,
901 bool UniqueSectionName =
false;
903 if (EmitUniqueSection) {
905 UniqueSectionName =
true;
914 auto [Group, IsComdat, ExtraFlags,
Type, EntrySize] =
919 if (Kind.isExecuteOnly())
921 return Ctx.getELFSection(Name,
Type, Flags, EntrySize, Group, IsComdat,
928 unsigned Flags,
unsigned *NextUniqueID) {
931 EmitUniqueSection =
true;
936 EmitUniqueSection =
true;
938 }
else if (Ctx.getAsmInfo().useIntegratedAssembler() ||
939 Ctx.getAsmInfo().binutilsIsAtLeast(2, 36)) {
940 EmitUniqueSection =
true;
944 if (GO->
hasMetadata(LLVMContext::MD_elf_section_properties))
945 EmitUniqueSection =
true;
948 Ctx, GO, Kind, Mang, TM, EmitUniqueSection, Flags,
949 NextUniqueID, LinkedToSym);
950 assert(Section->getLinkedToSymbol() == LinkedToSym);
960 bool EmitUniqueSection =
false;
963 EmitUniqueSection =
TM.getFunctionSections();
965 EmitUniqueSection =
TM.getDataSections();
969 Used.count(GO), EmitUniqueSection, Flags,
982 Used.count(&
F),
true);
986 true, Flags, &NextUniqueID);
1000 bool EmitUniqueSection =
TM.getFunctionSections() ||
C;
1001 if (!EmitUniqueSection && !
TM.getEnableStaticDataPartitioning())
1014 if (!
LSDASection || (!
F.hasComdat() && !
TM.getFunctionSections()))
1021 bool IsComdat =
false;
1024 Group =
C->getName();
1029 if (
TM.getFunctionSections() &&
1030 (
getContext().getAsmInfo().useIntegratedAssembler() &&
1031 getContext().getAsmInfo().binutilsIsAtLeast(2, 36))) {
1033 LinkedToSym =
static_cast<const MCSymbolELF *
>(&FnSym);
1039 (
TM.getUniqueSectionNames() ? LSDA->getName() +
"." +
F.getName()
1046 bool UsesLabelDifference,
const Function &
F)
const {
1065 if (Kind.isReadOnly())
1068 assert(Kind.isReadOnlyWithRel() &&
"Unknown section kind");
1077 if (SectionSuffix.
empty())
1086 CstPrefix =
".lrodata";
1090 return Context.getELFSection(CstPrefix +
".cst4." + SectionSuffix +
".",
1093 return Context.getELFSection(CstPrefix +
".cst8." + SectionSuffix +
".",
1096 return Context.getELFSection(CstPrefix +
".cst16." + SectionSuffix +
".",
1099 return Context.getELFSection(CstPrefix +
".cst32." + SectionSuffix +
".",
1101 if (Kind.isReadOnly())
1102 return Context.getELFSection(
".rodata." + SectionSuffix +
".",
1105 assert(Kind.isReadOnlyWithRel() &&
"Unknown section kind");
1106 return Context.getELFSection(
".data.rel.ro." + SectionSuffix +
".",
1115 assert(
MBB.isBeginSection() &&
"Basic block does not start a section!");
1124 StringRef FunctionSectionName =
MBB.getParent()->getSection()->getName();
1125 if (FunctionSectionName ==
".text" ||
1131 Name += FunctionName;
1133 Name +=
".text.eh.";
1134 Name += FunctionName;
1136 Name += FunctionSectionName;
1137 if (
TM.getUniqueBasicBlockSectionNames()) {
1138 if (!Name.ends_with(
"."))
1140 Name +=
MBB.getSymbol()->getName();
1148 Name = FunctionSectionName;
1153 std::string GroupName;
1154 if (
F.hasComdat()) {
1156 GroupName =
F.getComdat()->getName().str();
1164 bool IsCtor,
unsigned Priority,
1177 Name =
".init_array";
1180 Name =
".fini_array";
1182 if (Priority != 65535) {
1184 Name +=
utostr(Priority);
1193 if (Priority != 65535)
1198 return Ctx.getELFSection(Name,
Type, Flags, 0,
Comdat,
true);
1202 unsigned Priority,
const MCSymbol *KeySym)
const {
1208 unsigned Priority,
const MCSymbol *KeySym)
const {
1215 std::optional<int64_t> PCRelativeOffset)
const {
1223 Addend += *PCRelativeOffset;
1244 std::optional<int64_t> PCRelativeOffset,
const TargetMachine &
TM)
const {
1265 UseInitArray = UseInitArray_;
1267 if (!UseInitArray) {
1315 unsigned Priority,
const MCSymbol *KeySym)
const {
1331 unsigned VersionVal = 0;
1332 unsigned ImageInfoFlags = 0;
1339 if (SectionVal.
empty())
1343 unsigned TAA = 0, StubSize = 0;
1346 SectionVal, Segment, Section, TAA, TAAParsed, StubSize)) {
1349 "': " +
toString(std::move(E)) +
".");
1357 getOrCreateSymbol(
StringRef(
"L_OBJC_IMAGE_INFO")));
1365 if (
auto *LinkerOptions = M.getNamedMetadata(
"llvm.linker.options")) {
1366 for (
const auto *Option : LinkerOptions->operands()) {
1368 for (
const auto &Piece :
cast<MDNode>(Option)->operands())
1381 "' cannot be lowered.");
1391 unsigned TAA = 0, StubSize = 0;
1397 SectionName, Segment, Section, TAA, TAAParsed, StubSize)) {
1400 "' has an invalid section specifier '" +
1419 "' section type or attributes does not match previous"
1420 " section specifier");
1440 if (Kind.isReadOnly())
1442 if (Kind.isReadOnlyWithRel())
1448 if (Kind.isMergeable1ByteCString() &&
1464 if (Kind.isMergeableConst4())
1466 if (Kind.isMergeableConst8())
1468 if (Kind.isMergeableConst16())
1474 if (Kind.isReadOnly())
1479 if (Kind.isReadOnlyWithRel())
1484 if (Kind.isBSSExtern())
1489 if (Kind.isBSSLocal())
1501 if (Kind.isData() || Kind.isReadOnlyWithRel())
1504 if (Kind.isMergeableConst4())
1506 if (Kind.isMergeableConst8())
1508 if (Kind.isMergeableConst16())
1622 MCSymbol *Stub = Ctx.getOrCreateSymbol(Name);
1656 bool CannotUsePrivateLabel =
true;
1677 else if (K.isExclude())
1680 else if (K.isText())
1691 else if (K.isThreadLocal())
1696 else if (K.isReadOnly() || K.isReadOnlyWithRel())
1700 else if (K.isWriteable())
1711 assert(
C &&
"expected GV to have a Comdat!");
1717 "' does not exist.");
1721 "' is not a key for its COMDAT.");
1731 if (ComdatKey == GV) {
1732 switch (
C->getSelectionKind()) {
1762 Name ==
".llvmbc" || Name ==
".llvmcmd")
1776 MCSymbol *Sym = TM.getSymbol(ComdatGV);
1777 COMDATSymName = Sym->
getName();
1793 if (Kind.isThreadLocal())
1795 if (Kind.isReadOnly() || Kind.isReadOnlyWithRel())
1804 bool EmitUniquedSection;
1806 EmitUniquedSection = TM.getFunctionSections();
1808 EmitUniquedSection = TM.getDataSections();
1810 if ((EmitUniquedSection && !Kind.isCommon()) || GO->
hasComdat()) {
1826 if (EmitUniquedSection)
1830 MCSymbol *Sym = TM.getSymbol(ComdatGV);
1834 if (std::optional<StringRef> Prefix =
F->getSectionPrefix())
1840 if (
getContext().getTargetTriple().isOSCygMing())
1856 if (Kind.isThreadLocal())
1859 if (Kind.isReadOnly() || Kind.isReadOnlyWithRel())
1865 if (Kind.isBSS() || Kind.isCommon())
1874 bool CannotUsePrivateLabel =
false;
1878 CannotUsePrivateLabel =
true;
1888 bool EmitUniqueSection = TM.getFunctionSections() ||
C;
1889 if (!EmitUniqueSection)
1893 if (
F.hasPrivateLinkage())
1903 unsigned UniqueID = NextUniqueID++;
1911 bool UsesLabelDifference,
const Function &
F)
const {
1920 UsesLabelDifference,
F);
1932 if (!Section.empty()) {
1948 if (Sym->isUndefined()) {
1958 if (
NamedMDNode *LinkerOptions = M.getNamedMetadata(
"llvm.linker.options")) {
1964 for (
const auto *Option : LinkerOptions->operands()) {
1965 for (
const auto &Piece :
cast<MDNode>(Option)->operands()) {
1980 if (!Flags.empty()) {
1988 if (
const auto *LU = M.getNamedGlobal(
"llvm.used")) {
1989 assert(LU->hasInitializer() &&
"expected llvm.used to have an initializer");
1991 "expected llvm.used to be an array type");
1993 for (
const Value *
Op :
A->operands()) {
1998 if (GV->hasLocalLinkage())
2005 if (!Flags.empty()) {
2019 const Triple &
T = TM.getTargetTriple();
2020 if (
T.isWindowsMSVCEnvironment() ||
T.isWindowsItaniumEnvironment()) {
2042 if (
T.isWindowsMSVCEnvironment() ||
T.isWindowsItaniumEnvironment()) {
2044 if (Priority == 65535)
2045 return Ctx.getAssociativeCOFFSection(
Default, KeySym, 0);
2058 char LastLetter =
'T';
2059 bool AddPrioritySuffix = Priority != 200 && Priority != 400;
2062 else if (Priority < 400)
2064 else if (Priority == 400)
2067 OS <<
".CRT$X" << (IsCtor ?
"C" :
"T") << LastLetter;
2068 if (AddPrioritySuffix)
2069 OS <<
format(
"%05u", Priority);
2072 return Ctx.getAssociativeCOFFSection(Sec, KeySym, 0);
2075 std::string Name = IsCtor ?
".ctors" :
".dtors";
2076 if (Priority != 65535)
2079 return Ctx.getAssociativeCOFFSection(
2087 unsigned Priority,
const MCSymbol *KeySym)
const {
2094 unsigned Priority,
const MCSymbol *KeySym)
const {
2102 std::optional<int64_t> PCRelativeOffset,
const TargetMachine &TM)
const {
2103 const Triple &
T = TM.getTargetTriple();
2104 if (
T.isOSCygMing())
2109 if (LHS->getType()->getPointerAddressSpace() != 0 ||
2110 RHS->getType()->getPointerAddressSpace() != 0)
2121 LHS->isThreadLocal() || RHS->isThreadLocal() ||
2122 RHS->getName() !=
"__ImageBase" || !RHS->hasExternalLinkage() ||
2136 std::string HexString =
toString(AI, 16,
false);
2138 unsigned Size = HexString.size();
2139 assert(Width >=
Size &&
"hex string is too large!");
2140 HexString.insert(HexString.begin(), Width -
Size,
'0');
2146 Type *Ty =
C->getType();
2150 if (CFP->getType()->isFloatingPointTy())
2153 std::string HexString;
2154 unsigned NumElements =
2156 for (
unsigned I = 0;
I < NumElements; ++
I)
2160 if (CI->getType()->isIntegerTy())
2163 std::string HexString;
2164 unsigned NumElements =
2166 for (
unsigned I = 0;
I < NumElements; ++
I)
2170 unsigned NumElements;
2174 NumElements = Ty->getArrayNumElements();
2175 std::string HexString;
2176 for (
int I = NumElements - 1,
E = -1;
I !=
E; --
I)
2185 if (Kind.isMergeableConst() &&
C &&
2186 getContext().getAsmInfo().hasCOFFComdatConstants()) {
2194 std::string COMDATSymName;
2195 if (Kind.isMergeableConst4()) {
2196 if (Alignment <= 4) {
2198 Alignment =
Align(4);
2200 }
else if (Kind.isMergeableConst8()) {
2201 if (Alignment <= 8) {
2203 Alignment =
Align(8);
2205 }
else if (Kind.isMergeableConst16()) {
2207 if (Alignment <= 16) {
2209 Alignment =
Align(16);
2211 }
else if (Kind.isMergeableConst32()) {
2212 if (Alignment <= 32) {
2214 Alignment =
Align(32);
2218 if (!COMDATSymName.empty())
2239 "SelectionKind::Any, '" +
C->getName() +
"' cannot be "
2248 if (K.isThreadLocal())
2251 if (K.isMergeableCString())
2289 Name ==
".llvmbc" || Name ==
".llvmcmd")
2294 Group =
C->getName();
2308 unsigned *NextUniqueID,
bool Retain) {
2311 Group =
C->getName();
2318 const auto &OptionalPrefix =
F->getSectionPrefix();
2323 if (EmitUniqueSection && UniqueSectionNames) {
2324 Name.push_back(
'.');
2328 if (EmitUniqueSection && !UniqueSectionNames) {
2334 return Ctx.getWasmSection(Name, Kind, Flags, Group,
UniqueID);
2340 if (Kind.isCommon())
2345 bool EmitUniqueSection =
false;
2347 EmitUniqueSection =
TM.getFunctionSections();
2349 EmitUniqueSection =
TM.getDataSections();
2351 bool Retain = Used.count(GO);
2352 EmitUniqueSection |=
Retain;
2355 EmitUniqueSection, &NextUniqueID,
Retain);
2359 bool UsesLabelDifference,
const Function &
F)
const {
2375 unsigned Priority,
const MCSymbol *KeySym)
const {
2376 return Priority == UINT16_MAX ?
2383 unsigned Priority,
const MCSymbol *KeySym)
const {
2396 if (!
F.hasPersonalityFn() || !
F.needsUnwindTableEntry())
2401 assert(Per &&
"Personality routine is not a GlobalValue type.");
2411 if (!
F.hasStackProtectorFnAttr())
2442 if (GO->isDeclarationForLinker())
2445 ->getQualNameSymbol();
2448 if (GVar->hasAttribute(
"toc-data"))
2451 ->getQualNameSymbol();
2456 ->getQualNameSymbol();
2462 ->getQualNameSymbol();
2463 if ((
TM.getDataSections() && !GO->hasSection()) || GO->hasCommonLinkage() ||
2467 ->getQualNameSymbol();
2483 if (GVar->hasAttribute(
"toc-data"))
2492 else if (Kind.isData() || Kind.isBSS())
2494 else if (Kind.isReadOnlyWithRel())
2497 else if (Kind.isReadOnly())
2510 "Tried to get ER section for a defined global.");
2530 if (GVar->hasAttribute(
"toc-data"))
2543 if (GVar->hasAttribute(
"toc-data")) {
2557 if (Kind.isBSSLocal() || GO->
hasCommonLinkage() || Kind.isThreadBSSLocal()) {
2567 if (Kind.isText()) {
2568 if (
TM.getFunctionSections()) {
2571 ->getRepresentedCsect();
2576 if (
TM.Options.XCOFFReadOnlyPointers && Kind.isReadOnlyWithRel()) {
2577 if (!
TM.getDataSections())
2579 "ReadOnlyPointers is supported only if data sections is turned on");
2592 if (Kind.isData() || Kind.isReadOnlyWithRel() || Kind.isBSS()) {
2593 if (
TM.getDataSections()) {
2603 if (Kind.isReadOnly()) {
2604 if (
TM.getDataSections()) {
2618 if (Kind.isThreadLocal()) {
2619 if (
TM.getDataSections()) {
2633 assert (!
F.getComdat() &&
"Comdat not supported on XCOFF.");
2635 if (!
TM.getFunctionSections())
2648 bool UsesLabelDifference,
const Function &
F)
const {
2658 if (Alignment >
Align(16))
2661 if (Alignment ==
Align(8)) {
2666 if (Alignment ==
Align(16)) {
2694 unsigned Priority,
const MCSymbol *KeySym)
const {
2699 unsigned Priority,
const MCSymbol *KeySym)
const {
2723 "There is no mapping that implements AppendingLinkage for XCOFF.");
2734 "Func must be a function or an alias which has a function as base "
2745 if (((
TM.getFunctionSections() && !Func->hasSection()) ||
2746 Func->isDeclarationForLinker()) &&
2763 "F must be a function or ifunc object.");
2779 if (XSym->getSymbolTableName() ==
"_$TLSML")
2785 if (XSym->isEHInfo())
2789 if (!XSym->hasPerSymbolCodeModel())
2799 static_cast<const MCSymbolXCOFF *
>(Sym)->getSymbolTableName(),
2806 if (
TM.getFunctionSections()) {
2813 LSDA->getCsectProp());
2827 FileName = FileName.
substr(1, FileName.
size() - 2);
2833 RootSD->
setName(DefaultRootSDName);
2834 ADAPR->
setName(DefaultADAPRName);
2851 bool UsesLabelDifference,
const Function &
F)
const {
2862 std::string Name =
".gcc_exception_table." +
F.getName().str();
2880 auto *Symbol =
TM.getSymbol(GO);
2882 if (Kind.isBSS() || Kind.isData()) {
2893 Alignment =
F->getAlign();
2895 Alignment = V->getAlign();
2901 GOFF::SDAttr{GOFF::ESD_TA_Unspecified, SDBindingScope});
2908 return getContext().getGOFFSection(Kind, Symbol->getName(),
2910 GOFF::ESD_LT_XPLink,
2925 static constexpr const uint32_t ClangDefaultSinitPriority = 65535;
2926 uint32_t Prio = Priority + (0x80000000 - ClangDefaultSinitPriority);
2928 std::string Name(
".xtor");
2929 if (Priority != ClangDefaultSinitPriority)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
amdgpu AMDGPU DAG DAG Pattern Instruction Selection
static bool isThumb(const MCSubtargetInfo &STI)
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
This file contains the declarations for the subclasses of Constant, which represent the different fla...
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.
This file defines the SmallString class.
This file defines the SmallVector class.
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.
unsigned getBitWidth() const
Return the number of bits in the APInt.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
@ Largest
The linker will choose the largest COMDAT.
@ SameSize
The data referenced by the COMDAT must be the same size.
@ Any
The linker may choose any COMDAT.
@ NoDeduplicate
No deduplication is performed.
@ ExactMatch
The data referenced by the COMDAT must be the same.
This is an important base class in LLVM.
A parsed version of the target data layout string in and methods for querying it.
StringRef getInternalSymbolPrefix() const
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.
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.
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
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
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
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.
@ CommonLinkage
Tentative definitions.
@ InternalLinkage
Rename collisions when linking (static functions).
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
@ WeakODRLinkage
Same, but only replaced by something equivalent.
@ ExternalLinkage
Externally visible function.
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
@ AppendingLinkage
Special purpose, only applies to global arrays.
@ AvailableExternallyLinkage
Available for inspection, not emission.
@ ExternalWeakLinkage
ExternalWeak linkage description.
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
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...
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
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)
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)
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.
MCSection * TLSBSSSection
Section directive for Thread Local uninitialized data.
MCSection * MergeableConst16Section
MCSection * MergeableConst4Section
MCSection * TextSection
Section directive for standard text.
MCSection * ConstDataCoalSection
MCSection * ConstTextCoalSection
MCSection * TLSDataSection
Section directive for Thread Local data. ELF, MachO, COFF, and Wasm.
MCSection * MergeableConst8Section
MCSection * LSDASection
If exception handling is supported by the target, this is the section the Language Specific Data Area...
MCSection * ReadOnly16Section
MCSection * FourByteConstantSection
MCSection * ReadOnly8Section
MCSection * DataBSSSection
MCSection * getDrectveSection() const
MCSection * TextCoalSection
MCSection * DataRelROSection
MCSection * CStringSection
bool isPositionIndependent() const
MCSection * DataCoalSection
MCSection * UStringSection
MCSection * MergeableConst32Section
MCSection * SixteenByteConstantSection
MCSection * DataCommonSection
MCSection * ReadOnlySection
Section that is readonly and can contain arbitrary initialized data.
MCSection * BSSSection
Section that is default initialized to zero.
MCSection * EightByteConstantSection
MCSection * ConstDataSection
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.
static constexpr unsigned NonUniqueID
void setBeginSymbol(MCSymbol *Sym)
StringRef getName() const
static const MCSpecifierExpr * create(const MCExpr *Expr, Spec S, MCContext &Ctx, SMLoc Loc=SMLoc())
Streaming machine code generation interface.
virtual void addBlankLine()
Emit a blank line to a .s file to pretty it up.
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.
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)
MCSection * getCurrentSectionOnly() const
void emitInt8(uint64_t Value)
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())
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
StringRef getName() const
getName - Get the symbol name.
int64_t getConstant() const
const MCSymbol * getSubSym() const
const MDOperand & getOperand(unsigned I) const
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.
A Module instance is used to store all the information related to an LLVM module.
@ Require
Adds a requirement that another module flag be present and have a specified value after linking is pe...
const std::string & getSourceFileName() const
Get the module's original source file name.
GlobalValue * getNamedValue(StringRef Name) const
Return the global value in the module with the specified name, of arbitrary type.
const DataLayout & getDataLayout() const
Get the data layout for the module's target platform.
PointerTy getPointer() const
SectionKind - This is a simple POD value that classifies the properties of a section.
static SectionKind getThreadData()
static SectionKind getMetadata()
bool isThreadBSSLocal() const
static SectionKind getText()
static SectionKind getData()
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...
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.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
Check if the string is empty.
constexpr size_t size() const
Get the string size.
bool ends_with(StringRef Suffix) const
Check if this string ends with the given Suffix.
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
uint16_t PLTRelativeSpecifier
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
void InitializeELF(bool UseInitArray_)
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
TargetLoweringObjectFileGOFF()
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
TargetLoweringObjectFileMachO()
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.
Mangler & getMangler() const
bool SupportIndirectSymViaGOTPCRel
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
bool SupportDebugThreadLocalLocation
virtual void Initialize(MCContext &ctx, const TargetMachine &TM)
This method must be called before any actual lowering is done.
unsigned getPersonalityEncoding() const
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...
uint32_t PLTPCRelativeSpecifier
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...
unsigned CallSiteEncoding
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
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.
Triple - Helper class for working with autoconf configuration names.
ArchType getArch() const
Get the parsed architecture type of this triple.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
Twine concat(const Twine &Suffix) const
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
A raw_ostream that writes to an std::string.
A raw_ostream that writes to an SmallVector or SmallString.
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.
@ IMAGE_SCN_CNT_UNINITIALIZED_DATA
@ IMAGE_SCN_MEM_DISCARDABLE
@ IMAGE_SCN_CNT_INITIALIZED_DATA
@ IMAGE_COMDAT_SELECT_NODUPLICATES
@ IMAGE_COMDAT_SELECT_LARGEST
@ IMAGE_COMDAT_SELECT_SAME_SIZE
@ IMAGE_COMDAT_SELECT_ASSOCIATIVE
@ IMAGE_COMDAT_SELECT_EXACT_MATCH
@ IMAGE_COMDAT_SELECT_ANY
@ C
The default llvm calling convention, compatible with C.
@ SHT_LLVM_DEPENDENT_LIBRARIES
@ SHT_LLVM_LINKER_OPTIONS
constexpr StringLiteral CLASS_WSA
constexpr StringLiteral CLASS_SINIT
@ S_MOD_TERM_FUNC_POINTERS
S_MOD_TERM_FUNC_POINTERS - Section with only function pointers for termination.
@ S_MOD_INIT_FUNC_POINTERS
S_MOD_INIT_FUNC_POINTERS - Section with only function pointers for initialization.
StorageMappingClass
Storage Mapping Class definitions.
@ XMC_TE
Symbol mapped at the end of TOC.
@ XMC_DS
Descriptor csect.
@ XMC_TL
Initialized thread-local variable.
@ XMC_RO
Read Only Constant.
@ XMC_UA
Unclassified - Treated as Read Write.
@ XMC_TD
Scalar data item in the TOC.
@ XMC_UL
Uninitialized thread-local variable.
@ XMC_BS
BSS class (uninitialized static internal)
@ XMC_TC
General TOC item.
@ XTY_CM
Common csect definition. For uninitialized storage.
@ XTY_SD
Csect definition for initialized storage.
@ XTY_ER
External reference.
initializer< Ty > init(const Ty &Val)
Calculates the starting offsets for various sections within the .debug_names section.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
LLVM_ABI StringRef stem(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get stem.
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
std::string utostr(uint64_t X, bool isNeg=false)
bool isa_and_nonnull(const Y &Val)
LLVM_ABI std::string getInstrProfSectionName(InstrProfSectKind IPSK, Triple::ObjectFormatType OF, bool AddSegmentInfo=true)
Return the name of the profile section corresponding to IPSK.
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.
std::string encodeBase64(InputBytes const &Bytes)
FunctionAddr VTableAddr uintptr_t uintptr_t Version
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
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)
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...
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
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)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
unsigned Log2(Align A)
Returns the log2 of the alignment.
LLVM_ABI cl::opt< std::string > BBSectionsColdTextPrefix
@ 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 ...
This struct is a compact representation of a valid (non-zero power of two) alignment.
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
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.