//== Environment.cpp - Map from Expr* to Locations/Values -------*- C++ -*--==// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defined the Environment and EnvironmentManager classes. // //===----------------------------------------------------------------------===// #include "clang/Analysis/PathSensitive/Environment.h" #include "llvm/ADT/ImmutableMap.h" using namespace clang; RVal Environment::GetRVal(Expr* E, BasicValueFactory& BasicVals) const { for (;;) { switch (E->getStmtClass()) { case Stmt::AddrLabelExprClass: return LVal::MakeVal(cast(E)); // ParenExprs are no-ops. case Stmt::ParenExprClass: E = cast(E)->getSubExpr(); continue; case Stmt::CharacterLiteralClass: { CharacterLiteral* C = cast(E); return NonLVal::MakeVal(BasicVals, C->getValue(), C->getType()); } case Stmt::IntegerLiteralClass: { return NonLVal::MakeVal(BasicVals, cast(E)); } case Stmt::StringLiteralClass: return LVal::MakeVal(cast(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: case Stmt::ExplicitCastExprClass: { CastExpr* C = cast(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(E); return NonLVal::MakeVal(BasicVals, C->getValue(), C->getType()); } case Stmt::IntegerLiteralClass: { return NonLVal::MakeVal(BasicVals, cast(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; } return isBlkExpr ? AddBlkExpr(Env, E, V) : AddSubExpr(Env, E, V); }