aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-02-06 17:32:17 +0000
committerTed Kremenek <kremenek@apple.com>2008-02-06 17:32:17 +0000
commitfeb01f6962d393da70185cb7dbcf5f7d021c1097 (patch)
treea69b1fbbc69a816ff7f0381f7f933bc034abd837
parent87a98759d683d9ed23e09744207a4428c4ed5ace (diff)
Added assumption logic for symbolic non-lvalues when used in conditions such as
"if(x)". On the true branch we know the value is != 0, and on the false branch we know it is 0. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46814 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--Analysis/GRConstants.cpp13
-rw-r--r--Analysis/RValues.cpp10
-rw-r--r--Analysis/RValues.h16
3 files changed, 34 insertions, 5 deletions
diff --git a/Analysis/GRConstants.cpp b/Analysis/GRConstants.cpp
index bd5cb0689b..a9371ee4e6 100644
--- a/Analysis/GRConstants.cpp
+++ b/Analysis/GRConstants.cpp
@@ -898,6 +898,19 @@ GRConstants::StateTy GRConstants::Assume(StateTy St, NonLValue Cond,
assert (false && "'Assume' not implemented for this NonLValue.");
return St;
+
+ case nonlval::SymbolValKind: {
+ lval::SymbolVal& SV = cast<lval::SymbolVal>(Cond);
+ SymbolID sym = SV.getSymbol();
+
+ if (Assumption)
+ return AssumeSymNE(St, sym, ValMgr.getValue(0, SymMgr.getType(sym)),
+ isFeasible);
+ else
+ return AssumeSymEQ(St, sym, ValMgr.getValue(0, SymMgr.getType(sym)),
+ isFeasible);
+ }
+
case nonlval::SymIntConstraintValKind:
return
AssumeSymInt(St, Assumption,
diff --git a/Analysis/RValues.cpp b/Analysis/RValues.cpp
index fba59b42ac..df6db08db2 100644
--- a/Analysis/RValues.cpp
+++ b/Analysis/RValues.cpp
@@ -34,6 +34,16 @@ SymbolID SymbolManager::getSymbol(ParmVarDecl* D) {
return X;
}
+QualType SymbolData::getType() const {
+ switch (getKind()) {
+ default:
+ assert (false && "getType() not implemented for this symbol.");
+
+ case ParmKind:
+ return static_cast<ParmVarDecl*>(getPtr())->getType();
+ }
+}
+
SymbolManager::SymbolManager() {}
SymbolManager::~SymbolManager() {}
diff --git a/Analysis/RValues.h b/Analysis/RValues.h
index 9bb97caf40..bf3fe0dec9 100644
--- a/Analysis/RValues.h
+++ b/Analysis/RValues.h
@@ -71,7 +71,9 @@ public:
inline Kind getKind() const { return (Kind) (Data & Mask); }
inline void* getPtr() const { return reinterpret_cast<void*>(Data & ~Mask); }
- inline bool operator==(const SymbolData& R) const { return Data == R.Data; }
+ inline bool operator==(const SymbolData& R) const { return Data == R.Data; }
+
+ QualType getType() const;
};
@@ -114,12 +116,16 @@ public:
SymbolManager();
~SymbolManager();
- SymbolData getSymbolData(SymbolID id) const {
- assert (id < SymbolToData.size());
- return SymbolToData[id];
+ SymbolID getSymbol(ParmVarDecl* D);
+
+ inline SymbolData getSymbolData(SymbolID ID) const {
+ assert (ID < SymbolToData.size());
+ return SymbolToData[ID];
}
- SymbolID getSymbol(ParmVarDecl* D);
+ inline QualType getType(SymbolID ID) const {
+ return getSymbolData(ID).getType();
+ }
};