LLVM 22.0.0git
Verifier.cpp File Reference
#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/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.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/ProfileData/InstrProf.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/TimeProfiler.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include "llvm/IR/Metadata.def"
#include "llvm/IR/Attributes.inc"
#include "llvm/IR/VPIntrinsics.def"
#include "llvm/IR/ConstrainedOps.def"

Go to the source code of this file.

Classes

struct  llvm::VerifierSupport

Namespaces

namespace  llvm
 This is an optimization pass for GlobalISel generic memory operations.

Macros

#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS)
#define Check(C, ...)
 We know that cond should be true, if not print an error message.
#define CheckDI(C, ...)
 We know that a debug info condition should be true, if not print an error message.
#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS)
#define GET_ATTR_NAMES
#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME)
#define ATTRIBUTE_STRBOOL(ENUM_NAME, DISPLAY_NAME)
#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...)
#define INSTRUCTION(NAME, NARGS, ROUND_MODE, INTRINSIC)
#define CheckTBAA(C, ...)

Functions

static void forEachUser (const Value *User, SmallPtrSet< const Value *, 32 > &Visited, llvm::function_ref< bool(const Value *)> Callback)
static bool isType (const Metadata *MD)
static bool isScope (const Metadata *MD)
static bool isDINode (const Metadata *MD)
static bool hasConflictingReferenceFlags (unsigned Flags)
 Detect mutually exclusive flags.
static InstructiongetSuccPad (Instruction *Terminator)
static bool isTypeCongruent (Type *L, Type *R)
 Two types are "congruent" if they are identical, or if they are both pointer types with different pointee types and the same address space.
static AttrBuilder getParameterABIAttributes (LLVMContext &C, unsigned I, AttributeList Attrs)
static bool isContiguous (const ConstantRange &A, const ConstantRange &B)
static ValuegetParentPad (Value *EHPad)
static bool isConstantIntMetadataOperand (const Metadata *MD)
static DISubprogramgetSubprogram (Metadata *LocalScope)
 Carefully grab the subprogram from a local scope.
static bool IsRootTBAANode (const MDNode *MD)
static bool IsScalarTBAANodeImpl (const MDNode *MD, SmallPtrSetImpl< const MDNode * > &Visited)
static bool isNewFormatTBAATypeNode (llvm::MDNode *Type)

Variables

static cl::opt< boolVerifyNoAliasScopeDomination ("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"))

Macro Definition Documentation

◆ ATTRIBUTE_ENUM

#define ATTRIBUTE_ENUM ( ENUM_NAME,
DISPLAY_NAME )

◆ ATTRIBUTE_STRBOOL

#define ATTRIBUTE_STRBOOL ( ENUM_NAME,
DISPLAY_NAME )
Value:
if (A.getKindAsString() == #DISPLAY_NAME) { \
auto V = A.getValueAsString(); \
if (!(V.empty() || V == "true" || V == "false")) \
CheckFailed("invalid value for '" #DISPLAY_NAME "' attribute: " + V + \
""); \
}
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")

◆ BEGIN_REGISTER_VP_INTRINSIC

#define BEGIN_REGISTER_VP_INTRINSIC ( VPID,
... )
Value:
case Intrinsic::VPID:

◆ Check

#define Check ( C,
... )
Value:
do { \
if (!(C)) { \
CheckFailed(__VA_ARGS__); \
return; \
} \
} while (false)
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34

We know that cond should be true, if not print an error message.

Definition at line 668 of file Verifier.cpp.

◆ CheckDI

#define CheckDI ( C,
... )
Value:
do { \
if (!(C)) { \
DebugInfoCheckFailed(__VA_ARGS__); \
return; \
} \
} while (false)

We know that a debug info condition should be true, if not print an error message.

Definition at line 678 of file Verifier.cpp.

◆ CheckTBAA

#define CheckTBAA ( C,
... )
Value:
do { \
if (!(C)) { \
CheckFailed(__VA_ARGS__); \
return false; \
} \
} while (false)

Definition at line 7646 of file Verifier.cpp.

Referenced by llvm::TBAAVerifier::visitTBAAMetadata().

◆ GET_ATTR_NAMES

#define GET_ATTR_NAMES

◆ HANDLE_SPECIALIZED_MDNODE_LEAF [1/2]

#define HANDLE_SPECIALIZED_MDNODE_LEAF ( CLASS)
Value:
void visit##CLASS(const CLASS &N);
void visit(MachineFunction &MF, MachineBasicBlock &Start, std::function< void(MachineBasicBlock *)> op)
#define N

Definition at line 545 of file Verifier.cpp.

◆ HANDLE_SPECIALIZED_MDNODE_LEAF [2/2]

#define HANDLE_SPECIALIZED_MDNODE_LEAF ( CLASS)
Value:
case Metadata::CLASS##Kind: \
visit##CLASS(cast<CLASS>(MD)); \
break;
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565

Definition at line 545 of file Verifier.cpp.

◆ INSTRUCTION

#define INSTRUCTION ( NAME,
NARGS,
ROUND_MODE,
INTRINSIC )
Value:
case Intrinsic::INTRINSIC:

Function Documentation

◆ forEachUser()

◆ getParameterABIAttributes()

AttrBuilder getParameterABIAttributes ( LLVMContext & C,
unsigned I,
AttributeList Attrs )
static

Definition at line 4014 of file Verifier.cpp.

References llvm::CallingConv::C, I, and llvm::Attribute::isValid().

◆ getParentPad()

◆ getSubprogram()

DISubprogram * getSubprogram ( Metadata * LocalScope)
static

Carefully grab the subprogram from a local scope.

This carefully grabs the subprogram from a local scope, avoiding the built-in assertions that would typically fire.

Definition at line 6939 of file Verifier.cpp.

References assert(), llvm::dyn_cast(), getSubprogram(), and llvm::isa().

◆ getSuccPad()

Instruction * getSuccPad ( Instruction * Terminator)
static

◆ hasConflictingReferenceFlags()

bool hasConflictingReferenceFlags ( unsigned Flags)
static

Detect mutually exclusive flags.

Definition at line 1361 of file Verifier.cpp.

◆ isConstantIntMetadataOperand()

bool isConstantIntMetadataOperand ( const Metadata * MD)
inlinestatic

Definition at line 5270 of file Verifier.cpp.

References llvm::dyn_cast(), and llvm::isa().

◆ isContiguous()

bool isContiguous ( const ConstantRange & A,
const ConstantRange & B )
static

Definition at line 4330 of file Verifier.cpp.

References A(), and B().

◆ isDINode()

bool isDINode ( const Metadata * MD)
static

Definition at line 1160 of file Verifier.cpp.

References llvm::isa().

◆ isNewFormatTBAATypeNode()

bool isNewFormatTBAATypeNode ( llvm::MDNode * Type)
static

Definition at line 7868 of file Verifier.cpp.

References llvm::isa_and_nonnull().

Referenced by llvm::TBAAVerifier::visitTBAAMetadata().

◆ IsRootTBAANode()

bool IsRootTBAANode ( const MDNode * MD)
static

◆ IsScalarTBAANodeImpl()

◆ isScope()

bool isScope ( const Metadata * MD)
static

Definition at line 1159 of file Verifier.cpp.

References llvm::isa().

◆ isType()

bool isType ( const Metadata * MD)
static

Definition at line 1158 of file Verifier.cpp.

References llvm::isa().

◆ isTypeCongruent()

bool isTypeCongruent ( Type * L,
Type * R )
static

Two types are "congruent" if they are identical, or if they are both pointer types with different pointee types and the same address space.

Definition at line 4004 of file Verifier.cpp.

References llvm::dyn_cast().

Variable Documentation

◆ VerifyNoAliasScopeDomination

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")) ( "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