aboutsummaryrefslogtreecommitdiffstats
path: root/lib/VMCore/Verifier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/VMCore/Verifier.cpp')
-rw-r--r--lib/VMCore/Verifier.cpp41
1 files changed, 33 insertions, 8 deletions
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp
index 4431c81d29..05b8514d9d 100644
--- a/lib/VMCore/Verifier.cpp
+++ b/lib/VMCore/Verifier.cpp
@@ -743,7 +743,7 @@ void Verifier::visitICmpInst(ICmpInst& IC) {
Assert1(Op0Ty == Op1Ty,
"Both operands to ICmp instruction are not of the same type!", &IC);
// Check that the operands are the right type
- Assert1(Op0Ty->isIntegral() || Op0Ty->getTypeID() == Type::PointerTyID,
+ Assert1(Op0Ty->isIntegral() || isa<PointerType>(Op0Ty),
"Invalid operand types for ICmp instruction", &IC);
visitInstruction(IC);
}
@@ -1005,7 +1005,7 @@ void Verifier::VerifyIntrinsicPrototype(Function *F, ...) {
else
Ty = FTy->getParamType(ArgNo-1);
- if (Ty->getTypeID() != TypeID) {
+ if (TypeID != Ty->getTypeID()) {
if (ArgNo == 0)
CheckFailed("Intrinsic prototype has incorrect result type!", F);
else
@@ -1013,18 +1013,43 @@ void Verifier::VerifyIntrinsicPrototype(Function *F, ...) {
break;
}
- // If this is a packed argument, verify the number and type of elements.
- if (TypeID == Type::PackedTyID) {
+ if (TypeID == Type::IntegerTyID) {
+ unsigned GotBits = (unsigned) va_arg(VA, int);
+ unsigned ExpectBits = cast<IntegerType>(Ty)->getBitWidth();
+ if (GotBits != ExpectBits) {
+ std::string bitmsg = " Expecting " + utostr(ExpectBits) + " but got " +
+ utostr(GotBits) + " bits.";
+ if (ArgNo == 0)
+ CheckFailed("Intrinsic prototype has incorrect integer result width!"
+ + bitmsg, F);
+ else
+ CheckFailed("Intrinsic parameter #" + utostr(ArgNo-1) + " has "
+ "incorrect integer width!" + bitmsg, F);
+ break;
+ }
+ } else if (TypeID == Type::PackedTyID) {
+ // If this is a packed argument, verify the number and type of elements.
const PackedType *PTy = cast<PackedType>(Ty);
- if (va_arg(VA, int) != PTy->getElementType()->getTypeID()) {
- CheckFailed("Intrinsic prototype has incorrect vector element type!",F);
+ int ElemTy = va_arg(VA, int);
+ if (ElemTy != PTy->getElementType()->getTypeID()) {
+ CheckFailed("Intrinsic prototype has incorrect vector element type!",
+ F);
break;
}
-
+ if (ElemTy == Type::IntegerTyID) {
+ unsigned NumBits = (unsigned)va_arg(VA, int);
+ unsigned ExpectedBits =
+ cast<IntegerType>(PTy->getElementType())->getBitWidth();
+ if (NumBits != ExpectedBits) {
+ CheckFailed("Intrinsic prototype has incorrect vector element type!",
+ F);
+ break;
+ }
+ }
if ((unsigned)va_arg(VA, int) != PTy->getNumElements()) {
CheckFailed("Intrinsic prototype has incorrect number of "
"vector elements!",F);
- break;
+ break;
}
}
}