mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
Add a hack to check for a subset of true dominance properties
llvm-svn: 2947
This commit is contained in:
parent
b121676038
commit
9b1f5682b5
@ -6,9 +6,6 @@
|
|||||||
// Note that this does not provide full 'java style' security and verifications,
|
// Note that this does not provide full 'java style' security and verifications,
|
||||||
// instead it just tries to ensure that code is well formed.
|
// instead it just tries to ensure that code is well formed.
|
||||||
//
|
//
|
||||||
// . There are no duplicated names in a symbol table... ie there !exist a val
|
|
||||||
// with the same name as something in the symbol table, but with a different
|
|
||||||
// address as what is in the symbol table...
|
|
||||||
// * Both of a binary operator's parameters are the same type
|
// * Both of a binary operator's parameters are the same type
|
||||||
// * Verify that the indices of mem access instructions match other operands
|
// * Verify that the indices of mem access instructions match other operands
|
||||||
// . Verify that arithmetic and other things are only performed on first class
|
// . Verify that arithmetic and other things are only performed on first class
|
||||||
@ -194,6 +191,7 @@ void Verifier::visitTerminatorInst(TerminatorInst &I) {
|
|||||||
// Ensure that terminators only exist at the end of the basic block.
|
// Ensure that terminators only exist at the end of the basic block.
|
||||||
Assert1(&I == I.getParent()->getTerminator(),
|
Assert1(&I == I.getParent()->getTerminator(),
|
||||||
"Terminator found in the middle of a basic block!", I.getParent());
|
"Terminator found in the middle of a basic block!", I.getParent());
|
||||||
|
visitInstruction(I);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Verifier::visitReturnInst(ReturnInst &RI) {
|
void Verifier::visitReturnInst(ReturnInst &RI) {
|
||||||
@ -294,6 +292,8 @@ void Verifier::visitCallInst(CallInst &CI) {
|
|||||||
Assert2(CI.getOperand(i+1)->getType() == FTy->getParamType(i),
|
Assert2(CI.getOperand(i+1)->getType() == FTy->getParamType(i),
|
||||||
"Call parameter type does not match function signature!",
|
"Call parameter type does not match function signature!",
|
||||||
CI.getOperand(i+1), FTy->getParamType(i));
|
CI.getOperand(i+1), FTy->getParamType(i));
|
||||||
|
|
||||||
|
visitInstruction(CI);
|
||||||
}
|
}
|
||||||
|
|
||||||
// visitBinaryOperator - Check that both arguments to the binary operator are
|
// visitBinaryOperator - Check that both arguments to the binary operator are
|
||||||
@ -335,7 +335,7 @@ void Verifier::visitStoreInst(StoreInst &SI) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// verifyInstruction - Verify that a non-terminator instruction is well formed.
|
// verifyInstruction - Verify that an instruction is well formed.
|
||||||
//
|
//
|
||||||
void Verifier::visitInstruction(Instruction &I) {
|
void Verifier::visitInstruction(Instruction &I) {
|
||||||
Assert1(I.getParent(), "Instruction not embedded in basic block!", &I);
|
Assert1(I.getParent(), "Instruction not embedded in basic block!", &I);
|
||||||
@ -360,8 +360,26 @@ void Verifier::visitInstruction(Instruction &I) {
|
|||||||
"Only PHI nodes may reference their own value!", &I);
|
"Only PHI nodes may reference their own value!", &I);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check that void typed values don't have names
|
||||||
Assert1(I.getType() != Type::VoidTy || !I.hasName(),
|
Assert1(I.getType() != Type::VoidTy || !I.hasName(),
|
||||||
"Instruction has a name, but provides a void value!", &I);
|
"Instruction has a name, but provides a void value!", &I);
|
||||||
|
|
||||||
|
// Check that a definition dominates all of its uses.
|
||||||
|
// FIXME: This should use dominator set information, instead of this local
|
||||||
|
// hack that we have now.
|
||||||
|
//
|
||||||
|
for (User::use_iterator UI = I.use_begin(), UE = I.use_end();
|
||||||
|
UI != UE; ++UI) {
|
||||||
|
Instruction *I2 = cast<Instruction>(*UI);
|
||||||
|
// Same basic block?
|
||||||
|
if (I.getParent() == I2->getParent() && !isa<PHINode>(I2)) {
|
||||||
|
// Make sure the instruction is not before the current instruction...
|
||||||
|
for (Instruction *Test = I.getPrev(); Test != 0; Test = Test->getPrev())
|
||||||
|
Assert2(Test != I2, "Definition of value does not dominate a use!",
|
||||||
|
&I, I2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user