[cfe-commits] r46722 - /cfe/trunk/Analysis/ValueState.cpp
Ted Kremenek
kremenek at apple.com
Mon Feb 4 13:59:22 PST 2008
Author: kremenek
Date: Mon Feb 4 15:59:22 2008
New Revision: 46722
URL: http://llvm.org/viewvc/llvm-project?rev=46722&view=rev
Log:
Added file that should have been in my previous commit.
Added:
cfe/trunk/Analysis/ValueState.cpp
Added: cfe/trunk/Analysis/ValueState.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/ValueState.cpp?rev=46722&view=auto
==============================================================================
--- cfe/trunk/Analysis/ValueState.cpp (added)
+++ cfe/trunk/Analysis/ValueState.cpp Mon Feb 4 15:59:22 2008
@@ -0,0 +1,116 @@
+#include "ValueState.h"
+
+using namespace clang;
+
+RValue ValueStateManager::GetValue(const StateTy& St, const LValue& LV) {
+ switch (LV.getSubKind()) {
+ case LValueDeclKind: {
+ StateTy::TreeTy* T = St.SlimFind(cast<LValueDecl>(LV).getDecl());
+ return T ? T->getValue().second : InvalidValue();
+ }
+ default:
+ assert (false && "Invalid LValue.");
+ break;
+ }
+
+ return InvalidValue();
+}
+
+RValue ValueStateManager::GetValue(const StateTy& St, Stmt* S) {
+ for (;;) {
+ switch (S->getStmtClass()) {
+
+ // ParenExprs are no-ops.
+
+ case Stmt::ParenExprClass:
+ S = cast<ParenExpr>(S)->getSubExpr();
+ continue;
+
+ // DeclRefExprs can either evaluate to an LValue or a Non-LValue
+ // (assuming an implicit "load") depending on the context. In this
+ // context we assume that we are retrieving the value contained
+ // within the referenced variables.
+
+ case Stmt::DeclRefExprClass:
+ return GetValue(St, LValueDecl(cast<DeclRefExpr>(S)->getDecl()));
+
+ // Integer literals evaluate to an RValue. Simply retrieve the
+ // RValue for the literal.
+
+ case Stmt::IntegerLiteralClass:
+ return NonLValue::GetValue(ValMgr, cast<IntegerLiteral>(S));
+
+ // Casts where the source and target type are the same
+ // are no-ops. We blast through these to get the descendant
+ // subexpression that has a value.
+
+ case Stmt::ImplicitCastExprClass: {
+ ImplicitCastExpr* C = cast<ImplicitCastExpr>(S);
+ if (C->getType() == C->getSubExpr()->getType()) {
+ S = C->getSubExpr();
+ continue;
+ }
+ break;
+ }
+
+ case Stmt::CastExprClass: {
+ CastExpr* C = cast<CastExpr>(S);
+ if (C->getType() == C->getSubExpr()->getType()) {
+ S = C->getSubExpr();
+ continue;
+ }
+ break;
+ }
+
+ // Handle all other Stmt* using a lookup.
+
+ default:
+ break;
+ };
+
+ break;
+ }
+
+ StateTy::TreeTy* T = St.SlimFind(S);
+
+ return T ? T->getValue().second : InvalidValue();
+}
+
+LValue ValueStateManager::GetLValue(const StateTy& St, Stmt* S) {
+
+ while (ParenExpr* P = dyn_cast<ParenExpr>(S))
+ S = P->getSubExpr();
+
+ if (DeclRefExpr* DR = dyn_cast<DeclRefExpr>(S))
+ return LValueDecl(DR->getDecl());
+
+ return cast<LValue>(GetValue(St, S));
+}
+
+
+ValueStateManager::StateTy
+ValueStateManager::SetValue(StateTy St, Stmt* S, bool isBlkExpr,
+ const RValue& V) {
+
+ assert (S);
+ return V.isValid() ? Factory.Add(St, ValueKey(S, isBlkExpr), V) : St;
+}
+
+ValueStateManager::StateTy
+ValueStateManager::SetValue(StateTy St, const LValue& LV, const RValue& V) {
+
+ switch (LV.getSubKind()) {
+ case LValueDeclKind:
+ return V.isValid() ? Factory.Add(St, cast<LValueDecl>(LV).getDecl(), V)
+ : Factory.Remove(St, cast<LValueDecl>(LV).getDecl());
+
+ default:
+ assert ("SetValue for given LValue type not yet implemented.");
+ return St;
+ }
+}
+
+ValueStateManager::StateTy ValueStateManager::Remove(StateTy St, ValueKey K) {
+ return Factory.Remove(St, K);
+}
+
More information about the cfe-commits
mailing list