Implemented casts for ConcreteInt and ConcreteIntLValue.
Implemented '==' and '!=' for ConcreteIntLValue.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46630 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Analysis/RValues.cpp b/Analysis/RValues.cpp
index 4008e76..f41051e 100644
--- a/Analysis/RValues.cpp
+++ b/Analysis/RValues.cpp
@@ -79,20 +79,56 @@
return getValue(V);
}
+//===----------------------------------------------------------------------===//
+// Transfer function for Casts.
+//===----------------------------------------------------------------------===//
+
+RValue RValue::Cast(ValueManager& ValMgr, Expr* CastExpr) const {
+ switch (getBaseKind()) {
+ default: assert(false && "Invalid RValue."); break;
+ case LValueKind: return cast<LValue>(this)->Cast(ValMgr, CastExpr);
+ case NonLValueKind: return cast<NonLValue>(this)->Cast(ValMgr, CastExpr);
+ case UninitializedKind: case InvalidKind: break;
+ }
+
+ return *this;
+}
+
+RValue LValue::Cast(ValueManager& ValMgr, Expr* CastExpr) const {
+ if (CastExpr->getType()->isPointerType())
+ return *this;
+
+ assert (CastExpr->getType()->isIntegerType());
+
+ if (!isa<ConcreteIntLValue>(*this))
+ return InvalidValue();
+
+ APSInt V = cast<ConcreteIntLValue>(this)->getValue();
+ QualType T = CastExpr->getType();
+ V.setIsUnsigned(T->isUnsignedIntegerType());
+ V.extOrTrunc(ValMgr.getContext().getTypeSize(T, CastExpr->getLocStart()));
+ return ConcreteInt(ValMgr.getValue(V));
+}
+
+RValue NonLValue::Cast(ValueManager& ValMgr, Expr* CastExpr) const {
+ if (!isa<ConcreteInt>(this))
+ return InvalidValue();
+
+ APSInt V = cast<ConcreteInt>(this)->getValue();
+ QualType T = CastExpr->getType();
+ V.setIsUnsigned(T->isUnsignedIntegerType());
+ V.extOrTrunc(ValMgr.getContext().getTypeSize(T, CastExpr->getLocStart()));
+
+ if (CastExpr->getType()->isPointerType())
+ return ConcreteIntLValue(ValMgr.getValue(V));
+ else
+ return ConcreteInt(ValMgr.getValue(V));
+}
//===----------------------------------------------------------------------===//
// Transfer function dispatch for Non-LValues.
//===----------------------------------------------------------------------===//
-RValue RValue::Cast(ValueManager& ValMgr, Expr* CastExpr) const {
- switch (getSubKind()) {
- case ConcreteIntKind:
- return cast<ConcreteInt>(this)->Cast(ValMgr, CastExpr);
- default:
- return InvalidValue();
- }
-}
-
NonLValue NonLValue::UnaryMinus(ValueManager& ValMgr, UnaryOperator* U) const {
switch (getSubKind()) {
case ConcreteIntKind:
@@ -162,6 +198,13 @@
default:
assert(false && "EQ not implemented for this LValue.");
return cast<NonLValue>(InvalidValue());
+
+ case ConcreteIntLValueKind: {
+ bool b = cast<ConcreteIntLValue>(this)->getValue() ==
+ cast<ConcreteIntLValue>(RHS).getValue();
+
+ return NonLValue::GetIntTruthValue(ValMgr, b);
+ }
case LValueDeclKind: {
bool b = cast<LValueDecl>(*this) == cast<LValueDecl>(RHS);
@@ -179,6 +222,13 @@
assert(false && "EQ not implemented for this LValue.");
return cast<NonLValue>(InvalidValue());
+ case ConcreteIntLValueKind: {
+ bool b = cast<ConcreteIntLValue>(this)->getValue() !=
+ cast<ConcreteIntLValue>(RHS).getValue();
+
+ return NonLValue::GetIntTruthValue(ValMgr, b);
+ }
+
case LValueDeclKind: {
bool b = cast<LValueDecl>(*this) != cast<LValueDecl>(RHS);
return NonLValue::GetIntTruthValue(ValMgr, b);
@@ -255,7 +305,12 @@
}
void LValue::print(std::ostream& Out) const {
- switch (getSubKind()) {
+ switch (getSubKind()) {
+ case ConcreteIntLValueKind:
+ Out << cast<ConcreteIntLValue>(this)->getValue().toString()
+ << " (LValue)";
+ break;
+
case SymbolicLValueKind:
Out << '$' << cast<SymbolicLValue>(this)->getSymbolID();
break;