diff options
| author | Dan Gohman <gohman@apple.com> | 2010-04-08 23:05:57 +0000 |
|---|---|---|
| committer | Dan Gohman <gohman@apple.com> | 2010-04-08 23:05:57 +0000 |
| commit | 7808d490d31564b569d955657d4770b2179a116e (patch) | |
| tree | 20076b4a73eaae328e7717db6db135b880e57f5a /llvm/lib/Analysis | |
| parent | 4ce1fb14488dc9082ca9bff51cd95b186fbf9123 (diff) | |
| download | bcm5719-llvm-7808d490d31564b569d955657d4770b2179a116e.tar.gz bcm5719-llvm-7808d490d31564b569d955657d4770b2179a116e.zip | |
Add a few more lint checks.
llvm-svn: 100825
Diffstat (limited to 'llvm/lib/Analysis')
| -rw-r--r-- | llvm/lib/Analysis/Lint.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/Lint.cpp b/llvm/lib/Analysis/Lint.cpp index 19945179f4d..db0a22fc381 100644 --- a/llvm/lib/Analysis/Lint.cpp +++ b/llvm/lib/Analysis/Lint.cpp @@ -63,6 +63,9 @@ namespace { void visitReturnInst(ReturnInst &I); void visitLoadInst(LoadInst &I); void visitStoreInst(StoreInst &I); + void visitLShr(BinaryOperator &I); + void visitAShr(BinaryOperator &I); + void visitShl(BinaryOperator &I); void visitSDiv(BinaryOperator &I); void visitUDiv(BinaryOperator &I); void visitSRem(BinaryOperator &I); @@ -70,6 +73,8 @@ namespace { void visitAllocaInst(AllocaInst &I); void visitVAArgInst(VAArgInst &I); void visitIndirectBrInst(IndirectBrInst &I); + void visitExtractElementInst(ExtractElementInst &I); + void visitInsertElementInst(InsertElementInst &I); public: Module *Mod; @@ -295,6 +300,27 @@ void Lint::visitStoreInst(StoreInst &I) { I.getOperand(0)->getType()); } +void Lint::visitLShr(BinaryOperator &I) { + if (ConstantInt *CI = + dyn_cast<ConstantInt>(I.getOperand(1)->stripPointerCasts())) + Assert1(CI->getValue().ult(cast<IntegerType>(I.getType())->getBitWidth()), + "Shift count out of range", &I); +} + +void Lint::visitAShr(BinaryOperator &I) { + if (ConstantInt *CI = + dyn_cast<ConstantInt>(I.getOperand(1)->stripPointerCasts())) + Assert1(CI->getValue().ult(cast<IntegerType>(I.getType())->getBitWidth()), + "Shift count out of range", &I); +} + +void Lint::visitShl(BinaryOperator &I) { + if (ConstantInt *CI = + dyn_cast<ConstantInt>(I.getOperand(1)->stripPointerCasts())) + Assert1(CI->getValue().ult(cast<IntegerType>(I.getType())->getBitWidth()), + "Shift count out of range", &I); +} + static bool isZero(Value *V, TargetData *TD) { unsigned BitWidth = cast<IntegerType>(V->getType())->getBitWidth(); APInt Mask = APInt::getAllOnesValue(BitWidth), @@ -334,6 +360,20 @@ void Lint::visitIndirectBrInst(IndirectBrInst &I) { visitMemoryReference(I, I.getAddress(), 0, 0); } +void Lint::visitExtractElementInst(ExtractElementInst &I) { + if (ConstantInt *CI = + dyn_cast<ConstantInt>(I.getIndexOperand()->stripPointerCasts())) + Assert1(CI->getValue().ult(I.getVectorOperandType()->getNumElements()), + "extractelement index out of range", &I); +} + +void Lint::visitInsertElementInst(InsertElementInst &I) { + if (ConstantInt *CI = + dyn_cast<ConstantInt>(I.getOperand(2)->stripPointerCasts())) + Assert1(CI->getValue().ult(I.getType()->getNumElements()), + "insertelement index out of range", &I); +} + //===----------------------------------------------------------------------===// // Implement the public interfaces to this file... //===----------------------------------------------------------------------===// |

