[llvm] r223275 - Strength Verifier checks around the types involved in a statepoint
Philip Reames
listmail at philipreames.com
Wed Dec 3 14:23:24 PST 2014
Author: reames
Date: Wed Dec 3 16:23:24 2014
New Revision: 223275
URL: http://llvm.org/viewvc/llvm-project?rev=223275&view=rev
Log:
Strength Verifier checks around the types involved in a statepoint
Add checks that the types in a gc.statepoint sequence match the wrapper callee and that relocating a pointer doesn't change it's type.
Modified:
llvm/trunk/lib/IR/Verifier.cpp
Modified: llvm/trunk/lib/IR/Verifier.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=223275&r1=223274&r2=223275&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Verifier.cpp (original)
+++ llvm/trunk/lib/IR/Verifier.cpp Wed Dec 3 16:23:24 2014
@@ -2567,6 +2567,7 @@ void Verifier::visitIntrinsicFunctionCal
Assert2(PT && PT->getElementType()->isFunctionTy(),
"gc.statepoint callee must be of function pointer type",
&CI, Target);
+ FunctionType *TargetFuncType = cast<FunctionType>(PT->getElementType());
const Value *NumCallArgsV = CI.getArgOperand(1);
Assert1(isa<ConstantInt>(NumCallArgsV),
@@ -2582,9 +2583,15 @@ void Verifier::visitIntrinsicFunctionCal
cast<ConstantInt>(Unused)->isNullValue(),
"gc.statepoint parameter #3 must be zero", &CI);
- // TODO: Verify that the types of the call parameter arguments match
- // the type of the callee.
-
+ // Verify that the types of the call parameter arguments match
+ // the type of the wrapped callee.
+ for (int i = 0; i < NumCallArgs; i++) {
+ Type *ParamType = TargetFuncType->getParamType(i);
+ Type *ArgType = CI.getArgOperand(3+i)->getType();
+ Assert1(ArgType == ParamType,
+ "gc.statepoint call argument does not match wrapped "
+ "function type", &CI);
+ }
const int EndCallArgsInx = 2+NumCallArgs;
const Value *NumDeoptArgsV = CI.getArgOperand(EndCallArgsInx+1);
Assert1(isa<ConstantInt>(NumDeoptArgsV),
@@ -2639,7 +2646,14 @@ void Verifier::visitIntrinsicFunctionCal
StatepointFn->getIntrinsicID() == Intrinsic::experimental_gc_statepoint,
"token must be from a statepoint", &CI, CI.getArgOperand(0));
- //TODO: assert that result type matches wrapped callee
+ // Assert that result type matches wrapped callee.
+ const Value *Target = StatepointCS.getArgument(0);
+ const PointerType *PT = cast<PointerType>(Target->getType());
+ const FunctionType *TargetFuncType =
+ cast<FunctionType>(PT->getElementType());
+ Assert1(CI.getType() == TargetFuncType->getReturnType(),
+ "gc.result result type does not match wrapped callee",
+ &CI);
break;
}
case Intrinsic::experimental_gc_relocate: {
@@ -2668,8 +2682,11 @@ void Verifier::visitIntrinsicFunctionCal
DerivedIndex < (int)StatepointCS.arg_size(),
"index out of bounds", &CI);
- // TODO: assert that the result type matches the type of the
- // relocated pointer
+ // Assert that the result type matches the type of the relocated pointer
+ GCRelocateOperands Operands(&CI);
+ Assert1(Operands.derivedPtr()->getType() == CI.getType(),
+ "gc.relocate: relocating a pointer shouldn't change it's type",
+ &CI);
break;
}
};
More information about the llvm-commits
mailing list