96#include "llvm/IR/IntrinsicsAArch64.h"
97#include "llvm/IR/IntrinsicsAMDGPU.h"
98#include "llvm/IR/IntrinsicsARM.h"
99#include "llvm/IR/IntrinsicsNVPTX.h"
100#include "llvm/IR/IntrinsicsWebAssembly.h"
138 cl::desc(
"Ensure that llvm.experimental.noalias.scope.decl for identical "
139 "scopes are not dominating"));
162 *
OS <<
"; ModuleID = '" << M->getModuleIdentifier() <<
"'\n";
175 V.printAsOperand(*
OS,
true,
MST);
180 void Write(
const DbgRecord *DR) {
196 *
OS <<
"declare_value";
217 template <
class T>
void Write(
const MDTupleTypedArrayWrapper<T> &MD) {
221 void Write(
const NamedMDNode *NMD) {
234 void Write(
const Comdat *
C) {
240 void Write(
const APInt *AI) {
246 void Write(
const unsigned i) { *
OS << i <<
'\n'; }
252 *
OS <<
A->getAsString() <<
'\n';
256 void Write(
const AttributeSet *AS) {
263 void Write(
const AttributeList *AL) {
269 void Write(Printable
P) { *
OS <<
P <<
'\n'; }
271 template <
typename T>
void Write(ArrayRef<T> Vs) {
272 for (
const T &V : Vs)
276 template <
typename T1,
typename... Ts>
277 void WriteTs(
const T1 &V1,
const Ts &... Vs) {
282 template <
typename... Ts>
void WriteTs() {}
291 *
OS << Message <<
'\n';
299 template <
typename T1,
typename... Ts>
309 *
OS << Message <<
'\n';
315 template <
typename T1,
typename... Ts>
347 Type *LandingPadResultTy;
354 bool HasDebugInfo =
false;
397 SawFrameEscape(
false), TBAAVerifyHelper(this) {
398 TreatBrokenDebugInfoAsError = ShouldTreatBrokenDebugInfoAsError;
401 bool hasBrokenDebugInfo()
const {
return BrokenDebugInfo; }
403 bool verify(
const Function &
F) {
404 llvm::TimeTraceScope timeScope(
"Verifier");
406 "An instance of this class only works with a specific module!");
415 DT.recalculate(
const_cast<Function &
>(
F));
417 for (
const BasicBlock &BB :
F) {
418 if (!BB.empty() && BB.back().isTerminator())
422 *OS <<
"Basic Block in function '" <<
F.getName()
423 <<
"' does not have terminator!\n";
424 BB.printAsOperand(*OS,
true, MST);
430 auto FailureCB = [
this](
const Twine &Message) {
431 this->CheckFailed(Message);
433 ConvergenceVerifyHelper.initialize(OS, FailureCB,
F);
438 verifySiblingFuncletUnwinds();
440 if (ConvergenceVerifyHelper.sawTokens())
441 ConvergenceVerifyHelper.verify(DT);
443 InstsInThisBlock.clear();
445 LandingPadResultTy =
nullptr;
446 SawFrameEscape =
false;
447 SiblingFuncletInfo.clear();
448 verifyNoAliasScopeDecl();
449 NoAliasScopeDecls.clear();
459 for (
const Function &
F : M)
460 if (
F.getIntrinsicID() == Intrinsic::experimental_deoptimize)
461 DeoptimizeDeclarations.push_back(&
F);
465 verifyFrameRecoverIndices();
466 for (
const GlobalVariable &GV :
M.globals())
467 visitGlobalVariable(GV);
469 for (
const GlobalAlias &GA :
M.aliases())
470 visitGlobalAlias(GA);
472 for (
const GlobalIFunc &GI :
M.ifuncs())
473 visitGlobalIFunc(GI);
475 for (
const NamedMDNode &NMD :
M.named_metadata())
476 visitNamedMDNode(NMD);
478 for (
const StringMapEntry<Comdat> &SMEC :
M.getComdatSymbolTable())
479 visitComdat(SMEC.getValue());
483 visitModuleCommandLines();
484 visitModuleErrnoTBAA();
486 verifyCompileUnits();
488 verifyDeoptimizeCallingConvs();
489 DISubprogramAttachments.clear();
495 enum class AreDebugLocsAllowed {
No,
Yes };
499 enum class RangeLikeMetadataKind {
506 void visitGlobalValue(
const GlobalValue &GV);
507 void visitGlobalVariable(
const GlobalVariable &GV);
508 void visitGlobalAlias(
const GlobalAlias &GA);
509 void visitGlobalIFunc(
const GlobalIFunc &GI);
510 void visitAliaseeSubExpr(
const GlobalAlias &
A,
const Constant &
C);
511 void visitAliaseeSubExpr(SmallPtrSetImpl<const GlobalAlias *> &Visited,
512 const GlobalAlias &
A,
const Constant &
C);
513 void visitNamedMDNode(
const NamedMDNode &NMD);
514 void visitMDNode(
const MDNode &MD, AreDebugLocsAllowed AllowLocs);
515 void visitMetadataAsValue(
const MetadataAsValue &MD, Function *
F);
516 void visitValueAsMetadata(
const ValueAsMetadata &MD, Function *
F);
517 void visitDIArgList(
const DIArgList &AL, Function *
F);
518 void visitComdat(
const Comdat &
C);
519 void visitModuleIdents();
520 void visitModuleCommandLines();
521 void visitModuleErrnoTBAA();
522 void visitModuleFlags();
523 void visitModuleFlag(
const MDNode *
Op,
524 DenseMap<const MDString *, const MDNode *> &SeenIDs,
525 SmallVectorImpl<const MDNode *> &Requirements);
526 void visitModuleFlagCGProfileEntry(
const MDOperand &MDO);
527 void visitFunction(
const Function &
F);
528 void visitBasicBlock(BasicBlock &BB);
529 void verifyRangeLikeMetadata(
const Value &V,
const MDNode *
Range,
Type *Ty,
530 RangeLikeMetadataKind Kind);
531 void visitRangeMetadata(Instruction &
I, MDNode *
Range,
Type *Ty);
532 void visitNoFPClassMetadata(Instruction &
I, MDNode *
Range,
Type *Ty);
533 void visitNoaliasAddrspaceMetadata(Instruction &
I, MDNode *
Range,
Type *Ty);
534 void visitDereferenceableMetadata(Instruction &
I, MDNode *MD);
535 void visitNofreeMetadata(Instruction &
I, MDNode *MD);
536 void visitProfMetadata(Instruction &
I, MDNode *MD);
537 void visitCallStackMetadata(MDNode *MD);
538 void visitMemProfMetadata(Instruction &
I, MDNode *MD);
539 void visitCallsiteMetadata(Instruction &
I, MDNode *MD);
540 void visitCalleeTypeMetadata(Instruction &
I, MDNode *MD);
541 void visitDIAssignIDMetadata(Instruction &
I, MDNode *MD);
542 void visitMMRAMetadata(Instruction &
I, MDNode *MD);
543 void visitAnnotationMetadata(MDNode *Annotation);
544 void visitAliasScopeMetadata(
const MDNode *MD);
545 void visitAliasScopeListMetadata(
const MDNode *MD);
546 void visitAccessGroupMetadata(
const MDNode *MD);
547 void visitCapturesMetadata(Instruction &
I,
const MDNode *Captures);
548 void visitAllocTokenMetadata(Instruction &
I, MDNode *MD);
550 template <
class Ty>
bool isValidMetadataArray(
const MDTuple &
N);
551#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) void visit##CLASS(const CLASS &N);
552#include "llvm/IR/Metadata.def"
553 void visitDIScope(
const DIScope &
N);
577 void checkPtrToAddr(
Type *SrcTy,
Type *DestTy,
const Value &V);
582 void visitPHINode(
PHINode &PN);
591 void visitVAArgInst(
VAArgInst &VAA) { visitInstruction(VAA); }
592 void visitCallInst(CallInst &CI);
593 void visitInvokeInst(InvokeInst &
II);
594 void visitGetElementPtrInst(GetElementPtrInst &
GEP);
595 void visitLoadInst(LoadInst &LI);
596 void visitStoreInst(StoreInst &SI);
597 void verifyDominatesUse(Instruction &
I,
unsigned i);
598 void visitInstruction(Instruction &
I);
599 void visitTerminator(Instruction &
I);
600 void visitBranchInst(BranchInst &BI);
601 void visitReturnInst(ReturnInst &RI);
602 void visitSwitchInst(SwitchInst &SI);
603 void visitIndirectBrInst(IndirectBrInst &BI);
604 void visitCallBrInst(CallBrInst &CBI);
605 void visitSelectInst(SelectInst &SI);
606 void visitUserOp1(Instruction &
I);
607 void visitUserOp2(Instruction &
I) { visitUserOp1(
I); }
609 void visitConstrainedFPIntrinsic(ConstrainedFPIntrinsic &FPI);
610 void visitVPIntrinsic(VPIntrinsic &VPI);
611 void visitDbgLabelIntrinsic(StringRef Kind, DbgLabelInst &DLI);
612 void visitAtomicCmpXchgInst(AtomicCmpXchgInst &CXI);
613 void visitAtomicRMWInst(AtomicRMWInst &RMWI);
614 void visitFenceInst(FenceInst &FI);
615 void visitAllocaInst(AllocaInst &AI);
616 void visitExtractValueInst(ExtractValueInst &EVI);
617 void visitInsertValueInst(InsertValueInst &IVI);
618 void visitEHPadPredecessors(Instruction &
I);
619 void visitLandingPadInst(LandingPadInst &LPI);
620 void visitResumeInst(ResumeInst &RI);
621 void visitCatchPadInst(CatchPadInst &CPI);
622 void visitCatchReturnInst(CatchReturnInst &CatchReturn);
623 void visitCleanupPadInst(CleanupPadInst &CPI);
624 void visitFuncletPadInst(FuncletPadInst &FPI);
625 void visitCatchSwitchInst(CatchSwitchInst &CatchSwitch);
626 void visitCleanupReturnInst(CleanupReturnInst &CRI);
628 void verifySwiftErrorCall(CallBase &
Call,
const Value *SwiftErrorVal);
629 void verifySwiftErrorValue(
const Value *SwiftErrorVal);
630 void verifyTailCCMustTailAttrs(
const AttrBuilder &Attrs, StringRef
Context);
631 void verifyMustTailCall(CallInst &CI);
632 bool verifyAttributeCount(AttributeList Attrs,
unsigned Params);
633 void verifyAttributeTypes(AttributeSet Attrs,
const Value *V);
634 void verifyParameterAttrs(AttributeSet Attrs,
Type *Ty,
const Value *V);
635 void checkUnsignedBaseTenFuncAttr(AttributeList Attrs, StringRef Attr,
637 void verifyFunctionAttrs(FunctionType *FT, AttributeList Attrs,
638 const Value *V,
bool IsIntrinsic,
bool IsInlineAsm);
639 void verifyFunctionMetadata(
ArrayRef<std::pair<unsigned, MDNode *>> MDs);
640 void verifyUnknownProfileMetadata(MDNode *MD);
641 void visitConstantExprsRecursively(
const Constant *EntryC);
642 void visitConstantExpr(
const ConstantExpr *CE);
643 void visitConstantPtrAuth(
const ConstantPtrAuth *CPA);
644 void verifyInlineAsmCall(
const CallBase &
Call);
645 void verifyStatepoint(
const CallBase &
Call);
646 void verifyFrameRecoverIndices();
647 void verifySiblingFuncletUnwinds();
649 void verifyFragmentExpression(
const DbgVariableRecord &
I);
650 template <
typename ValueOrMetadata>
651 void verifyFragmentExpression(
const DIVariable &V,
653 ValueOrMetadata *
Desc);
654 void verifyFnArgs(
const DbgVariableRecord &DVR);
655 void verifyNotEntryValue(
const DbgVariableRecord &
I);
658 void verifyCompileUnits();
662 void verifyDeoptimizeCallingConvs();
664 void verifyAttachedCallBundle(
const CallBase &
Call,
665 const OperandBundleUse &BU);
668 void verifyNoAliasScopeDecl();
674#define Check(C, ...) \
677 CheckFailed(__VA_ARGS__); \
684#define CheckDI(C, ...) \
687 DebugInfoCheckFailed(__VA_ARGS__); \
695 CheckDI(
I.DebugMarker->MarkedInstr == &
I,
696 "Instruction has invalid DebugMarker", &
I);
698 "PHI Node must not have any attached DbgRecords", &
I);
701 "DbgRecord had invalid DebugMarker", &
I, &DR);
704 visitMDNode(*
Loc, AreDebugLocsAllowed::Yes);
709 verifyFragmentExpression(*DVR);
710 verifyNotEntryValue(*DVR);
717void Verifier::visit(Instruction &
I) {
719 for (
unsigned i = 0, e =
I.getNumOperands(); i != e; ++i)
720 Check(
I.getOperand(i) !=
nullptr,
"Operand is null", &
I);
732 while (!WorkList.
empty()) {
734 if (!Visited.
insert(Cur).second)
741void Verifier::visitGlobalValue(
const GlobalValue &GV) {
743 "Global is external, but doesn't have external or weak linkage!", &GV);
746 if (
const MDNode *Associated =
747 GO->getMetadata(LLVMContext::MD_associated)) {
748 Check(Associated->getNumOperands() == 1,
749 "associated metadata must have one operand", &GV, Associated);
750 const Metadata *
Op = Associated->getOperand(0).get();
751 Check(
Op,
"associated metadata must have a global value", GO, Associated);
754 Check(VM,
"associated metadata must be ValueAsMetadata", GO, Associated);
757 "associated value must be pointer typed", GV, Associated);
759 const Value *Stripped = VM->getValue()->stripPointerCastsAndAliases();
761 "associated metadata must point to a GlobalObject", GO, Stripped);
762 Check(Stripped != GO,
763 "global values should not associate to themselves", GO,
769 if (
const MDNode *AbsoluteSymbol =
770 GO->getMetadata(LLVMContext::MD_absolute_symbol)) {
771 verifyRangeLikeMetadata(*GO, AbsoluteSymbol,
772 DL.getIntPtrType(GO->getType()),
773 RangeLikeMetadataKind::AbsoluteSymbol);
776 if (GO->hasMetadata(LLVMContext::MD_implicit_ref)) {
777 Check(!GO->isDeclaration(),
778 "ref metadata must not be placed on a declaration", GO);
781 GO->getMetadata(LLVMContext::MD_implicit_ref, MDs);
782 for (
const MDNode *MD : MDs) {
783 Check(MD->getNumOperands() == 1,
"ref metadata must have one operand",
787 Check(VM,
"ref metadata must be ValueAsMetadata", GO, MD);
790 "ref value must be pointer typed", GV, MD);
794 "ref metadata must point to a GlobalObject", GO, Stripped);
795 Check(Stripped != GO,
"values should not reference themselves", GO,
803 "Only global variables can have appending linkage!", &GV);
808 "Only global arrays can have appending linkage!", GVar);
812 Check(!GV.
hasComdat(),
"Declaration may not be in a Comdat!", &GV);
816 "dllexport GlobalValue must have default or protected visibility",
821 "dllimport GlobalValue must have default visibility", &GV);
822 Check(!GV.
isDSOLocal(),
"GlobalValue with DLLImport Storage is dso_local!",
828 "Global is marked as dllimport, but not external", &GV);
833 "GlobalValue with local linkage or non-default "
834 "visibility must be dso_local!",
839 if (!
I->getParent() || !
I->getParent()->getParent())
840 CheckFailed(
"Global is referenced by parentless instruction!", &GV, &M,
842 else if (
I->getParent()->getParent()->getParent() != &M)
843 CheckFailed(
"Global is referenced in a different module!", &GV, &M,
I,
844 I->getParent()->getParent(),
845 I->getParent()->getParent()->getParent());
848 if (
F->getParent() != &M)
849 CheckFailed(
"Global is used by function in a different module", &GV, &M,
857void Verifier::visitGlobalVariable(
const GlobalVariable &GV) {
861 Check(
A->value() <= Value::MaximumAlignment,
862 "huge alignment values are unsupported", &GV);
867 "Global variable initializer type does not match global "
871 "Global variable initializer must be sized", &GV);
877 "'common' global must have a zero initializer!", &GV);
880 Check(!GV.
hasComdat(),
"'common' global may not be in a Comdat!", &GV);
885 GV.
getName() ==
"llvm.global_dtors")) {
887 "invalid linkage for intrinsic global variable", &GV);
889 "invalid uses of intrinsic global variable", &GV);
896 PointerType::get(
Context,
DL.getProgramAddressSpace());
900 "wrong type for intrinsic global variable", &GV);
902 "the third field of the element type is mandatory, "
903 "specify ptr null to migrate from the obsoleted 2-field form");
911 GV.
getName() ==
"llvm.compiler.used")) {
913 "invalid linkage for intrinsic global variable", &GV);
915 "invalid uses of intrinsic global variable", &GV);
919 Check(PTy,
"wrong type for intrinsic global variable", &GV);
923 Check(InitArray,
"wrong initializer for intrinsic global variable",
929 Twine(
"invalid ") + GV.
getName() +
" member", V);
931 Twine(
"members of ") + GV.
getName() +
" must be named", V);
940 for (
auto *MD : MDs) {
942 visitDIGlobalVariableExpression(*GVE);
944 CheckDI(
false,
"!dbg attachment of global variable must be a "
945 "DIGlobalVariableExpression");
955 "Global @" + GV.
getName() +
" has illegal target extension type",
964 "Global variable is too large to fit into the address space", &GV,
968 visitGlobalValue(GV);
975 visitGlobalValue(GV);
978void Verifier::visitAliaseeSubExpr(
const GlobalAlias &GA,
const Constant &
C) {
979 SmallPtrSet<const GlobalAlias*, 4> Visited;
981 visitAliaseeSubExpr(Visited, GA,
C);
984void Verifier::visitAliaseeSubExpr(SmallPtrSetImpl<const GlobalAlias*> &Visited,
985 const GlobalAlias &GA,
const Constant &
C) {
989 "available_externally alias must point to available_externally "
1000 Check(Visited.
insert(GA2).second,
"Aliases cannot form a cycle", &GA);
1002 Check(!GA2->isInterposable(),
1003 "Alias cannot point to an interposable alias", &GA);
1012 visitConstantExprsRecursively(CE);
1014 for (
const Use &U :
C.operands()) {
1017 visitAliaseeSubExpr(Visited, GA, *GA2->getAliasee());
1019 visitAliaseeSubExpr(Visited, GA, *C2);
1023void Verifier::visitGlobalAlias(
const GlobalAlias &GA) {
1025 "Alias should have private, internal, linkonce, weak, linkonce_odr, "
1026 "weak_odr, external, or available_externally linkage!",
1029 Check(Aliasee,
"Aliasee cannot be NULL!", &GA);
1031 "Alias and aliasee types should match!", &GA);
1034 "Aliasee should be either GlobalValue or ConstantExpr", &GA);
1036 visitAliaseeSubExpr(GA, *Aliasee);
1038 visitGlobalValue(GA);
1041void Verifier::visitGlobalIFunc(
const GlobalIFunc &GI) {
1042 visitGlobalValue(GI);
1046 for (
const auto &
I : MDs) {
1047 CheckDI(
I.first != LLVMContext::MD_dbg,
1048 "an ifunc may not have a !dbg attachment", &GI);
1049 Check(
I.first != LLVMContext::MD_prof,
1050 "an ifunc may not have a !prof attachment", &GI);
1051 visitMDNode(*
I.second, AreDebugLocsAllowed::No);
1055 "IFunc should have private, internal, linkonce, weak, linkonce_odr, "
1056 "weak_odr, or external linkage!",
1061 Check(Resolver,
"IFunc must have a Function resolver", &GI);
1063 "IFunc resolver must be a definition", &GI);
1070 "IFunc resolver must return a pointer", &GI);
1073 "IFunc resolver has incorrect type", &GI);
1076void Verifier::visitNamedMDNode(
const NamedMDNode &NMD) {
1081 "unrecognized named metadata node in the llvm.dbg namespace", &NMD);
1082 for (
const MDNode *MD : NMD.
operands()) {
1083 if (NMD.
getName() ==
"llvm.dbg.cu")
1089 visitMDNode(*MD, AreDebugLocsAllowed::Yes);
1093void Verifier::visitMDNode(
const MDNode &MD, AreDebugLocsAllowed AllowLocs) {
1096 if (!MDNodes.
insert(&MD).second)
1100 "MDNode context does not match Module context!", &MD);
1105 case Metadata::MDTupleKind:
1107#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) \
1108 case Metadata::CLASS##Kind: \
1109 visit##CLASS(cast<CLASS>(MD)); \
1111#include "llvm/IR/Metadata.def"
1120 "DILocation not allowed within this metadata node", &MD,
Op);
1122 visitMDNode(*
N, AllowLocs);
1126 visitValueAsMetadata(*V,
nullptr);
1138 "Expected second operand to be an integer constant of type i32 or "
1148void Verifier::visitValueAsMetadata(
const ValueAsMetadata &MD, Function *
F) {
1151 "Unexpected metadata round-trip through values", &MD, MD.
getValue());
1157 Check(
F,
"function-local metadata used outside a function", L);
1163 Check(
I->getParent(),
"function-local metadata not in basic block", L,
I);
1169 assert(ActualF &&
"Unimplemented function local metadata case!");
1171 Check(ActualF ==
F,
"function-local metadata used in wrong function", L);
1174void Verifier::visitDIArgList(
const DIArgList &AL, Function *
F) {
1175 for (
const ValueAsMetadata *VAM :
AL.getArgs())
1176 visitValueAsMetadata(*VAM,
F);
1179void Verifier::visitMetadataAsValue(
const MetadataAsValue &MDV, Function *
F) {
1182 visitMDNode(*
N, AreDebugLocsAllowed::No);
1188 if (!MDNodes.
insert(MD).second)
1192 visitValueAsMetadata(*V,
F);
1195 visitDIArgList(*AL,
F);
1203void Verifier::visitDILocation(
const DILocation &
N) {
1205 "location requires a valid scope", &
N,
N.getRawScope());
1206 if (
auto *IA =
N.getRawInlinedAt())
1209 CheckDI(
SP->isDefinition(),
"scope points into the type hierarchy", &
N);
1212void Verifier::visitGenericDINode(
const GenericDINode &
N) {
1216void Verifier::visitDIScope(
const DIScope &
N) {
1217 if (
auto *
F =
N.getRawFile())
1221void Verifier::visitDISubrangeType(
const DISubrangeType &
N) {
1222 CheckDI(
N.getTag() == dwarf::DW_TAG_subrange_type,
"invalid tag", &
N);
1225 auto *LBound =
N.getRawLowerBound();
1229 "LowerBound must be signed constant or DIVariable or DIExpression or "
1232 auto *UBound =
N.getRawUpperBound();
1236 "UpperBound must be signed constant or DIVariable or DIExpression or "
1239 auto *Stride =
N.getRawStride();
1242 "Stride must be signed constant or DIVariable or DIExpression", &
N);
1243 auto *Bias =
N.getRawBias();
1246 "Bias must be signed constant or DIVariable or DIExpression", &
N);
1248 auto *
Size =
N.getRawSizeInBits();
1250 "SizeInBits must be a constant");
1253void Verifier::visitDISubrange(
const DISubrange &
N) {
1254 CheckDI(
N.getTag() == dwarf::DW_TAG_subrange_type,
"invalid tag", &
N);
1255 CheckDI(!
N.getRawCountNode() || !
N.getRawUpperBound(),
1256 "Subrange can have any one of count or upperBound", &
N);
1257 auto *CBound =
N.getRawCountNode();
1260 "Count must be signed constant or DIVariable or DIExpression", &
N);
1261 auto Count =
N.getCount();
1264 "invalid subrange count", &
N);
1265 auto *LBound =
N.getRawLowerBound();
1268 "LowerBound must be signed constant or DIVariable or DIExpression",
1270 auto *UBound =
N.getRawUpperBound();
1273 "UpperBound must be signed constant or DIVariable or DIExpression",
1275 auto *Stride =
N.getRawStride();
1278 "Stride must be signed constant or DIVariable or DIExpression", &
N);
1281void Verifier::visitDIGenericSubrange(
const DIGenericSubrange &
N) {
1282 CheckDI(
N.getTag() == dwarf::DW_TAG_generic_subrange,
"invalid tag", &
N);
1283 CheckDI(!
N.getRawCountNode() || !
N.getRawUpperBound(),
1284 "GenericSubrange can have any one of count or upperBound", &
N);
1285 auto *CBound =
N.getRawCountNode();
1287 "Count must be signed constant or DIVariable or DIExpression", &
N);
1288 auto *LBound =
N.getRawLowerBound();
1289 CheckDI(LBound,
"GenericSubrange must contain lowerBound", &
N);
1291 "LowerBound must be signed constant or DIVariable or DIExpression",
1293 auto *UBound =
N.getRawUpperBound();
1295 "UpperBound must be signed constant or DIVariable or DIExpression",
1297 auto *Stride =
N.getRawStride();
1298 CheckDI(Stride,
"GenericSubrange must contain stride", &
N);
1300 "Stride must be signed constant or DIVariable or DIExpression", &
N);
1303void Verifier::visitDIEnumerator(
const DIEnumerator &
N) {
1304 CheckDI(
N.getTag() == dwarf::DW_TAG_enumerator,
"invalid tag", &
N);
1307void Verifier::visitDIBasicType(
const DIBasicType &
N) {
1308 CheckDI(
N.getTag() == dwarf::DW_TAG_base_type ||
1309 N.getTag() == dwarf::DW_TAG_unspecified_type ||
1310 N.getTag() == dwarf::DW_TAG_string_type,
1313 auto *
Size =
N.getRawSizeInBits();
1315 "SizeInBits must be a constant");
1318void Verifier::visitDIFixedPointType(
const DIFixedPointType &
N) {
1319 visitDIBasicType(
N);
1321 CheckDI(
N.getTag() == dwarf::DW_TAG_base_type,
"invalid tag", &
N);
1322 CheckDI(
N.getEncoding() == dwarf::DW_ATE_signed_fixed ||
1323 N.getEncoding() == dwarf::DW_ATE_unsigned_fixed,
1324 "invalid encoding", &
N);
1328 "invalid kind", &
N);
1330 N.getFactorRaw() == 0,
1331 "factor should be 0 for rationals", &
N);
1333 (
N.getNumeratorRaw() == 0 &&
N.getDenominatorRaw() == 0),
1334 "numerator and denominator should be 0 for non-rationals", &
N);
1337void Verifier::visitDIStringType(
const DIStringType &
N) {
1338 CheckDI(
N.getTag() == dwarf::DW_TAG_string_type,
"invalid tag", &
N);
1339 CheckDI(!(
N.isBigEndian() &&
N.isLittleEndian()),
"has conflicting flags",
1343void Verifier::visitDIDerivedType(
const DIDerivedType &
N) {
1347 CheckDI(
N.getTag() == dwarf::DW_TAG_typedef ||
1348 N.getTag() == dwarf::DW_TAG_pointer_type ||
1349 N.getTag() == dwarf::DW_TAG_ptr_to_member_type ||
1350 N.getTag() == dwarf::DW_TAG_reference_type ||
1351 N.getTag() == dwarf::DW_TAG_rvalue_reference_type ||
1352 N.getTag() == dwarf::DW_TAG_const_type ||
1353 N.getTag() == dwarf::DW_TAG_immutable_type ||
1354 N.getTag() == dwarf::DW_TAG_volatile_type ||
1355 N.getTag() == dwarf::DW_TAG_restrict_type ||
1356 N.getTag() == dwarf::DW_TAG_atomic_type ||
1357 N.getTag() == dwarf::DW_TAG_LLVM_ptrauth_type ||
1358 N.getTag() == dwarf::DW_TAG_member ||
1359 (
N.getTag() == dwarf::DW_TAG_variable &&
N.isStaticMember()) ||
1360 N.getTag() == dwarf::DW_TAG_inheritance ||
1361 N.getTag() == dwarf::DW_TAG_friend ||
1362 N.getTag() == dwarf::DW_TAG_set_type ||
1363 N.getTag() == dwarf::DW_TAG_template_alias,
1365 if (
N.getTag() == dwarf::DW_TAG_ptr_to_member_type) {
1366 CheckDI(
isType(
N.getRawExtraData()),
"invalid pointer to member type", &
N,
1367 N.getRawExtraData());
1368 }
else if (
N.getTag() == dwarf::DW_TAG_template_alias) {
1370 N.getRawExtraData());
1371 }
else if (
N.getTag() == dwarf::DW_TAG_inheritance ||
1372 N.getTag() == dwarf::DW_TAG_member ||
1373 N.getTag() == dwarf::DW_TAG_variable) {
1374 auto *ExtraData =
N.getRawExtraData();
1375 auto IsValidExtraData = [&]() {
1376 if (ExtraData ==
nullptr)
1382 if (Tuple->getNumOperands() != 1)
1389 "extraData must be ConstantAsMetadata, MDString, DIObjCProperty, "
1390 "or MDTuple with single ConstantAsMetadata operand",
1394 if (
N.getTag() == dwarf::DW_TAG_set_type) {
1395 if (
auto *
T =
N.getRawBaseType()) {
1400 (Enum &&
Enum->getTag() == dwarf::DW_TAG_enumeration_type) ||
1401 (Subrange &&
Subrange->getTag() == dwarf::DW_TAG_subrange_type) ||
1402 (
Basic && (
Basic->getEncoding() == dwarf::DW_ATE_unsigned ||
1403 Basic->getEncoding() == dwarf::DW_ATE_signed ||
1404 Basic->getEncoding() == dwarf::DW_ATE_unsigned_char ||
1405 Basic->getEncoding() == dwarf::DW_ATE_signed_char ||
1406 Basic->getEncoding() == dwarf::DW_ATE_boolean)),
1407 "invalid set base type", &
N,
T);
1413 N.getRawBaseType());
1415 if (
N.getDWARFAddressSpace()) {
1416 CheckDI(
N.getTag() == dwarf::DW_TAG_pointer_type ||
1417 N.getTag() == dwarf::DW_TAG_reference_type ||
1418 N.getTag() == dwarf::DW_TAG_rvalue_reference_type,
1419 "DWARF address space only applies to pointer or reference types",
1423 auto *
Size =
N.getRawSizeInBits();
1426 "SizeInBits must be a constant or DIVariable or DIExpression");
1431 return ((Flags & DINode::FlagLValueReference) &&
1432 (Flags & DINode::FlagRValueReference)) ||
1433 ((Flags & DINode::FlagTypePassByValue) &&
1434 (Flags & DINode::FlagTypePassByReference));
1437void Verifier::visitTemplateParams(
const MDNode &
N,
const Metadata &RawParams) {
1439 CheckDI(Params,
"invalid template params", &
N, &RawParams);
1446void Verifier::visitDICompositeType(
const DICompositeType &
N) {
1450 CheckDI(
N.getTag() == dwarf::DW_TAG_array_type ||
1451 N.getTag() == dwarf::DW_TAG_structure_type ||
1452 N.getTag() == dwarf::DW_TAG_union_type ||
1453 N.getTag() == dwarf::DW_TAG_enumeration_type ||
1454 N.getTag() == dwarf::DW_TAG_class_type ||
1455 N.getTag() == dwarf::DW_TAG_variant_part ||
1456 N.getTag() == dwarf::DW_TAG_variant ||
1457 N.getTag() == dwarf::DW_TAG_namelist,
1462 N.getRawBaseType());
1465 "invalid composite elements", &
N,
N.getRawElements());
1467 N.getRawVTableHolder());
1469 "invalid reference flags", &
N);
1470 unsigned DIBlockByRefStruct = 1 << 4;
1471 CheckDI((
N.getFlags() & DIBlockByRefStruct) == 0,
1472 "DIBlockByRefStruct on DICompositeType is no longer supported", &
N);
1474 "DISubprogram contains null entry in `elements` field", &
N);
1477 const DINodeArray
Elements =
N.getElements();
1479 Elements[0]->getTag() == dwarf::DW_TAG_subrange_type,
1480 "invalid vector, expected one element of type subrange", &
N);
1483 if (
auto *Params =
N.getRawTemplateParams())
1484 visitTemplateParams(
N, *Params);
1486 if (
auto *
D =
N.getRawDiscriminator()) {
1488 "discriminator can only appear on variant part");
1491 if (
N.getRawDataLocation()) {
1492 CheckDI(
N.getTag() == dwarf::DW_TAG_array_type,
1493 "dataLocation can only appear in array type");
1496 if (
N.getRawAssociated()) {
1497 CheckDI(
N.getTag() == dwarf::DW_TAG_array_type,
1498 "associated can only appear in array type");
1501 if (
N.getRawAllocated()) {
1502 CheckDI(
N.getTag() == dwarf::DW_TAG_array_type,
1503 "allocated can only appear in array type");
1506 if (
N.getRawRank()) {
1507 CheckDI(
N.getTag() == dwarf::DW_TAG_array_type,
1508 "rank can only appear in array type");
1511 if (
N.getTag() == dwarf::DW_TAG_array_type) {
1512 CheckDI(
N.getRawBaseType(),
"array types must have a base type", &
N);
1515 auto *
Size =
N.getRawSizeInBits();
1518 "SizeInBits must be a constant or DIVariable or DIExpression");
1521void Verifier::visitDISubroutineType(
const DISubroutineType &
N) {
1522 CheckDI(
N.getTag() == dwarf::DW_TAG_subroutine_type,
"invalid tag", &
N);
1523 if (
auto *Types =
N.getRawTypeArray()) {
1525 for (
Metadata *Ty :
N.getTypeArray()->operands()) {
1526 CheckDI(
isType(Ty),
"invalid subroutine type ref", &
N, Types, Ty);
1530 "invalid reference flags", &
N);
1533void Verifier::visitDIFile(
const DIFile &
N) {
1534 CheckDI(
N.getTag() == dwarf::DW_TAG_file_type,
"invalid tag", &
N);
1535 std::optional<DIFile::ChecksumInfo<StringRef>> Checksum =
N.getChecksum();
1537 CheckDI(Checksum->Kind <= DIFile::ChecksumKind::CSK_Last,
1538 "invalid checksum kind", &
N);
1540 switch (Checksum->Kind) {
1551 CheckDI(Checksum->Value.size() ==
Size,
"invalid checksum length", &
N);
1553 "invalid checksum", &
N);
1557void Verifier::visitDICompileUnit(
const DICompileUnit &
N) {
1558 CheckDI(
N.isDistinct(),
"compile units must be distinct", &
N);
1559 CheckDI(
N.getTag() == dwarf::DW_TAG_compile_unit,
"invalid tag", &
N);
1565 CheckDI(!
N.getFile()->getFilename().empty(),
"invalid filename", &
N,
1569 "invalid emission kind", &
N);
1571 if (
auto *Array =
N.getRawEnumTypes()) {
1573 for (
Metadata *
Op :
N.getEnumTypes()->operands()) {
1575 CheckDI(Enum &&
Enum->getTag() == dwarf::DW_TAG_enumeration_type,
1576 "invalid enum type", &
N,
N.getEnumTypes(),
Op);
1579 if (
auto *Array =
N.getRawRetainedTypes()) {
1581 for (
Metadata *
Op :
N.getRetainedTypes()->operands()) {
1585 "invalid retained type", &
N,
Op);
1588 if (
auto *Array =
N.getRawGlobalVariables()) {
1590 for (
Metadata *
Op :
N.getGlobalVariables()->operands()) {
1592 "invalid global variable ref", &
N,
Op);
1595 if (
auto *Array =
N.getRawImportedEntities()) {
1597 for (
Metadata *
Op :
N.getImportedEntities()->operands()) {
1602 if (
auto *Array =
N.getRawMacros()) {
1611void Verifier::visitDISubprogram(
const DISubprogram &
N) {
1612 CheckDI(
N.getTag() == dwarf::DW_TAG_subprogram,
"invalid tag", &
N);
1614 if (
auto *
F =
N.getRawFile())
1617 CheckDI(
N.getLine() == 0,
"line specified with no file", &
N,
N.getLine());
1618 if (
auto *
T =
N.getRawType())
1620 CheckDI(
isType(
N.getRawContainingType()),
"invalid containing type", &
N,
1621 N.getRawContainingType());
1622 if (
auto *Params =
N.getRawTemplateParams())
1623 visitTemplateParams(
N, *Params);
1624 if (
auto *S =
N.getRawDeclaration())
1626 "invalid subprogram declaration", &
N, S);
1627 if (
auto *RawNode =
N.getRawRetainedNodes()) {
1629 CheckDI(Node,
"invalid retained nodes list", &
N, RawNode);
1631 CheckDI(
Op,
"nullptr in retained nodes", &
N, Node);
1633 auto True = [](
const Metadata *) {
return true; };
1634 auto False = [](
const Metadata *) {
return false; };
1635 bool IsTypeCorrect = DISubprogram::visitRetainedNode<bool>(
1636 Op, True, True, True, True, False);
1638 "invalid retained nodes, expected DILocalVariable, DILabel, "
1639 "DIImportedEntity or DIType",
1646 "invalid retained nodes, retained node is not local", &
N, Node,
1649 DISubprogram *RetainedNodeSP = RetainedNodeScope->getSubprogram();
1650 DICompileUnit *RetainedNodeUnit =
1651 RetainedNodeSP ? RetainedNodeSP->getUnit() :
nullptr;
1653 RetainedNodeSP == &
N,
1654 "invalid retained nodes, retained node does not belong to subprogram",
1655 &
N, Node, RetainedNode, RetainedNodeScope, RetainedNodeSP,
1660 "invalid reference flags", &
N);
1662 auto *
Unit =
N.getRawUnit();
1663 if (
N.isDefinition()) {
1665 CheckDI(
N.isDistinct(),
"subprogram definitions must be distinct", &
N);
1666 CheckDI(Unit,
"subprogram definitions must have a compile unit", &
N);
1671 if (CT && CT->getRawIdentifier() &&
1672 M.getContext().isODRUniquingDebugTypes())
1674 "definition subprograms cannot be nested within DICompositeType "
1675 "when enabling ODR",
1679 CheckDI(!Unit,
"subprogram declarations must not have a compile unit", &
N);
1681 "subprogram declaration must not have a declaration field");
1684 if (
auto *RawThrownTypes =
N.getRawThrownTypes()) {
1686 CheckDI(ThrownTypes,
"invalid thrown types list", &
N, RawThrownTypes);
1692 if (
N.areAllCallsDescribed())
1694 "DIFlagAllCallsDescribed must be attached to a definition");
1697void Verifier::visitDILexicalBlockBase(
const DILexicalBlockBase &
N) {
1698 CheckDI(
N.getTag() == dwarf::DW_TAG_lexical_block,
"invalid tag", &
N);
1700 "invalid local scope", &
N,
N.getRawScope());
1702 CheckDI(
SP->isDefinition(),
"scope points into the type hierarchy", &
N);
1705void Verifier::visitDILexicalBlock(
const DILexicalBlock &
N) {
1706 visitDILexicalBlockBase(
N);
1709 "cannot have column info without line info", &
N);
1712void Verifier::visitDILexicalBlockFile(
const DILexicalBlockFile &
N) {
1713 visitDILexicalBlockBase(
N);
1716void Verifier::visitDICommonBlock(
const DICommonBlock &
N) {
1717 CheckDI(
N.getTag() == dwarf::DW_TAG_common_block,
"invalid tag", &
N);
1718 if (
auto *S =
N.getRawScope())
1720 if (
auto *S =
N.getRawDecl())
1724void Verifier::visitDINamespace(
const DINamespace &
N) {
1725 CheckDI(
N.getTag() == dwarf::DW_TAG_namespace,
"invalid tag", &
N);
1726 if (
auto *S =
N.getRawScope())
1730void Verifier::visitDIMacro(
const DIMacro &
N) {
1733 "invalid macinfo type", &
N);
1734 CheckDI(!
N.getName().empty(),
"anonymous macro", &
N);
1735 if (!
N.getValue().empty()) {
1736 assert(
N.getValue().data()[0] !=
' ' &&
"Macro value has a space prefix");
1740void Verifier::visitDIMacroFile(
const DIMacroFile &
N) {
1742 "invalid macinfo type", &
N);
1743 if (
auto *
F =
N.getRawFile())
1746 if (
auto *Array =
N.getRawElements()) {
1748 for (
Metadata *
Op :
N.getElements()->operands()) {
1754void Verifier::visitDIModule(
const DIModule &
N) {
1755 CheckDI(
N.getTag() == dwarf::DW_TAG_module,
"invalid tag", &
N);
1756 CheckDI(!
N.getName().empty(),
"anonymous module", &
N);
1759void Verifier::visitDITemplateParameter(
const DITemplateParameter &
N) {
1763void Verifier::visitDITemplateTypeParameter(
const DITemplateTypeParameter &
N) {
1764 visitDITemplateParameter(
N);
1766 CheckDI(
N.getTag() == dwarf::DW_TAG_template_type_parameter,
"invalid tag",
1770void Verifier::visitDITemplateValueParameter(
1771 const DITemplateValueParameter &
N) {
1772 visitDITemplateParameter(
N);
1774 CheckDI(
N.getTag() == dwarf::DW_TAG_template_value_parameter ||
1775 N.getTag() == dwarf::DW_TAG_GNU_template_template_param ||
1776 N.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack,
1780void Verifier::visitDIVariable(
const DIVariable &
N) {
1781 if (
auto *S =
N.getRawScope())
1783 if (
auto *
F =
N.getRawFile())
1787void Verifier::visitDIGlobalVariable(
const DIGlobalVariable &
N) {
1791 CheckDI(
N.getTag() == dwarf::DW_TAG_variable,
"invalid tag", &
N);
1794 if (
N.isDefinition())
1795 CheckDI(
N.getType(),
"missing global variable type", &
N);
1796 if (
auto *Member =
N.getRawStaticDataMemberDeclaration()) {
1798 "invalid static data member declaration", &
N, Member);
1802void Verifier::visitDILocalVariable(
const DILocalVariable &
N) {
1807 CheckDI(
N.getTag() == dwarf::DW_TAG_variable,
"invalid tag", &
N);
1809 "local variable requires a valid scope", &
N,
N.getRawScope());
1810 if (
auto Ty =
N.getType())
1814void Verifier::visitDIAssignID(
const DIAssignID &
N) {
1815 CheckDI(!
N.getNumOperands(),
"DIAssignID has no arguments", &
N);
1816 CheckDI(
N.isDistinct(),
"DIAssignID must be distinct", &
N);
1819void Verifier::visitDILabel(
const DILabel &
N) {
1820 if (
auto *S =
N.getRawScope())
1822 if (
auto *
F =
N.getRawFile())
1825 CheckDI(
N.getTag() == dwarf::DW_TAG_label,
"invalid tag", &
N);
1827 "label requires a valid scope", &
N,
N.getRawScope());
1830void Verifier::visitDIExpression(
const DIExpression &
N) {
1831 CheckDI(
N.isValid(),
"invalid expression", &
N);
1834void Verifier::visitDIGlobalVariableExpression(
1835 const DIGlobalVariableExpression &GVE) {
1838 visitDIGlobalVariable(*Var);
1840 visitDIExpression(*Expr);
1841 if (
auto Fragment = Expr->getFragmentInfo())
1842 verifyFragmentExpression(*GVE.
getVariable(), *Fragment, &GVE);
1846void Verifier::visitDIObjCProperty(
const DIObjCProperty &
N) {
1847 CheckDI(
N.getTag() == dwarf::DW_TAG_APPLE_property,
"invalid tag", &
N);
1848 if (
auto *
T =
N.getRawType())
1850 if (
auto *
F =
N.getRawFile())
1854void Verifier::visitDIImportedEntity(
const DIImportedEntity &
N) {
1855 CheckDI(
N.getTag() == dwarf::DW_TAG_imported_module ||
1856 N.getTag() == dwarf::DW_TAG_imported_declaration,
1858 if (
auto *S =
N.getRawScope())
1864void Verifier::visitComdat(
const Comdat &
C) {
1867 if (
TT.isOSBinFormatCOFF())
1868 if (
const GlobalValue *GV =
M.getNamedValue(
C.getName()))
1873void Verifier::visitModuleIdents() {
1874 const NamedMDNode *Idents =
M.getNamedMetadata(
"llvm.ident");
1880 for (
const MDNode *
N : Idents->
operands()) {
1881 Check(
N->getNumOperands() == 1,
1882 "incorrect number of operands in llvm.ident metadata",
N);
1884 (
"invalid value for llvm.ident metadata entry operand"
1885 "(the operand should be a string)"),
1890void Verifier::visitModuleCommandLines() {
1891 const NamedMDNode *CommandLines =
M.getNamedMetadata(
"llvm.commandline");
1898 for (
const MDNode *
N : CommandLines->
operands()) {
1899 Check(
N->getNumOperands() == 1,
1900 "incorrect number of operands in llvm.commandline metadata",
N);
1902 (
"invalid value for llvm.commandline metadata entry operand"
1903 "(the operand should be a string)"),
1908void Verifier::visitModuleErrnoTBAA() {
1909 const NamedMDNode *ErrnoTBAA =
M.getNamedMetadata(
"llvm.errno.tbaa");
1914 "llvm.errno.tbaa must have at least one operand", ErrnoTBAA);
1916 for (
const MDNode *
N : ErrnoTBAA->
operands())
1920void Verifier::visitModuleFlags() {
1921 const NamedMDNode *
Flags =
M.getModuleFlagsMetadata();
1925 DenseMap<const MDString*, const MDNode*> SeenIDs;
1927 uint64_t PAuthABIPlatform = -1;
1928 uint64_t PAuthABIVersion = -1;
1929 for (
const MDNode *MDN :
Flags->operands()) {
1930 visitModuleFlag(MDN, SeenIDs, Requirements);
1931 if (MDN->getNumOperands() != 3)
1934 if (FlagName->getString() ==
"aarch64-elf-pauthabi-platform") {
1935 if (
const auto *PAP =
1937 PAuthABIPlatform = PAP->getZExtValue();
1938 }
else if (FlagName->getString() ==
"aarch64-elf-pauthabi-version") {
1939 if (
const auto *PAV =
1941 PAuthABIVersion = PAV->getZExtValue();
1946 if ((PAuthABIPlatform == uint64_t(-1)) != (PAuthABIVersion == uint64_t(-1)))
1947 CheckFailed(
"either both or no 'aarch64-elf-pauthabi-platform' and "
1948 "'aarch64-elf-pauthabi-version' module flags must be present");
1951 for (
const MDNode *Requirement : Requirements) {
1953 const Metadata *ReqValue = Requirement->getOperand(1);
1955 const MDNode *
Op = SeenIDs.
lookup(Flag);
1957 CheckFailed(
"invalid requirement on flag, flag is not present in module",
1962 if (
Op->getOperand(2) != ReqValue) {
1963 CheckFailed((
"invalid requirement on flag, "
1964 "flag does not have the required value"),
1972Verifier::visitModuleFlag(
const MDNode *
Op,
1973 DenseMap<const MDString *, const MDNode *> &SeenIDs,
1974 SmallVectorImpl<const MDNode *> &Requirements) {
1978 "incorrect number of operands in module flag",
Op);
1979 Module::ModFlagBehavior MFB;
1980 if (!Module::isValidModFlagBehavior(
Op->getOperand(0), MFB)) {
1982 "invalid behavior operand in module flag (expected constant integer)",
1985 "invalid behavior operand in module flag (unexpected constant)",
1989 Check(
ID,
"invalid ID operand in module flag (expected metadata string)",
1995 case Module::Warning:
1996 case Module::Override:
2002 Check(V &&
V->getValue().isNonNegative(),
2003 "invalid value for 'min' module flag (expected constant non-negative "
2011 "invalid value for 'max' module flag (expected constant integer)",
2016 case Module::Require: {
2021 "invalid value for 'require' module flag (expected metadata pair)",
2024 (
"invalid value for 'require' module flag "
2025 "(first value operand should be a string)"),
2026 Value->getOperand(0));
2034 case Module::Append:
2035 case Module::AppendUnique: {
2038 "invalid value for 'append'-type module flag "
2039 "(expected a metadata node)",
2046 if (MFB != Module::Require) {
2049 "module flag identifiers must be unique (or of 'require' type)",
ID);
2052 if (
ID->getString() ==
"wchar_size") {
2055 Check(
Value,
"wchar_size metadata requires constant integer argument");
2058 if (
ID->getString() ==
"Linker Options") {
2062 Check(
M.getNamedMetadata(
"llvm.linker.options"),
2063 "'Linker Options' named metadata no longer supported");
2066 if (
ID->getString() ==
"SemanticInterposition") {
2067 ConstantInt *
Value =
2070 "SemanticInterposition metadata requires constant integer argument");
2073 if (
ID->getString() ==
"CG Profile") {
2074 for (
const MDOperand &MDO :
cast<MDNode>(
Op->getOperand(2))->operands())
2075 visitModuleFlagCGProfileEntry(MDO);
2079void Verifier::visitModuleFlagCGProfileEntry(
const MDOperand &MDO) {
2080 auto CheckFunction = [&](
const MDOperand &FuncMDO) {
2085 "expected a Function or null", FuncMDO);
2088 Check(Node &&
Node->getNumOperands() == 3,
"expected a MDNode triple", MDO);
2089 CheckFunction(
Node->getOperand(0));
2090 CheckFunction(
Node->getOperand(1));
2093 "expected an integer constant",
Node->getOperand(2));
2096void Verifier::verifyAttributeTypes(AttributeSet Attrs,
const Value *V) {
2099 if (
A.isStringAttribute()) {
2100#define GET_ATTR_NAMES
2101#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME)
2102#define ATTRIBUTE_STRBOOL(ENUM_NAME, DISPLAY_NAME) \
2103 if (A.getKindAsString() == #DISPLAY_NAME) { \
2104 auto V = A.getValueAsString(); \
2105 if (!(V.empty() || V == "true" || V == "false")) \
2106 CheckFailed("invalid value for '" #DISPLAY_NAME "' attribute: " + V + \
2110#include "llvm/IR/Attributes.inc"
2114 if (
A.isIntAttribute() != Attribute::isIntAttrKind(
A.getKindAsEnum())) {
2115 CheckFailed(
"Attribute '" +
A.getAsString() +
"' should have an Argument",
2124void Verifier::verifyParameterAttrs(AttributeSet Attrs,
Type *Ty,
2126 if (!
Attrs.hasAttributes())
2129 verifyAttributeTypes(Attrs, V);
2132 Check(Attr.isStringAttribute() ||
2133 Attribute::canUseAsParamAttr(Attr.getKindAsEnum()),
2134 "Attribute '" + Attr.getAsString() +
"' does not apply to parameters",
2137 if (
Attrs.hasAttribute(Attribute::ImmArg)) {
2138 unsigned AttrCount =
2139 Attrs.getNumAttributes() -
Attrs.hasAttribute(Attribute::Range);
2140 Check(AttrCount == 1,
2141 "Attribute 'immarg' is incompatible with other attributes except the "
2142 "'range' attribute",
2148 unsigned AttrCount = 0;
2149 AttrCount +=
Attrs.hasAttribute(Attribute::ByVal);
2150 AttrCount +=
Attrs.hasAttribute(Attribute::InAlloca);
2151 AttrCount +=
Attrs.hasAttribute(Attribute::Preallocated);
2152 AttrCount +=
Attrs.hasAttribute(Attribute::StructRet) ||
2153 Attrs.hasAttribute(Attribute::InReg);
2154 AttrCount +=
Attrs.hasAttribute(Attribute::Nest);
2155 AttrCount +=
Attrs.hasAttribute(Attribute::ByRef);
2156 Check(AttrCount <= 1,
2157 "Attributes 'byval', 'inalloca', 'preallocated', 'inreg', 'nest', "
2158 "'byref', and 'sret' are incompatible!",
2161 Check(!(
Attrs.hasAttribute(Attribute::InAlloca) &&
2162 Attrs.hasAttribute(Attribute::ReadOnly)),
2164 "'inalloca and readonly' are incompatible!",
2167 Check(!(
Attrs.hasAttribute(Attribute::StructRet) &&
2168 Attrs.hasAttribute(Attribute::Returned)),
2170 "'sret and returned' are incompatible!",
2173 Check(!(
Attrs.hasAttribute(Attribute::ZExt) &&
2174 Attrs.hasAttribute(Attribute::SExt)),
2176 "'zeroext and signext' are incompatible!",
2179 Check(!(
Attrs.hasAttribute(Attribute::ReadNone) &&
2180 Attrs.hasAttribute(Attribute::ReadOnly)),
2182 "'readnone and readonly' are incompatible!",
2185 Check(!(
Attrs.hasAttribute(Attribute::ReadNone) &&
2186 Attrs.hasAttribute(Attribute::WriteOnly)),
2188 "'readnone and writeonly' are incompatible!",
2191 Check(!(
Attrs.hasAttribute(Attribute::ReadOnly) &&
2192 Attrs.hasAttribute(Attribute::WriteOnly)),
2194 "'readonly and writeonly' are incompatible!",
2197 Check(!(
Attrs.hasAttribute(Attribute::NoInline) &&
2198 Attrs.hasAttribute(Attribute::AlwaysInline)),
2200 "'noinline and alwaysinline' are incompatible!",
2203 Check(!(
Attrs.hasAttribute(Attribute::Writable) &&
2204 Attrs.hasAttribute(Attribute::ReadNone)),
2205 "Attributes writable and readnone are incompatible!", V);
2207 Check(!(
Attrs.hasAttribute(Attribute::Writable) &&
2208 Attrs.hasAttribute(Attribute::ReadOnly)),
2209 "Attributes writable and readonly are incompatible!", V);
2211 AttributeMask IncompatibleAttrs = AttributeFuncs::typeIncompatible(Ty, Attrs);
2213 if (!Attr.isStringAttribute() &&
2214 IncompatibleAttrs.
contains(Attr.getKindAsEnum())) {
2215 CheckFailed(
"Attribute '" + Attr.getAsString() +
2216 "' applied to incompatible type!", V);
2222 if (
Attrs.hasAttribute(Attribute::Alignment)) {
2223 Align AttrAlign =
Attrs.getAlignment().valueOrOne();
2224 Check(AttrAlign.
value() <= Value::MaximumAlignment,
2225 "huge alignment values are unsupported", V);
2227 if (
Attrs.hasAttribute(Attribute::ByVal)) {
2229 SmallPtrSet<Type *, 4> Visited;
2231 "Attribute 'byval' does not support unsized types!", V);
2235 "'byval' argument has illegal target extension type", V);
2236 Check(
DL.getTypeAllocSize(ByValTy).getKnownMinValue() < (1ULL << 32),
2237 "huge 'byval' arguments are unsupported", V);
2239 if (
Attrs.hasAttribute(Attribute::ByRef)) {
2240 SmallPtrSet<Type *, 4> Visited;
2241 Check(
Attrs.getByRefType()->isSized(&Visited),
2242 "Attribute 'byref' does not support unsized types!", V);
2243 Check(
DL.getTypeAllocSize(
Attrs.getByRefType()).getKnownMinValue() <
2245 "huge 'byref' arguments are unsupported", V);
2247 if (
Attrs.hasAttribute(Attribute::InAlloca)) {
2248 SmallPtrSet<Type *, 4> Visited;
2249 Check(
Attrs.getInAllocaType()->isSized(&Visited),
2250 "Attribute 'inalloca' does not support unsized types!", V);
2251 Check(
DL.getTypeAllocSize(
Attrs.getInAllocaType()).getKnownMinValue() <
2253 "huge 'inalloca' arguments are unsupported", V);
2255 if (
Attrs.hasAttribute(Attribute::Preallocated)) {
2256 SmallPtrSet<Type *, 4> Visited;
2257 Check(
Attrs.getPreallocatedType()->isSized(&Visited),
2258 "Attribute 'preallocated' does not support unsized types!", V);
2260 DL.getTypeAllocSize(
Attrs.getPreallocatedType()).getKnownMinValue() <
2262 "huge 'preallocated' arguments are unsupported", V);
2266 if (
Attrs.hasAttribute(Attribute::Initializes)) {
2267 auto Inits =
Attrs.getAttribute(Attribute::Initializes).getInitializes();
2268 Check(!Inits.empty(),
"Attribute 'initializes' does not support empty list",
2271 "Attribute 'initializes' does not support unordered ranges", V);
2274 if (
Attrs.hasAttribute(Attribute::NoFPClass)) {
2275 uint64_t Val =
Attrs.getAttribute(Attribute::NoFPClass).getValueAsInt();
2276 Check(Val != 0,
"Attribute 'nofpclass' must have at least one test bit set",
2279 "Invalid value for 'nofpclass' test mask", V);
2281 if (
Attrs.hasAttribute(Attribute::Range)) {
2282 const ConstantRange &CR =
2283 Attrs.getAttribute(Attribute::Range).getValueAsConstantRange();
2285 "Range bit width must match type bit width!", V);
2289void Verifier::checkUnsignedBaseTenFuncAttr(AttributeList Attrs, StringRef Attr,
2291 if (
Attrs.hasFnAttr(Attr)) {
2292 StringRef S =
Attrs.getFnAttr(Attr).getValueAsString();
2295 CheckFailed(
"\"" + Attr +
"\" takes an unsigned integer: " + S, V);
2301void Verifier::verifyFunctionAttrs(FunctionType *FT, AttributeList Attrs,
2302 const Value *V,
bool IsIntrinsic,
2304 if (
Attrs.isEmpty())
2307 if (AttributeListsVisited.
insert(
Attrs.getRawPointer()).second) {
2309 "Attribute list does not match Module context!", &Attrs, V);
2310 for (
const auto &AttrSet : Attrs) {
2311 Check(!AttrSet.hasAttributes() || AttrSet.hasParentContext(
Context),
2312 "Attribute set does not match Module context!", &AttrSet, V);
2313 for (
const auto &
A : AttrSet) {
2315 "Attribute does not match Module context!", &
A, V);
2320 bool SawNest =
false;
2321 bool SawReturned =
false;
2322 bool SawSRet =
false;
2323 bool SawSwiftSelf =
false;
2324 bool SawSwiftAsync =
false;
2325 bool SawSwiftError =
false;
2328 AttributeSet RetAttrs =
Attrs.getRetAttrs();
2331 Attribute::canUseAsRetAttr(
RetAttr.getKindAsEnum()),
2332 "Attribute '" +
RetAttr.getAsString() +
2333 "' does not apply to function return values",
2336 unsigned MaxParameterWidth = 0;
2337 auto GetMaxParameterWidth = [&MaxParameterWidth](
Type *Ty) {
2340 unsigned Size = VT->getPrimitiveSizeInBits().getFixedValue();
2341 if (
Size > MaxParameterWidth)
2342 MaxParameterWidth =
Size;
2346 GetMaxParameterWidth(FT->getReturnType());
2347 verifyParameterAttrs(RetAttrs, FT->getReturnType(), V);
2350 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {
2351 Type *Ty = FT->getParamType(i);
2352 AttributeSet ArgAttrs =
Attrs.getParamAttrs(i);
2356 "immarg attribute only applies to intrinsics", V);
2359 "Attribute 'elementtype' can only be applied to intrinsics"
2364 verifyParameterAttrs(ArgAttrs, Ty, V);
2365 GetMaxParameterWidth(Ty);
2368 Check(!SawNest,
"More than one parameter has attribute nest!", V);
2373 Check(!SawReturned,
"More than one parameter has attribute returned!", V);
2375 "Incompatible argument and return types for 'returned' attribute",
2381 Check(!SawSRet,
"Cannot have multiple 'sret' parameters!", V);
2382 Check(i == 0 || i == 1,
2383 "Attribute 'sret' is not on first or second parameter!", V);
2388 Check(!SawSwiftSelf,
"Cannot have multiple 'swiftself' parameters!", V);
2389 SawSwiftSelf =
true;
2393 Check(!SawSwiftAsync,
"Cannot have multiple 'swiftasync' parameters!", V);
2394 SawSwiftAsync =
true;
2398 Check(!SawSwiftError,
"Cannot have multiple 'swifterror' parameters!", V);
2399 SawSwiftError =
true;
2403 Check(i == FT->getNumParams() - 1,
2404 "inalloca isn't on the last parameter!", V);
2408 if (!
Attrs.hasFnAttrs())
2411 verifyAttributeTypes(
Attrs.getFnAttrs(), V);
2414 Attribute::canUseAsFnAttr(
FnAttr.getKindAsEnum()),
2415 "Attribute '" +
FnAttr.getAsString() +
2416 "' does not apply to functions!",
2419 Check(!(
Attrs.hasFnAttr(Attribute::NoInline) &&
2420 Attrs.hasFnAttr(Attribute::AlwaysInline)),
2421 "Attributes 'noinline and alwaysinline' are incompatible!", V);
2423 if (
Attrs.hasFnAttr(Attribute::OptimizeNone)) {
2425 "Attribute 'optnone' requires 'noinline'!", V);
2427 Check(!
Attrs.hasFnAttr(Attribute::OptimizeForSize),
2428 "Attributes 'optsize and optnone' are incompatible!", V);
2431 "Attributes 'minsize and optnone' are incompatible!", V);
2433 Check(!
Attrs.hasFnAttr(Attribute::OptimizeForDebugging),
2434 "Attributes 'optdebug and optnone' are incompatible!", V);
2437 Check(!(
Attrs.hasFnAttr(Attribute::SanitizeRealtime) &&
2438 Attrs.hasFnAttr(Attribute::SanitizeRealtimeBlocking)),
2440 "'sanitize_realtime and sanitize_realtime_blocking' are incompatible!",
2443 if (
Attrs.hasFnAttr(Attribute::OptimizeForDebugging)) {
2444 Check(!
Attrs.hasFnAttr(Attribute::OptimizeForSize),
2445 "Attributes 'optsize and optdebug' are incompatible!", V);
2448 "Attributes 'minsize and optdebug' are incompatible!", V);
2451 Check(!
Attrs.hasAttrSomewhere(Attribute::Writable) ||
2452 isModSet(
Attrs.getMemoryEffects().getModRef(IRMemLocation::ArgMem)),
2453 "Attribute writable and memory without argmem: write are incompatible!",
2456 if (
Attrs.hasFnAttr(
"aarch64_pstate_sm_enabled")) {
2457 Check(!
Attrs.hasFnAttr(
"aarch64_pstate_sm_compatible"),
2458 "Attributes 'aarch64_pstate_sm_enabled and "
2459 "aarch64_pstate_sm_compatible' are incompatible!",
2463 Check((
Attrs.hasFnAttr(
"aarch64_new_za") +
Attrs.hasFnAttr(
"aarch64_in_za") +
2464 Attrs.hasFnAttr(
"aarch64_inout_za") +
2465 Attrs.hasFnAttr(
"aarch64_out_za") +
2466 Attrs.hasFnAttr(
"aarch64_preserves_za") +
2467 Attrs.hasFnAttr(
"aarch64_za_state_agnostic")) <= 1,
2468 "Attributes 'aarch64_new_za', 'aarch64_in_za', 'aarch64_out_za', "
2469 "'aarch64_inout_za', 'aarch64_preserves_za' and "
2470 "'aarch64_za_state_agnostic' are mutually exclusive",
2474 Attrs.hasFnAttr(
"aarch64_in_zt0") +
2475 Attrs.hasFnAttr(
"aarch64_inout_zt0") +
2476 Attrs.hasFnAttr(
"aarch64_out_zt0") +
2477 Attrs.hasFnAttr(
"aarch64_preserves_zt0") +
2478 Attrs.hasFnAttr(
"aarch64_za_state_agnostic")) <= 1,
2479 "Attributes 'aarch64_new_zt0', 'aarch64_in_zt0', 'aarch64_out_zt0', "
2480 "'aarch64_inout_zt0', 'aarch64_preserves_zt0' and "
2481 "'aarch64_za_state_agnostic' are mutually exclusive",
2484 if (
Attrs.hasFnAttr(Attribute::JumpTable)) {
2487 "Attribute 'jumptable' requires 'unnamed_addr'", V);
2490 if (
auto Args =
Attrs.getFnAttrs().getAllocSizeArgs()) {
2491 auto CheckParam = [&](StringRef
Name,
unsigned ParamNo) {
2492 if (ParamNo >= FT->getNumParams()) {
2493 CheckFailed(
"'allocsize' " + Name +
" argument is out of bounds", V);
2497 if (!FT->getParamType(ParamNo)->isIntegerTy()) {
2498 CheckFailed(
"'allocsize' " + Name +
2499 " argument must refer to an integer parameter",
2507 if (!CheckParam(
"element size",
Args->first))
2510 if (
Args->second && !CheckParam(
"number of elements", *
Args->second))
2514 if (
Attrs.hasFnAttr(Attribute::AllocKind)) {
2517 K & (AllocFnKind::Alloc | AllocFnKind::Realloc | AllocFnKind::Free);
2519 {AllocFnKind::Alloc, AllocFnKind::Realloc, AllocFnKind::Free},
2522 "'allockind()' requires exactly one of alloc, realloc, and free");
2523 if ((
Type == AllocFnKind::Free) &&
2524 ((K & (AllocFnKind::Uninitialized | AllocFnKind::Zeroed |
2525 AllocFnKind::Aligned)) != AllocFnKind::Unknown))
2526 CheckFailed(
"'allockind(\"free\")' doesn't allow uninitialized, zeroed, "
2527 "or aligned modifiers.");
2528 AllocFnKind ZeroedUninit = AllocFnKind::Uninitialized | AllocFnKind::Zeroed;
2529 if ((K & ZeroedUninit) == ZeroedUninit)
2530 CheckFailed(
"'allockind()' can't be both zeroed and uninitialized");
2534 StringRef S =
A.getValueAsString();
2535 Check(!S.
empty(),
"'alloc-variant-zeroed' must not be empty");
2543 "'alloc-variant-zeroed' must name a function belonging to the "
2544 "same 'alloc-family'");
2547 (
Variant->getFnAttribute(Attribute::AllocKind).getAllocKind() &
2548 AllocFnKind::Zeroed) != AllocFnKind::Unknown,
2549 "'alloc-variant-zeroed' must name a function with "
2550 "'allockind(\"zeroed\")'");
2553 "'alloc-variant-zeroed' must name a function with the same "
2558 "'alloc-variant-zeroed' must name a function with the same "
2559 "calling convention");
2563 if (
Attrs.hasFnAttr(Attribute::VScaleRange)) {
2564 unsigned VScaleMin =
Attrs.getFnAttrs().getVScaleRangeMin();
2566 CheckFailed(
"'vscale_range' minimum must be greater than 0", V);
2568 CheckFailed(
"'vscale_range' minimum must be power-of-two value", V);
2569 std::optional<unsigned> VScaleMax =
Attrs.getFnAttrs().getVScaleRangeMax();
2570 if (VScaleMax && VScaleMin > VScaleMax)
2571 CheckFailed(
"'vscale_range' minimum cannot be greater than maximum", V);
2573 CheckFailed(
"'vscale_range' maximum must be power-of-two value", V);
2576 if (
Attribute FPAttr =
Attrs.getFnAttr(
"frame-pointer"); FPAttr.isValid()) {
2577 StringRef
FP = FPAttr.getValueAsString();
2578 if (
FP !=
"all" &&
FP !=
"non-leaf" &&
FP !=
"none" &&
FP !=
"reserved" &&
2579 FP !=
"non-leaf-no-reserve")
2580 CheckFailed(
"invalid value for 'frame-pointer' attribute: " +
FP, V);
2583 checkUnsignedBaseTenFuncAttr(Attrs,
"patchable-function-prefix", V);
2584 checkUnsignedBaseTenFuncAttr(Attrs,
"patchable-function-entry", V);
2585 if (
Attrs.hasFnAttr(
"patchable-function-entry-section"))
2586 Check(!
Attrs.getFnAttr(
"patchable-function-entry-section")
2589 "\"patchable-function-entry-section\" must not be empty");
2590 checkUnsignedBaseTenFuncAttr(Attrs,
"warn-stack-size", V);
2592 if (
auto A =
Attrs.getFnAttr(
"sign-return-address");
A.isValid()) {
2593 StringRef S =
A.getValueAsString();
2594 if (S !=
"none" && S !=
"all" && S !=
"non-leaf")
2595 CheckFailed(
"invalid value for 'sign-return-address' attribute: " + S, V);
2598 if (
auto A =
Attrs.getFnAttr(
"sign-return-address-key");
A.isValid()) {
2599 StringRef S =
A.getValueAsString();
2600 if (S !=
"a_key" && S !=
"b_key")
2601 CheckFailed(
"invalid value for 'sign-return-address-key' attribute: " + S,
2603 if (
auto AA =
Attrs.getFnAttr(
"sign-return-address"); !AA.isValid()) {
2605 "'sign-return-address-key' present without `sign-return-address`");
2609 if (
auto A =
Attrs.getFnAttr(
"branch-target-enforcement");
A.isValid()) {
2610 StringRef S =
A.getValueAsString();
2611 if (S !=
"" && S !=
"true" && S !=
"false")
2613 "invalid value for 'branch-target-enforcement' attribute: " + S, V);
2616 if (
auto A =
Attrs.getFnAttr(
"branch-protection-pauth-lr");
A.isValid()) {
2617 StringRef S =
A.getValueAsString();
2618 if (S !=
"" && S !=
"true" && S !=
"false")
2620 "invalid value for 'branch-protection-pauth-lr' attribute: " + S, V);
2623 if (
auto A =
Attrs.getFnAttr(
"guarded-control-stack");
A.isValid()) {
2624 StringRef S =
A.getValueAsString();
2625 if (S !=
"" && S !=
"true" && S !=
"false")
2626 CheckFailed(
"invalid value for 'guarded-control-stack' attribute: " + S,
2630 if (
auto A =
Attrs.getFnAttr(
"vector-function-abi-variant");
A.isValid()) {
2631 StringRef S =
A.getValueAsString();
2634 CheckFailed(
"invalid name for a VFABI variant: " + S, V);
2637 if (
auto A =
Attrs.getFnAttr(
"modular-format");
A.isValid()) {
2638 StringRef S =
A.getValueAsString();
2642 "modular-format attribute requires at least 5 arguments", V);
2643 unsigned FirstArgIdx;
2644 Check(!Args[2].getAsInteger(10, FirstArgIdx),
2645 "modular-format attribute first arg index is not an integer", V);
2646 unsigned UpperBound = FT->getNumParams() + (FT->isVarArg() ? 1 : 0);
2647 Check(FirstArgIdx > 0 && FirstArgIdx <= UpperBound,
2648 "modular-format attribute first arg index is out of bounds", V);
2651 if (
auto A =
Attrs.getFnAttr(
"target-features");
A.isValid()) {
2652 StringRef S =
A.getValueAsString();
2654 for (
auto FeatureFlag :
split(S,
',')) {
2655 if (FeatureFlag.empty())
2657 "target-features attribute should not contain an empty string");
2659 Check(FeatureFlag[0] ==
'+' || FeatureFlag[0] ==
'-',
2660 "target feature '" + FeatureFlag +
2661 "' must start with a '+' or '-'",
2667void Verifier::verifyUnknownProfileMetadata(MDNode *MD) {
2669 "'unknown' !prof should have a single additional operand", MD);
2672 "'unknown' !prof should have an additional operand of type "
2675 "the 'unknown' !prof operand should not be an empty string");
2678void Verifier::verifyFunctionMetadata(
2679 ArrayRef<std::pair<unsigned, MDNode *>> MDs) {
2680 for (
const auto &Pair : MDs) {
2681 if (Pair.first == LLVMContext::MD_prof) {
2682 MDNode *MD = Pair.second;
2684 "!prof annotations should have no less than 2 operands", MD);
2689 verifyUnknownProfileMetadata(MD);
2694 Check(MD->
getOperand(0) !=
nullptr,
"first operand should not be null",
2697 "expected string with name of the !prof annotation", MD);
2702 "first operand should be 'function_entry_count'"
2703 " or 'synthetic_function_entry_count'",
2707 Check(MD->
getOperand(1) !=
nullptr,
"second operand should not be null",
2710 "expected integer argument to function_entry_count", MD);
2711 }
else if (Pair.first == LLVMContext::MD_kcfi_type) {
2712 MDNode *MD = Pair.second;
2714 "!kcfi_type must have exactly one operand", MD);
2715 Check(MD->
getOperand(0) !=
nullptr,
"!kcfi_type operand must not be null",
2718 "expected a constant operand for !kcfi_type", MD);
2721 "expected a constant integer operand for !kcfi_type", MD);
2723 "expected a 32-bit integer constant operand for !kcfi_type", MD);
2728void Verifier::visitConstantExprsRecursively(
const Constant *EntryC) {
2732 if (!ConstantExprVisited.
insert(EntryC).second)
2736 Stack.push_back(EntryC);
2738 while (!
Stack.empty()) {
2743 visitConstantExpr(CE);
2746 visitConstantPtrAuth(CPA);
2751 Check(GV->
getParent() == &M,
"Referencing global in another module!",
2757 for (
const Use &U :
C->operands()) {
2761 if (!ConstantExprVisited.
insert(OpC).second)
2763 Stack.push_back(OpC);
2768void Verifier::visitConstantExpr(
const ConstantExpr *CE) {
2769 if (
CE->getOpcode() == Instruction::BitCast)
2772 "Invalid bitcast", CE);
2773 else if (
CE->getOpcode() == Instruction::PtrToAddr)
2774 checkPtrToAddr(
CE->getOperand(0)->getType(),
CE->getType(), *CE);
2777void Verifier::visitConstantPtrAuth(
const ConstantPtrAuth *CPA) {
2779 "signed ptrauth constant base pointer must have pointer type");
2782 "signed ptrauth constant must have same type as its base pointer");
2785 "signed ptrauth constant key must be i32 constant integer");
2788 "signed ptrauth constant address discriminator must be a pointer");
2791 "signed ptrauth constant discriminator must be i64 constant integer");
2794 "signed ptrauth constant deactivation symbol must be a pointer");
2798 "signed ptrauth constant deactivation symbol must be a global value "
2802bool Verifier::verifyAttributeCount(AttributeList Attrs,
unsigned Params) {
2805 return Attrs.getNumAttrSets() <= Params + 2;
2808void Verifier::verifyInlineAsmCall(
const CallBase &
Call) {
2811 unsigned LabelNo = 0;
2812 for (
const InlineAsm::ConstraintInfo &CI :
IA->ParseConstraints()) {
2822 if (CI.isIndirect) {
2825 "Operand for indirect constraint must have pointer type", &
Call);
2828 "Operand for indirect constraint must have elementtype attribute",
2832 "Elementtype attribute can only be applied for indirect "
2841 Check(LabelNo == CallBr->getNumIndirectDests(),
2842 "Number of label constraints does not match number of callbr dests",
2845 Check(LabelNo == 0,
"Label constraints can only be used with callbr",
2851void Verifier::verifyStatepoint(
const CallBase &
Call) {
2856 "gc.statepoint must read and write all memory to preserve "
2857 "reordering restrictions required by safepoint semantics",
2860 const int64_t NumPatchBytes =
2863 Check(NumPatchBytes >= 0,
2864 "gc.statepoint number of patchable bytes must be "
2869 Check(TargetElemType,
2870 "gc.statepoint callee argument must have elementtype attribute",
Call);
2872 Check(TargetFuncType,
2873 "gc.statepoint callee elementtype must be function type",
Call);
2876 Check(NumCallArgs >= 0,
2877 "gc.statepoint number of arguments to underlying call "
2880 const int NumParams = (int)TargetFuncType->getNumParams();
2881 if (TargetFuncType->isVarArg()) {
2882 Check(NumCallArgs >= NumParams,
2883 "gc.statepoint mismatch in number of vararg call args",
Call);
2886 Check(TargetFuncType->getReturnType()->isVoidTy(),
2887 "gc.statepoint doesn't support wrapping non-void "
2888 "vararg functions yet",
2891 Check(NumCallArgs == NumParams,
2892 "gc.statepoint mismatch in number of call args",
Call);
2894 const uint64_t
Flags
2896 Check((Flags & ~(uint64_t)StatepointFlags::MaskAll) == 0,
2897 "unknown flag used in gc.statepoint flags argument",
Call);
2902 for (
int i = 0; i < NumParams; i++) {
2903 Type *ParamType = TargetFuncType->getParamType(i);
2905 Check(ArgType == ParamType,
2906 "gc.statepoint call argument does not match wrapped "
2910 if (TargetFuncType->isVarArg()) {
2911 AttributeSet ArgAttrs =
Attrs.getParamAttrs(5 + i);
2913 "Attribute 'sret' cannot be used for vararg call arguments!",
Call);
2917 const int EndCallArgsInx = 4 + NumCallArgs;
2921 "gc.statepoint number of transition arguments "
2922 "must be constant integer",
2924 const int NumTransitionArgs =
2926 Check(NumTransitionArgs == 0,
2927 "gc.statepoint w/inline transition bundle is deprecated",
Call);
2928 const int EndTransitionArgsInx = EndCallArgsInx + 1 + NumTransitionArgs;
2932 "gc.statepoint number of deoptimization arguments "
2933 "must be constant integer",
2936 Check(NumDeoptArgs == 0,
2937 "gc.statepoint w/inline deopt operands is deprecated",
Call);
2939 const int ExpectedNumArgs = 7 + NumCallArgs;
2941 "gc.statepoint too many arguments",
Call);
2948 Check(UserCall,
"illegal use of statepoint token",
Call, U);
2952 "gc.result or gc.relocate are the only value uses "
2953 "of a gc.statepoint",
2957 "gc.result connected to wrong gc.statepoint",
Call, UserCall);
2960 "gc.relocate connected to wrong gc.statepoint",
Call, UserCall);
2974void Verifier::verifyFrameRecoverIndices() {
2975 for (
auto &Counts : FrameEscapeInfo) {
2977 unsigned EscapedObjectCount = Counts.second.first;
2978 unsigned MaxRecoveredIndex = Counts.second.second;
2979 Check(MaxRecoveredIndex <= EscapedObjectCount,
2980 "all indices passed to llvm.localrecover must be less than the "
2981 "number of arguments passed to llvm.localescape in the parent "
2990 UnwindDest =
II->getUnwindDest();
2992 UnwindDest = CSI->getUnwindDest();
2998void Verifier::verifySiblingFuncletUnwinds() {
2999 llvm::TimeTraceScope timeScope(
"Verifier verify sibling funclet unwinds");
3000 SmallPtrSet<Instruction *, 8> Visited;
3001 SmallPtrSet<Instruction *, 8>
Active;
3002 for (
const auto &Pair : SiblingFuncletInfo) {
3004 if (Visited.
count(PredPad))
3010 if (
Active.count(SuccPad)) {
3013 SmallVector<Instruction *, 8> CycleNodes;
3016 Instruction *CycleTerminator = SiblingFuncletInfo[CyclePad];
3017 if (CycleTerminator != CyclePad)
3020 }
while (CyclePad != SuccPad);
3021 Check(
false,
"EH pads can't handle each other's exceptions",
3025 if (!Visited.
insert(SuccPad).second)
3029 auto TermI = SiblingFuncletInfo.find(PredPad);
3030 if (TermI == SiblingFuncletInfo.end())
3043void Verifier::visitFunction(
const Function &
F) {
3044 visitGlobalValue(
F);
3047 FunctionType *FT =
F.getFunctionType();
3048 unsigned NumArgs =
F.arg_size();
3051 "Function context does not match Module context!", &
F);
3053 Check(!
F.hasCommonLinkage(),
"Functions may not have common linkage", &
F);
3054 Check(FT->getNumParams() == NumArgs,
3055 "# formal arguments must match # of arguments for function type!", &
F,
3057 Check(
F.getReturnType()->isFirstClassType() ||
3058 F.getReturnType()->isVoidTy() ||
F.getReturnType()->isStructTy(),
3059 "Functions cannot return aggregate values!", &
F);
3061 Check(!
F.hasStructRetAttr() ||
F.getReturnType()->isVoidTy(),
3062 "Invalid struct return type!", &
F);
3064 if (MaybeAlign
A =
F.getAlign()) {
3065 Check(
A->value() <= Value::MaximumAlignment,
3066 "huge alignment values are unsupported", &
F);
3069 AttributeList
Attrs =
F.getAttributes();
3071 Check(verifyAttributeCount(Attrs, FT->getNumParams()),
3072 "Attribute after last parameter!", &
F);
3074 bool IsIntrinsic =
F.isIntrinsic();
3077 verifyFunctionAttrs(FT, Attrs, &
F, IsIntrinsic,
false);
3083 "Attribute 'builtin' can only be applied to a callsite.", &
F);
3085 Check(!
Attrs.hasAttrSomewhere(Attribute::ElementType),
3086 "Attribute 'elementtype' can only be applied to a callsite.", &
F);
3089 "Attribute 'aarch64_zt0_undef' can only be applied to a callsite.");
3091 if (
Attrs.hasFnAttr(Attribute::Naked))
3092 for (
const Argument &Arg :
F.args())
3093 Check(Arg.use_empty(),
"cannot use argument of naked function", &Arg);
3098 switch (
F.getCallingConv()) {
3100 case CallingConv::C:
3102 case CallingConv::X86_INTR: {
3103 Check(
F.arg_empty() ||
Attrs.hasParamAttr(0, Attribute::ByVal),
3104 "Calling convention parameter requires byval", &
F);
3107 case CallingConv::AMDGPU_KERNEL:
3108 case CallingConv::SPIR_KERNEL:
3109 case CallingConv::AMDGPU_CS_Chain:
3110 case CallingConv::AMDGPU_CS_ChainPreserve:
3111 Check(
F.getReturnType()->isVoidTy(),
3112 "Calling convention requires void return type", &
F);
3114 case CallingConv::AMDGPU_VS:
3115 case CallingConv::AMDGPU_HS:
3116 case CallingConv::AMDGPU_GS:
3117 case CallingConv::AMDGPU_PS:
3118 case CallingConv::AMDGPU_CS:
3119 Check(!
F.hasStructRetAttr(),
"Calling convention does not allow sret", &
F);
3120 if (
F.getCallingConv() != CallingConv::SPIR_KERNEL) {
3121 const unsigned StackAS =
DL.getAllocaAddrSpace();
3123 for (
const Argument &Arg :
F.args()) {
3124 Check(!
Attrs.hasParamAttr(i, Attribute::ByVal),
3125 "Calling convention disallows byval", &
F);
3126 Check(!
Attrs.hasParamAttr(i, Attribute::Preallocated),
3127 "Calling convention disallows preallocated", &
F);
3128 Check(!
Attrs.hasParamAttr(i, Attribute::InAlloca),
3129 "Calling convention disallows inalloca", &
F);
3131 if (
Attrs.hasParamAttr(i, Attribute::ByRef)) {
3134 Check(Arg.getType()->getPointerAddressSpace() != StackAS,
3135 "Calling convention disallows stack byref", &
F);
3143 case CallingConv::Fast:
3144 case CallingConv::Cold:
3145 case CallingConv::Intel_OCL_BI:
3146 case CallingConv::PTX_Kernel:
3147 case CallingConv::PTX_Device:
3149 "Calling convention does not support varargs or "
3150 "perfect forwarding!",
3153 case CallingConv::AMDGPU_Gfx_WholeWave:
3154 Check(!
F.arg_empty() &&
F.arg_begin()->getType()->isIntegerTy(1),
3155 "Calling convention requires first argument to be i1", &
F);
3156 Check(!
F.arg_begin()->hasInRegAttr(),
3157 "Calling convention requires first argument to not be inreg", &
F);
3159 "Calling convention does not support varargs or "
3160 "perfect forwarding!",
3167 for (
const Argument &Arg :
F.args()) {
3168 Check(Arg.getType() == FT->getParamType(i),
3169 "Argument value does not match function argument type!", &Arg,
3170 FT->getParamType(i));
3171 Check(Arg.getType()->isFirstClassType(),
3172 "Function arguments must have first-class types!", &Arg);
3174 Check(!Arg.getType()->isMetadataTy(),
3175 "Function takes metadata but isn't an intrinsic", &Arg, &
F);
3176 Check(!Arg.getType()->isTokenLikeTy(),
3177 "Function takes token but isn't an intrinsic", &Arg, &
F);
3178 Check(!Arg.getType()->isX86_AMXTy(),
3179 "Function takes x86_amx but isn't an intrinsic", &Arg, &
F);
3183 if (
Attrs.hasParamAttr(i, Attribute::SwiftError)) {
3184 verifySwiftErrorValue(&Arg);
3190 Check(!
F.getReturnType()->isTokenLikeTy(),
3191 "Function returns a token but isn't an intrinsic", &
F);
3192 Check(!
F.getReturnType()->isX86_AMXTy(),
3193 "Function returns a x86_amx but isn't an intrinsic", &
F);
3198 F.getAllMetadata(MDs);
3199 assert(
F.hasMetadata() != MDs.
empty() &&
"Bit out-of-sync");
3200 verifyFunctionMetadata(MDs);
3203 if (
F.hasPersonalityFn()) {
3206 Check(Per->getParent() ==
F.getParent(),
3207 "Referencing personality function in another module!", &
F,
3208 F.getParent(), Per, Per->getParent());
3212 BlockEHFuncletColors.
clear();
3214 if (
F.isMaterializable()) {
3216 Check(MDs.
empty(),
"unmaterialized function cannot have metadata", &
F,
3218 }
else if (
F.isDeclaration()) {
3219 for (
const auto &
I : MDs) {
3221 CheckDI(
I.first != LLVMContext::MD_dbg ||
3223 "function declaration may only have a unique !dbg attachment",
3225 Check(
I.first != LLVMContext::MD_prof,
3226 "function declaration may not have a !prof attachment", &
F);
3229 visitMDNode(*
I.second, AreDebugLocsAllowed::Yes);
3231 Check(!
F.hasPersonalityFn(),
3232 "Function declaration shouldn't have a personality routine", &
F);
3236 Check(!IsIntrinsic,
"llvm intrinsics cannot be defined!", &
F);
3241 "Entry block to function must not have predecessors!", Entry);
3244 if (
Entry->hasAddressTaken()) {
3246 "blockaddress may not be used with the entry block!", Entry);
3249 unsigned NumDebugAttachments = 0, NumProfAttachments = 0,
3250 NumKCFIAttachments = 0;
3252 for (
const auto &
I : MDs) {
3254 auto AllowLocs = AreDebugLocsAllowed::No;
3258 case LLVMContext::MD_dbg: {
3259 ++NumDebugAttachments;
3260 CheckDI(NumDebugAttachments == 1,
3261 "function must have a single !dbg attachment", &
F,
I.second);
3263 "function !dbg attachment must be a subprogram", &
F,
I.second);
3265 "function definition may only have a distinct !dbg attachment",
3269 const Function *&AttachedTo = DISubprogramAttachments[
SP];
3270 CheckDI(!AttachedTo || AttachedTo == &
F,
3271 "DISubprogram attached to more than one function", SP, &
F);
3273 AllowLocs = AreDebugLocsAllowed::Yes;
3276 case LLVMContext::MD_prof:
3277 ++NumProfAttachments;
3278 Check(NumProfAttachments == 1,
3279 "function must have a single !prof attachment", &
F,
I.second);
3281 case LLVMContext::MD_kcfi_type:
3282 ++NumKCFIAttachments;
3283 Check(NumKCFIAttachments == 1,
3284 "function must have a single !kcfi_type attachment", &
F,
3290 visitMDNode(*
I.second, AllowLocs);
3298 if (
F.isIntrinsic() &&
F.getParent()->isMaterialized()) {
3300 if (
F.hasAddressTaken(&U,
false,
true,
false,
3302 Check(
false,
"Invalid user of intrinsic instruction!", U);
3306 switch (
F.getIntrinsicID()) {
3307 case Intrinsic::experimental_gc_get_pointer_base: {
3308 FunctionType *FT =
F.getFunctionType();
3309 Check(FT->getNumParams() == 1,
"wrong number of parameters",
F);
3311 "gc.get.pointer.base must return a pointer",
F);
3312 Check(FT->getParamType(0) ==
F.getReturnType(),
3313 "gc.get.pointer.base operand and result must be of the same type",
F);
3316 case Intrinsic::experimental_gc_get_pointer_offset: {
3317 FunctionType *FT =
F.getFunctionType();
3318 Check(FT->getNumParams() == 1,
"wrong number of parameters",
F);
3320 "gc.get.pointer.offset operand must be a pointer",
F);
3321 Check(
F.getReturnType()->isIntegerTy(),
3322 "gc.get.pointer.offset must return integer",
F);
3327 auto *
N =
F.getSubprogram();
3328 HasDebugInfo = (
N !=
nullptr);
3336 SmallPtrSet<const MDNode *, 32> Seen;
3348 "DILocation's scope must be a DILocalScope",
N, &
F, &
I,
DL, Parent);
3350 DILocalScope *
Scope =
DL->getInlinedAtScope();
3351 Check(Scope,
"Failed to find DILocalScope",
DL);
3353 if (!Seen.
insert(Scope).second)
3356 DISubprogram *
SP =
Scope->getSubprogram();
3360 if ((Scope != SP) && !Seen.
insert(SP).second)
3364 "!dbg attachment points at wrong subprogram for function",
N, &
F,
3368 for (
auto &
I : BB) {
3369 VisitDebugLoc(
I,
I.getDebugLoc().getAsMDNode());
3371 if (
auto MD =
I.getMetadata(LLVMContext::MD_loop))
3374 if (BrokenDebugInfo)
3381void Verifier::visitBasicBlock(BasicBlock &BB) {
3382 InstsInThisBlock.
clear();
3383 ConvergenceVerifyHelper.
visit(BB);
3394 for (
const PHINode &PN : BB.
phis()) {
3395 Check(PN.getNumIncomingValues() == Preds.size(),
3396 "PHINode should have one entry for each predecessor of its "
3397 "parent basic block!",
3402 Values.
reserve(PN.getNumIncomingValues());
3403 for (
unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i)
3405 std::make_pair(PN.getIncomingBlock(i), PN.getIncomingValue(i)));
3408 for (
unsigned i = 0, e = Values.
size(); i != e; ++i) {
3413 Check(i == 0 || Values[i].first != Values[i - 1].first ||
3414 Values[i].second == Values[i - 1].second,
3415 "PHI node has multiple entries for the same basic block with "
3416 "different incoming values!",
3417 &PN, Values[i].first, Values[i].second, Values[i - 1].second);
3421 Check(Values[i].first == Preds[i],
3422 "PHI node entries do not match predecessors!", &PN,
3423 Values[i].first, Preds[i]);
3431 Check(
I.getParent() == &BB,
"Instruction has bogus parent pointer!");
3435 CheckDI(!BB.getTrailingDbgRecords(),
"Basic Block has trailing DbgRecords!",
3439void Verifier::visitTerminator(Instruction &
I) {
3441 Check(&
I ==
I.getParent()->getTerminator(),
3442 "Terminator found in the middle of a basic block!",
I.getParent());
3443 visitInstruction(
I);
3446void Verifier::visitBranchInst(BranchInst &BI) {
3449 "Branch condition is not 'i1' type!", &BI, BI.
getCondition());
3451 visitTerminator(BI);
3454void Verifier::visitReturnInst(ReturnInst &RI) {
3457 if (
F->getReturnType()->isVoidTy())
3459 "Found return instr that returns non-void in Function of void "
3461 &RI,
F->getReturnType());
3464 "Function return type does not match operand "
3465 "type of return inst!",
3466 &RI,
F->getReturnType());
3470 visitTerminator(RI);
3473void Verifier::visitSwitchInst(SwitchInst &SI) {
3474 Check(
SI.getType()->isVoidTy(),
"Switch must have void result type!", &SI);
3477 Type *SwitchTy =
SI.getCondition()->getType();
3478 SmallPtrSet<ConstantInt*, 32>
Constants;
3479 for (
auto &Case :
SI.cases()) {
3481 "Case value is not a constant integer.", &SI);
3482 Check(Case.getCaseValue()->getType() == SwitchTy,
3483 "Switch constants must all be same type as switch value!", &SI);
3485 "Duplicate integer as switch case", &SI, Case.getCaseValue());
3488 visitTerminator(SI);
3491void Verifier::visitIndirectBrInst(IndirectBrInst &BI) {
3493 "Indirectbr operand must have pointer type!", &BI);
3496 "Indirectbr destinations must all have pointer type!", &BI);
3498 visitTerminator(BI);
3501void Verifier::visitCallBrInst(CallBrInst &CBI) {
3504 "Callbr: indirect function / invalid signature");
3506 "Callbr for intrinsics currently doesn't support operand bundles");
3509 case Intrinsic::amdgcn_kill: {
3511 "Callbr amdgcn_kill only supports one indirect dest");
3515 Intrinsic::amdgcn_unreachable),
3516 "Callbr amdgcn_kill indirect dest needs to be unreachable");
3521 "Callbr currently only supports asm-goto and selected intrinsics");
3526 Check(!
IA->canThrow(),
"Unwinding from Callbr is not allowed");
3528 verifyInlineAsmCall(CBI);
3530 visitTerminator(CBI);
3533void Verifier::visitSelectInst(SelectInst &SI) {
3536 "Invalid operands for select instruction!", &SI);
3538 Check(
SI.getTrueValue()->getType() ==
SI.getType(),
3539 "Select values must have same type as select instruction!", &SI);
3540 visitInstruction(SI);
3546void Verifier::visitUserOp1(Instruction &
I) {
3547 Check(
false,
"User-defined operators should not live outside of a pass!", &
I);
3550void Verifier::visitTruncInst(TruncInst &
I) {
3552 Type *SrcTy =
I.getOperand(0)->getType();
3553 Type *DestTy =
I.getType();
3562 "trunc source and destination must both be a vector or neither", &
I);
3563 Check(SrcBitSize > DestBitSize,
"DestTy too big for Trunc", &
I);
3565 visitInstruction(
I);
3568void Verifier::visitZExtInst(ZExtInst &
I) {
3570 Type *SrcTy =
I.getOperand(0)->getType();
3571 Type *DestTy =
I.getType();
3577 "zext source and destination must both be a vector or neither", &
I);
3581 Check(SrcBitSize < DestBitSize,
"Type too small for ZExt", &
I);
3583 visitInstruction(
I);
3586void Verifier::visitSExtInst(SExtInst &
I) {
3588 Type *SrcTy =
I.getOperand(0)->getType();
3589 Type *DestTy =
I.getType();
3598 "sext source and destination must both be a vector or neither", &
I);
3599 Check(SrcBitSize < DestBitSize,
"Type too small for SExt", &
I);
3601 visitInstruction(
I);
3604void Verifier::visitFPTruncInst(FPTruncInst &
I) {
3606 Type *SrcTy =
I.getOperand(0)->getType();
3607 Type *DestTy =
I.getType();
3615 "fptrunc source and destination must both be a vector or neither", &
I);
3616 Check(SrcBitSize > DestBitSize,
"DestTy too big for FPTrunc", &
I);
3618 visitInstruction(
I);
3621void Verifier::visitFPExtInst(FPExtInst &
I) {
3623 Type *SrcTy =
I.getOperand(0)->getType();
3624 Type *DestTy =
I.getType();
3633 "fpext source and destination must both be a vector or neither", &
I);
3634 Check(SrcBitSize < DestBitSize,
"DestTy too small for FPExt", &
I);
3636 visitInstruction(
I);
3639void Verifier::visitUIToFPInst(UIToFPInst &
I) {
3641 Type *SrcTy =
I.getOperand(0)->getType();
3642 Type *DestTy =
I.getType();
3647 Check(SrcVec == DstVec,
3648 "UIToFP source and dest must both be vector or scalar", &
I);
3650 "UIToFP source must be integer or integer vector", &
I);
3654 if (SrcVec && DstVec)
3657 "UIToFP source and dest vector length mismatch", &
I);
3659 visitInstruction(
I);
3662void Verifier::visitSIToFPInst(SIToFPInst &
I) {
3664 Type *SrcTy =
I.getOperand(0)->getType();
3665 Type *DestTy =
I.getType();
3670 Check(SrcVec == DstVec,
3671 "SIToFP source and dest must both be vector or scalar", &
I);
3673 "SIToFP source must be integer or integer vector", &
I);
3677 if (SrcVec && DstVec)
3680 "SIToFP source and dest vector length mismatch", &
I);
3682 visitInstruction(
I);
3685void Verifier::visitFPToUIInst(FPToUIInst &
I) {
3687 Type *SrcTy =
I.getOperand(0)->getType();
3688 Type *DestTy =
I.getType();
3693 Check(SrcVec == DstVec,
3694 "FPToUI source and dest must both be vector or scalar", &
I);
3697 "FPToUI result must be integer or integer vector", &
I);
3699 if (SrcVec && DstVec)
3702 "FPToUI source and dest vector length mismatch", &
I);
3704 visitInstruction(
I);
3707void Verifier::visitFPToSIInst(FPToSIInst &
I) {
3709 Type *SrcTy =
I.getOperand(0)->getType();
3710 Type *DestTy =
I.getType();
3715 Check(SrcVec == DstVec,
3716 "FPToSI source and dest must both be vector or scalar", &
I);
3719 "FPToSI result must be integer or integer vector", &
I);
3721 if (SrcVec && DstVec)
3724 "FPToSI source and dest vector length mismatch", &
I);
3726 visitInstruction(
I);
3729void Verifier::checkPtrToAddr(
Type *SrcTy,
Type *DestTy,
const Value &V) {
3738 Check(VSrc->getElementCount() == VDest->getElementCount(),
3739 "PtrToAddr vector length mismatch", V);
3742 Type *AddrTy =
DL.getAddressType(SrcTy);
3743 Check(AddrTy == DestTy,
"PtrToAddr result must be address width", V);
3746void Verifier::visitPtrToAddrInst(PtrToAddrInst &
I) {
3747 checkPtrToAddr(
I.getOperand(0)->getType(),
I.getType(),
I);
3748 visitInstruction(
I);
3751void Verifier::visitPtrToIntInst(PtrToIntInst &
I) {
3753 Type *SrcTy =
I.getOperand(0)->getType();
3754 Type *DestTy =
I.getType();
3765 Check(VSrc->getElementCount() == VDest->getElementCount(),
3766 "PtrToInt Vector length mismatch", &
I);
3769 visitInstruction(
I);
3772void Verifier::visitIntToPtrInst(IntToPtrInst &
I) {
3774 Type *SrcTy =
I.getOperand(0)->getType();
3775 Type *DestTy =
I.getType();
3785 Check(VSrc->getElementCount() == VDest->getElementCount(),
3786 "IntToPtr Vector length mismatch", &
I);
3788 visitInstruction(
I);
3791void Verifier::visitBitCastInst(BitCastInst &
I) {
3794 "Invalid bitcast", &
I);
3795 visitInstruction(
I);
3798void Verifier::visitAddrSpaceCastInst(AddrSpaceCastInst &
I) {
3799 Type *SrcTy =
I.getOperand(0)->getType();
3800 Type *DestTy =
I.getType();
3807 "AddrSpaceCast must be between different address spaces", &
I);
3809 Check(SrcVTy->getElementCount() ==
3811 "AddrSpaceCast vector pointer number of elements mismatch", &
I);
3812 visitInstruction(
I);
3817void Verifier::visitPHINode(PHINode &PN) {
3824 "PHI nodes not grouped at top of basic block!", &PN, PN.
getParent());
3833 "PHI node operands are not the same type as the result!", &PN);
3838 visitInstruction(PN);
3841void Verifier::visitCallBase(CallBase &
Call) {
3843 "Called function must be a pointer!",
Call);
3847 if (FTy->isVarArg())
3849 "Called function requires more parameters than were provided!",
Call);
3852 "Incorrect number of arguments passed to called function!",
Call);
3855 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3857 "Call parameter type does not match function signature!",
3863 "Attribute after last parameter!",
Call);
3870 "Intrinsic called with incompatible signature",
Call);
3874 "calling convention does not permit calls",
Call);
3880 auto VerifyTypeAlign = [&](
Type *Ty,
const Twine &Message) {
3883 Align ABIAlign =
DL.getABITypeAlign(Ty);
3884 Check(ABIAlign.
value() <= Value::MaximumAlignment,
3885 "Incorrect alignment of " + Message +
" to called function!",
Call);
3889 VerifyTypeAlign(FTy->getReturnType(),
"return type");
3890 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
3891 Type *Ty = FTy->getParamType(i);
3892 VerifyTypeAlign(Ty,
"argument passed");
3896 if (
Attrs.hasFnAttr(Attribute::Speculatable)) {
3900 "speculatable attribute may not apply to call sites",
Call);
3903 if (
Attrs.hasFnAttr(Attribute::Preallocated)) {
3905 "preallocated as a call site attribute can only be on "
3906 "llvm.call.preallocated.arg");
3909 Check(!
Attrs.hasFnAttr(Attribute::DenormalFPEnv),
3910 "denormal_fpenv attribute may not apply to call sites",
Call);
3921 Check(AI->isUsedWithInAlloca(),
3922 "inalloca argument for call has mismatched alloca", AI,
Call);
3928 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
3932 Check(AI->isSwiftError(),
3933 "swifterror argument for call has mismatched alloca", AI,
Call);
3937 Check(ArgI,
"swifterror argument should come from an alloca or parameter",
3938 SwiftErrorArg,
Call);
3939 Check(ArgI->hasSwiftErrorAttr(),
3940 "swifterror argument for call has mismatched parameter", ArgI,
3944 if (
Attrs.hasParamAttr(i, Attribute::ImmArg)) {
3947 Check(Callee &&
Callee->hasParamAttribute(i, Attribute::ImmArg),
3955 "immarg operand has non-immediate parameter", ArgVal,
Call);
3961 const ConstantRange &CR =
3964 "immarg value " + Twine(CI->getValue().getSExtValue()) +
3977 Check(hasOB != isMustTail,
3978 "preallocated operand either requires a preallocated bundle or "
3979 "the call to be musttail (but not both)",
3984 if (FTy->isVarArg()) {
3986 bool SawNest =
false;
3987 bool SawReturned =
false;
3989 for (
unsigned Idx = 0; Idx < FTy->getNumParams(); ++Idx) {
3990 if (
Attrs.hasParamAttr(Idx, Attribute::Nest))
3992 if (
Attrs.hasParamAttr(Idx, Attribute::Returned))
3997 for (
unsigned Idx = FTy->getNumParams(); Idx <
Call.
arg_size(); ++Idx) {
3999 AttributeSet ArgAttrs =
Attrs.getParamAttrs(Idx);
4000 verifyParameterAttrs(ArgAttrs, Ty, &
Call);
4003 Check(!SawNest,
"More than one parameter has attribute nest!",
Call);
4008 Check(!SawReturned,
"More than one parameter has attribute returned!",
4011 "Incompatible argument and return types for 'returned' "
4021 "Attribute 'sret' cannot be used for vararg call arguments!",
4026 "inalloca isn't on the last argument!",
Call);
4032 for (
Type *ParamTy : FTy->params()) {
4033 Check(!ParamTy->isMetadataTy(),
4034 "Function has metadata parameter but isn't an intrinsic",
Call);
4035 Check(!ParamTy->isTokenLikeTy(),
4036 "Function has token parameter but isn't an intrinsic",
Call);
4042 Check(!FTy->getReturnType()->isTokenLikeTy(),
4043 "Return type cannot be token for indirect call!");
4044 Check(!FTy->getReturnType()->isX86_AMXTy(),
4045 "Return type cannot be x86_amx for indirect call!");
4049 visitIntrinsicCall(
ID,
Call);
4054 bool FoundDeoptBundle =
false, FoundFuncletBundle =
false,
4055 FoundGCTransitionBundle =
false, FoundCFGuardTargetBundle =
false,
4056 FoundPreallocatedBundle =
false, FoundGCLiveBundle =
false,
4057 FoundPtrauthBundle =
false, FoundKCFIBundle =
false,
4058 FoundAttachedCallBundle =
false;
4063 Check(!FoundDeoptBundle,
"Multiple deopt operand bundles",
Call);
4064 FoundDeoptBundle =
true;
4066 Check(!FoundGCTransitionBundle,
"Multiple gc-transition operand bundles",
4068 FoundGCTransitionBundle =
true;
4070 Check(!FoundFuncletBundle,
"Multiple funclet operand bundles",
Call);
4071 FoundFuncletBundle =
true;
4073 "Expected exactly one funclet bundle operand",
Call);
4075 "Funclet bundle operands should correspond to a FuncletPadInst",
4078 Check(!FoundCFGuardTargetBundle,
"Multiple CFGuardTarget operand bundles",
4080 FoundCFGuardTargetBundle =
true;
4082 "Expected exactly one cfguardtarget bundle operand",
Call);
4084 Check(!FoundPtrauthBundle,
"Multiple ptrauth operand bundles",
Call);
4085 FoundPtrauthBundle =
true;
4087 "Expected exactly two ptrauth bundle operands",
Call);
4089 BU.
Inputs[0]->getType()->isIntegerTy(32),
4090 "Ptrauth bundle key operand must be an i32 constant",
Call);
4092 "Ptrauth bundle discriminator operand must be an i64",
Call);
4094 Check(!FoundKCFIBundle,
"Multiple kcfi operand bundles",
Call);
4095 FoundKCFIBundle =
true;
4096 Check(BU.
Inputs.size() == 1,
"Expected exactly one kcfi bundle operand",
4099 BU.
Inputs[0]->getType()->isIntegerTy(32),
4100 "Kcfi bundle operand must be an i32 constant",
Call);
4102 Check(!FoundPreallocatedBundle,
"Multiple preallocated operand bundles",
4104 FoundPreallocatedBundle =
true;
4106 "Expected exactly one preallocated bundle operand",
Call);
4109 Input->getIntrinsicID() == Intrinsic::call_preallocated_setup,
4110 "\"preallocated\" argument must be a token from "
4111 "llvm.call.preallocated.setup",
4114 Check(!FoundGCLiveBundle,
"Multiple gc-live operand bundles",
Call);
4115 FoundGCLiveBundle =
true;
4117 Check(!FoundAttachedCallBundle,
4118 "Multiple \"clang.arc.attachedcall\" operand bundles",
Call);
4119 FoundAttachedCallBundle =
true;
4120 verifyAttachedCallBundle(
Call, BU);
4126 "Direct call cannot have a ptrauth bundle",
Call);
4138 "inlinable function call in a function with "
4139 "debug info must have a !dbg location",
4143 verifyInlineAsmCall(
Call);
4147 visitInstruction(
Call);
4150void Verifier::verifyTailCCMustTailAttrs(
const AttrBuilder &Attrs,
4153 Twine(
"inalloca attribute not allowed in ") +
Context);
4155 Twine(
"inreg attribute not allowed in ") +
Context);
4156 Check(!
Attrs.contains(Attribute::SwiftError),
4157 Twine(
"swifterror attribute not allowed in ") +
Context);
4158 Check(!
Attrs.contains(Attribute::Preallocated),
4159 Twine(
"preallocated attribute not allowed in ") +
Context);
4161 Twine(
"byref attribute not allowed in ") +
Context);
4173 return PL->getAddressSpace() == PR->getAddressSpace();
4178 Attribute::StructRet, Attribute::ByVal, Attribute::InAlloca,
4179 Attribute::InReg, Attribute::StackAlignment, Attribute::SwiftSelf,
4180 Attribute::SwiftAsync, Attribute::SwiftError, Attribute::Preallocated,
4182 AttrBuilder Copy(
C);
4183 for (
auto AK : ABIAttrs) {
4184 Attribute Attr = Attrs.getParamAttrs(
I).getAttribute(AK);
4186 Copy.addAttribute(Attr);
4190 if (Attrs.hasParamAttr(
I, Attribute::Alignment) &&
4191 (Attrs.hasParamAttr(
I, Attribute::ByVal) ||
4192 Attrs.hasParamAttr(
I, Attribute::ByRef)))
4193 Copy.addAlignmentAttr(Attrs.getParamAlignment(
I));
4197void Verifier::verifyMustTailCall(CallInst &CI) {
4201 FunctionType *CallerTy =
F->getFunctionType();
4203 Check(CallerTy->isVarArg() == CalleeTy->isVarArg(),
4204 "cannot guarantee tail call due to mismatched varargs", &CI);
4206 "cannot guarantee tail call due to mismatched return types", &CI);
4210 "cannot guarantee tail call due to mismatched calling conv", &CI);
4216 Value *RetVal = &CI;
4222 "bitcast following musttail call must use the call", BI);
4229 Check(Ret,
"musttail call must precede a ret with an optional bitcast", &CI);
4232 "musttail call result must be returned", Ret);
4234 AttributeList CallerAttrs =
F->getAttributes();
4239 CI.
getCallingConv() == CallingConv::Tail ?
"tailcc" :
"swifttailcc";
4243 for (
unsigned I = 0,
E = CallerTy->getNumParams();
I !=
E; ++
I) {
4245 SmallString<32>
Context{CCName, StringRef(
" musttail caller")};
4246 verifyTailCCMustTailAttrs(ABIAttrs,
Context);
4248 for (
unsigned I = 0,
E = CalleeTy->getNumParams();
I !=
E; ++
I) {
4250 SmallString<32>
Context{CCName, StringRef(
" musttail callee")};
4251 verifyTailCCMustTailAttrs(ABIAttrs,
Context);
4254 Check(!CallerTy->isVarArg(), Twine(
"cannot guarantee ") + CCName +
4255 " tail call for varargs function");
4263 Check(CallerTy->getNumParams() == CalleeTy->getNumParams(),
4264 "cannot guarantee tail call due to mismatched parameter counts", &CI);
4265 for (
unsigned I = 0,
E = CallerTy->getNumParams();
I !=
E; ++
I) {
4268 "cannot guarantee tail call due to mismatched parameter types", &CI);
4274 for (
unsigned I = 0,
E = CallerTy->getNumParams();
I !=
E; ++
I) {
4277 Check(CallerABIAttrs == CalleeABIAttrs,
4278 "cannot guarantee tail call due to mismatched ABI impacting "
4279 "function attributes",
4284void Verifier::visitCallInst(CallInst &CI) {
4288 verifyMustTailCall(CI);
4291void Verifier::visitInvokeInst(InvokeInst &
II) {
4297 II.getUnwindDest()->isEHPad(),
4298 "The unwind destination does not have an exception handling instruction!",
4301 visitTerminator(
II);
4306void Verifier::visitUnaryOperator(UnaryOperator &U) {
4307 Check(
U.getType() ==
U.getOperand(0)->getType(),
4308 "Unary operators must have same type for"
4309 "operands and result!",
4312 switch (
U.getOpcode()) {
4315 case Instruction::FNeg:
4316 Check(
U.getType()->isFPOrFPVectorTy(),
4317 "FNeg operator only works with float types!", &U);
4323 visitInstruction(U);
4329void Verifier::visitBinaryOperator(BinaryOperator &
B) {
4330 Check(
B.getOperand(0)->getType() ==
B.getOperand(1)->getType(),
4331 "Both operands to a binary operator are not of the same type!", &
B);
4333 switch (
B.getOpcode()) {
4336 case Instruction::Add:
4337 case Instruction::Sub:
4338 case Instruction::Mul:
4339 case Instruction::SDiv:
4340 case Instruction::UDiv:
4341 case Instruction::SRem:
4342 case Instruction::URem:
4343 Check(
B.getType()->isIntOrIntVectorTy(),
4344 "Integer arithmetic operators only work with integral types!", &
B);
4345 Check(
B.getType() ==
B.getOperand(0)->getType(),
4346 "Integer arithmetic operators must have same type "
4347 "for operands and result!",
4352 case Instruction::FAdd:
4353 case Instruction::FSub:
4354 case Instruction::FMul:
4355 case Instruction::FDiv:
4356 case Instruction::FRem:
4357 Check(
B.getType()->isFPOrFPVectorTy(),
4358 "Floating-point arithmetic operators only work with "
4359 "floating-point types!",
4361 Check(
B.getType() ==
B.getOperand(0)->getType(),
4362 "Floating-point arithmetic operators must have same type "
4363 "for operands and result!",
4367 case Instruction::And:
4368 case Instruction::Or:
4369 case Instruction::Xor:
4370 Check(
B.getType()->isIntOrIntVectorTy(),
4371 "Logical operators only work with integral types!", &
B);
4372 Check(
B.getType() ==
B.getOperand(0)->getType(),
4373 "Logical operators must have same type for operands and result!", &
B);
4375 case Instruction::Shl:
4376 case Instruction::LShr:
4377 case Instruction::AShr:
4378 Check(
B.getType()->isIntOrIntVectorTy(),
4379 "Shifts only work with integral types!", &
B);
4380 Check(
B.getType() ==
B.getOperand(0)->getType(),
4381 "Shift return type must be same as operands!", &
B);
4387 visitInstruction(
B);
4390void Verifier::visitICmpInst(ICmpInst &IC) {
4394 Check(Op0Ty == Op1Ty,
4395 "Both operands to ICmp instruction are not of the same type!", &IC);
4398 "Invalid operand types for ICmp instruction", &IC);
4402 visitInstruction(IC);
4405void Verifier::visitFCmpInst(FCmpInst &FC) {
4407 Type *Op0Ty =
FC.getOperand(0)->getType();
4408 Type *Op1Ty =
FC.getOperand(1)->getType();
4409 Check(Op0Ty == Op1Ty,
4410 "Both operands to FCmp instruction are not of the same type!", &FC);
4415 Check(
FC.isFPPredicate(),
"Invalid predicate in FCmp instruction!", &FC);
4417 visitInstruction(FC);
4420void Verifier::visitExtractElementInst(ExtractElementInst &EI) {
4422 "Invalid extractelement operands!", &EI);
4423 visitInstruction(EI);
4426void Verifier::visitInsertElementInst(InsertElementInst &IE) {
4429 "Invalid insertelement operands!", &IE);
4430 visitInstruction(IE);
4433void Verifier::visitShuffleVectorInst(ShuffleVectorInst &SV) {
4436 "Invalid shufflevector operands!", &SV);
4437 visitInstruction(SV);
4440void Verifier::visitGetElementPtrInst(GetElementPtrInst &
GEP) {
4441 Type *TargetTy =
GEP.getPointerOperandType()->getScalarType();
4444 "GEP base pointer is not a vector or a vector of pointers", &
GEP);
4445 Check(
GEP.getSourceElementType()->isSized(),
"GEP into unsized type!", &
GEP);
4449 "getelementptr cannot target structure that contains scalable vector"
4454 SmallVector<Value *, 16> Idxs(
GEP.indices());
4456 all_of(Idxs, [](
Value *V) {
return V->getType()->isIntOrIntVectorTy(); }),
4457 "GEP indexes must be integers", &
GEP);
4460 Check(ElTy,
"Invalid indices for GEP pointer type!", &
GEP);
4464 Check(PtrTy &&
GEP.getResultElementType() == ElTy,
4465 "GEP is not of right type for indices!", &
GEP, ElTy);
4469 ElementCount GEPWidth = GEPVTy->getElementCount();
4470 if (
GEP.getPointerOperandType()->isVectorTy())
4474 "Vector GEP result width doesn't match operand's", &
GEP);
4475 for (
Value *Idx : Idxs) {
4476 Type *IndexTy = Idx->getType();
4478 ElementCount IndexWidth = IndexVTy->getElementCount();
4479 Check(IndexWidth == GEPWidth,
"Invalid GEP index vector width", &
GEP);
4482 "All GEP indices should be of integer type");
4489 GTI != GTE; ++GTI) {
4490 if (GTI.isVector()) {
4491 Type *ElemTy = GTI.getIndexedType();
4492 Check(
DL.typeSizeEqualsStoreSize(ElemTy),
4493 "GEP into vector with non-byte-addressable element type", &
GEP);
4497 Check(
GEP.getAddressSpace() == PtrTy->getAddressSpace(),
4498 "GEP address space doesn't match type", &
GEP);
4500 visitInstruction(
GEP);
4504 return A.getUpper() ==
B.getLower() ||
A.getLower() ==
B.getUpper();
4509void Verifier::verifyRangeLikeMetadata(
const Value &
I,
const MDNode *
Range,
4510 Type *Ty, RangeLikeMetadataKind Kind) {
4511 unsigned NumOperands =
Range->getNumOperands();
4512 Check(NumOperands % 2 == 0,
"Unfinished range!",
Range);
4513 unsigned NumRanges = NumOperands / 2;
4514 Check(NumRanges >= 1,
"It should have at least one range!",
Range);
4516 ConstantRange LastRange(1,
true);
4517 for (
unsigned i = 0; i < NumRanges; ++i) {
4520 Check(
Low,
"The lower limit must be an integer!",
Low);
4525 Check(
High->getType() ==
Low->getType(),
"Range pair types must match!",
4528 if (Kind == RangeLikeMetadataKind::NoaliasAddrspace) {
4530 "noalias.addrspace type must be i32!", &
I);
4533 "Range types must match instruction type!", &
I);
4536 APInt HighV =
High->getValue();
4537 APInt LowV =
Low->getValue();
4542 "The upper and lower limits cannot be the same value", &
I);
4544 ConstantRange CurRange(LowV, HighV);
4545 Check(!CurRange.isEmptySet() &&
4546 (Kind == RangeLikeMetadataKind::AbsoluteSymbol ||
4547 !CurRange.isFullSet()),
4548 "Range must not be empty!",
Range);
4550 Check(CurRange.intersectWith(LastRange).isEmptySet(),
4551 "Intervals are overlapping",
Range);
4552 Check(LowV.
sgt(LastRange.getLower()),
"Intervals are not in order",
4557 LastRange = ConstantRange(LowV, HighV);
4559 if (NumRanges > 2) {
4564 ConstantRange FirstRange(FirstLow, FirstHigh);
4565 Check(FirstRange.intersectWith(LastRange).isEmptySet(),
4566 "Intervals are overlapping",
Range);
4572void Verifier::visitRangeMetadata(Instruction &
I, MDNode *
Range,
Type *Ty) {
4574 "precondition violation");
4575 verifyRangeLikeMetadata(
I,
Range, Ty, RangeLikeMetadataKind::Range);
4578void Verifier::visitNoFPClassMetadata(Instruction &
I, MDNode *NoFPClass,
4580 Check(AttributeFuncs::isNoFPClassCompatibleType(Ty),
4581 "nofpclass only applies to floating-point typed loads",
I);
4584 "nofpclass must have exactly one entry", NoFPClass);
4585 ConstantInt *MaskVal =
4588 "nofpclass entry must be a constant i32", NoFPClass);
4590 Check(Val != 0,
"'nofpclass' must have at least one test bit set", NoFPClass,
4594 "Invalid value for 'nofpclass' test mask", NoFPClass,
I);
4597void Verifier::visitNoaliasAddrspaceMetadata(Instruction &
I, MDNode *
Range,
4600 "precondition violation");
4601 verifyRangeLikeMetadata(
I,
Range, Ty,
4602 RangeLikeMetadataKind::NoaliasAddrspace);
4605void Verifier::checkAtomicMemAccessSize(
Type *Ty,
const Instruction *
I) {
4606 unsigned Size =
DL.getTypeSizeInBits(Ty).getFixedValue();
4607 Check(
Size >= 8,
"atomic memory access' size must be byte-sized", Ty,
I);
4609 "atomic memory access' operand must have a power-of-two size", Ty,
I);
4612void Verifier::visitLoadInst(LoadInst &LI) {
4614 Check(PTy,
"Load operand must be a pointer.", &LI);
4617 Check(
A->value() <= Value::MaximumAlignment,
4618 "huge alignment values are unsupported", &LI);
4620 Check(ElTy->
isSized(),
"loading unsized types is not allowed", &LI);
4623 LI.
getOrdering() != AtomicOrdering::AcquireRelease,
4624 "Load cannot have Release ordering", &LI);
4627 "atomic load operand must have integer, pointer, floating point, "
4631 checkAtomicMemAccessSize(ElTy, &LI);
4634 "Non-atomic load cannot have SynchronizationScope specified", &LI);
4637 visitInstruction(LI);
4640void Verifier::visitStoreInst(StoreInst &SI) {
4642 Check(PTy,
"Store operand must be a pointer.", &SI);
4643 Type *ElTy =
SI.getOperand(0)->getType();
4644 if (MaybeAlign
A =
SI.getAlign()) {
4645 Check(
A->value() <= Value::MaximumAlignment,
4646 "huge alignment values are unsupported", &SI);
4648 Check(ElTy->
isSized(),
"storing unsized types is not allowed", &SI);
4649 if (
SI.isAtomic()) {
4650 Check(
SI.getOrdering() != AtomicOrdering::Acquire &&
4651 SI.getOrdering() != AtomicOrdering::AcquireRelease,
4652 "Store cannot have Acquire ordering", &SI);
4655 "atomic store operand must have integer, pointer, floating point, "
4658 checkAtomicMemAccessSize(ElTy, &SI);
4661 "Non-atomic store cannot have SynchronizationScope specified", &SI);
4663 visitInstruction(SI);
4667void Verifier::verifySwiftErrorCall(CallBase &
Call,
4668 const Value *SwiftErrorVal) {
4670 if (
I.value() == SwiftErrorVal) {
4672 "swifterror value when used in a callsite should be marked "
4673 "with swifterror attribute",
4674 SwiftErrorVal,
Call);
4679void Verifier::verifySwiftErrorValue(
const Value *SwiftErrorVal) {
4682 for (
const User *U : SwiftErrorVal->
users()) {
4685 "swifterror value can only be loaded and stored from, or "
4686 "as a swifterror argument!",
4690 Check(StoreI->getOperand(1) == SwiftErrorVal,
4691 "swifterror value should be the second operand when used "
4695 verifySwiftErrorCall(*
const_cast<CallBase *
>(
Call), SwiftErrorVal);
4699void Verifier::visitAllocaInst(AllocaInst &AI) {
4701 SmallPtrSet<Type*, 4> Visited;
4702 Check(Ty->
isSized(&Visited),
"Cannot allocate unsized type", &AI);
4706 "Alloca has illegal target extension type", &AI);
4708 "Alloca array size must have integer type", &AI);
4710 Check(
A->value() <= Value::MaximumAlignment,
4711 "huge alignment values are unsupported", &AI);
4717 "swifterror alloca must not be array allocation", &AI);
4718 verifySwiftErrorValue(&AI);
4721 if (
TT.isAMDGPU()) {
4723 "alloca on amdgpu must be in addrspace(5)", &AI);
4726 visitInstruction(AI);
4729void Verifier::visitAtomicCmpXchgInst(AtomicCmpXchgInst &CXI) {
4732 "cmpxchg operand must have integer or pointer type", ElTy, &CXI);
4733 checkAtomicMemAccessSize(ElTy, &CXI);
4734 visitInstruction(CXI);
4737void Verifier::visitAtomicRMWInst(AtomicRMWInst &RMWI) {
4739 "atomicrmw instructions cannot be unordered.", &RMWI);
4746 " operand must have integer or floating point type!",
4751 " operand must have floating-point or fixed vector of floating-point "
4757 " operand must have integer type!",
4760 checkAtomicMemAccessSize(ElTy, &RMWI);
4762 "Invalid binary operation!", &RMWI);
4763 visitInstruction(RMWI);
4766void Verifier::visitFenceInst(FenceInst &FI) {
4768 Check(Ordering == AtomicOrdering::Acquire ||
4769 Ordering == AtomicOrdering::Release ||
4770 Ordering == AtomicOrdering::AcquireRelease ||
4771 Ordering == AtomicOrdering::SequentiallyConsistent,
4772 "fence instructions may only have acquire, release, acq_rel, or "
4773 "seq_cst ordering.",
4775 visitInstruction(FI);
4778void Verifier::visitExtractValueInst(ExtractValueInst &EVI) {
4781 "Invalid ExtractValueInst operands!", &EVI);
4783 visitInstruction(EVI);
4786void Verifier::visitInsertValueInst(InsertValueInst &IVI) {
4790 "Invalid InsertValueInst operands!", &IVI);
4792 visitInstruction(IVI);
4797 return FPI->getParentPad();
4802void Verifier::visitEHPadPredecessors(Instruction &
I) {
4808 Check(BB != &
F->getEntryBlock(),
"EH pad cannot be in entry block.", &
I);
4816 Check(
II &&
II->getUnwindDest() == BB &&
II->getNormalDest() != BB,
4817 "Block containing LandingPadInst must be jumped to "
4818 "only by the unwind edge of an invoke.",
4826 "Block containg CatchPadInst must be jumped to "
4827 "only by its catchswitch.",
4829 Check(BB != CPI->getCatchSwitch()->getUnwindDest(),
4830 "Catchswitch cannot unwind to one of its catchpads",
4831 CPI->getCatchSwitch(), CPI);
4843 Check(
II->getUnwindDest() == BB &&
II->getNormalDest() != BB,
4844 "EH pad must be jumped to via an unwind edge", ToPad,
II);
4847 if (CalledFn && CalledFn->isIntrinsic() &&
II->doesNotThrow() &&
4851 FromPad = Bundle->Inputs[0];
4855 FromPad = CRI->getOperand(0);
4856 Check(FromPad != ToPadParent,
"A cleanupret must exit its cleanup", CRI);
4860 Check(
false,
"EH pad must be jumped to via an unwind edge", ToPad, TI);
4864 SmallPtrSet<Value *, 8> Seen;
4866 Check(FromPad != ToPad,
4867 "EH pad cannot handle exceptions raised within it", FromPad, TI);
4868 if (FromPad == ToPadParent) {
4873 "A single unwind edge may only enter one EH pad", TI);
4874 Check(Seen.
insert(FromPad).second,
"EH pad jumps through a cycle of pads",
4880 "Parent pad must be catchpad/cleanuppad/catchswitch", TI);
4885void Verifier::visitLandingPadInst(LandingPadInst &LPI) {
4889 "LandingPadInst needs at least one clause or to be a cleanup.", &LPI);
4891 visitEHPadPredecessors(LPI);
4893 if (!LandingPadResultTy)
4894 LandingPadResultTy = LPI.
getType();
4897 "The landingpad instruction should have a consistent result type "
4898 "inside a function.",
4902 Check(
F->hasPersonalityFn(),
4903 "LandingPadInst needs to be in a function with a personality.", &LPI);
4908 "LandingPadInst not the first non-PHI instruction in the block.", &LPI);
4914 "Catch operand does not have pointer type!", &LPI);
4916 Check(LPI.
isFilter(i),
"Clause is neither catch nor filter!", &LPI);
4918 "Filter operand is not an array of constants!", &LPI);
4922 visitInstruction(LPI);
4925void Verifier::visitResumeInst(ResumeInst &RI) {
4927 "ResumeInst needs to be in a function with a personality.", &RI);
4929 if (!LandingPadResultTy)
4933 "The resume instruction should have a consistent result type "
4934 "inside a function.",
4937 visitTerminator(RI);
4940void Verifier::visitCatchPadInst(CatchPadInst &CPI) {
4944 Check(
F->hasPersonalityFn(),
4945 "CatchPadInst needs to be in a function with a personality.", &CPI);
4948 "CatchPadInst needs to be directly nested in a CatchSwitchInst.",
4954 "CatchPadInst not the first non-PHI instruction in the block.", &CPI);
4956 visitEHPadPredecessors(CPI);
4957 visitFuncletPadInst(CPI);
4960void Verifier::visitCatchReturnInst(CatchReturnInst &CatchReturn) {
4962 "CatchReturnInst needs to be provided a CatchPad", &CatchReturn,
4965 visitTerminator(CatchReturn);
4968void Verifier::visitCleanupPadInst(CleanupPadInst &CPI) {
4972 Check(
F->hasPersonalityFn(),
4973 "CleanupPadInst needs to be in a function with a personality.", &CPI);
4978 "CleanupPadInst not the first non-PHI instruction in the block.", &CPI);
4982 "CleanupPadInst has an invalid parent.", &CPI);
4984 visitEHPadPredecessors(CPI);
4985 visitFuncletPadInst(CPI);
4988void Verifier::visitFuncletPadInst(FuncletPadInst &FPI) {
4989 User *FirstUser =
nullptr;
4990 Value *FirstUnwindPad =
nullptr;
4992 SmallPtrSet<FuncletPadInst *, 8> Seen;
4994 while (!Worklist.empty()) {
4995 FuncletPadInst *CurrentPad = Worklist.pop_back_val();
4997 "FuncletPadInst must not be nested within itself", CurrentPad);
4998 Value *UnresolvedAncestorPad =
nullptr;
4999 for (User *U : CurrentPad->
users()) {
5002 UnwindDest = CRI->getUnwindDest();
5008 if (CSI->unwindsToCaller())
5010 UnwindDest = CSI->getUnwindDest();
5012 UnwindDest =
II->getUnwindDest();
5022 Worklist.push_back(CPI);
5037 if (UnwindParent == CurrentPad)
5043 Value *ExitedPad = CurrentPad;
5046 if (ExitedPad == &FPI) {
5051 UnresolvedAncestorPad = &FPI;
5055 if (ExitedParent == UnwindParent) {
5059 UnresolvedAncestorPad = ExitedParent;
5062 ExitedPad = ExitedParent;
5068 UnresolvedAncestorPad = &FPI;
5075 Check(UnwindPad == FirstUnwindPad,
5076 "Unwind edges out of a funclet "
5077 "pad must have the same unwind "
5079 &FPI, U, FirstUser);
5082 FirstUnwindPad = UnwindPad;
5091 if (CurrentPad != &FPI)
5094 if (UnresolvedAncestorPad) {
5095 if (CurrentPad == UnresolvedAncestorPad) {
5099 assert(CurrentPad == &FPI);
5107 Value *ResolvedPad = CurrentPad;
5108 while (!Worklist.empty()) {
5109 Value *UnclePad = Worklist.back();
5113 while (ResolvedPad != AncestorPad) {
5115 if (ResolvedParent == UnresolvedAncestorPad) {
5118 ResolvedPad = ResolvedParent;
5122 if (ResolvedPad != AncestorPad)
5125 Worklist.pop_back();
5130 if (FirstUnwindPad) {
5132 BasicBlock *SwitchUnwindDest = CatchSwitch->getUnwindDest();
5133 Value *SwitchUnwindPad;
5134 if (SwitchUnwindDest)
5138 Check(SwitchUnwindPad == FirstUnwindPad,
5139 "Unwind edges out of a catch must have the same unwind dest as "
5140 "the parent catchswitch",
5141 &FPI, FirstUser, CatchSwitch);
5145 visitInstruction(FPI);
5148void Verifier::visitCatchSwitchInst(CatchSwitchInst &CatchSwitch) {
5152 Check(
F->hasPersonalityFn(),
5153 "CatchSwitchInst needs to be in a function with a personality.",
5159 "CatchSwitchInst not the first non-PHI instruction in the block.",
5164 "CatchSwitchInst has an invalid parent.", ParentPad);
5169 "CatchSwitchInst must unwind to an EH block which is not a "
5175 SiblingFuncletInfo[&CatchSwitch] = &CatchSwitch;
5179 "CatchSwitchInst cannot have empty handler list", &CatchSwitch);
5181 for (BasicBlock *Handler : CatchSwitch.
handlers()) {
5183 "CatchSwitchInst handlers must be catchpads", &CatchSwitch, Handler);
5186 visitEHPadPredecessors(CatchSwitch);
5187 visitTerminator(CatchSwitch);
5190void Verifier::visitCleanupReturnInst(CleanupReturnInst &CRI) {
5192 "CleanupReturnInst needs to be provided a CleanupPad", &CRI,
5198 "CleanupReturnInst must unwind to an EH block which is not a "
5203 visitTerminator(CRI);
5206void Verifier::verifyDominatesUse(Instruction &
I,
unsigned i) {
5212 if (
II->getNormalDest() ==
II->getUnwindDest())
5226 const Use &
U =
I.getOperandUse(i);
5227 Check(DT.dominates(
Op, U),
"Instruction does not dominate all uses!",
Op, &
I);
5230void Verifier::visitDereferenceableMetadata(Instruction&
I, MDNode* MD) {
5231 Check(
I.getType()->isPointerTy(),
5232 "dereferenceable, dereferenceable_or_null "
5233 "apply only to pointer types",
5236 "dereferenceable, dereferenceable_or_null apply only to load"
5237 " and inttoptr instructions, use attributes for calls or invokes",
5240 "dereferenceable, dereferenceable_or_null "
5241 "take one operand!",
5246 "dereferenceable_or_null metadata value must be an i64!",
5250void Verifier::visitNofreeMetadata(Instruction &
I, MDNode *MD) {
5251 Check(
I.getType()->isPointerTy(),
"nofree applies only to pointer types", &
I);
5257void Verifier::visitProfMetadata(Instruction &
I, MDNode *MD) {
5258 auto GetBranchingTerminatorNumOperands = [&]() {
5259 unsigned ExpectedNumOperands = 0;
5263 ExpectedNumOperands =
SI->getNumSuccessors();
5265 ExpectedNumOperands = 1;
5267 ExpectedNumOperands = IBI->getNumDestinations();
5269 ExpectedNumOperands = 2;
5272 return ExpectedNumOperands;
5275 "!prof annotations should have at least 1 operand", MD);
5277 Check(MD->
getOperand(0) !=
nullptr,
"first operand should not be null", MD);
5279 "expected string with name of the !prof annotation", MD);
5285 "'unknown' !prof should only appear on instructions on which "
5286 "'branch_weights' would",
5288 verifyUnknownProfileMetadata(MD);
5293 "!prof annotations should have no less than 2 operands", MD);
5299 Check(NumBranchWeights == 1 || NumBranchWeights == 2,
5300 "Wrong number of InvokeInst branch_weights operands", MD);
5302 const unsigned ExpectedNumOperands = GetBranchingTerminatorNumOperands();
5303 if (ExpectedNumOperands == 0)
5304 CheckFailed(
"!prof branch_weights are not allowed for this instruction",
5307 Check(NumBranchWeights == ExpectedNumOperands,
"Wrong number of operands",
5313 Check(MDO,
"second operand should not be null", MD);
5315 "!prof brunch_weights operand is not a const int");
5320 Check(KindInt,
"VP !prof missing kind argument", MD);
5323 Check(Kind >= InstrProfValueKind::IPVK_First &&
5324 Kind <= InstrProfValueKind::IPVK_Last,
5325 "Invalid VP !prof kind", MD);
5327 "VP !prof should have an even number "
5328 "of arguments after 'VP'",
5330 if (Kind == InstrProfValueKind::IPVK_IndirectCallTarget ||
5331 Kind == InstrProfValueKind::IPVK_MemOPSize)
5333 "VP !prof indirect call or memop size expected to be applied to "
5334 "CallBase instructions only",
5337 CheckFailed(
"expected either branch_weights or VP profile name", MD);
5341void Verifier::visitDIAssignIDMetadata(Instruction &
I, MDNode *MD) {
5342 assert(
I.hasMetadata(LLVMContext::MD_DIAssignID));
5347 bool ExpectedInstTy =
5349 CheckDI(ExpectedInstTy,
"!DIAssignID attached to unexpected instruction kind",
5354 for (
auto *User : AsValue->users()) {
5356 "!DIAssignID should only be used by llvm.dbg.assign intrinsics",
5360 CheckDI(DAI->getFunction() ==
I.getFunction(),
5361 "dbg.assign not in same function as inst", DAI, &
I);
5364 for (DbgVariableRecord *DVR :
5367 "!DIAssignID should only be used by Assign DVRs.", MD, DVR);
5368 CheckDI(DVR->getFunction() ==
I.getFunction(),
5369 "DVRAssign not in same function as inst", DVR, &
I);
5373void Verifier::visitMMRAMetadata(Instruction &
I, MDNode *MD) {
5375 "!mmra metadata attached to unexpected instruction kind",
I, MD);
5386 for (
const MDOperand &MDOp : MD->
operands())
5388 "!mmra metadata tuple operand is not an MMRA tag",
I, MDOp.get());
5391void Verifier::visitCallStackMetadata(MDNode *MD) {
5395 "call stack metadata should have at least 1 operand", MD);
5399 "call stack metadata operand should be constant integer",
Op);
5402void Verifier::visitMemProfMetadata(Instruction &
I, MDNode *MD) {
5405 "!memprof annotations should have at least 1 metadata operand "
5410 for (
auto &MIBOp : MD->
operands()) {
5416 "Each !memprof MemInfoBlock should have at least 2 operands", MIB);
5420 "!memprof MemInfoBlock first operand should not be null", MIB);
5422 "!memprof MemInfoBlock first operand should be an MDNode", MIB);
5424 visitCallStackMetadata(StackMD);
5428 "!memprof MemInfoBlock second operand should be an MDString", MIB);
5433 Check(OpNode,
"Not all !memprof MemInfoBlock operands 2 to N are MDNode",
5436 "Not all !memprof MemInfoBlock operands 2 to N are MDNode with 2 "
5441 [](
const MDOperand &
Op) {
5442 return mdconst::hasa<ConstantInt>(Op);
5444 "Not all !memprof MemInfoBlock operands 2 to N are MDNode with "
5445 "ConstantInt operands",
5451void Verifier::visitCallsiteMetadata(Instruction &
I, MDNode *MD) {
5455 visitCallStackMetadata(MD);
5464void Verifier::visitCalleeTypeMetadata(Instruction &
I, MDNode *MD) {
5469 "The callee_type metadata must be a list of type metadata nodes",
Op);
5471 Check(TypeMD->getNumOperands() == 2,
5472 "Well-formed generalized type metadata must contain exactly two "
5477 "The first operand of type metadata for functions must be zero",
Op);
5478 Check(TypeMD->hasGeneralizedMDString(),
5479 "Only generalized type metadata can be part of the callee_type "
5485void Verifier::visitAnnotationMetadata(MDNode *Annotation) {
5488 "annotation must have at least one operand");
5490 bool TupleOfStrings =
5496 "operands must be a string or a tuple of strings");
5500void Verifier::visitAliasScopeMetadata(
const MDNode *MD) {
5505 "first scope operand must be self-referential or string", MD);
5508 "third scope operand must be string (if used)", MD);
5511 Check(
Domain !=
nullptr,
"second scope operand must be MDNode", MD);
5513 unsigned NumDomainOps =
Domain->getNumOperands();
5514 Check(NumDomainOps >= 1 && NumDomainOps <= 2,
5515 "domain must have one or two operands",
Domain);
5518 "first domain operand must be self-referential or string",
Domain);
5519 if (NumDomainOps == 2)
5521 "second domain operand must be string (if used)",
Domain);
5524void Verifier::visitAliasScopeListMetadata(
const MDNode *MD) {
5527 Check(OpMD !=
nullptr,
"scope list must consist of MDNodes", MD);
5528 visitAliasScopeMetadata(OpMD);
5532void Verifier::visitAccessGroupMetadata(
const MDNode *MD) {
5533 auto IsValidAccessScope = [](
const MDNode *MD) {
5538 if (IsValidAccessScope(MD))
5544 Check(OpMD !=
nullptr,
"Access scope list must consist of MDNodes", MD);
5545 Check(IsValidAccessScope(OpMD),
5546 "Access scope list contains invalid access scope", MD);
5550void Verifier::visitCapturesMetadata(Instruction &
I,
const MDNode *Captures) {
5551 static const char *ValidArgs[] = {
"address_is_null",
"address",
5552 "read_provenance",
"provenance"};
5555 Check(SI,
"!captures metadata can only be applied to store instructions", &
I);
5556 Check(
SI->getValueOperand()->getType()->isPointerTy(),
5557 "!captures metadata can only be applied to store with value operand of "
5565 Check(Str,
"!captures metadata must be a list of strings", &
I);
5567 "invalid entry in !captures metadata", &
I, Str);
5571void Verifier::visitAllocTokenMetadata(Instruction &
I, MDNode *MD) {
5576 "expected integer constant", MD);
5581void Verifier::visitInstruction(Instruction &
I) {
5583 Check(BB,
"Instruction not embedded in basic block!", &
I);
5586 for (User *U :
I.users()) {
5587 Check(U != (User *)&
I || !DT.isReachableFromEntry(BB),
5588 "Only PHI nodes may reference their own value!", &
I);
5593 Check(!
I.getType()->isVoidTy() || !
I.hasName(),
5594 "Instruction has a name, but provides a void value!", &
I);
5598 Check(
I.getType()->isVoidTy() ||
I.getType()->isFirstClassType(),
5599 "Instruction returns a non-scalar type!", &
I);
5604 "Invalid use of metadata!", &
I);
5609 for (Use &U :
I.uses()) {
5612 "Instruction referencing"
5613 " instruction not embedded in a basic block!",
5616 CheckFailed(
"Use of instruction is not an instruction!", U);
5625 for (
unsigned i = 0, e =
I.getNumOperands(); i != e; ++i) {
5626 Check(
I.getOperand(i) !=
nullptr,
"Instruction has null operand!", &
I);
5630 if (!
I.getOperand(i)->getType()->isFirstClassType()) {
5631 Check(
false,
"Instruction operands must be first-class values!", &
I);
5637 auto IsAttachedCallOperand = [](
Function *
F,
const CallBase *CBI,
5639 return CBI && CBI->isOperandBundleOfType(
5647 Check((!
F->isIntrinsic() ||
5648 (CBI && &CBI->getCalledOperandUse() == &
I.getOperandUse(i)) ||
5649 IsAttachedCallOperand(
F, CBI, i)),
5650 "Cannot take the address of an intrinsic!", &
I);
5652 F->getIntrinsicID() == Intrinsic::donothing ||
5653 F->getIntrinsicID() == Intrinsic::seh_try_begin ||
5654 F->getIntrinsicID() == Intrinsic::seh_try_end ||
5655 F->getIntrinsicID() == Intrinsic::seh_scope_begin ||
5656 F->getIntrinsicID() == Intrinsic::seh_scope_end ||
5657 F->getIntrinsicID() == Intrinsic::coro_resume ||
5658 F->getIntrinsicID() == Intrinsic::coro_destroy ||
5659 F->getIntrinsicID() == Intrinsic::coro_await_suspend_void ||
5660 F->getIntrinsicID() == Intrinsic::coro_await_suspend_bool ||
5661 F->getIntrinsicID() == Intrinsic::coro_await_suspend_handle ||
5662 F->getIntrinsicID() ==
5663 Intrinsic::experimental_patchpoint_void ||
5664 F->getIntrinsicID() == Intrinsic::experimental_patchpoint ||
5665 F->getIntrinsicID() == Intrinsic::fake_use ||
5666 F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint ||
5667 F->getIntrinsicID() == Intrinsic::wasm_throw ||
5668 F->getIntrinsicID() == Intrinsic::wasm_rethrow ||
5669 IsAttachedCallOperand(
F, CBI, i),
5670 "Cannot invoke an intrinsic other than donothing, patchpoint, "
5671 "statepoint, coro_resume, coro_destroy, clang.arc.attachedcall or "
5674 Check(
F->getParent() == &M,
"Referencing function in another module!", &
I,
5675 &M,
F,
F->getParent());
5678 "Referring to a basic block in another function!", &
I);
5681 "Referring to an argument in another function!", &
I);
5683 Check(GV->
getParent() == &M,
"Referencing global in another module!", &
I,
5687 "Referring to an instruction in another function!", &
I);
5688 verifyDominatesUse(
I, i);
5690 Check(CBI && &CBI->getCalledOperandUse() == &
I.getOperandUse(i),
5691 "Cannot take the address of an inline asm!", &
I);
5693 visitConstantExprsRecursively(
C);
5697 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_fpmath)) {
5698 Check(
I.getType()->isFPOrFPVectorTy(),
5699 "fpmath requires a floating point result!", &
I);
5701 if (ConstantFP *CFP0 =
5703 const APFloat &Accuracy = CFP0->getValueAPF();
5705 "fpmath accuracy must have float type", &
I);
5707 "fpmath accuracy not a positive number!", &
I);
5709 Check(
false,
"invalid fpmath accuracy!", &
I);
5713 if (MDNode *
Range =
I.getMetadata(LLVMContext::MD_range)) {
5715 "Ranges are only for loads, calls and invokes!", &
I);
5716 visitRangeMetadata(
I,
Range,
I.getType());
5719 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_nofpclass)) {
5721 visitNoFPClassMetadata(
I, MD,
I.getType());
5724 if (MDNode *
Range =
I.getMetadata(LLVMContext::MD_noalias_addrspace)) {
5727 "noalias.addrspace are only for memory operations!", &
I);
5728 visitNoaliasAddrspaceMetadata(
I,
Range,
I.getType());
5731 if (
I.hasMetadata(LLVMContext::MD_invariant_group)) {
5733 "invariant.group metadata is only for loads and stores", &
I);
5736 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_nonnull)) {
5737 Check(
I.getType()->isPointerTy(),
"nonnull applies only to pointer types",
5740 "nonnull applies only to load instructions, use attributes"
5741 " for calls or invokes",
5746 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_dereferenceable))
5747 visitDereferenceableMetadata(
I, MD);
5749 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_dereferenceable_or_null))
5750 visitDereferenceableMetadata(
I, MD);
5752 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_nofree))
5753 visitNofreeMetadata(
I, MD);
5755 if (MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa))
5758 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_noalias))
5759 visitAliasScopeListMetadata(MD);
5760 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_alias_scope))
5761 visitAliasScopeListMetadata(MD);
5763 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_access_group))
5764 visitAccessGroupMetadata(MD);
5766 if (MDNode *AlignMD =
I.getMetadata(LLVMContext::MD_align)) {
5767 Check(
I.getType()->isPointerTy(),
"align applies only to pointer types",
5770 "align applies only to load instructions, "
5771 "use attributes for calls or invokes",
5773 Check(AlignMD->getNumOperands() == 1,
"align takes one operand!", &
I);
5776 "align metadata value must be an i64!", &
I);
5780 Check(Align <= Value::MaximumAlignment,
5781 "alignment is larger that implementation defined limit", &
I);
5784 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_prof))
5785 visitProfMetadata(
I, MD);
5787 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_memprof))
5788 visitMemProfMetadata(
I, MD);
5790 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_callsite))
5791 visitCallsiteMetadata(
I, MD);
5793 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_callee_type))
5794 visitCalleeTypeMetadata(
I, MD);
5796 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_DIAssignID))
5797 visitDIAssignIDMetadata(
I, MD);
5799 if (MDNode *MMRA =
I.getMetadata(LLVMContext::MD_mmra))
5800 visitMMRAMetadata(
I, MMRA);
5802 if (MDNode *Annotation =
I.getMetadata(LLVMContext::MD_annotation))
5803 visitAnnotationMetadata(Annotation);
5805 if (MDNode *Captures =
I.getMetadata(LLVMContext::MD_captures))
5806 visitCapturesMetadata(
I, Captures);
5808 if (MDNode *MD =
I.getMetadata(LLVMContext::MD_alloc_token))
5809 visitAllocTokenMetadata(
I, MD);
5811 if (MDNode *
N =
I.getDebugLoc().getAsMDNode()) {
5813 visitMDNode(*
N, AreDebugLocsAllowed::Yes);
5816 if (
DL->getAtomGroup()) {
5817 CheckDI(
DL->getScope()->getSubprogram()->getKeyInstructionsEnabled(),
5818 "DbgLoc uses atomGroup but DISubprogram doesn't have Key "
5819 "Instructions enabled",
5820 DL,
DL->getScope()->getSubprogram());
5826 I.getAllMetadata(MDs);
5827 for (
auto Attachment : MDs) {
5828 unsigned Kind = Attachment.first;
5830 (
Kind == LLVMContext::MD_dbg ||
Kind == LLVMContext::MD_loop)
5831 ? AreDebugLocsAllowed::Yes
5832 : AreDebugLocsAllowed::
No;
5833 visitMDNode(*Attachment.second, AllowLocs);
5848 bool IsVarArg = IFTy->isVarArg();
5859 "Intrinsic has incorrect return type!", IF);
5861 "Intrinsic has incorrect argument type!", IF);
5866 "Intrinsic was not defined with variable arguments!", IF);
5869 "Callsite was not defined with variable arguments!", IF);
5878 const std::string ExpectedName =
5881 "Intrinsic name not mangled correctly for type arguments! "
5893 "const x86_amx is not allowed in argument!");
5899 case Intrinsic::assume: {
5903 "assume with operand bundles must have i1 true condition",
Call);
5906 unsigned ArgCount = Elem.End - Elem.Begin;
5909 if (Elem.Tag->getKey() ==
"separate_storage") {
5910 Check(ArgCount == 2,
5911 "separate_storage assumptions should have 2 arguments",
Call);
5914 "arguments to separate_storage assumptions should be pointers",
5918 Check(Elem.Tag->getKey() ==
"ignore" ||
5919 Attribute::isExistingAttribute(Elem.Tag->getKey()),
5920 "tags must be valid attribute names",
Call);
5921 Attribute::AttrKind
Kind =
5922 Attribute::getAttrKindFromName(Elem.Tag->getKey());
5923 if (Kind == Attribute::Alignment) {
5924 Check(ArgCount <= 3 && ArgCount >= 2,
5925 "alignment assumptions should have 2 or 3 arguments",
Call);
5927 "first argument should be a pointer",
Call);
5929 "second argument should be an integer",
Call);
5932 "third argument should be an integer if present",
Call);
5935 if (Kind == Attribute::Dereferenceable) {
5936 Check(ArgCount == 2,
5937 "dereferenceable assumptions should have 2 arguments",
Call);
5939 "first argument should be a pointer",
Call);
5941 "second argument should be an integer",
Call);
5944 Check(ArgCount <= 2,
"too many arguments",
Call);
5945 if (Kind == Attribute::None)
5947 if (Attribute::isIntAttrKind(Kind)) {
5948 Check(ArgCount == 2,
"this attribute should have 2 arguments",
Call);
5950 "the second argument should be a constant integral value",
Call);
5951 }
else if (Attribute::canUseAsParamAttr(Kind)) {
5952 Check((ArgCount) == 1,
"this attribute should have one argument",
Call);
5953 }
else if (Attribute::canUseAsFnAttr(Kind)) {
5954 Check((ArgCount) == 0,
"this attribute has no argument",
Call);
5959 case Intrinsic::ucmp:
5960 case Intrinsic::scmp: {
5965 "result type must be at least 2 bits wide",
Call);
5967 bool IsDestTypeVector = DestTy->
isVectorTy();
5969 "ucmp/scmp argument and result types must both be either vector or "
5972 if (IsDestTypeVector) {
5975 Check(SrcVecLen == DestVecLen,
5976 "return type and arguments must have the same number of "
5982 case Intrinsic::coro_id: {
5988 "info argument of llvm.coro.id must refer to an initialized "
5992 "info argument of llvm.coro.id must refer to either a struct or "
5996 case Intrinsic::is_fpclass: {
5999 "unsupported bits for llvm.is.fpclass test mask");
6002 case Intrinsic::fptrunc_round: {
6007 MD = MAV->getMetadata();
6009 Check(MD !=
nullptr,
"missing rounding mode argument",
Call);
6012 (
"invalid value for llvm.fptrunc.round metadata operand"
6013 " (the operand should be a string)"),
6016 std::optional<RoundingMode> RoundMode =
6018 Check(RoundMode && *RoundMode != RoundingMode::Dynamic,
6019 "unsupported rounding mode argument",
Call);
6022 case Intrinsic::convert_to_arbitrary_fp: {
6030 "if floating-point operand is a vector, integer operand must also "
6033 Check(ValueVecTy->getElementCount() == IntVecTy->getElementCount(),
6034 "floating-point and integer vector operands must have the same "
6041 Check(InterpMAV,
"missing interpretation metadata operand",
Call);
6043 Check(InterpStr,
"interpretation metadata operand must be a string",
Call);
6044 StringRef Interp = InterpStr->getString();
6046 Check(!Interp.
empty(),
"interpretation metadata string must not be empty",
6051 "unsupported interpretation metadata string",
Call);
6055 Check(RoundingMAV,
"missing rounding mode metadata operand",
Call);
6057 Check(RoundingStr,
"rounding mode metadata operand must be a string",
Call);
6059 std::optional<RoundingMode>
RM =
6061 Check(RM && *RM != RoundingMode::Dynamic,
6062 "unsupported rounding mode argument",
Call);
6065 case Intrinsic::convert_from_arbitrary_fp: {
6073 "if floating-point operand is a vector, integer operand must also "
6076 Check(ValueVecTy->getElementCount() == IntVecTy->getElementCount(),
6077 "floating-point and integer vector operands must have the same "
6084 Check(InterpMAV,
"missing interpretation metadata operand",
Call);
6086 Check(InterpStr,
"interpretation metadata operand must be a string",
Call);
6087 StringRef Interp = InterpStr->getString();
6089 Check(!Interp.
empty(),
"interpretation metadata string must not be empty",
6094 "unsupported interpretation metadata string",
Call);
6097#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
6098#include "llvm/IR/VPIntrinsics.def"
6099#undef BEGIN_REGISTER_VP_INTRINSIC
6102#define INSTRUCTION(NAME, NARGS, ROUND_MODE, INTRINSIC) \
6103 case Intrinsic::INTRINSIC:
6104#include "llvm/IR/ConstrainedOps.def"
6108 case Intrinsic::dbg_declare:
6109 case Intrinsic::dbg_value:
6110 case Intrinsic::dbg_assign:
6111 case Intrinsic::dbg_label:
6118 case Intrinsic::memcpy:
6119 case Intrinsic::memcpy_inline:
6120 case Intrinsic::memmove:
6121 case Intrinsic::memset:
6122 case Intrinsic::memset_inline:
6124 case Intrinsic::experimental_memset_pattern: {
6126 Check(Memset->getValue()->getType()->isSized(),
6127 "unsized types cannot be used as memset patterns",
Call);
6130 case Intrinsic::memcpy_element_unordered_atomic:
6131 case Intrinsic::memmove_element_unordered_atomic:
6132 case Intrinsic::memset_element_unordered_atomic: {
6135 ConstantInt *ElementSizeCI =
6137 const APInt &ElementSizeVal = ElementSizeCI->
getValue();
6139 "element size of the element-wise atomic memory intrinsic "
6140 "must be a power of 2",
6143 auto IsValidAlignment = [&](MaybeAlign Alignment) {
6144 return Alignment && ElementSizeVal.
ule(Alignment->value());
6146 Check(IsValidAlignment(AMI->getDestAlign()),
6147 "incorrect alignment of the destination argument",
Call);
6149 Check(IsValidAlignment(AMT->getSourceAlign()),
6150 "incorrect alignment of the source argument",
Call);
6154 case Intrinsic::call_preallocated_setup: {
6156 bool FoundCall =
false;
6159 Check(UseCall !=
nullptr,
6160 "Uses of llvm.call.preallocated.setup must be calls");
6162 if (IID == Intrinsic::call_preallocated_arg) {
6164 Check(AllocArgIndex !=
nullptr,
6165 "llvm.call.preallocated.alloc arg index must be a constant");
6166 auto AllocArgIndexInt = AllocArgIndex->getValue();
6167 Check(AllocArgIndexInt.sge(0) &&
6168 AllocArgIndexInt.slt(NumArgs->getValue()),
6169 "llvm.call.preallocated.alloc arg index must be between 0 and "
6171 "llvm.call.preallocated.setup's argument count");
6172 }
else if (IID == Intrinsic::call_preallocated_teardown) {
6175 Check(!FoundCall,
"Can have at most one call corresponding to a "
6176 "llvm.call.preallocated.setup");
6178 size_t NumPreallocatedArgs = 0;
6179 for (
unsigned i = 0; i < UseCall->arg_size(); i++) {
6180 if (UseCall->paramHasAttr(i, Attribute::Preallocated)) {
6181 ++NumPreallocatedArgs;
6184 Check(NumPreallocatedArgs != 0,
6185 "cannot use preallocated intrinsics on a call without "
6186 "preallocated arguments");
6187 Check(NumArgs->equalsInt(NumPreallocatedArgs),
6188 "llvm.call.preallocated.setup arg size must be equal to number "
6189 "of preallocated arguments "
6199 auto PreallocatedBundle =
6201 Check(PreallocatedBundle,
6202 "Use of llvm.call.preallocated.setup outside intrinsics "
6203 "must be in \"preallocated\" operand bundle");
6204 Check(PreallocatedBundle->Inputs.front().get() == &
Call,
6205 "preallocated bundle must have token from corresponding "
6206 "llvm.call.preallocated.setup");
6211 case Intrinsic::call_preallocated_arg: {
6214 Token->getIntrinsicID() == Intrinsic::call_preallocated_setup,
6215 "llvm.call.preallocated.arg token argument must be a "
6216 "llvm.call.preallocated.setup");
6218 "llvm.call.preallocated.arg must be called with a \"preallocated\" "
6219 "call site attribute");
6222 case Intrinsic::call_preallocated_teardown: {
6225 Token->getIntrinsicID() == Intrinsic::call_preallocated_setup,
6226 "llvm.call.preallocated.teardown token argument must be a "
6227 "llvm.call.preallocated.setup");
6230 case Intrinsic::gcroot:
6231 case Intrinsic::gcwrite:
6232 case Intrinsic::gcread:
6233 if (
ID == Intrinsic::gcroot) {
6236 Check(AI,
"llvm.gcroot parameter #1 must be an alloca.",
Call);
6238 "llvm.gcroot parameter #2 must be a constant.",
Call);
6241 "llvm.gcroot parameter #1 must either be a pointer alloca, "
6242 "or argument #2 must be a non-null constant.",
6248 "Enclosing function does not use GC.",
Call);
6250 case Intrinsic::init_trampoline:
6252 "llvm.init_trampoline parameter #2 must resolve to a function.",
6255 case Intrinsic::prefetch:
6257 "rw argument to llvm.prefetch must be 0-1",
Call);
6259 "locality argument to llvm.prefetch must be 0-3",
Call);
6261 "cache type argument to llvm.prefetch must be 0-1",
Call);
6263 case Intrinsic::reloc_none: {
6266 "llvm.reloc.none argument must be a metadata string", &
Call);
6269 case Intrinsic::stackprotector:
6271 "llvm.stackprotector parameter #2 must resolve to an alloca.",
Call);
6273 case Intrinsic::localescape: {
6277 Check(!SawFrameEscape,
"multiple calls to llvm.localescape in one function",
6284 "llvm.localescape only accepts static allocas",
Call);
6287 SawFrameEscape =
true;
6290 case Intrinsic::localrecover: {
6294 "llvm.localrecover first "
6295 "argument must be function defined in this module",
6298 auto &
Entry = FrameEscapeInfo[Fn];
6299 Entry.second = unsigned(
6300 std::max(uint64_t(
Entry.second), IdxArg->getLimitedValue(~0U) + 1));
6304 case Intrinsic::experimental_gc_statepoint:
6306 Check(!CI->isInlineAsm(),
6307 "gc.statepoint support for inline assembly unimplemented", CI);
6309 "Enclosing function does not use GC.",
Call);
6311 verifyStatepoint(
Call);
6313 case Intrinsic::experimental_gc_result: {
6315 "Enclosing function does not use GC.",
Call);
6323 Check(StatepointCall && StatepointCall->getIntrinsicID() ==
6324 Intrinsic::experimental_gc_statepoint,
6325 "gc.result operand #1 must be from a statepoint",
Call,
6329 auto *TargetFuncType =
6332 "gc.result result type does not match wrapped callee",
Call);
6335 case Intrinsic::experimental_gc_relocate: {
6339 "gc.relocate must return a pointer or a vector of pointers",
Call);
6344 if (LandingPadInst *LandingPad =
6348 LandingPad->getParent()->getUniquePredecessor();
6352 Check(InvokeBB,
"safepoints should have unique landingpads",
6353 LandingPad->getParent());
6357 "gc relocate should be linked to a statepoint", InvokeBB);
6364 "gc relocate is incorrectly tied to the statepoint",
Call, Token);
6373 "gc.relocate operand #2 must be integer offset",
Call);
6377 "gc.relocate operand #3 must be integer offset",
Call);
6387 Check(BaseIndex < Opt->Inputs.size(),
6388 "gc.relocate: statepoint base index out of bounds",
Call);
6389 Check(DerivedIndex < Opt->Inputs.size(),
6390 "gc.relocate: statepoint derived index out of bounds",
Call);
6403 "gc.relocate: relocated value must be a pointer",
Call);
6404 Check(DerivedType->isPtrOrPtrVectorTy(),
6405 "gc.relocate: relocated value must be a pointer",
Call);
6407 Check(ResultType->isVectorTy() == DerivedType->isVectorTy(),
6408 "gc.relocate: vector relocates to vector and pointer to pointer",
6411 ResultType->getPointerAddressSpace() ==
6412 DerivedType->getPointerAddressSpace(),
6413 "gc.relocate: relocating a pointer shouldn't change its address space",
6417 Check(GC,
"gc.relocate: calling function must have GCStrategy",
6420 auto isGCPtr = [&
GC](
Type *PTy) {
6421 return GC->isGCManagedPointer(PTy->getScalarType()).value_or(
true);
6423 Check(isGCPtr(ResultType),
"gc.relocate: must return gc pointer",
Call);
6425 "gc.relocate: relocated value must be a gc pointer",
Call);
6426 Check(isGCPtr(DerivedType),
6427 "gc.relocate: relocated value must be a gc pointer",
Call);
6431 case Intrinsic::experimental_patchpoint: {
6434 "patchpoint: invalid return type used with anyregcc",
Call);
6438 case Intrinsic::eh_exceptioncode:
6439 case Intrinsic::eh_exceptionpointer: {
6441 "eh.exceptionpointer argument must be a catchpad",
Call);
6444 case Intrinsic::get_active_lane_mask: {
6446 "get_active_lane_mask: must return a "
6450 Check(ElemTy->isIntegerTy(1),
6451 "get_active_lane_mask: element type is not "
6456 case Intrinsic::experimental_get_vector_length: {
6459 "get_vector_length: VF must be positive",
Call);
6462 case Intrinsic::masked_load: {
6468 Check(
Mask->getType()->isVectorTy(),
"masked_load: mask must be vector",
6471 "masked_load: pass through and return type must match",
Call);
6474 "masked_load: vector mask must be same length as return",
Call);
6477 case Intrinsic::masked_store: {
6480 Check(
Mask->getType()->isVectorTy(),
"masked_store: mask must be vector",
6484 "masked_store: vector mask must be same length as value",
Call);
6488 case Intrinsic::experimental_guard: {
6491 "experimental_guard must have exactly one "
6492 "\"deopt\" operand bundle");
6496 case Intrinsic::experimental_deoptimize: {
6500 "experimental_deoptimize must have exactly one "
6501 "\"deopt\" operand bundle");
6503 "experimental_deoptimize return type must match caller return type");
6508 "calls to experimental_deoptimize must be followed by a return");
6512 "calls to experimental_deoptimize must be followed by a return "
6513 "of the value computed by experimental_deoptimize");
6518 case Intrinsic::vastart: {
6520 "va_start called in a non-varargs function");
6523 case Intrinsic::get_dynamic_area_offset: {
6525 Check(IntTy &&
DL.getPointerSizeInBits(
DL.getAllocaAddrSpace()) ==
6526 IntTy->getBitWidth(),
6527 "get_dynamic_area_offset result type must be scalar integer matching "
6528 "alloca address space width",
6532 case Intrinsic::vector_reduce_and:
6533 case Intrinsic::vector_reduce_or:
6534 case Intrinsic::vector_reduce_xor:
6535 case Intrinsic::vector_reduce_add:
6536 case Intrinsic::vector_reduce_mul:
6537 case Intrinsic::vector_reduce_smax:
6538 case Intrinsic::vector_reduce_smin:
6539 case Intrinsic::vector_reduce_umax:
6540 case Intrinsic::vector_reduce_umin: {
6543 "Intrinsic has incorrect argument type!");
6546 case Intrinsic::vector_reduce_fmax:
6547 case Intrinsic::vector_reduce_fmin: {
6550 "Intrinsic has incorrect argument type!");
6553 case Intrinsic::vector_reduce_fadd:
6554 case Intrinsic::vector_reduce_fmul: {
6559 "Intrinsic has incorrect argument type!");
6562 case Intrinsic::smul_fix:
6563 case Intrinsic::smul_fix_sat:
6564 case Intrinsic::umul_fix:
6565 case Intrinsic::umul_fix_sat:
6566 case Intrinsic::sdiv_fix:
6567 case Intrinsic::sdiv_fix_sat:
6568 case Intrinsic::udiv_fix:
6569 case Intrinsic::udiv_fix_sat: {
6573 "first operand of [us][mul|div]_fix[_sat] must be an int type or "
6576 "second operand of [us][mul|div]_fix[_sat] must be an int type or "
6580 Check(Op3->getType()->isIntegerTy(),
6581 "third operand of [us][mul|div]_fix[_sat] must be an int type");
6582 Check(Op3->getBitWidth() <= 32,
6583 "third operand of [us][mul|div]_fix[_sat] must fit within 32 bits");
6585 if (
ID == Intrinsic::smul_fix ||
ID == Intrinsic::smul_fix_sat ||
6586 ID == Intrinsic::sdiv_fix ||
ID == Intrinsic::sdiv_fix_sat) {
6588 "the scale of s[mul|div]_fix[_sat] must be less than the width of "
6592 "the scale of u[mul|div]_fix[_sat] must be less than or equal "
6593 "to the width of the operands");
6597 case Intrinsic::lrint:
6598 case Intrinsic::llrint:
6599 case Intrinsic::lround:
6600 case Intrinsic::llround: {
6606 ExpectedName +
": argument must be floating-point or vector "
6607 "of floating-points, and result must be integer or "
6608 "vector of integers",
6611 ExpectedName +
": argument and result disagree on vector use", &
Call);
6613 Check(VTy->getElementCount() == RTy->getElementCount(),
6614 ExpectedName +
": argument must be same length as result", &
Call);
6618 case Intrinsic::bswap: {
6621 Check(
Size % 16 == 0,
"bswap must be an even number of bytes", &
Call);
6624 case Intrinsic::invariant_start: {
6626 Check(InvariantSize &&
6628 "invariant_start parameter must be -1, 0 or a positive number",
6632 case Intrinsic::matrix_multiply:
6633 case Intrinsic::matrix_transpose:
6634 case Intrinsic::matrix_column_major_load:
6635 case Intrinsic::matrix_column_major_store: {
6637 ConstantInt *Stride =
nullptr;
6638 ConstantInt *NumRows;
6639 ConstantInt *NumColumns;
6641 Type *Op0ElemTy =
nullptr;
6642 Type *Op1ElemTy =
nullptr;
6644 case Intrinsic::matrix_multiply: {
6649 ->getNumElements() ==
6651 "First argument of a matrix operation does not match specified "
6654 ->getNumElements() ==
6656 "Second argument of a matrix operation does not match specified "
6666 case Intrinsic::matrix_transpose:
6673 case Intrinsic::matrix_column_major_load: {
6680 case Intrinsic::matrix_column_major_store: {
6693 Check(ResultTy->getElementType()->isIntegerTy() ||
6694 ResultTy->getElementType()->isFloatingPointTy(),
6695 "Result type must be an integer or floating-point type!", IF);
6698 Check(ResultTy->getElementType() == Op0ElemTy,
6699 "Vector element type mismatch of the result and first operand "
6704 Check(ResultTy->getElementType() == Op1ElemTy,
6705 "Vector element type mismatch of the result and second operand "
6711 "Result of a matrix operation does not fit in the returned vector!");
6717 "Stride must be greater or equal than the number of rows!", IF);
6722 case Intrinsic::stepvector: {
6724 Check(VecTy && VecTy->getScalarType()->isIntegerTy() &&
6725 VecTy->getScalarSizeInBits() >= 8,
6726 "stepvector only supported for vectors of integers "
6727 "with a bitwidth of at least 8.",
6731 case Intrinsic::experimental_vector_match: {
6740 Check(Op1Ty && Op2Ty && MaskTy,
"Operands must be vectors.", &
Call);
6742 "Second operand must be a fixed length vector.", &
Call);
6743 Check(Op1Ty->getElementType()->isIntegerTy(),
6744 "First operand must be a vector of integers.", &
Call);
6745 Check(Op1Ty->getElementType() == Op2Ty->getElementType(),
6746 "First two operands must have the same element type.", &
Call);
6747 Check(Op1Ty->getElementCount() == MaskTy->getElementCount(),
6748 "First operand and mask must have the same number of elements.",
6750 Check(MaskTy->getElementType()->isIntegerTy(1),
6751 "Mask must be a vector of i1's.", &
Call);
6756 case Intrinsic::vector_insert: {
6765 ElementCount VecEC = VecTy->getElementCount();
6766 ElementCount SubVecEC = SubVecTy->getElementCount();
6767 Check(VecTy->getElementType() == SubVecTy->getElementType(),
6768 "vector_insert parameters must have the same element "
6772 "vector_insert index must be a constant multiple of "
6773 "the subvector's known minimum vector length.");
6781 "subvector operand of vector_insert would overrun the "
6782 "vector being inserted into.");
6786 case Intrinsic::vector_extract: {
6794 ElementCount VecEC = VecTy->getElementCount();
6795 ElementCount ResultEC = ResultTy->getElementCount();
6797 Check(ResultTy->getElementType() == VecTy->getElementType(),
6798 "vector_extract result must have the same element "
6799 "type as the input vector.",
6802 "vector_extract index must be a constant multiple of "
6803 "the result type's known minimum vector length.");
6811 "vector_extract would overrun.");
6815 case Intrinsic::vector_partial_reduce_fadd:
6816 case Intrinsic::vector_partial_reduce_add: {
6820 unsigned VecWidth = VecTy->getElementCount().getKnownMinValue();
6821 unsigned AccWidth = AccTy->getElementCount().getKnownMinValue();
6823 Check((VecWidth % AccWidth) == 0,
6824 "Invalid vector widths for partial "
6825 "reduction. The width of the input vector "
6826 "must be a positive integer multiple of "
6827 "the width of the accumulator vector.");
6830 case Intrinsic::experimental_noalias_scope_decl: {
6834 case Intrinsic::preserve_array_access_index:
6835 case Intrinsic::preserve_struct_access_index:
6836 case Intrinsic::aarch64_ldaxr:
6837 case Intrinsic::aarch64_ldxr:
6838 case Intrinsic::arm_ldaex:
6839 case Intrinsic::arm_ldrex: {
6841 Check(ElemTy,
"Intrinsic requires elementtype attribute on first argument.",
6845 case Intrinsic::aarch64_stlxr:
6846 case Intrinsic::aarch64_stxr:
6847 case Intrinsic::arm_stlex:
6848 case Intrinsic::arm_strex: {
6851 "Intrinsic requires elementtype attribute on second argument.",
6855 case Intrinsic::aarch64_prefetch: {
6857 "write argument to llvm.aarch64.prefetch must be 0 or 1",
Call);
6859 "target argument to llvm.aarch64.prefetch must be 0-3",
Call);
6861 "stream argument to llvm.aarch64.prefetch must be 0 or 1",
Call);
6863 "isdata argument to llvm.aarch64.prefetch must be 0 or 1",
Call);
6866 case Intrinsic::aarch64_range_prefetch: {
6868 "write argument to llvm.aarch64.range.prefetch must be 0 or 1",
Call);
6870 "stream argument to llvm.aarch64.range.prefetch must be 0 or 1",
6874 case Intrinsic::callbr_landingpad: {
6876 Check(CBR,
"intrinstic requires callbr operand", &
Call);
6883 CheckFailed(
"Intrinsic in block must have 1 unique predecessor", &
Call);
6887 CheckFailed(
"Intrinsic must have corresponding callbr in predecessor",
6892 "Intrinsic's corresponding callbr must have intrinsic's parent basic "
6893 "block in indirect destination list",
6896 Check(&
First == &
Call,
"No other instructions may proceed intrinsic",
6900 case Intrinsic::structured_gep: {
6906 "Intrinsic first parameter is missing an ElementType attribute",
6914 "Index operand type must be an integer", &
Call);
6917 T = AT->getElementType();
6919 Check(CI,
"Indexing into a struct requires a constant int", &
Call);
6921 "Indexing in a struct should be inbounds", &
Call);
6924 T = VT->getElementType();
6926 CheckFailed(
"Reached a non-composite type with more indices to process",
6932 case Intrinsic::amdgcn_cs_chain: {
6935 case CallingConv::AMDGPU_CS:
6936 case CallingConv::AMDGPU_CS_Chain:
6937 case CallingConv::AMDGPU_CS_ChainPreserve:
6938 case CallingConv::AMDGPU_ES:
6939 case CallingConv::AMDGPU_GS:
6940 case CallingConv::AMDGPU_HS:
6941 case CallingConv::AMDGPU_LS:
6942 case CallingConv::AMDGPU_VS:
6945 CheckFailed(
"Intrinsic cannot be called from functions with this "
6946 "calling convention",
6952 "SGPR arguments must have the `inreg` attribute", &
Call);
6954 "VGPR arguments must not have the `inreg` attribute", &
Call);
6959 Intrinsic::amdgcn_unreachable;
6961 "llvm.amdgcn.cs.chain must be followed by unreachable", &
Call);
6964 case Intrinsic::amdgcn_init_exec_from_input: {
6967 "only inreg arguments to the parent function are valid as inputs to "
6972 case Intrinsic::amdgcn_set_inactive_chain_arg: {
6975 case CallingConv::AMDGPU_CS_Chain:
6976 case CallingConv::AMDGPU_CS_ChainPreserve:
6979 CheckFailed(
"Intrinsic can only be used from functions with the "
6980 "amdgpu_cs_chain or amdgpu_cs_chain_preserve "
6981 "calling conventions",
6986 unsigned InactiveIdx = 1;
6988 "Value for inactive lanes must not have the `inreg` attribute",
6991 "Value for inactive lanes must be a function argument", &
Call);
6993 "Value for inactive lanes must be a VGPR function argument", &
Call);
6996 case Intrinsic::amdgcn_call_whole_wave: {
6998 Check(
F,
"Indirect whole wave calls are not allowed", &
Call);
7000 CallingConv::ID CC =
F->getCallingConv();
7001 Check(CC == CallingConv::AMDGPU_Gfx_WholeWave,
7002 "Callee must have the amdgpu_gfx_whole_wave calling convention",
7005 Check(!
F->isVarArg(),
"Variadic whole wave calls are not allowed", &
Call);
7008 "Call argument count must match callee argument count", &
Call);
7012 Check(
F->arg_begin()->getType()->isIntegerTy(1),
7013 "Callee must have i1 as its first argument", &
Call);
7014 for (
auto [CallArg, FuncArg] :
7016 Check(CallArg->getType() == FuncArg.getType(),
7017 "Argument types must match", &
Call);
7021 FuncArg.hasInRegAttr(),
7022 "Argument inreg attributes must match", &
Call);
7026 case Intrinsic::amdgcn_s_prefetch_data: {
7030 "llvm.amdgcn.s.prefetch.data only supports global or constant memory");
7033 case Intrinsic::amdgcn_mfma_scale_f32_16x16x128_f8f6f4:
7034 case Intrinsic::amdgcn_mfma_scale_f32_32x32x64_f8f6f4: {
7040 Check(CBSZ <= 4,
"invalid value for cbsz format",
Call,
7042 Check(BLGP <= 4,
"invalid value for blgp format",
Call,
7046 auto getFormatNumRegs = [](
unsigned FormatVal) {
7047 switch (FormatVal) {
7061 auto isValidSrcASrcBVector = [](FixedVectorType *Ty) {
7062 if (!Ty || !Ty->getElementType()->
isIntegerTy(32))
7064 unsigned NumElts = Ty->getNumElements();
7065 return NumElts == 4 || NumElts == 6 || NumElts == 8;
7070 Check(isValidSrcASrcBVector(Src0Ty),
7071 "operand 0 must be 4, 6 or 8 element i32 vector", &
Call, Src0);
7072 Check(isValidSrcASrcBVector(Src1Ty),
7073 "operand 1 must be 4, 6 or 8 element i32 vector", &
Call, Src1);
7076 Check(Src0Ty->getNumElements() >= getFormatNumRegs(CBSZ),
7078 Check(Src1Ty->getNumElements() >= getFormatNumRegs(BLGP),
7082 case Intrinsic::amdgcn_wmma_f32_16x16x128_f8f6f4:
7083 case Intrinsic::amdgcn_wmma_scale_f32_16x16x128_f8f6f4:
7084 case Intrinsic::amdgcn_wmma_scale16_f32_16x16x128_f8f6f4: {
7090 Check(FmtA <= 4,
"invalid value for matrix format",
Call,
7092 Check(FmtB <= 4,
"invalid value for matrix format",
Call,
7096 auto getFormatNumRegs = [](
unsigned FormatVal) {
7097 switch (FormatVal) {
7111 auto isValidSrcASrcBVector = [](FixedVectorType *Ty) {
7112 if (!Ty || !Ty->getElementType()->
isIntegerTy(32))
7114 unsigned NumElts = Ty->getNumElements();
7115 return NumElts == 16 || NumElts == 12 || NumElts == 8;
7120 Check(isValidSrcASrcBVector(Src0Ty),
7121 "operand 1 must be 8, 12 or 16 element i32 vector", &
Call, Src0);
7122 Check(isValidSrcASrcBVector(Src1Ty),
7123 "operand 3 must be 8, 12 or 16 element i32 vector", &
Call, Src1);
7126 Check(Src0Ty->getNumElements() >= getFormatNumRegs(FmtA),
7128 Check(Src1Ty->getNumElements() >= getFormatNumRegs(FmtB),
7132 case Intrinsic::amdgcn_cooperative_atomic_load_32x4B:
7133 case Intrinsic::amdgcn_cooperative_atomic_load_16x8B:
7134 case Intrinsic::amdgcn_cooperative_atomic_load_8x16B:
7135 case Intrinsic::amdgcn_cooperative_atomic_store_32x4B:
7136 case Intrinsic::amdgcn_cooperative_atomic_store_16x8B:
7137 case Intrinsic::amdgcn_cooperative_atomic_store_8x16B: {
7142 "cooperative atomic intrinsics require a generic or global pointer",
7149 "cooperative atomic intrinsics require that the last argument is a "
7154 case Intrinsic::nvvm_setmaxnreg_inc_sync_aligned_u32:
7155 case Intrinsic::nvvm_setmaxnreg_dec_sync_aligned_u32: {
7158 Check(RegCount % 8 == 0,
7159 "reg_count argument to nvvm.setmaxnreg must be in multiples of 8");
7162 case Intrinsic::experimental_convergence_entry:
7163 case Intrinsic::experimental_convergence_anchor:
7165 case Intrinsic::experimental_convergence_loop:
7167 case Intrinsic::ptrmask: {
7171 "llvm.ptrmask intrinsic first argument must be pointer or vector "
7176 "llvm.ptrmask intrinsic arguments must be both scalars or both vectors",
7181 "llvm.ptrmask intrinsic arguments must have the same number of "
7185 "llvm.ptrmask intrinsic second argument bitwidth must match "
7186 "pointer index type size of first argument",
7190 case Intrinsic::thread_pointer: {
7192 DL.getDefaultGlobalsAddressSpace(),
7193 "llvm.thread.pointer intrinsic return type must be for the globals "
7198 case Intrinsic::threadlocal_address: {
7201 "llvm.threadlocal.address first argument must be a GlobalValue");
7203 "llvm.threadlocal.address operand isThreadLocal() must be true");
7206 case Intrinsic::lifetime_start:
7207 case Intrinsic::lifetime_end: {
7210 "llvm.lifetime.start/end can only be used on alloca or poison",
7214 case Intrinsic::sponentry: {
7215 const unsigned StackAS =
DL.getAllocaAddrSpace();
7218 "llvm.sponentry must return a pointer to the stack", &
Call);
7226 if (
F->hasPersonalityFn() &&
7230 if (BlockEHFuncletColors.
empty())
7234 bool InEHFunclet =
false;
7238 for (BasicBlock *ColorFirstBB : CV)
7239 if (
auto It = ColorFirstBB->getFirstNonPHIIt();
7240 It != ColorFirstBB->end())
7245 bool HasToken =
false;
7252 Check(HasToken,
"Missing funclet token on intrinsic call", &
Call);
7276void Verifier::visit(DbgLabelRecord &DLR) {
7278 "invalid #dbg_label intrinsic variable", &DLR, DLR.
getRawLabel());
7291 CheckDI(Loc,
"#dbg_label record requires a !dbg attachment", &DLR, BB,
F);
7295 if (!LabelSP || !LocSP)
7299 "mismatched subprogram between #dbg_label label and !dbg attachment",
7300 &DLR, BB,
F, Label,
Label->getScope()->getSubprogram(), Loc,
7301 Loc->getScope()->getSubprogram());
7304void Verifier::visit(DbgVariableRecord &DVR) {
7308 CheckDI(DVR.
getType() == DbgVariableRecord::LocationType::Value ||
7309 DVR.
getType() == DbgVariableRecord::LocationType::Declare ||
7310 DVR.
getType() == DbgVariableRecord::LocationType::DeclareValue ||
7311 DVR.
getType() == DbgVariableRecord::LocationType::Assign,
7312 "invalid #dbg record type", &DVR, DVR.
getType(), BB,
F);
7320 "invalid #dbg record address/value", &DVR, MD, BB,
F);
7322 visitValueAsMetadata(*VAM,
F);
7325 Type *Ty = VAM->getValue()->getType();
7327 "location of #dbg_declare must be a pointer or int", &DVR, MD, BB,
7331 visitDIArgList(*AL,
F);
7345 "invalid #dbg_assign DIAssignID", &DVR, DVR.
getRawAssignID(), BB,
7348 AreDebugLocsAllowed::No);
7357 "invalid #dbg_assign address", &DVR, DVR.
getRawAddress(), BB,
F);
7359 visitValueAsMetadata(*VAM,
F);
7362 "invalid #dbg_assign address expression", &DVR,
7369 "inst not in same function as #dbg_assign",
I, &DVR, BB,
F);
7379 &DVR, DLNode, BB,
F);
7385 if (!VarSP || !LocSP)
7389 "mismatched subprogram between #dbg record variable and DILocation",
7391 Loc->getScope()->getSubprogram(), BB,
F);
7396void Verifier::visitVPIntrinsic(VPIntrinsic &VPI) {
7400 Check(RetTy->getElementCount() == ValTy->getElementCount(),
7401 "VP cast intrinsic first argument and result vector lengths must be "
7405 switch (VPCast->getIntrinsicID()) {
7408 case Intrinsic::vp_trunc:
7410 "llvm.vp.trunc intrinsic first argument and result element type "
7414 "llvm.vp.trunc intrinsic the bit size of first argument must be "
7415 "larger than the bit size of the return type",
7418 case Intrinsic::vp_zext:
7419 case Intrinsic::vp_sext:
7421 "llvm.vp.zext or llvm.vp.sext intrinsic first argument and result "
7422 "element type must be integer",
7425 "llvm.vp.zext or llvm.vp.sext intrinsic the bit size of first "
7426 "argument must be smaller than the bit size of the return type",
7429 case Intrinsic::vp_fptoui:
7430 case Intrinsic::vp_fptosi:
7431 case Intrinsic::vp_lrint:
7432 case Intrinsic::vp_llrint:
7435 "llvm.vp.fptoui, llvm.vp.fptosi, llvm.vp.lrint or llvm.vp.llrint" "intrinsic first argument element "
7436 "type must be floating-point and result element type must be integer",
7439 case Intrinsic::vp_uitofp:
7440 case Intrinsic::vp_sitofp:
7443 "llvm.vp.uitofp or llvm.vp.sitofp intrinsic first argument element "
7444 "type must be integer and result element type must be floating-point",
7447 case Intrinsic::vp_fptrunc:
7449 "llvm.vp.fptrunc intrinsic first argument and result element type "
7450 "must be floating-point",
7453 "llvm.vp.fptrunc intrinsic the bit size of first argument must be "
7454 "larger than the bit size of the return type",
7457 case Intrinsic::vp_fpext:
7459 "llvm.vp.fpext intrinsic first argument and result element type "
7460 "must be floating-point",
7463 "llvm.vp.fpext intrinsic the bit size of first argument must be "
7464 "smaller than the bit size of the return type",
7467 case Intrinsic::vp_ptrtoint:
7469 "llvm.vp.ptrtoint intrinsic first argument element type must be "
7470 "pointer and result element type must be integer",
7473 case Intrinsic::vp_inttoptr:
7475 "llvm.vp.inttoptr intrinsic first argument element type must be "
7476 "integer and result element type must be pointer",
7483 case Intrinsic::vp_fcmp: {
7486 "invalid predicate for VP FP comparison intrinsic", &VPI);
7489 case Intrinsic::vp_icmp: {
7492 "invalid predicate for VP integer comparison intrinsic", &VPI);
7495 case Intrinsic::vp_is_fpclass: {
7498 "unsupported bits for llvm.vp.is.fpclass test mask");
7501 case Intrinsic::experimental_vp_splice: {
7504 int64_t KnownMinNumElements = VecTy->getElementCount().getKnownMinValue();
7506 AttributeList
Attrs = VPI.
getParent()->getParent()->getAttributes();
7507 if (
Attrs.hasFnAttr(Attribute::VScaleRange))
7508 KnownMinNumElements *=
Attrs.getFnAttrs().getVScaleRangeMin();
7510 Check((Idx < 0 && std::abs(Idx) <= KnownMinNumElements) ||
7511 (Idx >= 0 && Idx < KnownMinNumElements),
7512 "The splice index exceeds the range [-VL, VL-1] where VL is the "
7513 "known minimum number of elements in the vector. For scalable "
7514 "vectors the minimum number of elements is determined from "
7522void Verifier::visitConstrainedFPIntrinsic(ConstrainedFPIntrinsic &FPI) {
7524 bool HasRoundingMD =
7528 NumOperands += (1 + HasRoundingMD);
7534 "invalid arguments for constrained FP intrinsic", &FPI);
7537 case Intrinsic::experimental_constrained_lrint:
7538 case Intrinsic::experimental_constrained_llrint: {
7542 "Intrinsic does not support vectors", &FPI);
7546 case Intrinsic::experimental_constrained_lround:
7547 case Intrinsic::experimental_constrained_llround: {
7551 "Intrinsic does not support vectors", &FPI);
7555 case Intrinsic::experimental_constrained_fcmp:
7556 case Intrinsic::experimental_constrained_fcmps: {
7559 "invalid predicate for constrained FP comparison intrinsic", &FPI);
7563 case Intrinsic::experimental_constrained_fptosi:
7564 case Intrinsic::experimental_constrained_fptoui: {
7568 "Intrinsic first argument must be floating point", &FPI);
7575 "Intrinsic first argument and result disagree on vector use", &FPI);
7577 "Intrinsic result must be an integer", &FPI);
7580 "Intrinsic first argument and result vector lengths must be equal",
7586 case Intrinsic::experimental_constrained_sitofp:
7587 case Intrinsic::experimental_constrained_uitofp: {
7591 "Intrinsic first argument must be integer", &FPI);
7598 "Intrinsic first argument and result disagree on vector use", &FPI);
7600 "Intrinsic result must be a floating point", &FPI);
7603 "Intrinsic first argument and result vector lengths must be equal",
7609 case Intrinsic::experimental_constrained_fptrunc:
7610 case Intrinsic::experimental_constrained_fpext: {
7616 "Intrinsic first argument must be FP or FP vector", &FPI);
7618 "Intrinsic result must be FP or FP vector", &FPI);
7620 "Intrinsic first argument and result disagree on vector use", &FPI);
7624 "Intrinsic first argument and result vector lengths must be equal",
7627 if (FPI.
getIntrinsicID() == Intrinsic::experimental_constrained_fptrunc) {
7629 "Intrinsic first argument's type must be larger than result type",
7633 "Intrinsic first argument's type must be smaller than result type",
7649 "invalid exception behavior argument", &FPI);
7650 if (HasRoundingMD) {
7656void Verifier::verifyFragmentExpression(
const DbgVariableRecord &DVR) {
7661 if (!V || !
E || !
E->isValid())
7665 auto Fragment =
E->getFragmentInfo();
7675 if (
V->isArtificial())
7678 verifyFragmentExpression(*V, *Fragment, &DVR);
7681template <
typename ValueOrMetadata>
7682void Verifier::verifyFragmentExpression(
const DIVariable &V,
7684 ValueOrMetadata *
Desc) {
7687 auto VarSize =
V.getSizeInBits();
7693 CheckDI(FragSize + FragOffset <= *VarSize,
7694 "fragment is larger than or outside of variable",
Desc, &V);
7695 CheckDI(FragSize != *VarSize,
"fragment covers entire variable",
Desc, &V);
7698void Verifier::verifyFnArgs(
const DbgVariableRecord &DVR) {
7710 CheckDI(Var,
"#dbg record without variable");
7712 unsigned ArgNo = Var->
getArg();
7718 if (DebugFnArgs.
size() < ArgNo)
7719 DebugFnArgs.
resize(ArgNo,
nullptr);
7721 auto *Prev = DebugFnArgs[ArgNo - 1];
7722 DebugFnArgs[ArgNo - 1] = Var;
7723 CheckDI(!Prev || (Prev == Var),
"conflicting debug info for argument", &DVR,
7727void Verifier::verifyNotEntryValue(
const DbgVariableRecord &DVR) {
7731 if (!
E || !
E->isValid())
7741 ArgLoc && ArgLoc->hasAttribute(Attribute::SwiftAsync))
7746 "Entry values are only allowed in MIR unless they target a "
7747 "swiftasync Argument",
7751void Verifier::verifyCompileUnits() {
7755 if (
M.getContext().isODRUniquingDebugTypes())
7757 auto *CUs =
M.getNamedMetadata(
"llvm.dbg.cu");
7758 SmallPtrSet<const Metadata *, 2> Listed;
7761 for (
const auto *CU : CUVisited)
7762 CheckDI(Listed.
count(CU),
"DICompileUnit not listed in llvm.dbg.cu", CU);
7766void Verifier::verifyDeoptimizeCallingConvs() {
7767 if (DeoptimizeDeclarations.
empty())
7771 for (
const auto *
F :
ArrayRef(DeoptimizeDeclarations).slice(1)) {
7772 Check(
First->getCallingConv() ==
F->getCallingConv(),
7773 "All llvm.experimental.deoptimize declarations must have the same "
7774 "calling convention",
7779void Verifier::verifyAttachedCallBundle(
const CallBase &
Call,
7780 const OperandBundleUse &BU) {
7783 Check((FTy->getReturnType()->isPointerTy() ||
7785 "a call with operand bundle \"clang.arc.attachedcall\" must call a "
7786 "function returning a pointer or a non-returning function that has a "
7791 "operand bundle \"clang.arc.attachedcall\" requires one function as "
7799 Check((IID == Intrinsic::objc_retainAutoreleasedReturnValue ||
7800 IID == Intrinsic::objc_claimAutoreleasedReturnValue ||
7801 IID == Intrinsic::objc_unsafeClaimAutoreleasedReturnValue),
7802 "invalid function argument",
Call);
7804 StringRef FnName = Fn->
getName();
7805 Check((FnName ==
"objc_retainAutoreleasedReturnValue" ||
7806 FnName ==
"objc_claimAutoreleasedReturnValue" ||
7807 FnName ==
"objc_unsafeClaimAutoreleasedReturnValue"),
7808 "invalid function argument",
Call);
7812void Verifier::verifyNoAliasScopeDecl() {
7813 if (NoAliasScopeDecls.
empty())
7817 for (
auto *
II : NoAliasScopeDecls) {
7818 assert(
II->getIntrinsicID() == Intrinsic::experimental_noalias_scope_decl &&
7819 "Not a llvm.experimental.noalias.scope.decl ?");
7822 Check(ScopeListMV !=
nullptr,
7823 "llvm.experimental.noalias.scope.decl must have a MetadataAsValue "
7828 Check(ScopeListMD !=
nullptr,
"!id.scope.list must point to an MDNode",
II);
7829 Check(ScopeListMD->getNumOperands() == 1,
7830 "!id.scope.list must point to a list with a single scope",
II);
7831 visitAliasScopeListMetadata(ScopeListMD);
7841 auto GetScope = [](IntrinsicInst *
II) {
7844 return &
cast<MDNode>(ScopeListMV->getMetadata())->getOperand(0);
7849 auto Compare = [GetScope](IntrinsicInst *Lhs, IntrinsicInst *Rhs) {
7850 return GetScope(Lhs) < GetScope(Rhs);
7857 auto ItCurrent = NoAliasScopeDecls.begin();
7858 while (ItCurrent != NoAliasScopeDecls.end()) {
7859 auto CurScope = GetScope(*ItCurrent);
7860 auto ItNext = ItCurrent;
7863 }
while (ItNext != NoAliasScopeDecls.end() &&
7864 GetScope(*ItNext) == CurScope);
7869 if (ItNext - ItCurrent < 32)
7873 Check(!DT.dominates(
I, J),
7874 "llvm.experimental.noalias.scope.decl dominates another one "
7875 "with the same scope",
7889 Verifier V(OS,
true, *f.getParent());
7893 return !V.verify(
F);
7897 bool *BrokenDebugInfo) {
7899 Verifier V(OS, !BrokenDebugInfo, M);
7901 bool Broken =
false;
7903 Broken |= !V.verify(
F);
7905 Broken |= !V.verify();
7906 if (BrokenDebugInfo)
7907 *BrokenDebugInfo = V.hasBrokenDebugInfo();
7918 std::unique_ptr<Verifier> V;
7919 bool FatalErrors =
true;
7922 explicit VerifierLegacyPass(
bool FatalErrors)
7923 : FunctionPass(
ID), FatalErrors(FatalErrors) {}
7925 bool doInitialization(
Module &M)
override {
7926 V = std::make_unique<Verifier>(
7932 if (!
V->verify(
F) && FatalErrors) {
7933 errs() <<
"in function " <<
F.getName() <<
'\n';
7939 bool doFinalization(
Module &M)
override {
7940 bool HasErrors =
false;
7941 for (Function &
F : M)
7942 if (
F.isDeclaration())
7943 HasErrors |= !
V->verify(
F);
7945 HasErrors |= !
V->verify();
7946 if (FatalErrors && (HasErrors ||
V->hasBrokenDebugInfo()))
7951 void getAnalysisUsage(AnalysisUsage &AU)
const override {
7959template <
typename... Tys>
void TBAAVerifier::CheckFailed(Tys &&... Args) {
7961 return Diagnostic->CheckFailed(
Args...);
7964#define CheckTBAA(C, ...) \
7967 CheckFailed(__VA_ARGS__); \
7975TBAAVerifier::TBAABaseNodeSummary
7979 CheckFailed(
"Base nodes must have at least two operands",
I, BaseNode);
7983 auto Itr = TBAABaseNodes.find(BaseNode);
7984 if (Itr != TBAABaseNodes.end())
7987 auto Result = verifyTBAABaseNodeImpl(
I, BaseNode, IsNewFormat);
7988 auto InsertResult = TBAABaseNodes.insert({BaseNode, Result});
7990 assert(InsertResult.second &&
"We just checked!");
7994TBAAVerifier::TBAABaseNodeSummary
7995TBAAVerifier::verifyTBAABaseNodeImpl(
const Instruction *
I,
7996 const MDNode *BaseNode,
bool IsNewFormat) {
7997 const TBAAVerifier::TBAABaseNodeSummary InvalidNode = {
true, ~0
u};
8001 return isValidScalarTBAANode(BaseNode)
8002 ? TBAAVerifier::TBAABaseNodeSummary({
false, 0})
8008 CheckFailed(
"Access tag nodes must have the number of operands that is a "
8009 "multiple of 3!", BaseNode);
8014 CheckFailed(
"Struct tag nodes must have an odd number of operands!",
8024 if (!TypeSizeNode) {
8025 CheckFailed(
"Type size nodes must be constants!",
I, BaseNode);
8032 CheckFailed(
"Struct tag nodes have a string as their first operand",
8039 std::optional<APInt> PrevOffset;
8044 unsigned FirstFieldOpNo = IsNewFormat ? 3 : 1;
8045 unsigned NumOpsPerField = IsNewFormat ? 3 : 2;
8046 for (
unsigned Idx = FirstFieldOpNo; Idx < BaseNode->
getNumOperands();
8047 Idx += NumOpsPerField) {
8048 const MDOperand &FieldTy = BaseNode->
getOperand(Idx);
8049 const MDOperand &FieldOffset = BaseNode->
getOperand(Idx + 1);
8051 CheckFailed(
"Incorrect field entry in struct type node!",
I, BaseNode);
8056 auto *OffsetEntryCI =
8058 if (!OffsetEntryCI) {
8059 CheckFailed(
"Offset entries must be constants!",
I, BaseNode);
8065 BitWidth = OffsetEntryCI->getBitWidth();
8067 if (OffsetEntryCI->getBitWidth() !=
BitWidth) {
8069 "Bitwidth between the offsets and struct type entries must match",
I,
8081 !PrevOffset || PrevOffset->ule(OffsetEntryCI->getValue());
8084 CheckFailed(
"Offsets must be increasing!",
I, BaseNode);
8088 PrevOffset = OffsetEntryCI->getValue();
8093 if (!MemberSizeNode) {
8094 CheckFailed(
"Member size entries must be constants!",
I, BaseNode);
8101 return Failed ? InvalidNode
8102 : TBAAVerifier::TBAABaseNodeSummary(
false,
BitWidth);
8124 return Parent && Visited.
insert(Parent).second &&
8128bool TBAAVerifier::isValidScalarTBAANode(
const MDNode *MD) {
8129 auto ResultIt = TBAAScalarNodes.find(MD);
8130 if (ResultIt != TBAAScalarNodes.end())
8131 return ResultIt->second;
8133 SmallPtrSet<const MDNode *, 4> Visited;
8135 auto InsertResult = TBAAScalarNodes.insert({MD,
Result});
8137 assert(InsertResult.second &&
"Just checked!");
8146MDNode *TBAAVerifier::getFieldNodeFromTBAABaseNode(
const Instruction *
I,
8147 const MDNode *BaseNode,
8158 unsigned FirstFieldOpNo = IsNewFormat ? 3 : 1;
8159 unsigned NumOpsPerField = IsNewFormat ? 3 : 2;
8160 for (
unsigned Idx = FirstFieldOpNo; Idx < BaseNode->
getNumOperands();
8161 Idx += NumOpsPerField) {
8162 auto *OffsetEntryCI =
8164 if (OffsetEntryCI->getValue().ugt(
Offset)) {
8165 if (Idx == FirstFieldOpNo) {
8166 CheckFailed(
"Could not find TBAA parent in struct type node",
I,
8171 unsigned PrevIdx = Idx - NumOpsPerField;
8172 auto *PrevOffsetEntryCI =
8174 Offset -= PrevOffsetEntryCI->getValue();
8182 Offset -= LastOffsetEntryCI->getValue();
8187 if (!
Type ||
Type->getNumOperands() < 3)
8203 "This instruction shall not have a TBAA access tag!",
I);
8205 bool IsStructPathTBAA =
8209 "Old-style TBAA is no longer allowed, use struct-path TBAA instead",
8219 "Access tag metadata must have either 4 or 5 operands",
I, MD);
8222 "Struct tag metadata must have either 3 or 4 operands",
I, MD);
8229 CheckTBAA(AccessSizeNode,
"Access size field must be a constant",
I, MD);
8233 unsigned ImmutabilityFlagOpNo = IsNewFormat ? 4 : 3;
8238 "Immutability tag on struct tag metadata must be a constant",
I,
8241 IsImmutableCI->isZero() || IsImmutableCI->isOne(),
8242 "Immutability part of the struct tag metadata must be either 0 or 1",
I,
8247 "Malformed struct tag metadata: base and access-type "
8248 "should be non-null and point to Metadata nodes",
8249 I, MD, BaseNode, AccessType);
8252 CheckTBAA(isValidScalarTBAANode(AccessType),
8253 "Access type node must be a valid scalar type",
I, MD,
8258 CheckTBAA(OffsetCI,
"Offset must be constant integer",
I, MD);
8261 bool SeenAccessTypeInPath =
false;
8267 getFieldNodeFromTBAABaseNode(
I, BaseNode,
Offset, IsNewFormat)) {
8268 if (!StructPath.
insert(BaseNode).second) {
8269 CheckFailed(
"Cycle detected in struct path",
I, MD);
8274 unsigned BaseNodeBitWidth;
8275 std::tie(
Invalid, BaseNodeBitWidth) =
8276 verifyTBAABaseNode(
I, BaseNode, IsNewFormat);
8283 SeenAccessTypeInPath |= BaseNode == AccessType;
8285 if (isValidScalarTBAANode(BaseNode) || BaseNode == AccessType)
8290 (BaseNodeBitWidth == 0 &&
Offset == 0) ||
8291 (IsNewFormat && BaseNodeBitWidth == ~0u),
8292 "Access bit-width not the same as description bit-width",
I, MD,
8293 BaseNodeBitWidth,
Offset.getBitWidth());
8295 if (IsNewFormat && SeenAccessTypeInPath)
8299 CheckTBAA(SeenAccessTypeInPath,
"Did not see access type in access path!",
I,
8304char VerifierLegacyPass::ID = 0;
8305INITIALIZE_PASS(VerifierLegacyPass,
"verify",
"Module Verifier",
false,
false)
8308 return new VerifierLegacyPass(FatalErrors);
8326 if (FatalErrors && (Res.IRBroken || Res.DebugInfoBroken))
8334 if (res.IRBroken && FatalErrors)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU address space definition.
ArrayRef< TableEntry > TableRef
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file declares the LLVM IR specialization of the GenericConvergenceVerifier template.
static DISubprogram * getSubprogram(bool IsDistinct, Ts &&...Args)
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
static bool runOnFunction(Function &F, bool PostInlining)
This file contains the declarations of entities that describe floating point environment and related ...
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
This defines the Use class.
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
Machine Check Debug Module
This file implements a map that provides insertion order iteration.
This file provides utility for Memory Model Relaxation Annotations (MMRAs).
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
static unsigned getNumElements(Type *Ty)
static void visit(BasicBlock &Start, std::function< bool(BasicBlock *)> op)
verify safepoint Safepoint IR Verifier
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
static bool IsScalarTBAANodeImpl(const MDNode *MD, SmallPtrSetImpl< const MDNode * > &Visited)
static bool isType(const Metadata *MD)
static Instruction * getSuccPad(Instruction *Terminator)
static bool isMDTuple(const Metadata *MD)
static bool isNewFormatTBAATypeNode(llvm::MDNode *Type)
#define CheckDI(C,...)
We know that a debug info condition should be true, if not print an error message.
static void forEachUser(const Value *User, SmallPtrSet< const Value *, 32 > &Visited, llvm::function_ref< bool(const Value *)> Callback)
static bool isDINode(const Metadata *MD)
static bool isScope(const Metadata *MD)
static cl::opt< bool > VerifyNoAliasScopeDomination("verify-noalias-scope-decl-dom", cl::Hidden, cl::init(false), cl::desc("Ensure that llvm.experimental.noalias.scope.decl for identical " "scopes are not dominating"))
static bool isTypeCongruent(Type *L, Type *R)
Two types are "congruent" if they are identical, or if they are both pointer types with different poi...
static bool isConstantIntMetadataOperand(const Metadata *MD)
static bool IsRootTBAANode(const MDNode *MD)
static Value * getParentPad(Value *EHPad)
static bool hasConflictingReferenceFlags(unsigned Flags)
Detect mutually exclusive flags.
static AttrBuilder getParameterABIAttributes(LLVMContext &C, unsigned I, AttributeList Attrs)
static const char PassName[]
static LLVM_ABI bool isValidArbitraryFPFormat(StringRef Format)
Returns true if the given string is a valid arbitrary floating-point format interpretation for llvm....
bool isFiniteNonZero() const
const fltSemantics & getSemantics() const
Class for arbitrary precision integers.
bool sgt(const APInt &RHS) const
Signed greater than comparison.
bool isMinValue() const
Determine if this is the smallest unsigned value.
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
int64_t getSExtValue() const
Get sign extended value.
bool isMaxValue() const
Determine if this is the largest unsigned value.
This class represents a conversion between pointers from one address space to another.
bool isSwiftError() const
Return true if this alloca is used as a swifterror argument to a call.
LLVM_ABI bool isStaticAlloca() const
Return true if this alloca is in the entry block of the function and is a constant size.
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
unsigned getAddressSpace() const
Return the address space for the allocation.
LLVM_ABI bool isArrayAllocation() const
Return true if there is an allocation size parameter to the allocation instruction that is not 1.
const Value * getArraySize() const
Get the number of elements allocated.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
void setPreservesAll()
Set by analyses that do not transform their input at all.
LLVM_ABI bool hasInRegAttr() const
Return true if this argument has the inreg attribute.
bool empty() const
empty - Check if the array is empty.
static bool isFPOperation(BinOp Op)
BinOp getOperation() const
static LLVM_ABI StringRef getOperationName(BinOp Op)
AtomicOrdering getOrdering() const
Returns the ordering constraint of this rmw instruction.
bool contains(Attribute::AttrKind A) const
Return true if the builder has the specified attribute.
LLVM_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Return true if the attribute exists in this set.
LLVM_ABI std::string getAsString(bool InAttrGrp=false) const
Functions, function parameters, and return types can have attributes to indicate how they should be t...
LLVM_ABI const ConstantRange & getValueAsConstantRange() const
Return the attribute's value as a ConstantRange.
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
bool isValid() const
Return true if the attribute is any kind of attribute.
LLVM_ABI Type * getValueAsType() const
Return the attribute's value as a Type.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
const Function * getParent() const
Return the enclosing method, or null if none.
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
const Instruction & front() const
LLVM_ABI const BasicBlock * getUniquePredecessor() const
Return the predecessor of this block if it has a unique predecessor block.
InstListType::iterator iterator
Instruction iterators...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
This class represents a no-op cast from one type to another.
static LLVM_ABI BlockAddress * lookup(const BasicBlock *BB)
Lookup an existing BlockAddress constant for the given BasicBlock.
bool isConditional() const
Value * getCondition() const
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
bool isInlineAsm() const
Check if this call is an inline asm statement.
bool hasInAllocaArgument() const
Determine if there are is an inalloca argument.
OperandBundleUse getOperandBundleAt(unsigned Index) const
Return the operand bundle at a specific index.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
bool doesNotAccessMemory(unsigned OpNo) const
bool hasFnAttr(Attribute::AttrKind Kind) const
Determine whether this call has the given attribute.
unsigned getNumOperandBundles() const
Return the number of operand bundles associated with this User.
CallingConv::ID getCallingConv() const
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
Attribute getParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Get the attribute of a given kind from a given arg.
iterator_range< bundle_op_iterator > bundle_op_infos()
Return the range [bundle_op_info_begin, bundle_op_info_end).
unsigned countOperandBundlesOfType(StringRef Name) const
Return the number of operand bundles with the tag Name attached to this instruction.
bool onlyReadsMemory(unsigned OpNo) const
Value * getCalledOperand() const
Type * getParamElementType(unsigned ArgNo) const
Extract the elementtype type for a parameter.
Value * getArgOperand(unsigned i) const
FunctionType * getFunctionType() const
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
bool doesNotReturn() const
Determine if the call cannot return.
LLVM_ABI bool onlyAccessesArgMemory() const
Determine if the call can access memmory only using pointers based on its arguments.
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
bool hasOperandBundles() const
Return true if this User has any operand bundles.
LLVM_ABI Function * getCaller()
Helper to get the caller (the parent function).
BasicBlock * getIndirectDest(unsigned i) const
unsigned getNumIndirectDests() const
Return the number of callbr indirect dest labels.
bool isMustTailCall() const
static LLVM_ABI bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
unsigned getNumHandlers() const
return the number of 'handlers' in this catchswitch instruction, except the default handler
Value * getParentPad() const
BasicBlock * getUnwindDest() const
handler_range handlers()
iteration adapter for range-for loops.
BasicBlock * getUnwindDest() const
bool isFPPredicate() const
bool isIntPredicate() const
static bool isIntPredicate(Predicate P)
bool isMinusOne() const
This function will return true iff every bit in this constant is set to true.
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
const APInt & getValue() const
Return the constant as an APInt value reference.
Constant * getAddrDiscriminator() const
The address discriminator if any, or the null constant.
Constant * getPointer() const
The pointer that is signed in this ptrauth signed pointer.
ConstantInt * getKey() const
The Key ID, an i32 constant.
Constant * getDeactivationSymbol() const
ConstantInt * getDiscriminator() const
The integer discriminator, an i64 constant, or 0.
static LLVM_ABI bool isOrderedRanges(ArrayRef< ConstantRange > RangesRef)
This class represents a range of values.
const APInt & getLower() const
Return the lower value for this range.
const APInt & getUpper() const
Return the upper value for this range.
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
static LLVM_ABI ConstantTokenNone * get(LLVMContext &Context)
Return the ConstantTokenNone.
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
LLVM_ABI std::optional< fp::ExceptionBehavior > getExceptionBehavior() const
LLVM_ABI std::optional< RoundingMode > getRoundingMode() const
LLVM_ABI unsigned getNonMetadataArgCount() const
DbgVariableFragmentInfo FragmentInfo
@ FixedPointBinary
Scale factor 2^Factor.
@ FixedPointDecimal
Scale factor 10^Factor.
@ FixedPointRational
Arbitrary rational scale factor.
DIGlobalVariable * getVariable() const
DIExpression * getExpression() const
LLVM_ABI DISubprogram * getSubprogram() const
Get the subprogram for this scope.
DILocalScope * getScope() const
Get the local scope for this variable.
Metadata * getRawScope() const
Base class for scope-like contexts.
Subprogram description. Uses SubclassData1.
static const DIScope * getRawRetainedNodeScope(const MDNode *N)
Base class for template parameters.
Base class for variables.
Metadata * getRawType() const
Metadata * getRawScope() const
uint64_t getNumOperands() const
A parsed version of the target data layout string in and methods for querying it.
Records a position in IR for a source label (DILabel).
MDNode * getRawLabel() const
DILabel * getLabel() const
Base class for non-instruction debug metadata records that have positions within IR.
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false) const
DebugLoc getDebugLoc() const
LLVM_ABI const BasicBlock * getParent() const
LLVM_ABI Function * getFunction()
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LocationType getType() const
MDNode * getRawExpression() const
MDNode * getRawAddressExpression() const
LLVM_ABI Value * getVariableLocationOp(unsigned OpIdx) const
DIExpression * getExpression() const
Metadata * getRawAssignID() const
MDNode * getRawVariable() const
DILocalVariable * getVariable() const
Metadata * getRawLocation() const
Returns the metadata operand for the first location description.
bool isDbgDeclare() const
Metadata * getRawAddress() const
@ End
Marks the end of the concrete types.
@ Any
To indicate all LocationTypes in searches.
DIExpression * getAddressExpression() const
MDNode * getAsMDNode() const
Return this as a bar MDNode.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
This instruction compares its operands according to the predicate given to the constructor.
This class represents an extension of floating point types.
This class represents a cast from floating point to signed integer.
This class represents a cast from floating point to unsigned integer.
This class represents a truncation of floating point types.
AtomicOrdering getOrdering() const
Returns the ordering constraint of this fence instruction.
Value * getParentPad() const
Convenience accessors.
FunctionPass class - This class is used to implement most global optimizations.
Type * getReturnType() const
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
DISubprogram * getSubprogram() const
Get the attached subprogram.
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
bool hasPersonalityFn() const
Check whether this function has a personality function.
const Function & getFunction() const
const std::string & getGC() const
Type * getReturnType() const
Returns the type of the ret val.
bool isVarArg() const
isVarArg - Return true if this function takes a variable number of arguments.
LLVM_ABI Value * getBasePtr() const
LLVM_ABI Value * getDerivedPtr() const
void visit(const BlockT &BB)
static LLVM_ABI Type * getIndexedType(Type *Ty, ArrayRef< Value * > IdxList)
Returns the result type of a getelementptr with the given source element type and indexes.
static bool isValidLinkage(LinkageTypes L)
const Constant * getAliasee() const
LLVM_ABI const Function * getResolverFunction() const
static bool isValidLinkage(LinkageTypes L)
const Constant * getResolver() const
LLVM_ABI void getAllMetadata(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
Appends all metadata attached to this value to MDs, sorting by KindID.
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
bool hasExternalLinkage() const
bool isImplicitDSOLocal() const
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
bool hasValidDeclarationLinkage() const
LinkageTypes getLinkage() const
bool hasDefaultVisibility() const
bool hasPrivateLinkage() const
bool hasHiddenVisibility() const
bool hasExternalWeakLinkage() const
bool hasDLLImportStorageClass() const
bool hasDLLExportStorageClass() const
bool isDeclarationForLinker() const
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
PointerType * getType() const
Global values are always pointers.
LLVM_ABI bool isInterposable() const
Return true if this global's definition can be substituted with an arbitrary definition at link time ...
bool hasCommonLinkage() const
bool hasGlobalUnnamedAddr() const
bool hasAppendingLinkage() const
bool hasAvailableExternallyLinkage() const
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool hasInitializer() const
Definitions have initializers, declarations don't.
MaybeAlign getAlign() const
Returns the alignment of the given variable.
LLVM_ABI uint64_t getGlobalSize(const DataLayout &DL) const
Get the size of this global variable in bytes.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
bool hasDefinitiveInitializer() const
hasDefinitiveInitializer - Whether the global variable has an initializer, and any other instances of...
This instruction compares its operands according to the predicate given to the constructor.
BasicBlock * getDestination(unsigned i)
Return the specified destination.
unsigned getNumDestinations() const
return the number of possible destinations in this indirectbr instruction.
unsigned getNumSuccessors() const
This instruction inserts a single (scalar) element into a VectorType value.
static LLVM_ABI bool isValidOperands(const Value *Vec, const Value *NewElt, const Value *Idx)
Return true if an insertelement instruction can be formed with the specified operands.
Value * getAggregateOperand()
ArrayRef< unsigned > getIndices() const
Base class for instruction visitors.
void visit(Iterator Start, Iterator End)
LLVM_ABI unsigned getNumSuccessors() const LLVM_READONLY
Return the number of successors that this instruction has.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI bool isAtomic() const LLVM_READONLY
Return true if this instruction has an AtomicOrdering of unordered or higher.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
This class represents a cast from an integer to a pointer.
static LLVM_ABI bool mayLowerToFunctionCall(Intrinsic::ID IID)
Check if the intrinsic might lower into a regular function call in the course of IR transformations.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
This is an important class for using LLVM in a threaded context.
@ OB_clang_arc_attachedcall
bool isCleanup() const
Return 'true' if this landingpad instruction is a cleanup.
unsigned getNumClauses() const
Get the number of clauses for this landing pad.
bool isCatch(unsigned Idx) const
Return 'true' if the clause and index Idx is a catch clause.
bool isFilter(unsigned Idx) const
Return 'true' if the clause and index Idx is a filter clause.
Constant * getClause(unsigned Idx) const
Get the value of the clause at index Idx.
AtomicOrdering getOrdering() const
Returns the ordering constraint of this load instruction.
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this load instruction.
Align getAlign() const
Return the alignment of the access that is being performed.
const MDOperand & getOperand(unsigned I) const
ArrayRef< MDOperand > operands() const
unsigned getNumOperands() const
Return number of MDNode operands.
bool isResolved() const
Check if node is fully resolved.
LLVMContext & getContext() const
bool equalsStr(StringRef Str) const
LLVM_ABI StringRef getString() const
This class implements a map that also provides access to all stored values in a deterministic order.
Manage lifetime of a slot tracker for printing IR.
A Module instance is used to store all the information related to an LLVM module.
LLVM_ABI StringRef getName() const
LLVM_ABI void print(raw_ostream &ROS, bool IsForDebug=false) const
LLVM_ABI unsigned getNumOperands() const
iterator_range< op_iterator > operands()
op_range incoming_values()
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
This class represents a cast from a pointer to an address (non-capturing ptrtoint).
This class represents a cast from a pointer to an integer.
Value * getValue() const
Convenience accessor.
Value * getReturnValue() const
Convenience accessor. Returns null if there is no return value.
This class represents a sign extension of integer types.
This class represents a cast from signed integer to floating point.
static LLVM_ABI const char * areInvalidOperands(Value *Cond, Value *True, Value *False)
Return a string if the specified operands are invalid for a select operation, otherwise return null.
This instruction constructs a fixed permutation of two input vectors.
static LLVM_ABI bool isValidOperands(const Value *V1, const Value *V2, const Value *Mask)
Return true if a shufflevector instruction can be formed with the specified operands.
static LLVM_ABI void getShuffleMask(const Constant *Mask, SmallVectorImpl< int > &Result)
Convert the input shuffle mask operand to a vector of integers.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
void insert_range(Range &&R)
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
void reserve(size_type N)
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
static constexpr size_t npos
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
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.
unsigned getNumElements() const
Random access to the elements.
LLVM_ABI Type * getTypeAtIndex(const Value *V) const
Given an index value into the type, return the type of the element.
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Returns true if this struct contains a scalable vector.
Verify that the TBAA Metadatas are valid.
LLVM_ABI bool visitTBAAMetadata(const Instruction *I, const MDNode *MD)
Visit an instruction, or a TBAA node itself as part of a metadata, and return true if it is valid,...
Triple - Helper class for working with autoconf configuration names.
This class represents a truncation of integer types.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
bool isVectorTy() const
True if this is an instance of VectorType.
LLVM_ABI bool containsNonGlobalTargetExtType(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this type is or contains a target extension type that disallows being used as a global...
bool isArrayTy() const
True if this is an instance of ArrayType.
LLVM_ABI bool containsNonLocalTargetExtType(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this type is or contains a target extension type that disallows being used as a local.
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
bool isLabelTy() const
Return true if this is 'label'.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isPointerTy() const
True if this is an instance of PointerType.
LLVM_ABI bool isTokenLikeTy() const
Returns true if this is 'token' or a token-like target type.s.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isSingleValueType() const
Return true if the type is a valid type for a register in codegen.
LLVM_ABI bool canLosslesslyBitCastTo(Type *Ty) const
Return true if this type could be converted with a lossless BitCast to type 'Ty'.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
bool isIntOrPtrTy() const
Return true if this is an integer type or a pointer type.
bool isIntegerTy() const
True if this is an instance of IntegerType.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
bool isVoidTy() const
Return true if this is 'void'.
bool isMetadataTy() const
Return true if this is 'metadata'.
This class represents a cast unsigned integer to floating point.
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM Value Representation.
iterator_range< user_iterator > materialized_users()
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI const Value * stripPointerCastsAndAliases() const
Strip off pointer casts, all-zero GEPs, address space casts, and aliases.
LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI const Value * stripInBoundsOffsets(function_ref< void(const Value *)> Func=[](const Value *) {}) const
Strip off pointer casts and inbounds GEPs.
iterator_range< user_iterator > users()
bool materialized_use_empty() const
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Check a module for errors, and report separate error states for IR and debug info errors.
LLVM_ABI Result run(Module &M, ModuleAnalysisManager &)
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
This class represents zero extension of integer types.
constexpr bool isNonZero() const
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
This class implements an extremely fast bulk output stream that can only output to a stream.
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.
@ FLAT_ADDRESS
Address space for flat memory.
@ GLOBAL_ADDRESS
Address space for global memory (RAT0, VTX0).
@ PRIVATE_ADDRESS
Address space for private memory.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
bool isFlatGlobalAddrSpace(unsigned AS)
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
@ BasicBlock
Various leaf nodes.
LLVM_ABI MatchIntrinsicTypesResult matchIntrinsicSignature(FunctionType *FTy, ArrayRef< IITDescriptor > &Infos, SmallVectorImpl< Type * > &ArgTys)
Match the specified function type with the type constraints specified by the .td file.
LLVM_ABI void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl< IITDescriptor > &T)
Return the IIT table descriptor for the specified intrinsic into an array of IITDescriptors.
MatchIntrinsicTypesResult
@ MatchIntrinsicTypes_NoMatchRet
@ MatchIntrinsicTypes_NoMatchArg
LLVM_ABI bool hasConstrainedFPRoundingModeOperand(ID QID)
Returns true if the intrinsic ID is for one of the "ConstrainedFloating-Point Intrinsics" that take r...
LLVM_ABI StringRef getName(ID id)
Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx".
static const int NoAliasScopeDeclScopeArg
LLVM_ABI bool matchIntrinsicVarArg(bool isVarArg, ArrayRef< IITDescriptor > &Infos)
Verify if the intrinsic has variable arguments.
std::variant< std::monostate, Loc::Single, Loc::Multi, Loc::MMI, Loc::EntryValue > Variant
Alias for the std::variant specialization base class of DbgVariable.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
@ System
Synchronized with respect to all concurrently executing threads.
LLVM_ABI std::optional< VFInfo > tryDemangleForVFABI(StringRef MangledName, const FunctionType *FTy)
Function to construct a VFInfo out of a mangled names in the following format:
@ CE
Windows NT (Windows on ARM)
LLVM_ABI AssignmentInstRange getAssignmentInsts(DIAssignID *ID)
Return a range of instructions (typically just one) that have ID as an attachment.
initializer< Ty > init(const Ty &Val)
Scope
Defines the scope in which this symbol should be visible: Default – Visible in the public interface o...
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract_or_null(Y &&MD)
Extract a Value from Metadata, if any, allowing null.
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.
@ User
could "use" a pointer
NodeAddr< UseNode * > Use
NodeAddr< NodeBase * > Node
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
FunctionAddr VTableAddr Value
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI bool canInstructionHaveMMRAs(const Instruction &I)
detail::zippy< detail::zip_first, T, U, Args... > zip_equal(T &&t, U &&u, Args &&...args)
zip iterator that assumes that all iteratees have the same length.
LLVM_ABI unsigned getBranchWeightOffset(const MDNode *ProfileData)
Return the offset to the first branch weight data.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI bool verifyFunction(const Function &F, raw_ostream *OS=nullptr)
Check a function for errors, useful for use when debugging a pass.
testing::Matcher< const detail::ErrorHolder & > Failed()
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI DenseMap< BasicBlock *, ColorVector > colorEHFunclets(Function &F)
If an EH funclet personality is in use (see isFuncletEHPersonality), this will recompute which blocks...
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
gep_type_iterator gep_type_end(const User *GEP)
bool isa_and_nonnull(const Y &Val)
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
auto dyn_cast_or_null(const Y &Val)
GenericConvergenceVerifier< SSAContext > ConvergenceVerifier
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
bool isModSet(const ModRefInfo MRI)
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
generic_gep_type_iterator<> gep_type_iterator
FunctionAddr VTableAddr Count
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
iterator_range< SplittingIterator > split(StringRef Str, StringRef Separator)
Split the specified string over a separator and return a range-compatible iterable over its partition...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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...
LLVM_ABI bool isValueProfileMD(const MDNode *ProfileData)
Checks if an MDNode contains value profiling Metadata.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
LLVM_ABI unsigned getNumBranchWeights(const MDNode &ProfileData)
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
LLVM_ABI FunctionPass * createVerifierPass(bool FatalErrors=true)
FunctionAddr VTableAddr Next
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
TinyPtrVector< BasicBlock * > ColorVector
LLVM_ABI const char * LLVMLoopEstimatedTripCount
Profile-based loop metadata that should be accessed only by using llvm::getLoopEstimatedTripCount and...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI std::optional< RoundingMode > convertStrToRoundingMode(StringRef)
Returns a valid RoundingMode enumerator when given a string that is valid as input in constrained int...
gep_type_iterator gep_type_begin(const User *GEP)
LLVM_ABI std::unique_ptr< GCStrategy > getGCStrategy(const StringRef Name)
Lookup the GCStrategy object associated with the given gc name.
auto predecessors(const MachineBasicBlock *BB)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
bool pred_empty(const BasicBlock *BB)
bool isHexDigit(char C)
Checks if character C is a hexadecimal numeric character.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
constexpr bool isCallableCC(CallingConv::ID CC)
LLVM_ABI bool verifyModule(const Module &M, raw_ostream *OS=nullptr, bool *BrokenDebugInfo=nullptr)
Check a module for errors.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
A special type used by analysis passes to provide an address that identifies that particular analysis...
static LLVM_ABI const char * SyntheticFunctionEntryCount
static LLVM_ABI const char * UnknownBranchWeightsMarker
static LLVM_ABI const char * ValueProfile
static LLVM_ABI const char * FunctionEntryCount
static LLVM_ABI const char * BranchWeights
uint32_t getTagID() const
Return the tag of this operand bundle as an integer.
void DebugInfoCheckFailed(const Twine &Message)
A debug info check failed.
VerifierSupport(raw_ostream *OS, const Module &M)
bool Broken
Track the brokenness of the module while recursively visiting.
void CheckFailed(const Twine &Message, const T1 &V1, const Ts &... Vs)
A check failed (with values to print).
bool BrokenDebugInfo
Broken debug info can be "recovered" from by stripping the debug info.
bool TreatBrokenDebugInfoAsError
Whether to treat broken debug info as an error.
void CheckFailed(const Twine &Message)
A check failed, so printout out the condition and the message.
void DebugInfoCheckFailed(const Twine &Message, const T1 &V1, const Ts &... Vs)
A debug info check failed (with values to print).