diff options
-rw-r--r-- | Analysis/GRConstants.cpp | 6 | ||||
-rw-r--r-- | Analysis/RValues.cpp | 10 | ||||
-rw-r--r-- | Analysis/RValues.h | 5 |
3 files changed, 21 insertions, 0 deletions
diff --git a/Analysis/GRConstants.cpp b/Analysis/GRConstants.cpp index 895f0e1025..cc999b9349 100644 --- a/Analysis/GRConstants.cpp +++ b/Analysis/GRConstants.cpp @@ -561,6 +561,12 @@ void GRConstants::VisitUnaryOperator(UnaryOperator* U, break; } + case UnaryOperator::Not: { + const NonLValue& R1 = cast<NonLValue>(GetValue(St, U->getSubExpr())); + Nodify(Dst, U, N1, SetValue(St, U, R1.BitwiseComplement(ValMgr))); + break; + } + case UnaryOperator::AddrOf: { const LValue& L1 = GetLValue(St, U->getSubExpr()); Nodify(Dst, U, N1, SetValue(St, U, L1)); diff --git a/Analysis/RValues.cpp b/Analysis/RValues.cpp index f41051ed57..2854ee6414 100644 --- a/Analysis/RValues.cpp +++ b/Analysis/RValues.cpp @@ -138,6 +138,16 @@ NonLValue NonLValue::UnaryMinus(ValueManager& ValMgr, UnaryOperator* U) const { } } +NonLValue NonLValue::BitwiseComplement(ValueManager& ValMgr) const { + switch (getSubKind()) { + case ConcreteIntKind: + return cast<ConcreteInt>(this)->BitwiseComplement(ValMgr); + default: + return cast<NonLValue>(InvalidValue()); + } +} + + #define NONLVALUE_DISPATCH_CASE(k1,k2,Op)\ case (k1##Kind*NumNonLValueKind+k2##Kind):\ return cast<k1>(*this).Op(ValMgr,cast<k2>(RHS)); diff --git a/Analysis/RValues.h b/Analysis/RValues.h index c5ad8a5327..79202da545 100644 --- a/Analysis/RValues.h +++ b/Analysis/RValues.h @@ -196,6 +196,7 @@ public: NonLValue Div(ValueManager& ValMgr, const NonLValue& RHS) const; NonLValue Rem(ValueManager& ValMgr, const NonLValue& RHS) const; NonLValue UnaryMinus(ValueManager& ValMgr, UnaryOperator* U) const; + NonLValue BitwiseComplement(ValueManager& ValMgr) const; // Equality operators. NonLValue EQ(ValueManager& ValMgr, const NonLValue& RHS) const; @@ -295,6 +296,10 @@ public: return ValMgr.getValue(-getValue()); } + ConcreteInt BitwiseComplement(ValueManager& ValMgr) const { + return ValMgr.getValue(~getValue()); + } + // Casting. ConcreteInt Cast(ValueManager& ValMgr, Expr* CastExpr) const { |