diff options
-rw-r--r-- | llvm/include/llvm/IR/IntrinsicInst.h | 48 | ||||
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 39 |
2 files changed, 27 insertions, 60 deletions
diff --git a/llvm/include/llvm/IR/IntrinsicInst.h b/llvm/include/llvm/IR/IntrinsicInst.h index f58ee217a7c..eccb4080932 100644 --- a/llvm/include/llvm/IR/IntrinsicInst.h +++ b/llvm/include/llvm/IR/IntrinsicInst.h @@ -71,6 +71,22 @@ namespace llvm { /// variable's value or its address. Value *getVariableLocation(bool AllowNullOp = true) const; + DILocalVariable *getVariable() const { + return cast<DILocalVariable>(getRawVariable()); + } + + DIExpression *getExpression() const { + return cast<DIExpression>(getRawExpression()); + } + + Metadata *getRawVariable() const { + return cast<MetadataAsValue>(getArgOperand(1))->getMetadata(); + } + + Metadata *getRawExpression() const { + return cast<MetadataAsValue>(getArgOperand(2))->getMetadata(); + } + // Methods for support type inquiry through isa, cast, and dyn_cast: static bool classof(const IntrinsicInst *I) { switch (I->getIntrinsicID()) { @@ -90,22 +106,6 @@ namespace llvm { public: Value *getAddress() const { return getVariableLocation(); } - DILocalVariable *getVariable() const { - return cast<DILocalVariable>(getRawVariable()); - } - - DIExpression *getExpression() const { - return cast<DIExpression>(getRawExpression()); - } - - Metadata *getRawVariable() const { - return cast<MetadataAsValue>(getArgOperand(1))->getMetadata(); - } - - Metadata *getRawExpression() const { - return cast<MetadataAsValue>(getArgOperand(2))->getMetadata(); - } - // Methods for support type inquiry through isa, cast, and dyn_cast: static bool classof(const IntrinsicInst *I) { return I->getIntrinsicID() == Intrinsic::dbg_declare; @@ -122,22 +122,6 @@ namespace llvm { return getVariableLocation(/* AllowNullOp = */ false); } - DILocalVariable *getVariable() const { - return cast<DILocalVariable>(getRawVariable()); - } - - DIExpression *getExpression() const { - return cast<DIExpression>(getRawExpression()); - } - - Metadata *getRawVariable() const { - return cast<MetadataAsValue>(getArgOperand(1))->getMetadata(); - } - - Metadata *getRawExpression() const { - return cast<MetadataAsValue>(getArgOperand(2))->getMetadata(); - } - // Methods for support type inquiry through isa, cast, and dyn_cast: static bool classof(const IntrinsicInst *I) { return I->getIntrinsicID() == Intrinsic::dbg_value; diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index e62daeeb539..c875e302188 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -468,8 +468,7 @@ private: void visitUserOp2(Instruction &I) { visitUserOp1(I); } void visitIntrinsicCallSite(Intrinsic::ID ID, CallSite CS); void visitConstrainedFPIntrinsic(ConstrainedFPIntrinsic &FPI); - template <class DbgIntrinsicTy> - void visitDbgIntrinsic(StringRef Kind, DbgIntrinsicTy &DII); + void visitDbgIntrinsic(StringRef Kind, DbgInfoIntrinsic &DII); void visitAtomicCmpXchgInst(AtomicCmpXchgInst &CXI); void visitAtomicRMWInst(AtomicRMWInst &RMWI); void visitFenceInst(FenceInst &FI); @@ -4000,10 +3999,10 @@ void Verifier::visitIntrinsicCallSite(Intrinsic::ID ID, CallSite CS) { case Intrinsic::dbg_declare: // llvm.dbg.declare Assert(isa<MetadataAsValue>(CS.getArgOperand(0)), "invalid llvm.dbg.declare intrinsic call 1", CS); - visitDbgIntrinsic("declare", cast<DbgDeclareInst>(*CS.getInstruction())); + visitDbgIntrinsic("declare", cast<DbgInfoIntrinsic>(*CS.getInstruction())); break; case Intrinsic::dbg_value: // llvm.dbg.value - visitDbgIntrinsic("value", cast<DbgValueInst>(*CS.getInstruction())); + visitDbgIntrinsic("value", cast<DbgInfoIntrinsic>(*CS.getInstruction())); break; case Intrinsic::memcpy: case Intrinsic::memmove: @@ -4455,8 +4454,7 @@ void Verifier::visitConstrainedFPIntrinsic(ConstrainedFPIntrinsic &FPI) { "invalid exception behavior argument", &FPI); } -template <class DbgIntrinsicTy> -void Verifier::visitDbgIntrinsic(StringRef Kind, DbgIntrinsicTy &DII) { +void Verifier::visitDbgIntrinsic(StringRef Kind, DbgInfoIntrinsic &DII) { auto *MD = cast<MetadataAsValue>(DII.getArgOperand(0))->getMetadata(); AssertDI(isa<ValueAsMetadata>(MD) || (isa<MDNode>(MD) && !cast<MDNode>(MD)->getNumOperands()), @@ -4519,16 +4517,8 @@ static uint64_t getVariableSize(const DIVariable &V) { } void Verifier::verifyFragmentExpression(const DbgInfoIntrinsic &I) { - DILocalVariable *V; - DIExpression *E; - if (auto *DVI = dyn_cast<DbgValueInst>(&I)) { - V = dyn_cast_or_null<DILocalVariable>(DVI->getRawVariable()); - E = dyn_cast_or_null<DIExpression>(DVI->getRawExpression()); - } else { - auto *DDI = cast<DbgDeclareInst>(&I); - V = dyn_cast_or_null<DILocalVariable>(DDI->getRawVariable()); - E = dyn_cast_or_null<DIExpression>(DDI->getRawExpression()); - } + DILocalVariable *V = dyn_cast_or_null<DILocalVariable>(I.getRawVariable()); + DIExpression *E = dyn_cast_or_null<DIExpression>(I.getRawExpression()); // We don't know whether this intrinsic verified correctly. if (!V || !E || !E->isValid()) @@ -4575,18 +4565,11 @@ void Verifier::verifyFnArgs(const DbgInfoIntrinsic &I) { if (!HasDebugInfo) return; - DILocalVariable *Var; - if (auto *DV = dyn_cast<DbgValueInst>(&I)) { - // For performance reasons only check non-inlined ones. - if (DV->getDebugLoc()->getInlinedAt()) - return; - Var = DV->getVariable(); - } else { - auto *DD = cast<DbgDeclareInst>(&I); - if (DD->getDebugLoc()->getInlinedAt()) - return; - Var = DD->getVariable(); - } + // For performance reasons only check non-inlined ones. + if (I.getDebugLoc()->getInlinedAt()) + return; + + DILocalVariable *Var = I.getVariable(); AssertDI(Var, "dbg intrinsic without variable"); unsigned ArgNo = Var->getArg(); |