summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-02-04 16:58:30 +0000
committerTed Kremenek <kremenek@apple.com>2008-02-04 16:58:30 +0000
commit2cdfd6670e08e1bd6e4c112b1e27a22d4c3b67d1 (patch)
treeac3ec00a10ac9e77095a12ddd07b9b808daf8a7b
parent0bf88b9a510f0055dfb636562f3ae36fb9b5d9e2 (diff)
downloadbcm5719-llvm-2cdfd6670e08e1bd6e4c112b1e27a22d4c3b67d1.tar.gz
bcm5719-llvm-2cdfd6670e08e1bd6e4c112b1e27a22d4c3b67d1.zip
Implemented transfer function for unary '~'.
llvm-svn: 46708
-rw-r--r--clang/Analysis/GRConstants.cpp6
-rw-r--r--clang/Analysis/RValues.cpp10
-rw-r--r--clang/Analysis/RValues.h5
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 {
OpenPOWER on IntegriCloud