1//== Environment.h - Map from Stmt* 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#ifndef LLVM_CLANG_GR_ENVIRONMENT_H
15#define LLVM_CLANG_GR_ENVIRONMENT_H
16
17#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
18#include "llvm/ADT/ImmutableMap.h"
19
20namespace clang {
21
22class LiveVariables;
23
24namespace ento {
25
26class EnvironmentManager;
27class SValBuilder;
28
29/// Environment - An immutable map from Stmts to their current
30///  symbolic values (SVals).
31///
32class Environment {
33private:
34  friend class EnvironmentManager;
35
36  // Type definitions.
37  typedef llvm::ImmutableMap<const Stmt*,SVal> BindingsTy;
38
39  // Data.
40  BindingsTy ExprBindings;
41
42  Environment(BindingsTy eb)
43    : ExprBindings(eb) {}
44
45  SVal lookupExpr(const Stmt *E) const;
46
47public:
48  typedef BindingsTy::iterator iterator;
49  iterator begin() const { return ExprBindings.begin(); }
50  iterator end() const { return ExprBindings.end(); }
51
52
53  /// getSVal - Fetches the current binding of the expression in the
54  ///  Environment.
55  SVal getSVal(const Stmt *Ex, SValBuilder& svalBuilder,
56	       bool useOnlyDirectBindings = false) const;
57
58  /// Profile - Profile the contents of an Environment object for use
59  ///  in a FoldingSet.
60  static void Profile(llvm::FoldingSetNodeID& ID, const Environment* env) {
61    env->ExprBindings.Profile(ID);
62  }
63
64  /// Profile - Used to profile the contents of this object for inclusion
65  ///  in a FoldingSet.
66  void Profile(llvm::FoldingSetNodeID& ID) const {
67    Profile(ID, this);
68  }
69
70  bool operator==(const Environment& RHS) const {
71    return ExprBindings == RHS.ExprBindings;
72  }
73};
74
75class EnvironmentManager {
76private:
77  typedef Environment::BindingsTy::Factory FactoryTy;
78  FactoryTy F;
79
80public:
81  EnvironmentManager(llvm::BumpPtrAllocator& Allocator) : F(Allocator) {}
82  ~EnvironmentManager() {}
83
84  Environment getInitialEnvironment() {
85    return Environment(F.getEmptyMap());
86  }
87
88  /// Bind the value 'V' to the statement 'S'.
89  Environment bindExpr(Environment Env, const Stmt *S, SVal V,
90                       bool Invalidate);
91
92  /// Bind the location 'location' and value 'V' to the statement 'S'.  This
93  /// is used when simulating loads/stores.
94  Environment bindExprAndLocation(Environment Env, const Stmt *S, SVal location,
95                                  SVal V);
96
97  Environment removeDeadBindings(Environment Env,
98                                 SymbolReaper &SymReaper, const ProgramState *ST);
99};
100
101} // end GR namespace
102
103} // end clang namespace
104
105#endif
106