summaryrefslogtreecommitdiff
path: root/lib/VMCore/Verifier.cpp
diff options
context:
space:
mode:
authorNuno Lopes <nunoplopes@sapo.pt>2012-06-18 16:04:04 +0000
committerNuno Lopes <nunoplopes@sapo.pt>2012-06-18 16:04:04 +0000
commitfa7494306bc6fbe16cc82a67b93e762241b26777 (patch)
treebc87b64fbaa757a52d4a23c4558dcfd002d3085c /lib/VMCore/Verifier.cpp
parent96ef284da415cccd60cf5066929a4683dec5dd79 (diff)
downloadllvm-fa7494306bc6fbe16cc82a67b93e762241b26777.tar.gz
llvm-fa7494306bc6fbe16cc82a67b93e762241b26777.tar.bz2
llvm-fa7494306bc6fbe16cc82a67b93e762241b26777.tar.xz
add the 'alloc' metadata node to represent the size of offset of buffers pointed to by pointers.
This metadata can be attached to any instruction returning a pointer git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158660 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/Verifier.cpp')
-rw-r--r--lib/VMCore/Verifier.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp
index 477b81dc67..2ca4854d9a 100644
--- a/lib/VMCore/Verifier.cpp
+++ b/lib/VMCore/Verifier.cpp
@@ -1672,6 +1672,39 @@ void Verifier::visitInstruction(Instruction &I) {
}
}
+ if (MDNode *MD = I.getMetadata(LLVMContext::MD_alloc)) {
+ Assert1(I.getType()->isPointerTy(), "alloc requires a pointer result", &I);
+ Assert1(MD->getNumOperands() >= 1, "alloc takes at least one operand", &I);
+ Function *SizeFn = dyn_cast<Function>(MD->getOperand(0));
+ Function *OffsetFn = MD->getNumOperands() >= 2 ?
+ dyn_cast_or_null<Function>(MD->getOperand(1)) : 0;
+ Assert1(SizeFn, "first parameter of alloc must be a function", &I);
+ Assert1(MD->getNumOperands() == 1 || !MD->getOperand(1) || OffsetFn,
+ "second parameter of alloc must be either a function or null", &I);
+ Assert1(SizeFn->onlyReadsMemory(),
+ "size function must be readonly/readnone", &I);
+ Assert1(!OffsetFn || OffsetFn->onlyReadsMemory(),
+ "offset function must be readonly/readnone", &I);
+ Assert1(SizeFn->getReturnType()->isIntegerTy(),
+ "size function must return an integer", &I);
+ Assert1(!OffsetFn || OffsetFn->getReturnType()->isIntegerTy(),
+ "offset function must return an integer", &I);
+
+ FunctionType *SizeFnTy = SizeFn->getFunctionType();
+ FunctionType *OffsetFnTy = OffsetFn ? OffsetFn->getFunctionType() : 0;
+ Assert1(SizeFnTy->getNumParams() == MD->getNumOperands()-2,
+ "size function number of parameters mismatch", &I);
+ Assert1(!OffsetFnTy || OffsetFnTy->getNumParams() == MD->getNumOperands()-2,
+ "offset function number of parameters mismatch", &I);
+ for (unsigned i = 0, e = SizeFnTy->getNumParams(); i != e; ++i) {
+ Assert1(SizeFnTy->getParamType(i) == MD->getOperand(i+2)->getType(),
+ "size function parameter type mismatch", &I);
+ if (OffsetFnTy)
+ Assert1(OffsetFnTy->getParamType(i) == MD->getOperand(i+2)->getType(),
+ "offset function parameter type mismatch", &I);
+ }
+ }
+
MDNode *MD = I.getMetadata(LLVMContext::MD_range);
Assert1(!MD || isa<LoadInst>(I), "Ranges are only for loads!", &I);