diff options
-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(); + } }; |