From f267a15c8db766bb16ce60e74b9227407cb479af Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Thu, 16 Jul 2009 01:32:00 +0000 Subject: Two changes: (1) Moved the SValuator object from GRExprEngine to ValueManager. This allows ValueManager to use the SValuator when creating SVals. (2) Added ValueManager::makeArrayIndex() and ValueManager::convertToArrayIndex(), two SVal creation methods that will help RegionStoreManager always have a consistent set of SVals with the same integer size and type when reasoning about array indices. llvm-svn: 75882 --- clang/lib/Analysis/ValueManager.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'clang/lib/Analysis/ValueManager.cpp') diff --git a/clang/lib/Analysis/ValueManager.cpp b/clang/lib/Analysis/ValueManager.cpp index c9e24223df1..62d8b0093b2 100644 --- a/clang/lib/Analysis/ValueManager.cpp +++ b/clang/lib/Analysis/ValueManager.cpp @@ -55,6 +55,17 @@ NonLoc ValueManager::makeNonLoc(const SymExpr *lhs, BinaryOperator::Opcode op, } +SVal ValueManager::convertToArrayIndex(SVal V) { + // Common case: we have an appropriately sized integer. + if (nonloc::ConcreteInt* CI = dyn_cast(&V)) { + const llvm::APSInt& I = CI->getValue(); + if (I.getBitWidth() == ArrayIndexWidth && I.isSigned()) + return V; + } + + return SVator->EvalCast(V, ArrayIndexTy); +} + SVal ValueManager::getRegionValueSymbolVal(const MemRegion* R, QualType T) { SymbolRef sym = SymMgr.getRegionValueSymbol(R, T); -- cgit v1.2.3