76 cl::desc(
"Putting Jump Table in function section"));
81 M.getModuleFlagsMetadata(ModuleFlags);
83 for (
const auto &MFE: ModuleFlags) {
89 if (Key ==
"Objective-C Image Info Version") {
90 Version = mdconst::extract<ConstantInt>(MFE.Val)->getZExtValue();
91 }
else if (Key ==
"Objective-C Garbage Collection" ||
92 Key ==
"Objective-C GC Only" ||
93 Key ==
"Objective-C Is Simulated" ||
94 Key ==
"Objective-C Class Properties" ||
95 Key ==
"Objective-C Image Swift Version") {
96 Flags |= mdconst::extract<ConstantInt>(MFE.Val)->getZExtValue();
97 }
else if (Key ==
"Objective-C Image Info Section") {
98 Section = cast<MDString>(MFE.Val)->getString();
102 else if (Key ==
"Swift ABI Version") {
103 Flags |= (mdconst::extract<ConstantInt>(MFE.Val)->getZExtValue()) << 8;
104 }
else if (Key ==
"Swift Major Version") {
105 Flags |= (mdconst::extract<ConstantInt>(MFE.Val)->getZExtValue()) << 24;
106 }
else if (Key ==
"Swift Minor Version") {
107 Flags |= (mdconst::extract<ConstantInt>(MFE.Val)->getZExtValue()) << 16;
302 if (
auto *GO = dyn_cast<GlobalObject>(GV))
310 if (
NamedMDNode *LinkerOptions = M.getNamedMetadata(
"llvm.linker.options")) {
316 for (
const auto *Operand : LinkerOptions->operands()) {
317 if (cast<MDNode>(Operand)->getNumOperands() != 2)
319 for (
const auto &Option : cast<MDNode>(Operand)->operands()) {
320 Streamer.
emitBytes(cast<MDString>(Option)->getString());
326 if (
NamedMDNode *DependentLibraries = M.getNamedMetadata(
"llvm.dependent-libraries")) {
332 for (
const auto *Operand : DependentLibraries->operands()) {
334 cast<MDString>(cast<MDNode>(Operand)->getOperand(0))->getString());
346 for (
const auto *Operand : FuncInfo->operands()) {
347 const auto *MD = cast<MDNode>(Operand);
348 auto *GUID = mdconst::dyn_extract<ConstantInt>(MD->getOperand(0));
349 auto *Hash = mdconst::dyn_extract<ConstantInt>(MD->getOperand(1));
350 auto *
Name = cast<MDString>(MD->getOperand(2));
351 auto *S =
C.getObjectFileInfo()->getPseudoProbeDescSection(
355 Streamer.
emitInt64(GUID->getZExtValue());
356 Streamer.
emitInt64(Hash->getZExtValue());
362 if (
NamedMDNode *LLVMStats = M.getNamedMetadata(
"llvm.stats")) {
365 auto *S =
C.getObjectFileInfo()->getLLVMStatsSection();
367 for (
const auto *Operand : LLVMStats->operands()) {
368 const auto *MD = cast<MDNode>(Operand);
369 assert(MD->getNumOperands() % 2 == 0 &&
370 (
"Operand num should be even for a list of key/value pair"));
371 for (
size_t I = 0;
I < MD->getNumOperands();
I += 2) {
373 auto *Key = cast<MDString>(MD->getOperand(
I));
378 Twine(mdconst::dyn_extract<ConstantInt>(MD->getOperand(
I + 1))
387 unsigned Version = 0;
392 if (!Section.empty()) {
419 NameData +=
Sym->getName();
421 cast<MCSymbolELF>(
getContext().getOrCreateSymbol(NameData));
427 unsigned Size =
DL.getPointerSize();
479 Name ==
".llvmbc" ||
Name ==
".llvmcmd")
482 if (!
Name.starts_with(
"."))
return K;
485 if (
Name ==
".bss" ||
Name.starts_with(
".bss.") ||
486 Name.starts_with(
".gnu.linkonce.b.") ||
487 Name.starts_with(
".llvm.linkonce.b.") ||
Name ==
".sbss" ||
488 Name.starts_with(
".sbss.") ||
Name.starts_with(
".gnu.linkonce.sb.") ||
489 Name.starts_with(
".llvm.linkonce.sb."))
492 if (
Name ==
".tdata" ||
Name.starts_with(
".tdata.") ||
493 Name.starts_with(
".gnu.linkonce.td.") ||
494 Name.starts_with(
".llvm.linkonce.td."))
497 if (
Name ==
".tbss" ||
Name.starts_with(
".tbss.") ||
498 Name.starts_with(
".gnu.linkonce.tb.") ||
499 Name.starts_with(
".llvm.linkonce.tb."))
514 if (
Name.starts_with(
".note"))
529 if (K.isBSS() || K.isThreadBSS())
538 if (!K.isMetadata() && !K.isExclude())
547 if (K.isExecuteOnly())
553 if (K.isThreadLocal())
556 if (K.isMergeableCString() || K.isMergeableConst())
559 if (K.isMergeableCString())
573 "SelectionKind::NoDeduplicate, '" +
574 C->getName() +
"' cannot be lowered.");
586 auto *OtherGV = dyn_cast<GlobalValue>(VM->getValue());
587 return OtherGV ? dyn_cast<MCSymbolELF>(
TM.getSymbol(OtherGV)) :
nullptr;
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 unsigned EntrySize,
bool UniqueSectionName) {
640 if (Kind.isMergeableCString()) {
645 cast<GlobalVariable>(GO));
648 Name += utostr(EntrySize);
651 }
else if (Kind.isMergeableConst()) {
653 Name += utostr(EntrySize);
656 bool HasPrefix =
false;
657 if (
const auto *
F = dyn_cast<Function>(GO)) {
658 if (std::optional<StringRef> Prefix =
F->getSectionPrefix()) {
664 if (UniqueSectionName) {
666 TM.getNameWithPrefix(
Name, GO, Mang,
true);
667 }
else if (HasPrefix)
679 LoweringDiagnosticInfo(
const Twine &DiagMsg,
692 unsigned &EntrySize,
unsigned &NextUniqueID,
693 const bool Retain,
const bool ForceUnique) {
698 return NextUniqueID++;
702 const bool Associated = GO->
getMetadata(LLVMContext::MD_associated);
705 return NextUniqueID++;
709 if (
TM.getTargetTriple().isOSSolaris())
714 return NextUniqueID++;
725 if (!SupportsUnique) {
726 Flags &= ~ELF::SHF_MERGE;
732 const bool SeenSectionNameBefore =
736 if (!SymbolMergeable && !SeenSectionNameBefore)
742 const auto PreviousID =
753 if (SymbolMergeable &&
760 return NextUniqueID++;
763static std::tuple<StringRef, bool, unsigned>
766 bool IsComdat =
false;
770 Group =
C->getName();
773 if (
TM.isLargeGlobalValue(GO))
775 return {Group, IsComdat, Flags};
781 bool Retain,
bool ForceUnique) {
790 if (Attrs.hasAttribute(
"bss-section") && Kind.isBSS()) {
791 SectionName = Attrs.getAttribute(
"bss-section").getValueAsString();
792 }
else if (Attrs.hasAttribute(
"rodata-section") && Kind.isReadOnly()) {
793 SectionName = Attrs.getAttribute(
"rodata-section").getValueAsString();
794 }
else if (Attrs.hasAttribute(
"relro-section") && Kind.isReadOnlyWithRel()) {
795 SectionName = Attrs.getAttribute(
"relro-section").getValueAsString();
796 }
else if (Attrs.hasAttribute(
"data-section") && Kind.isData()) {
797 SectionName = Attrs.getAttribute(
"data-section").getValueAsString();
800 const Function *
F = dyn_cast<Function>(GO);
801 if (
F &&
F->hasFnAttribute(
"implicit-section-name")) {
802 SectionName =
F->getFnAttribute(
"implicit-section-name").getValueAsString();
814 GO,
SectionName, Kind,
TM, Ctx, Mang, Flags, EntrySize, NextUniqueID,
815 Retain, ForceUnique);
820 Group, IsComdat, UniqueID, LinkedToSym);
823 assert(Section->getLinkedToSymbol() == LinkedToSym &&
824 "Associated symbol mismatch between sections");
834 "Symbol '" + GO->
getName() +
"' from module '" +
836 "' required a section with entry-size=" +
839 ": Explicit assignment by pragma or attribute of an incompatible "
840 "symbol to this section?"));
849 NextUniqueID, Used.count(GO),
856 unsigned *NextUniqueID,
const MCSymbolELF *AssociatedSymbol) {
864 bool UniqueSectionName =
false;
866 if (EmitUniqueSection) {
867 if (
TM.getUniqueSectionNames()) {
868 UniqueSectionName =
true;
870 UniqueID = *NextUniqueID;
875 GO, Kind, Mang,
TM, EntrySize, UniqueSectionName);
878 if (Kind.isExecuteOnly())
881 EntrySize, Group, IsComdat, UniqueID,
888 unsigned Flags,
unsigned *NextUniqueID) {
891 EmitUniqueSection =
true;
895 if (
TM.getTargetTriple().isOSSolaris()) {
896 EmitUniqueSection =
true;
900 EmitUniqueSection =
true;
906 Ctx, GO, Kind, Mang,
TM, EmitUniqueSection, Flags,
907 NextUniqueID, LinkedToSym);
908 assert(Section->getLinkedToSymbol() == LinkedToSym);
918 bool EmitUniqueSection =
false;
927 Used.count(GO), EmitUniqueSection, Flags,
937 if (
F.hasSection() ||
F.hasFnAttribute(
"implicit-section-name"))
940 Used.count(&
F),
true);
944 true, Flags, &NextUniqueID);
953 if (!EmitUniqueSection)
969 const auto *LSDA = cast<MCSectionELF>(
LSDASection);
970 unsigned Flags = LSDA->getFlags();
973 bool IsComdat =
false;
976 Group =
C->getName();
982 (
getContext().getAsmInfo()->useIntegratedAssembler() &&
983 getContext().getAsmInfo()->binutilsIsAtLeast(2, 36))) {
985 LinkedToSym = cast<MCSymbolELF>(&FnSym);
998 bool UsesLabelDifference,
const Function &
F)
const {
1008 Align &Alignment)
const {
1017 if (Kind.isReadOnly())
1020 assert(Kind.isReadOnlyWithRel() &&
"Unknown section kind");
1038 if (FunctionSectionName.
equals(
".text") ||
1044 Name += FunctionName;
1046 Name +=
".text.eh.";
1047 Name += FunctionName;
1049 Name += FunctionSectionName;
1051 if (!
Name.ends_with(
"."))
1055 UniqueID = NextUniqueID++;
1061 Name = FunctionSectionName;
1062 UniqueID = NextUniqueID++;
1066 std::string GroupName;
1067 if (
F.hasComdat()) {
1069 GroupName =
F.getComdat()->getName().str();
1073 F.hasComdat(), UniqueID,
nullptr);
1077 bool IsCtor,
unsigned Priority,
1090 Name =
".init_array";
1093 Name =
".fini_array";
1095 if (Priority != 65535) {
1097 Name += utostr(Priority);
1106 if (Priority != 65535)
1115 unsigned Priority,
const MCSymbol *KeySym)
const {
1121 unsigned Priority,
const MCSymbol *KeySym)
const {
1131 if (!
LHS->hasGlobalUnnamedAddr() || !
LHS->getValueType()->isFunctionTy())
1137 RHS->isThreadLocal())
1153 if (GV->isDSOLocal() || GV->isImplicitDSOLocal())
1170 UseInitArray = UseInitArray_;
1172 if (!UseInitArray) {
1220 unsigned Priority,
const MCSymbol *KeySym)
const {
1232 if (
auto *LinkerOptions = M.getNamedMetadata(
"llvm.linker.options")) {
1233 for (
const auto *Option : LinkerOptions->operands()) {
1235 for (
const auto &Piece : cast<MDNode>(Option)->operands())
1236 StrOptions.
push_back(std::string(cast<MDString>(Piece)->getString()));
1241 unsigned VersionVal = 0;
1242 unsigned ImageInfoFlags = 0;
1249 if (SectionVal.
empty())
1253 unsigned TAA = 0, StubSize = 0;
1256 SectionVal, Segment, Section, TAA, TAAParsed, StubSize)) {
1259 "': " +
toString(std::move(E)) +
".");
1267 getOrCreateSymbol(
StringRef(
"L_OBJC_IMAGE_INFO")));
1279 "' cannot be lowered.");
1290 if (Attrs.hasAttribute(
"bss-section") && Kind.isBSS()) {
1291 SectionName = Attrs.getAttribute(
"bss-section").getValueAsString();
1292 }
else if (Attrs.hasAttribute(
"rodata-section") && Kind.isReadOnly()) {
1293 SectionName = Attrs.getAttribute(
"rodata-section").getValueAsString();
1294 }
else if (Attrs.hasAttribute(
"relro-section") && Kind.isReadOnlyWithRel()) {
1295 SectionName = Attrs.getAttribute(
"relro-section").getValueAsString();
1296 }
else if (Attrs.hasAttribute(
"data-section") && Kind.isData()) {
1297 SectionName = Attrs.getAttribute(
"data-section").getValueAsString();
1301 const Function *
F = dyn_cast<Function>(GO);
1302 if (
F &&
F->hasFnAttribute(
"implicit-section-name")) {
1303 SectionName =
F->getFnAttribute(
"implicit-section-name").getValueAsString();
1308 unsigned TAA = 0, StubSize = 0;
1314 SectionName, Segment, Section, TAA, TAAParsed, StubSize)) {
1317 "' has an invalid section specifier '" +
1336 "' section type or attributes does not match previous"
1337 " section specifier");
1357 if (Kind.isReadOnly())
1359 if (Kind.isReadOnlyWithRel())
1365 if (Kind.isMergeable1ByteCString() &&
1367 cast<GlobalVariable>(GO)) <
Align(32))
1375 cast<GlobalVariable>(GO)) <
Align(32))
1381 if (Kind.isMergeableConst4())
1383 if (Kind.isMergeableConst8())
1385 if (Kind.isMergeableConst16())
1391 if (Kind.isReadOnly())
1396 if (Kind.isReadOnlyWithRel())
1401 if (Kind.isBSSExtern())
1406 if (Kind.isBSSLocal())
1415 Align &Alignment)
const {
1418 if (Kind.isData() || Kind.isReadOnlyWithRel())
1421 if (Kind.isMergeableConst4())
1423 if (Kind.isMergeableConst8())
1425 if (Kind.isMergeableConst16())
1575 bool CannotUsePrivateLabel =
true;
1579 CannotUsePrivateLabel =
1597 else if (K.isExclude())
1600 else if (K.isText())
1611 else if (K.isThreadLocal())
1616 else if (K.isReadOnly() || K.isReadOnlyWithRel())
1620 else if (K.isWriteable())
1631 assert(
C &&
"expected GV to have a Comdat!");
1637 "' does not exist.");
1641 "' is not a key for its COMDAT.");
1649 if (
const auto *GA = dyn_cast<GlobalAlias>(ComdatKey))
1651 if (ComdatKey == GV) {
1652 switch (
C->getSelectionKind()) {
1696 COMDATSymName =
Sym->getName();
1712 if (Kind.isThreadLocal())
1714 if (Kind.isReadOnly() || Kind.isReadOnlyWithRel())
1723 bool EmitUniquedSection;
1725 EmitUniquedSection =
TM.getFunctionSections();
1727 EmitUniquedSection =
TM.getDataSections();
1729 if ((EmitUniquedSection && !Kind.isCommon()) || GO->
hasComdat()) {
1745 if (EmitUniquedSection)
1746 UniqueID = NextUniqueID++;
1752 if (
const auto *
F = dyn_cast<Function>(GO))
1753 if (std::optional<StringRef> Prefix =
F->getSectionPrefix())
1759 if (
getContext().getTargetTriple().isWindowsGNUEnvironment())
1775 if (Kind.isThreadLocal())
1778 if (Kind.isReadOnly() || Kind.isReadOnlyWithRel())
1784 if (Kind.isBSS() || Kind.isCommon())
1793 bool CannotUsePrivateLabel =
false;
1795 ((isa<Function>(GV) &&
TM.getFunctionSections()) ||
1796 (isa<GlobalVariable>(GV) &&
TM.getDataSections())))
1797 CannotUsePrivateLabel =
true;
1807 bool EmitUniqueSection =
TM.getFunctionSections() ||
C;
1808 if (!EmitUniqueSection)
1812 if (
F.hasPrivateLinkage())
1822 unsigned UniqueID = NextUniqueID++;
1830 bool UsesLabelDifference,
const Function &
F)
const {
1839 UsesLabelDifference,
F);
1844 emitLinkerDirectives(Streamer, M);
1846 unsigned Version = 0;
1851 if (!Section.empty()) {
1853 auto *S =
C.getCOFFSection(Section,
1867void TargetLoweringObjectFileCOFF::emitLinkerDirectives(
1869 if (
NamedMDNode *LinkerOptions = M.getNamedMetadata(
"llvm.linker.options")) {
1875 for (
const auto *Option : LinkerOptions->operands()) {
1876 for (
const auto &Piece : cast<MDNode>(Option)->operands()) {
1879 Directive.append(std::string(cast<MDString>(Piece)->getString()));
1892 if (!
Flags.empty()) {
1900 if (
const auto *LU =
M.getNamedGlobal(
"llvm.used")) {
1901 assert(LU->hasInitializer() &&
"expected llvm.used to have an initializer");
1902 assert(isa<ArrayType>(LU->getValueType()) &&
1903 "expected llvm.used to be an array type");
1904 if (
const auto *
A = cast<ConstantArray>(LU->getInitializer())) {
1905 for (
const Value *
Op :
A->operands()) {
1906 const auto *GV = cast<GlobalValue>(
Op->stripPointerCasts());
1910 if (GV->hasLocalLinkage())
1918 if (!
Flags.empty()) {
1933 if (
T.isWindowsMSVCEnvironment() ||
T.isWindowsItaniumEnvironment()) {
1959 if (
T.isWindowsMSVCEnvironment() ||
T.isWindowsItaniumEnvironment()) {
1961 if (Priority == 65535)
1975 char LastLetter =
'T';
1976 bool AddPrioritySuffix = Priority != 200 && Priority != 400;
1979 else if (Priority < 400)
1981 else if (Priority == 400)
1984 OS <<
".CRT$X" << (IsCtor ?
"C" :
"T") << LastLetter;
1985 if (AddPrioritySuffix)
1993 std::string
Name = IsCtor ?
".ctors" :
".dtors";
1994 if (Priority != 65535)
2006 unsigned Priority,
const MCSymbol *KeySym)
const {
2013 unsigned Priority,
const MCSymbol *KeySym)
const {
2023 if (
T.isOSCygMing())
2039 if (!isa<GlobalObject>(
LHS) || !isa<GlobalVariable>(
RHS) ||
2040 LHS->isThreadLocal() ||
RHS->isThreadLocal() ||
2041 RHS->
getName() !=
"__ImageBase" || !
RHS->hasExternalLinkage() ||
2042 cast<GlobalVariable>(
RHS)->hasInitializer() ||
RHS->hasSection())
2052 std::string HexString =
toString(AI, 16,
false);
2054 unsigned Size = HexString.size();
2055 assert(Width >=
Size &&
"hex string is too large!");
2056 HexString.insert(HexString.begin(), Width -
Size,
'0');
2062 Type *Ty =
C->getType();
2063 if (isa<UndefValue>(
C)) {
2065 }
else if (
const auto *CFP = dyn_cast<ConstantFP>(
C)) {
2067 }
else if (
const auto *CI = dyn_cast<ConstantInt>(
C)) {
2070 unsigned NumElements;
2071 if (
auto *VTy = dyn_cast<VectorType>(Ty))
2072 NumElements = cast<FixedVectorType>(VTy)->getNumElements();
2075 std::string HexString;
2076 for (
int I = NumElements - 1, E = -1;
I != E; --
I)
2084 Align &Alignment)
const {
2085 if (Kind.isMergeableConst() &&
C &&
2086 getContext().getAsmInfo()->hasCOFFComdatConstants()) {
2094 std::string COMDATSymName;
2095 if (Kind.isMergeableConst4()) {
2096 if (Alignment <= 4) {
2098 Alignment =
Align(4);
2100 }
else if (Kind.isMergeableConst8()) {
2101 if (Alignment <= 8) {
2103 Alignment =
Align(8);
2105 }
else if (Kind.isMergeableConst16()) {
2107 if (Alignment <= 16) {
2109 Alignment =
Align(16);
2111 }
else if (Kind.isMergeableConst32()) {
2112 if (Alignment <= 32) {
2114 Alignment =
Align(32);
2118 if (!COMDATSymName.empty())
2139 "SelectionKind::Any, '" +
C->getName() +
"' cannot be "
2148 if (K.isThreadLocal())
2151 if (K.isMergeableCString())
2166 if (
auto *GO = dyn_cast<GlobalObject>(GV))
2174 if (isa<Function>(GO)) {
2185 if (
Name ==
".llvmcmd" ||
Name ==
".llvmbc")
2190 Group =
C->getName();
2204 unsigned *NextUniqueID,
bool Retain) {
2207 Group =
C->getName();
2210 bool UniqueSectionNames =
TM.getUniqueSectionNames();
2213 if (
const auto *
F = dyn_cast<Function>(GO)) {
2214 const auto &OptionalPrefix =
F->getSectionPrefix();
2219 if (EmitUniqueSection && UniqueSectionNames) {
2220 Name.push_back(
'.');
2221 TM.getNameWithPrefix(
Name, GO, Mang,
true);
2224 if (EmitUniqueSection && !UniqueSectionNames) {
2225 UniqueID = *NextUniqueID;
2236 if (Kind.isCommon())
2241 bool EmitUniqueSection =
false;
2247 bool Retain = Used.count(GO);
2248 EmitUniqueSection |= Retain;
2251 EmitUniqueSection, &NextUniqueID, Retain);
2255 bool UsesLabelDifference,
const Function &
F)
const {
2266 if (!
LHS->hasGlobalUnnamedAddr() || !
LHS->getValueType()->isFunctionTy())
2272 RHS->isThreadLocal())
2291 unsigned Priority,
const MCSymbol *KeySym)
const {
2292 return Priority == UINT16_MAX ?
2299 unsigned Priority,
const MCSymbol *KeySym)
const {
2312 if (!
F.hasPersonalityFn() || !
F.needsUnwindTableEntry())
2316 dyn_cast<GlobalValue>(
F.getPersonalityFn()->stripPointerCasts());
2317 assert(Per &&
"Personality routine is not a GlobalValue type.");
2327 if (!
F.hasStackProtectorFnAttr())
2339 cast<MCSymbolXCOFF>(EHInfoSym)->setEHInfo();
2354 if (
const GlobalObject *GO = dyn_cast<GlobalObject>(GV)) {
2355 if (GO->isDeclarationForLinker())
2357 ->getQualNameSymbol();
2360 if (GVar->hasAttribute(
"toc-data"))
2361 return cast<MCSectionXCOFF>(
2363 ->getQualNameSymbol();
2367 return cast<MCSectionXCOFF>(
2369 ->getQualNameSymbol();
2373 ->getQualNameSymbol();
2389 if (GVar->hasAttribute(
"toc-data"))
2398 else if (Kind.isData() || Kind.isBSS())
2400 else if (Kind.isReadOnlyWithRel())
2403 else if (Kind.isReadOnly())
2416 "Tried to get ER section for a defined global.");
2436 if (GVar->hasAttribute(
"toc-data"))
2449 if (GVar->hasAttribute(
"toc-data")) {
2463 if (Kind.isBSSLocal() || GO->
hasCommonLinkage() || Kind.isThreadBSSLocal()) {
2473 if (Kind.isText()) {
2476 ->getRepresentedCsect();
2484 "ReadOnlyPointers is supported only if data sections is turned on");
2497 if (Kind.isData() || Kind.isReadOnlyWithRel() || Kind.isBSS()) {
2508 if (Kind.isReadOnly()) {
2523 if (Kind.isThreadLocal()) {
2538 assert (!
F.getComdat() &&
"Comdat not supported on XCOFF.");
2553 bool UsesLabelDifference,
const Function &
F)
const {
2561 Align &Alignment)
const {
2563 if (Alignment >
Align(16))
2566 if (Alignment ==
Align(8)) {
2571 if (Alignment ==
Align(16)) {
2599 unsigned Priority,
const MCSymbol *KeySym)
const {
2604 unsigned Priority,
const MCSymbol *KeySym)
const {
2617 assert(!isa<GlobalIFunc>(GV) &&
"GlobalIFunc is not supported on AIX.");
2635 "There is no mapping that implements AppendingLinkage for XCOFF.");
2642 assert((isa<Function>(Func) ||
2643 (isa<GlobalAlias>(Func) &&
2644 isa_and_nonnull<Function>(
2645 cast<GlobalAlias>(Func)->getAliaseeObject()))) &&
2646 "Func must be a function or an alias which has a function as base "
2658 Func->isDeclarationForLinker()) &&
2659 isa<Function>(Func)) {
2723 LSDA->getCsectProp());
2739 std::string
Name =
".gcc_exception_table." +
F.getName().str();
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
amdgpu AMDGPU DAG DAG Pattern Instruction Selection
static bool isThumb(const MCSubtargetInfo &STI)
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
COFFYAML::WeakExternalCharacteristics Characteristics
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.
This file declares the MCSectionGOFF class, which contains all of the necessary machine code sections...
Module.h This file contains the declarations for the Module class.
const char LLVMTargetMachineRef TM
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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 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 unsigned getWasmSectionFlags(SectionKind K, bool Retain)
static void checkMachOComdat(const GlobalValue *GV)
static std::string APIntToHexString(const APInt &AI)
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 MCSectionELF * selectELFSectionForGlobal(MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang, const TargetMachine &TM, bool EmitUniqueSection, unsigned Flags, unsigned *NextUniqueID, const MCSymbolELF *AssociatedSymbol)
static SmallString< 128 > getELFSectionNameForGlobal(const GlobalObject *GO, SectionKind Kind, Mangler &Mang, const TargetMachine &TM, unsigned EntrySize, bool UniqueSectionName)
static std::string scalarConstantToHexString(const Constant *C)
static StringRef getCOFFSectionNameForUniqueGlobal(SectionKind Kind)
static const Comdat * getELFComdat(const GlobalValue *GV)
static std::tuple< StringRef, bool, unsigned > getGlobalObjectInfo(const GlobalObject *GO, const TargetMachine &TM)
static unsigned getELFSectionFlags(SectionKind K)
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.
Wrapper for a function that represents a value that functionally represents the original function.
GlobalValue * getGlobalValue() const
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Align getPreferredAlign(const GlobalVariable *GV) const
Returns the preferred alignment of the specified global.
StringRef getPrivateGlobalPrefix() const
This is the base abstract class for diagnostic reporting in the backend.
Interface for custom diagnostic printing.
Lightweight error class with error context and mandatory checking.
StringRef getSection() const
Get the custom section of this global if it has one.
bool hasSection() const
Check if this global has a custom object file section.
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
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 hasPrivateLinkage() const
const Comdat * getComdat() const
ThreadLocalMode getThreadLocalMode() const
bool isDeclarationForLinker() const
Module * getParent()
Get the module that this global value is contained inside of...
const GlobalObject * getAliaseeObject() const
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.
void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
This class is intended to be used as a base class for asm properties and features specific to the tar...
bool useIntegratedAssembler() const
Return true if assembly (inline or otherwise) should be parsed.
virtual bool isSectionAtomizableBySymbols(const MCSection &Section) const
True if the section is atomized using the symbols in it.
bool binutilsIsAtLeast(int Major, int Minor) const
ExceptionHandling getExceptionHandlingType() const
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
const MCObjectFileInfo * getObjectFileInfo() const
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.
MCSectionWasm * getWasmSection(const Twine &Section, SectionKind K, unsigned Flags=0)
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)
bool isELFGenericMergeableSection(StringRef Name)
@ GenericSectionID
Pass this value as the UniqueID during section creation to get the generic section with the given nam...
MCSectionXCOFF * getXCOFFSection(StringRef Section, SectionKind K, std::optional< XCOFF::CsectProperties > CsectProp=std::nullopt, bool MultiSymbolsAllowed=false, const char *BeginSymName=nullptr, std::optional< XCOFF::DwarfSectionSubtypeFlags > DwarfSubtypeFlags=std::nullopt)
std::optional< unsigned > getELFUniqueIDForEntsize(StringRef SectionName, unsigned Flags, unsigned EntrySize)
Return the unique ID of the section with the given name, flags and entry size, if it exists.
const MCAsmInfo * getAsmInfo() const
MCSectionCOFF * getCOFFSection(StringRef Section, unsigned Characteristics, SectionKind Kind, StringRef COMDATSymName, int Selection, unsigned UniqueID=GenericSectionID, const char *BeginSymName=nullptr)
MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
bool isELFImplicitMergeableSectionNamePrefix(StringRef Name)
MCSectionGOFF * getGOFFSection(StringRef Section, SectionKind Kind, MCSection *Parent, const MCExpr *SubsectionId)
MCSectionCOFF * getAssociativeCOFFSection(MCSectionCOFF *Sec, const MCSymbol *KeySym, unsigned UniqueID=GenericSectionID)
Gets or creates a section equivalent to Sec that is associated with the section containing KeySym.
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 * getTextSection() const
MCSection * ConstDataSection
MCContext & getContext() const
MCSection * DataSection
Section directive for standard data.
This represents a section on Windows.
This represents a section on linux, lots of unix variants and some bare metal systems.
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
StringRef getName() const
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 Value=0, unsigned ValueSize=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.
void emitInt64(uint64_t Value)
virtual void switchSection(MCSection *Section, const MCExpr *Subsection=nullptr)
Set the current section where code is being emitted to Section.
void emitInt32(uint64_t Value)
void emitInt8(uint64_t Value)
virtual void emitBytes(StringRef Data)
Emit the bytes in Data into the output.
const MCSymbol & getSymbol() const
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
StringRef getSymbolTableName() const
bool hasPerSymbolCodeModel() const
CodeModel getPerSymbolCodeModel() const
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.
This represents an "assembler immediate".
int64_t getConstant() const
const MCSymbolRefExpr * getSymB() const
const MDOperand & getOperand(unsigned I) const
MCSymbol * getSymbol() const
Return the MCSymbol for this basic block.
MBBSectionID getSectionID() const
Returns the section ID of this basic block.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
bool isBeginSection() const
Returns true if this block begins any section.
unsigned getFunctionNumber() const
getFunctionNumber - Return a unique ID for the current function.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
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.
MCSection * getSection() const
Returns the Section this function belongs to.
MachineModuleInfo & getMMI() const
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 MCContext & getContext() const
const Module * getModule() const
Ty & getObjFileInfo()
Keep track of various per-module pieces of information for backends that would like to do so.
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.
PointerIntPair - This class implements a pair of a pointer and small integer.
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.
StringRef - Represent a constant reference to a string, i.e.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
empty - Check if the string is empty.
bool equals(StringRef RHS) const
equals - Check for string equality, this is more efficient than compare() when the relative ordering ...
const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, const TargetMachine &TM) 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 * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment) const override
Given a mergeable constant with the specified size and relocation information, return a section that ...
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
bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const override
void getNameWithPrefix(SmallVectorImpl< char > &OutName, const GlobalValue *GV, const TargetMachine &TM) const override
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 * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment) const override
Given a constant with the SectionKind, return a section that it should be placed in.
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.
MCSymbol * getCFIPersonalitySymbol(const GlobalValue *GV, const TargetMachine &TM, MachineModuleInfo *MMI) const override
TargetLoweringObjectFileELF()
MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const override
void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &DL, const MCSymbol *Sym) 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.
const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, const TargetMachine &TM) const override
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
const MCExpr * lowerDSOLocalEquivalent(const DSOLocalEquivalent *Equiv, 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
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.
MCSymbolRefExpr::VariantKind PLTRelativeVariantKind
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 * 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()
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment) const override
Given a constant with the SectionKind, return a section that it should be placed in.
void getNameWithPrefix(SmallVectorImpl< char > &OutName, const GlobalValue *GV, const TargetMachine &TM) const override
MCSymbol * getCFIPersonalitySymbol(const GlobalValue *GV, const TargetMachine &TM, MachineModuleInfo *MMI) const override
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) 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...
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.
const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, const TargetMachine &TM) const override
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
const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, const TargetMachine &TM) const override
MCSection * getSectionForJumpTable(const Function &F, const TargetMachine &TM) const override
static MCSymbol * getEHInfoTableSymbol(const MachineFunction *MF)
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)
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment) const override
Given a constant with the SectionKind, return a section that it should be placed in.
MCSymbol * getTargetSymbol(const GlobalValue *GV, const TargetMachine &TM) const override
For functions, this will always return a function descriptor symbol.
MCSection * getSectionForFunctionDescriptor(const Function *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
bool supportDSOLocalEquivalentLowering() const
Target supports a native lowering of a dso_local_equivalent constant without needing to replace it wi...
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.
bool SupportDSOLocalEquivalentLowering
virtual MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment) 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...
unsigned CallSiteEncoding
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 getUniqueBasicBlockSectionNames() const
Return true if unique basic block section names must be generated.
bool getUniqueSectionNames() const
Reloc::Model getRelocationModel() const
Returns the code generation relocation model.
MCSymbol * getSymbol(const GlobalValue *GV) const
bool getDataSections() const
Return true if data objects should be emitted into their own section, corresponds to -fdata-sections.
CodeModel::Model getCodeModel() const
Returns the code model.
bool getFunctionSections() const
Return true if functions should be emitted into their own section, corresponding to -ffunction-sectio...
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
unsigned XCOFFReadOnlyPointers
When set to true, const objects with relocatable address values are put into the RO data section.
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.
EnvironmentType getEnvironment() const
Get the parsed environment type of this triple.
bool isArch32Bit() const
Test whether the architecture is 32-bit.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
std::string str() const
Return the twine contents as a std::string.
The instances of the Type class are immutable: once they are created, they are never changed.
unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
uint64_t getArrayNumElements() const
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVMContext & getContext() const
All values hold a context through their type.
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.
const CustomOperand< const MCSubtargetInfo & > Msg[]
@ 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
@ 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)
std::optional< const char * > toString(const std::optional< DWARFFormValue > &V)
Take an optional DWARFFormValue and try to extract a string value from it.
This is an optimization pass for GlobalISel generic memory operations.
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)
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
void emitLinkerFlagsForUsedCOFF(raw_ostream &OS, const GlobalValue *GV, const Triple &T, Mangler &M)
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
DiagnosticSeverity
Defines the different supported severity of a diagnostic.
void emitLinkerFlagsForGlobalCOFF(raw_ostream &OS, const GlobalValue *GV, const Triple &TT, Mangler &Mangler)
cl::opt< std::string > BBSectionsColdTextPrefix
@ Default
The result values are uniform if and only if all operands are uniform.
@ MCSA_ELF_TypeObject
.type _foo, STT_OBJECT # aka @object
@ MCSA_Hidden
.hidden (ELF)
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 ...
constexpr const char * PseudoProbeDescMetadataName
This struct is a compact representation of a valid (non-zero power of two) alignment.
uint64_t value() const
This is a hole in the type system and should not be abused.
static const MBBSectionID ExceptionSectionID
static const MBBSectionID ColdSectionID