blob: dd5caef7f085b9d4a79496959f1485665be6ddac [file] [log] [blame]
Ted Kremenek8133a262008-07-08 21:46:56 +00001//== Environment.cpp - Map from Expr* to Locations/Values -------*- C++ -*--==//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defined the Environment and EnvironmentManager classes.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Analysis/PathSensitive/Environment.h"
15#include "llvm/ADT/ImmutableMap.h"
16
17using namespace clang;
18
Ted Kremenekd72ee902008-07-10 17:19:18 +000019RVal Environment::GetRVal(Expr* E, BasicValueFactory& BasicVals) const {
20
21 for (;;) {
22
23 switch (E->getStmtClass()) {
24
25 case Stmt::AddrLabelExprClass:
26 return LVal::MakeVal(cast<AddrLabelExpr>(E));
27
28 // ParenExprs are no-ops.
29
30 case Stmt::ParenExprClass:
31 E = cast<ParenExpr>(E)->getSubExpr();
32 continue;
33
34 case Stmt::CharacterLiteralClass: {
35 CharacterLiteral* C = cast<CharacterLiteral>(E);
36 return NonLVal::MakeVal(BasicVals, C->getValue(), C->getType());
37 }
38
39 case Stmt::IntegerLiteralClass: {
40 return NonLVal::MakeVal(BasicVals, cast<IntegerLiteral>(E));
41 }
42
43 case Stmt::StringLiteralClass:
44 return LVal::MakeVal(cast<StringLiteral>(E));
45
46 // Casts where the source and target type are the same
47 // are no-ops. We blast through these to get the descendant
48 // subexpression that has a value.
49
50 case Stmt::ImplicitCastExprClass: {
51 ImplicitCastExpr* C = cast<ImplicitCastExpr>(E);
52 QualType CT = C->getType();
53
54 if (CT->isVoidType())
55 return UnknownVal();
56
57 QualType ST = C->getSubExpr()->getType();
58
59 break;
60 }
61
62 case Stmt::CastExprClass: {
63 CastExpr* C = cast<CastExpr>(E);
64 QualType CT = C->getType();
65 QualType ST = C->getSubExpr()->getType();
66
67 if (CT->isVoidType())
68 return UnknownVal();
69
70 break;
71 }
72
73 // Handle all other Expr* using a lookup.
74
75 default:
76 break;
77 };
78
79 break;
80 }
81
82 return LookupExpr(E);
83}
Ted Kremenek8133a262008-07-08 21:46:56 +000084
Ted Kremenekd72ee902008-07-10 17:19:18 +000085RVal Environment::GetBlkExprRVal(Expr* E, BasicValueFactory& BasicVals) const {
86
87 E = E->IgnoreParens();
88
89 switch (E->getStmtClass()) {
90 case Stmt::CharacterLiteralClass: {
91 CharacterLiteral* C = cast<CharacterLiteral>(E);
92 return NonLVal::MakeVal(BasicVals, C->getValue(), C->getType());
93 }
94
95 case Stmt::IntegerLiteralClass: {
96 return NonLVal::MakeVal(BasicVals, cast<IntegerLiteral>(E));
97 }
98
99 default:
100 return LookupBlkExpr(E);
101 }
102}
Ted Kremenek8133a262008-07-08 21:46:56 +0000103
Ted Kremenekd72ee902008-07-10 17:19:18 +0000104Environment EnvironmentManager::SetRVal(const Environment& Env, Expr* E, RVal V,
105 bool isBlkExpr, bool Invalidate) {
106 assert (E);
107
108 if (V.isUnknown()) {
109 if (Invalidate)
110 return isBlkExpr ? RemoveBlkExpr(Env, E) : RemoveSubExpr(Env, E);
111 else
112 return Env;
113 }
Ted Kremenek8133a262008-07-08 21:46:56 +0000114
Ted Kremenekd72ee902008-07-10 17:19:18 +0000115 return isBlkExpr ? AddBlkExpr(Env, E, V) : AddSubExpr(Env, E, V);
116}