diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-02-04 16:58:30 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-02-04 16:58:30 +0000 |
commit | 2cdfd6670e08e1bd6e4c112b1e27a22d4c3b67d1 (patch) | |
tree | ac3ec00a10ac9e77095a12ddd07b9b808daf8a7b | |
parent | 0bf88b9a510f0055dfb636562f3ae36fb9b5d9e2 (diff) | |
download | bcm5719-llvm-2cdfd6670e08e1bd6e4c112b1e27a22d4c3b67d1.tar.gz bcm5719-llvm-2cdfd6670e08e1bd6e4c112b1e27a22d4c3b67d1.zip |
Implemented transfer function for unary '~'.
llvm-svn: 46708
-rw-r--r-- | clang/Analysis/GRConstants.cpp | 6 | ||||
-rw-r--r-- | clang/Analysis/RValues.cpp | 10 | ||||
-rw-r--r-- | clang/Analysis/RValues.h | 5 |
3 files changed, 21 insertions, 0 deletions
diff --git a/clang/Analysis/GRConstants.cpp b/clang/Analysis/GRConstants.cpp index 895f0e1025c..cc999b9349c 100644 --- a/clang/Analysis/GRConstants.cpp +++ b/clang/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/clang/Analysis/RValues.cpp b/clang/Analysis/RValues.cpp index f41051ed57c..2854ee64144 100644 --- a/clang/Analysis/RValues.cpp +++ b/clang/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/clang/Analysis/RValues.h b/clang/Analysis/RValues.h index c5ad8a5327e..79202da545a 100644 --- a/clang/Analysis/RValues.h +++ b/clang/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 { |