return false;
}
};
+}
- char PreVerifier::ID = 0;
- RegisterPass<PreVerifier> PreVer("preverify", "Preliminary module verification");
- const PassInfo *PreVerifyID = PreVer.getPassInfo();
+char PreVerifier::ID = 0;
+static RegisterPass<PreVerifier>
+PreVer("preverify", "Preliminary module verification");
+static const PassInfo *const PreVerifyID = &PreVer;
+namespace {
struct VISIBILITY_HIDDEN
Verifier : public FunctionPass, InstVisitor<Verifier> {
static char ID; // Pass ID, replacement for typeid
Broken = true;
}
};
-
- char Verifier::ID = 0;
- RegisterPass<Verifier> X("verify", "Module Verifier");
} // End anonymous namespace
+char Verifier::ID = 0;
+static RegisterPass<Verifier> X("verify", "Module Verifier");
// Assert - We know that cond should be true, if not print an error message.
#define Assert(C, M) \
Assert1(GA.hasExternalLinkage() || GA.hasInternalLinkage() ||
GA.hasWeakLinkage(),
"Alias should have external or external weak linkage!", &GA);
+ Assert1(GA.getAliasee(),
+ "Aliasee cannot be NULL!", &GA);
Assert1(GA.getType() == GA.getAliasee()->getType(),
"Alias and aliasee types should match!", &GA);
-
+
if (!isa<GlobalValue>(GA.getAliasee())) {
const ConstantExpr *CE = dyn_cast<ConstantExpr>(GA.getAliasee());
Assert1(CE && CE->getOpcode() == Instruction::BitCast &&
// Ensure that basic blocks have terminators!
Assert1(BB.getTerminator(), "Basic Block does not have terminator!", &BB);
- // Ensure that the BB doesn't point out of its Function for unwinding.
- Assert2(!BB.getUnwindDest() ||
- BB.getUnwindDest()->getParent() == BB.getParent(),
- "Basic Block unwinds to block in different function!",
- &BB, BB.getUnwindDest());
-
// Check constraints that this basic block imposes on all of the PHI nodes in
// it.
if (isa<PHINode>(BB.front())) {
void Verifier::visitReturnInst(ReturnInst &RI) {
Function *F = RI.getParent()->getParent();
unsigned N = RI.getNumOperands();
- if (N == 0)
- Assert2(F->getReturnType() == Type::VoidTy,
+ if (F->getReturnType() == Type::VoidTy)
+ Assert2(N == 0,
"Found return instr that returns void in Function of non-void "
"return type!", &RI, F->getReturnType());
else if (const StructType *STy = dyn_cast<StructType>(F->getReturnType())) {
- for (unsigned i = 0; i < N; i++)
+ Assert2(STy->getNumElements() == N,
+ "Incorrect number of return values in ret instruction!",
+ &RI, F->getReturnType());
+ for (unsigned i = 0; i != N; ++i)
Assert2(STy->getElementType(i) == RI.getOperand(i)->getType(),
"Function return type does not match operand "
"type of return inst!", &RI, F->getReturnType());
- }
- else if (N == 1)
- Assert2(F->getReturnType() == RI.getOperand(0)->getType(),
+ } else {
+ Assert2(N == 1 && F->getReturnType() == RI.getOperand(0)->getType(),
"Function return type does not match operand "
"type of return inst!", &RI, F->getReturnType());
- else
- Assert1(0, "Invalid return type!", &RI);
+ }
// Check to make sure that the return value has necessary properties for
// terminators...
SmallVector<Value*, 16> Idxs(GEP.idx_begin(), GEP.idx_end());
const Type *ElTy =
GetElementPtrInst::getIndexedType(GEP.getOperand(0)->getType(),
- Idxs.begin(), Idxs.end(), true);
+ Idxs.begin(), Idxs.end());
Assert1(ElTy, "Invalid indices for GEP pointer type!", &GEP);
Assert2(isa<PointerType>(GEP.getType()) &&
cast<PointerType>(GEP.getType())->getElementType() == ElTy,
}
void Verifier::visitGetResultInst(GetResultInst &GRI) {
- Assert1(GRI.isValidOperands(GRI.getAggregateValue(), GRI.getIndex()),
+ Assert1(GetResultInst::isValidOperands(GRI.getAggregateValue(),
+ GRI.getIndex()),
"Invalid GetResultInst operands!", &GRI);
+ Assert1(isa<CallInst>(GRI.getAggregateValue()) ||
+ isa<InvokeInst>(GRI.getAggregateValue()) ||
+ isa<UndefValue>(GRI.getAggregateValue()),
+ "GetResultInst operand must be a call/invoke/undef!", &GRI);
+
visitInstruction(GRI);
}
"Intrinsic parameter #1 is not i8**.", &CI);
Assert1(CI.getOperand(2)->getType() == PtrTy,
"Intrinsic parameter #2 is not i8*.", &CI);
- Assert1(isa<AllocaInst>(
- IntrinsicInst::StripPointerCasts(CI.getOperand(1))),
+ Assert1(isa<AllocaInst>(CI.getOperand(1)->stripPointerCasts()),
"llvm.gcroot parameter #1 must be an alloca.", &CI);
Assert1(isa<Constant>(CI.getOperand(2)),
"llvm.gcroot parameter #2 must be a constant.", &CI);
&CI);
} break;
case Intrinsic::init_trampoline:
- Assert1(isa<Function>(IntrinsicInst::StripPointerCasts(CI.getOperand(2))),
+ Assert1(isa<Function>(CI.getOperand(2)->stripPointerCasts()),
"llvm.init_trampoline parameter #2 must resolve to a function.",
&CI);
break;