diff options
Diffstat (limited to 'lib/Analysis/Environment.cpp')
-rw-r--r-- | lib/Analysis/Environment.cpp | 103 |
1 files changed, 95 insertions, 8 deletions
diff --git a/lib/Analysis/Environment.cpp b/lib/Analysis/Environment.cpp index 86fd12c2a5..dd5caef7f0 100644 --- a/lib/Analysis/Environment.cpp +++ b/lib/Analysis/Environment.cpp @@ -16,14 +16,101 @@ using namespace clang; -//===----------------------------------------------------------------------===// -// Environment. -//===----------------------------------------------------------------------===// - +RVal Environment::GetRVal(Expr* E, BasicValueFactory& BasicVals) const { + + for (;;) { + + switch (E->getStmtClass()) { + + case Stmt::AddrLabelExprClass: + return LVal::MakeVal(cast<AddrLabelExpr>(E)); + + // ParenExprs are no-ops. + + case Stmt::ParenExprClass: + E = cast<ParenExpr>(E)->getSubExpr(); + continue; + + case Stmt::CharacterLiteralClass: { + CharacterLiteral* C = cast<CharacterLiteral>(E); + return NonLVal::MakeVal(BasicVals, C->getValue(), C->getType()); + } + + case Stmt::IntegerLiteralClass: { + return NonLVal::MakeVal(BasicVals, cast<IntegerLiteral>(E)); + } + + case Stmt::StringLiteralClass: + return LVal::MakeVal(cast<StringLiteral>(E)); + + // 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>(E); + QualType CT = C->getType(); + + if (CT->isVoidType()) + return UnknownVal(); + + QualType ST = C->getSubExpr()->getType(); + + break; + } + + case Stmt::CastExprClass: { + CastExpr* C = cast<CastExpr>(E); + QualType CT = C->getType(); + QualType ST = C->getSubExpr()->getType(); + + if (CT->isVoidType()) + return UnknownVal(); + + break; + } + + // Handle all other Expr* using a lookup. + + default: + break; + }; + + break; + } + + return LookupExpr(E); +} +RVal Environment::GetBlkExprRVal(Expr* E, BasicValueFactory& BasicVals) const { + + E = E->IgnoreParens(); + + switch (E->getStmtClass()) { + case Stmt::CharacterLiteralClass: { + CharacterLiteral* C = cast<CharacterLiteral>(E); + return NonLVal::MakeVal(BasicVals, C->getValue(), C->getType()); + } + + case Stmt::IntegerLiteralClass: { + return NonLVal::MakeVal(BasicVals, cast<IntegerLiteral>(E)); + } + + default: + return LookupBlkExpr(E); + } +} +Environment EnvironmentManager::SetRVal(const Environment& Env, Expr* E, RVal V, + bool isBlkExpr, bool Invalidate) { + assert (E); + + if (V.isUnknown()) { + if (Invalidate) + return isBlkExpr ? RemoveBlkExpr(Env, E) : RemoveSubExpr(Env, E); + else + return Env; + } - -//===----------------------------------------------------------------------===// -// Environment Manager. -//===----------------------------------------------------------------------===//
\ No newline at end of file + return isBlkExpr ? AddBlkExpr(Env, E, V) : AddSubExpr(Env, E, V); +} |