#include "llvm/IR/Verifier.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/PostOrderIterator.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/AttributeMask.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Comdat.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/ConstantRange.h"
#include "llvm/IR/ConstantRangeList.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/ConvergenceVerifier.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/EHPersonalities.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GCStrategy.h"
#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/InstVisitor.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/IntrinsicsAArch64.h"
#include "llvm/IR/IntrinsicsAMDGPU.h"
#include "llvm/IR/IntrinsicsARM.h"
#include "llvm/IR/IntrinsicsNVPTX.h"
#include "llvm/IR/IntrinsicsWebAssembly.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MemoryModelRelaxationAnnotations.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/ModuleSlotTracker.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/ProfDataUtils.h"
#include "llvm/IR/Statepoint.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/User.h"
#include "llvm/IR/VFABIDemangler.h"
#include "llvm/IR/Value.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
#include "llvm/Support/AMDGPUAddrSpace.h"
#include "llvm/Support/AtomicOrdering.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/ModRef.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <memory>
#include <optional>
#include <string>
#include <utility>
usingnamespacellvm;
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"));
namespace llvm {
struct VerifierSupport { … };
}
namespace {
class Verifier : public InstVisitor<Verifier>, VerifierSupport { … };
}
#define Check(C, ...) …
#define CheckDI(C, ...) …
void Verifier::visitDbgRecords(Instruction &I) { … }
void Verifier::visit(Instruction &I) { … }
static void forEachUser(const Value *User,
SmallPtrSet<const Value *, 32> &Visited,
llvm::function_ref<bool(const Value *)> Callback) { … }
void Verifier::visitGlobalValue(const GlobalValue &GV) { … }
void Verifier::visitGlobalVariable(const GlobalVariable &GV) { … }
void Verifier::visitAliaseeSubExpr(const GlobalAlias &GA, const Constant &C) { … }
void Verifier::visitAliaseeSubExpr(SmallPtrSetImpl<const GlobalAlias*> &Visited,
const GlobalAlias &GA, const Constant &C) { … }
void Verifier::visitGlobalAlias(const GlobalAlias &GA) { … }
void Verifier::visitGlobalIFunc(const GlobalIFunc &GI) { … }
void Verifier::visitNamedMDNode(const NamedMDNode &NMD) { … }
void Verifier::visitMDNode(const MDNode &MD, AreDebugLocsAllowed AllowLocs) { … }
void Verifier::visitValueAsMetadata(const ValueAsMetadata &MD, Function *F) { … }
void Verifier::visitDIArgList(const DIArgList &AL, Function *F) { … }
void Verifier::visitMetadataAsValue(const MetadataAsValue &MDV, Function *F) { … }
static bool isType(const Metadata *MD) { … }
static bool isScope(const Metadata *MD) { … }
static bool isDINode(const Metadata *MD) { … }
void Verifier::visitDILocation(const DILocation &N) { … }
void Verifier::visitGenericDINode(const GenericDINode &N) { … }
void Verifier::visitDIScope(const DIScope &N) { … }
void Verifier::visitDISubrange(const DISubrange &N) { … }
void Verifier::visitDIGenericSubrange(const DIGenericSubrange &N) { … }
void Verifier::visitDIEnumerator(const DIEnumerator &N) { … }
void Verifier::visitDIBasicType(const DIBasicType &N) { … }
void Verifier::visitDIStringType(const DIStringType &N) { … }
void Verifier::visitDIDerivedType(const DIDerivedType &N) { … }
static bool hasConflictingReferenceFlags(unsigned Flags) { … }
void Verifier::visitTemplateParams(const MDNode &N, const Metadata &RawParams) { … }
void Verifier::visitDICompositeType(const DICompositeType &N) { … }
void Verifier::visitDISubroutineType(const DISubroutineType &N) { … }
void Verifier::visitDIFile(const DIFile &N) { … }
void Verifier::visitDICompileUnit(const DICompileUnit &N) { … }
void Verifier::visitDISubprogram(const DISubprogram &N) { … }
void Verifier::visitDILexicalBlockBase(const DILexicalBlockBase &N) { … }
void Verifier::visitDILexicalBlock(const DILexicalBlock &N) { … }
void Verifier::visitDILexicalBlockFile(const DILexicalBlockFile &N) { … }
void Verifier::visitDICommonBlock(const DICommonBlock &N) { … }
void Verifier::visitDINamespace(const DINamespace &N) { … }
void Verifier::visitDIMacro(const DIMacro &N) { … }
void Verifier::visitDIMacroFile(const DIMacroFile &N) { … }
void Verifier::visitDIModule(const DIModule &N) { … }
void Verifier::visitDITemplateParameter(const DITemplateParameter &N) { … }
void Verifier::visitDITemplateTypeParameter(const DITemplateTypeParameter &N) { … }
void Verifier::visitDITemplateValueParameter(
const DITemplateValueParameter &N) { … }
void Verifier::visitDIVariable(const DIVariable &N) { … }
void Verifier::visitDIGlobalVariable(const DIGlobalVariable &N) { … }
void Verifier::visitDILocalVariable(const DILocalVariable &N) { … }
void Verifier::visitDIAssignID(const DIAssignID &N) { … }
void Verifier::visitDILabel(const DILabel &N) { … }
void Verifier::visitDIExpression(const DIExpression &N) { … }
void Verifier::visitDIGlobalVariableExpression(
const DIGlobalVariableExpression &GVE) { … }
void Verifier::visitDIObjCProperty(const DIObjCProperty &N) { … }
void Verifier::visitDIImportedEntity(const DIImportedEntity &N) { … }
void Verifier::visitComdat(const Comdat &C) { … }
void Verifier::visitModuleIdents() { … }
void Verifier::visitModuleCommandLines() { … }
void Verifier::visitModuleFlags() { … }
void
Verifier::visitModuleFlag(const MDNode *Op,
DenseMap<const MDString *, const MDNode *> &SeenIDs,
SmallVectorImpl<const MDNode *> &Requirements) { … }
void Verifier::visitModuleFlagCGProfileEntry(const MDOperand &MDO) { … }
void Verifier::verifyAttributeTypes(AttributeSet Attrs, const Value *V) { … }
void Verifier::verifyParameterAttrs(AttributeSet Attrs, Type *Ty,
const Value *V) { … }
void Verifier::checkUnsignedBaseTenFuncAttr(AttributeList Attrs, StringRef Attr,
const Value *V) { … }
void Verifier::verifyFunctionAttrs(FunctionType *FT, AttributeList Attrs,
const Value *V, bool IsIntrinsic,
bool IsInlineAsm) { … }
void Verifier::verifyFunctionMetadata(
ArrayRef<std::pair<unsigned, MDNode *>> MDs) { … }
void Verifier::visitConstantExprsRecursively(const Constant *EntryC) { … }
void Verifier::visitConstantExpr(const ConstantExpr *CE) { … }
void Verifier::visitConstantPtrAuth(const ConstantPtrAuth *CPA) { … }
bool Verifier::verifyAttributeCount(AttributeList Attrs, unsigned Params) { … }
void Verifier::verifyInlineAsmCall(const CallBase &Call) { … }
void Verifier::verifyStatepoint(const CallBase &Call) { … }
void Verifier::verifyFrameRecoverIndices() { … }
static Instruction *getSuccPad(Instruction *Terminator) { … }
void Verifier::verifySiblingFuncletUnwinds() { … }
void Verifier::visitFunction(const Function &F) { … }
void Verifier::visitBasicBlock(BasicBlock &BB) { … }
void Verifier::visitTerminator(Instruction &I) { … }
void Verifier::visitBranchInst(BranchInst &BI) { … }
void Verifier::visitReturnInst(ReturnInst &RI) { … }
void Verifier::visitSwitchInst(SwitchInst &SI) { … }
void Verifier::visitIndirectBrInst(IndirectBrInst &BI) { … }
void Verifier::visitCallBrInst(CallBrInst &CBI) { … }
void Verifier::visitSelectInst(SelectInst &SI) { … }
void Verifier::visitUserOp1(Instruction &I) { … }
void Verifier::visitTruncInst(TruncInst &I) { … }
void Verifier::visitZExtInst(ZExtInst &I) { … }
void Verifier::visitSExtInst(SExtInst &I) { … }
void Verifier::visitFPTruncInst(FPTruncInst &I) { … }
void Verifier::visitFPExtInst(FPExtInst &I) { … }
void Verifier::visitUIToFPInst(UIToFPInst &I) { … }
void Verifier::visitSIToFPInst(SIToFPInst &I) { … }
void Verifier::visitFPToUIInst(FPToUIInst &I) { … }
void Verifier::visitFPToSIInst(FPToSIInst &I) { … }
void Verifier::visitPtrToIntInst(PtrToIntInst &I) { … }
void Verifier::visitIntToPtrInst(IntToPtrInst &I) { … }
void Verifier::visitBitCastInst(BitCastInst &I) { … }
void Verifier::visitAddrSpaceCastInst(AddrSpaceCastInst &I) { … }
void Verifier::visitPHINode(PHINode &PN) { … }
void Verifier::visitCallBase(CallBase &Call) { … }
void Verifier::verifyTailCCMustTailAttrs(const AttrBuilder &Attrs,
StringRef Context) { … }
static bool isTypeCongruent(Type *L, Type *R) { … }
static AttrBuilder getParameterABIAttributes(LLVMContext& C, unsigned I, AttributeList Attrs) { … }
void Verifier::verifyMustTailCall(CallInst &CI) { … }
void Verifier::visitCallInst(CallInst &CI) { … }
void Verifier::visitInvokeInst(InvokeInst &II) { … }
void Verifier::visitUnaryOperator(UnaryOperator &U) { … }
void Verifier::visitBinaryOperator(BinaryOperator &B) { … }
void Verifier::visitICmpInst(ICmpInst &IC) { … }
void Verifier::visitFCmpInst(FCmpInst &FC) { … }
void Verifier::visitExtractElementInst(ExtractElementInst &EI) { … }
void Verifier::visitInsertElementInst(InsertElementInst &IE) { … }
void Verifier::visitShuffleVectorInst(ShuffleVectorInst &SV) { … }
void Verifier::visitGetElementPtrInst(GetElementPtrInst &GEP) { … }
static bool isContiguous(const ConstantRange &A, const ConstantRange &B) { … }
void Verifier::verifyRangeMetadata(const Value &I, const MDNode *Range,
Type *Ty, bool IsAbsoluteSymbol) { … }
void Verifier::visitRangeMetadata(Instruction &I, MDNode *Range, Type *Ty) { … }
void Verifier::checkAtomicMemAccessSize(Type *Ty, const Instruction *I) { … }
void Verifier::visitLoadInst(LoadInst &LI) { … }
void Verifier::visitStoreInst(StoreInst &SI) { … }
void Verifier::verifySwiftErrorCall(CallBase &Call,
const Value *SwiftErrorVal) { … }
void Verifier::verifySwiftErrorValue(const Value *SwiftErrorVal) { … }
void Verifier::visitAllocaInst(AllocaInst &AI) { … }
void Verifier::visitAtomicCmpXchgInst(AtomicCmpXchgInst &CXI) { … }
void Verifier::visitAtomicRMWInst(AtomicRMWInst &RMWI) { … }
void Verifier::visitFenceInst(FenceInst &FI) { … }
void Verifier::visitExtractValueInst(ExtractValueInst &EVI) { … }
void Verifier::visitInsertValueInst(InsertValueInst &IVI) { … }
static Value *getParentPad(Value *EHPad) { … }
void Verifier::visitEHPadPredecessors(Instruction &I) { … }
void Verifier::visitLandingPadInst(LandingPadInst &LPI) { … }
void Verifier::visitResumeInst(ResumeInst &RI) { … }
void Verifier::visitCatchPadInst(CatchPadInst &CPI) { … }
void Verifier::visitCatchReturnInst(CatchReturnInst &CatchReturn) { … }
void Verifier::visitCleanupPadInst(CleanupPadInst &CPI) { … }
void Verifier::visitFuncletPadInst(FuncletPadInst &FPI) { … }
void Verifier::visitCatchSwitchInst(CatchSwitchInst &CatchSwitch) { … }
void Verifier::visitCleanupReturnInst(CleanupReturnInst &CRI) { … }
void Verifier::verifyDominatesUse(Instruction &I, unsigned i) { … }
void Verifier::visitDereferenceableMetadata(Instruction& I, MDNode* MD) { … }
void Verifier::visitProfMetadata(Instruction &I, MDNode *MD) { … }
void Verifier::visitDIAssignIDMetadata(Instruction &I, MDNode *MD) { … }
void Verifier::visitMMRAMetadata(Instruction &I, MDNode *MD) { … }
void Verifier::visitCallStackMetadata(MDNode *MD) { … }
void Verifier::visitMemProfMetadata(Instruction &I, MDNode *MD) { … }
void Verifier::visitCallsiteMetadata(Instruction &I, MDNode *MD) { … }
void Verifier::visitAnnotationMetadata(MDNode *Annotation) { … }
void Verifier::visitAliasScopeMetadata(const MDNode *MD) { … }
void Verifier::visitAliasScopeListMetadata(const MDNode *MD) { … }
void Verifier::visitAccessGroupMetadata(const MDNode *MD) { … }
void Verifier::visitInstruction(Instruction &I) { … }
void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) { … }
static DISubprogram *getSubprogram(Metadata *LocalScope) { … }
void Verifier::visit(DbgLabelRecord &DLR) { … }
void Verifier::visit(DbgVariableRecord &DVR) { … }
void Verifier::visitVPIntrinsic(VPIntrinsic &VPI) { … }
void Verifier::visitConstrainedFPIntrinsic(ConstrainedFPIntrinsic &FPI) { … }
void Verifier::visitDbgIntrinsic(StringRef Kind, DbgVariableIntrinsic &DII) { … }
void Verifier::visitDbgLabelIntrinsic(StringRef Kind, DbgLabelInst &DLI) { … }
void Verifier::verifyFragmentExpression(const DbgVariableIntrinsic &I) { … }
void Verifier::verifyFragmentExpression(const DbgVariableRecord &DVR) { … }
template <typename ValueOrMetadata>
void Verifier::verifyFragmentExpression(const DIVariable &V,
DIExpression::FragmentInfo Fragment,
ValueOrMetadata *Desc) { … }
void Verifier::verifyFnArgs(const DbgVariableIntrinsic &I) { … }
void Verifier::verifyFnArgs(const DbgVariableRecord &DVR) { … }
void Verifier::verifyNotEntryValue(const DbgVariableIntrinsic &I) { … }
void Verifier::verifyNotEntryValue(const DbgVariableRecord &DVR) { … }
void Verifier::verifyCompileUnits() { … }
void Verifier::verifyDeoptimizeCallingConvs() { … }
void Verifier::verifyAttachedCallBundle(const CallBase &Call,
const OperandBundleUse &BU) { … }
void Verifier::verifyNoAliasScopeDecl() { … }
bool llvm::verifyFunction(const Function &f, raw_ostream *OS) { … }
bool llvm::verifyModule(const Module &M, raw_ostream *OS,
bool *BrokenDebugInfo) { … }
namespace {
struct VerifierLegacyPass : public FunctionPass { … };
}
template <typename... Tys> void TBAAVerifier::CheckFailed(Tys &&... Args) { … }
#define CheckTBAA(C, ...) …
TBAAVerifier::TBAABaseNodeSummary
TBAAVerifier::verifyTBAABaseNode(Instruction &I, const MDNode *BaseNode,
bool IsNewFormat) { … }
TBAAVerifier::TBAABaseNodeSummary
TBAAVerifier::verifyTBAABaseNodeImpl(Instruction &I, const MDNode *BaseNode,
bool IsNewFormat) { … }
static bool IsRootTBAANode(const MDNode *MD) { … }
static bool IsScalarTBAANodeImpl(const MDNode *MD,
SmallPtrSetImpl<const MDNode *> &Visited) { … }
bool TBAAVerifier::isValidScalarTBAANode(const MDNode *MD) { … }
MDNode *TBAAVerifier::getFieldNodeFromTBAABaseNode(Instruction &I,
const MDNode *BaseNode,
APInt &Offset,
bool IsNewFormat) { … }
static bool isNewFormatTBAATypeNode(llvm::MDNode *Type) { … }
bool TBAAVerifier::visitTBAAMetadata(Instruction &I, const MDNode *MD) { … }
char VerifierLegacyPass::ID = …;
INITIALIZE_PASS(…)
FunctionPass *llvm::createVerifierPass(bool FatalErrors) { … }
AnalysisKey VerifierAnalysis::Key;
VerifierAnalysis::Result VerifierAnalysis::run(Module &M,
ModuleAnalysisManager &) { … }
VerifierAnalysis::Result VerifierAnalysis::run(Function &F,
FunctionAnalysisManager &) { … }
PreservedAnalyses VerifierPass::run(Module &M, ModuleAnalysisManager &AM) { … }
PreservedAnalyses VerifierPass::run(Function &F, FunctionAnalysisManager &AM) { … }