summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/ValueManager.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-07-16 01:32:00 +0000
committerTed Kremenek <kremenek@apple.com>2009-07-16 01:32:00 +0000
commitf267a15c8db766bb16ce60e74b9227407cb479af (patch)
treefe2454323142fb0a30a9cac46908cbc66da1aa41 /clang/lib/Analysis/ValueManager.cpp
parent86085a57ebef8fe8759ead071a5e57dbd7114eec (diff)
downloadbcm5719-llvm-f267a15c8db766bb16ce60e74b9227407cb479af.tar.gz
bcm5719-llvm-f267a15c8db766bb16ce60e74b9227407cb479af.zip
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
Diffstat (limited to 'clang/lib/Analysis/ValueManager.cpp')
-rw-r--r--clang/lib/Analysis/ValueManager.cpp11
1 files changed, 11 insertions, 0 deletions
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<nonloc::ConcreteInt>(&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);
OpenPOWER on IntegriCloud