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 | dd98c4d1859a318e7586f87031db44b215476020 (patch) | |
tree | 423ac5133693260c9dadc6830ef9e5f994fbc029 /lib | |
parent | e05678132345eb8a632362dbd320ee7d36226e67 (diff) | |
download | llvm-dd98c4d1859a318e7586f87031db44b215476020.tar.gz llvm-dd98c4d1859a318e7586f87031db44b215476020.tar.bz2 llvm-dd98c4d1859a318e7586f87031db44b215476020.tar.xz |
Add a few more lint checks.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100825 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Analysis/Lint.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/Analysis/Lint.cpp b/lib/Analysis/Lint.cpp index 19945179f4..db0a22fc38 100644 --- a/lib/Analysis/Lint.cpp +++ b/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... //===----------------------------------------------------------------------===// |