1 //== Environment.h - Map from Stmt* to Locations/Values ---------*- C++ -*--==//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defined the Environment and EnvironmentManager classes.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_ANALYSIS_ENVIRONMENT_H
15 #define LLVM_CLANG_ANALYSIS_ENVIRONMENT_H
17 #include "clang/Checker/PathSensitive/Store.h"
18 #include "clang/Checker/PathSensitive/SVals.h"
19 #include "llvm/ADT/ImmutableMap.h"
23 class EnvironmentManager
;
27 /// Environment - An immutable map from Stmts to their current
28 /// symbolic values (SVals).
32 friend class EnvironmentManager
;
35 typedef llvm::ImmutableMap
<const Stmt
*,SVal
> BindingsTy
;
38 BindingsTy ExprBindings
;
40 Environment(BindingsTy eb
)
43 SVal
lookupExpr(const Stmt
* E
) const;
46 typedef BindingsTy::iterator iterator
;
47 iterator
begin() const { return ExprBindings
.begin(); }
48 iterator
end() const { return ExprBindings
.end(); }
51 /// GetSVal - Fetches the current binding of the expression in the
53 SVal
getSVal(const Stmt
* Ex
, SValBuilder
& svalBuilder
) const;
55 /// Profile - Profile the contents of an Environment object for use
57 static void Profile(llvm::FoldingSetNodeID
& ID
, const Environment
* env
) {
58 env
->ExprBindings
.Profile(ID
);
61 /// Profile - Used to profile the contents of this object for inclusion
63 void Profile(llvm::FoldingSetNodeID
& ID
) const {
67 bool operator==(const Environment
& RHS
) const {
68 return ExprBindings
== RHS
.ExprBindings
;
72 class EnvironmentManager
{
74 typedef Environment::BindingsTy::Factory FactoryTy
;
78 EnvironmentManager(llvm::BumpPtrAllocator
& Allocator
) : F(Allocator
) {}
79 ~EnvironmentManager() {}
81 Environment
getInitialEnvironment() {
82 return Environment(F
.getEmptyMap());
85 /// Bind the value 'V' to the statement 'S'.
86 Environment
bindExpr(Environment Env
, const Stmt
*S
, SVal V
,
89 /// Bind the location 'location' and value 'V' to the statement 'S'. This
90 /// is used when simulating loads/stores.
91 Environment
bindExprAndLocation(Environment Env
, const Stmt
*S
, SVal location
,
94 Environment
RemoveDeadBindings(Environment Env
,
95 SymbolReaper
&SymReaper
, const GRState
*ST
,
96 llvm::SmallVectorImpl
<const MemRegion
*>& RegionRoots
);
99 } // end clang namespace