diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-02-06 17:32:17 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-02-06 17:32:17 +0000 |
commit | feb01f6962d393da70185cb7dbcf5f7d021c1097 (patch) | |
tree | a69b1fbbc69a816ff7f0381f7f933bc034abd837 | |
parent | 87a98759d683d9ed23e09744207a4428c4ed5ace (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.cpp | 13 | ||||
-rw-r--r-- | Analysis/RValues.cpp | 10 | ||||
-rw-r--r-- | Analysis/RValues.h | 16 |
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(); + } }; |