MemRegion.h revision 3d8173c1c68f451c7492f92023d829c626845925
1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//== MemRegion.h - Abstract memory regions for static analysis --*- C++ -*--==//
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//                     The LLVM Compiler Infrastructure
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This file is distributed under the University of Illinois Open Source
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// License. See LICENSE.TXT for details.
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//===----------------------------------------------------------------------===//
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick//
10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch//  This file defines MemRegion and its subclasses.  MemRegion defines a
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//  partially-typed abstraction of memory useful for path-sensitive dataflow
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//  analyses.
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//===----------------------------------------------------------------------===//
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#ifndef LLVM_CLANG_ANALYSIS_MEMREGION_H
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define LLVM_CLANG_ANALYSIS_MEMREGION_H
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "clang/AST/Decl.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "clang/AST/DeclObjC.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "clang/Analysis/PathSensitive/SymbolManager.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "clang/Analysis/PathSensitive/SVals.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "clang/AST/ASTContext.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "llvm/Support/Casting.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "llvm/ADT/FoldingSet.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "llvm/ADT/ImmutableList.h"
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "llvm/ADT/ImmutableMap.h"
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "llvm/Support/Allocator.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace llvm { class raw_ostream; }
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace clang {
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MemRegionManager;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// MemRegion - The root abstract class for all memory regions.
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MemRegion : public llvm::FoldingSetNode {
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum Kind { MemSpaceRegionKind, SymbolicRegionKind,
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              AllocaRegionKind,
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              // Typed regions.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              BEG_TYPED_REGIONS,
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               CompoundLiteralRegionKind,
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               StringRegionKind, ElementRegionKind,
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               AnonTypedRegionKind,
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               AnonPointeeRegionKind,
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               // Decl Regions.
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 BEG_DECL_REGIONS,
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  VarRegionKind, FieldRegionKind,
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  ObjCIvarRegionKind, ObjCObjectRegionKind,
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 END_DECL_REGIONS,
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              END_TYPED_REGIONS };
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprivate:
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Kind kind;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprotected:
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MemRegion(Kind k) : kind(k) {}
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~MemRegion();
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // virtual MemExtent getExtent(MemRegionManager& mrm) const = 0;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string getString() const;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void print(llvm::raw_ostream& os) const;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Kind getKind() const { return kind; }
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool classof(const MemRegion*) { return true; }
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// MemSpaceRegion - A memory region that represents and "memory space";
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///  for example, the set of global variables, the stack frame, etc.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MemSpaceRegion : public MemRegion {
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class MemRegionManager;
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MemSpaceRegion() : MemRegion(MemSpaceRegionKind) {}
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //RegionExtent getExtent() const { return UndefinedExtent(); }
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Profile(llvm::FoldingSetNodeID& ID) const;
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool classof(const MemRegion* R) {
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return R->getKind() == MemSpaceRegionKind;
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick/// SubRegion - A region that subsets another larger region.  Most regions
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick///  are subclasses of SubRegion.
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass SubRegion : public MemRegion {
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenprotected:
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const MemRegion* superRegion;
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const MemRegion* getSuperRegion() const {
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return superRegion;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static bool classof(const MemRegion* R) {
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return R->getKind() > SymbolicRegionKind;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// AllocaRegion - A region that represents an untyped blob of bytes created
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///  by a call to 'alloca'.
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AllocaRegion : public SubRegion {
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class MemRegionManager;
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprotected:
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                // memory allocated by alloca at the same call site.
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Expr* Ex;
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion* superRegion)
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Expr* getExpr() const { return Ex; }
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void Profile(llvm::FoldingSetNodeID& ID) const;
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            unsigned Cnt);
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void print(llvm::raw_ostream& os) const;
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool classof(const MemRegion* R) {
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return R->getKind() == AllocaRegionKind;
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///  clases, SymbolicRegion represents a region that serves as an alias for
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///  either a real region, a NULL pointer, etc.  It essentially is used to
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///  map the concept of symbolic values into the domain of regions.  Symbolic
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///  regions do not need to be typed.
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SymbolicRegion : public MemRegion {
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprotected:
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const SymbolRef sym;
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SymbolicRegion(const SymbolRef s) : MemRegion(SymbolicRegionKind), sym(s) {}
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SymbolRef getSymbol() const {
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return sym;
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Profile(llvm::FoldingSetNodeID& ID) const;
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym);
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void print(llvm::raw_ostream& os) const;
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool classof(const MemRegion* R) {
158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return R->getKind() == SymbolicRegionKind;
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// TypedRegion - An abstract class representing regions that are typed.
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TypedRegion : public SubRegion {
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprotected:
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual QualType getType(ASTContext&) const = 0;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool classof(const MemRegion* R) {
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    unsigned k = R->getKind();
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS;
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// StringRegion - Region associated with a StringLiteral.
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass StringRegion : public TypedRegion {
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class MemRegionManager;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const StringLiteral* Str;
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickprotected:
1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StringRegion(const StringLiteral* str, MemRegion* sreg)
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : TypedRegion(sreg, StringRegionKind), Str(str) {}
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            const StringLiteral* Str,
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            const MemRegion* superRegion);
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const StringLiteral* getStringLiteral() const { return Str; }
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QualType getType(ASTContext& C) const {
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return C.getCanonicalType(Str->getType());
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void Profile(llvm::FoldingSetNodeID& ID) const {
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ProfileRegion(ID, Str, superRegion);
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void print(llvm::raw_ostream& os) const;
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static bool classof(const MemRegion* R) {
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return R->getKind() == StringRegionKind;
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AnonTypedRegion : public TypedRegion {
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class MemRegionManager;
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QualType T;
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AnonTypedRegion(QualType t, const MemRegion* sreg)
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : TypedRegion(sreg, AnonTypedRegionKind), T(t) {}
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T,
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            const MemRegion* superRegion);
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QualType getType(ASTContext& C) const {
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return T;
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Profile(llvm::FoldingSetNodeID& ID) const {
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ProfileRegion(ID, T, superRegion);
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool classof(const MemRegion* R) {
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return R->getKind() == AnonTypedRegionKind;
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/// AnonPointeeRegion - anonymous regions pointed-to by pointer function
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///  parameters or pointer globals. In RegionStoreManager, we assume pointer
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///  parameters or globals point at some anonymous region. Such regions are not
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///  the regions associated with the pointer variables themselves.  They are
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///  identified by the symbols that are concretized. We create them lazily.
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AnonPointeeRegion : public TypedRegion {
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class MemRegionManager;
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sym - the symbol that is concretized.
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SymbolRef Sym;
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Ty - the type of the region.
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QualType T;
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AnonPointeeRegion(SymbolRef sym, QualType t, MemRegion* sreg)
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : TypedRegion(sreg, AnonPointeeRegionKind), Sym(sym), T(t) {}
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QualType getType(ASTContext& C) const;
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef Sym,
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            const MemRegion* superRegion);
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Profile(llvm::FoldingSetNodeID& ID) const {
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ProfileRegion(ID, Sym, superRegion);
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool classof(const MemRegion* R) {
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return R->getKind() == AnonPointeeRegionKind;
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/// CompoundLiteralRegion - A memory region representing a compound literal.
27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen///   Compound literals are essentially temporaries that are stack allocated
27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen///   or in the global constant pool.
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CompoundLiteralRegion : public TypedRegion {
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprivate:
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class MemRegionManager;
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const CompoundLiteralExpr* CL;
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg)
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            const CompoundLiteralExpr* CL,
28272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            const MemRegion* superRegion);
28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenpublic:
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QualType getType(ASTContext& C) const {
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return C.getCanonicalType(CL->getType());
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Profile(llvm::FoldingSetNodeID& ID) const;
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void print(llvm::raw_ostream& os) const;
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const CompoundLiteralExpr* getLiteralExpr() const { return CL; }
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool classof(const MemRegion* R) {
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return R->getKind() == CompoundLiteralRegionKind;
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DeclRegion : public TypedRegion {
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprotected:
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Decl* D;
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DeclRegion(const Decl* d, const MemRegion* sReg, Kind k)
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : TypedRegion(sReg, k), D(d) {}
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D,
30772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                      const MemRegion* superRegion, Kind k);
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Decl* getDecl() const { return D; }
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Profile(llvm::FoldingSetNodeID& ID) const;
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool classof(const MemRegion* R) {
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    unsigned k = R->getKind();
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS;
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass VarRegion : public DeclRegion {
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class MemRegionManager;
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  VarRegion(const VarDecl* vd, const MemRegion* sReg)
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : DeclRegion(vd, sReg, VarRegionKind) {}
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD,
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      const MemRegion* superRegion) {
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const VarDecl* getDecl() const { return cast<VarDecl>(D); }
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QualType getType(ASTContext& C) const {
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return C.getCanonicalType(getDecl()->getType());
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void print(llvm::raw_ostream& os) const;
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool classof(const MemRegion* R) {
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return R->getKind() == VarRegionKind;
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
3413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FieldRegion : public DeclRegion {
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class MemRegionManager;
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FieldRegion(const FieldDecl* fd, const MemRegion* sReg)
34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : DeclRegion(fd, sReg, FieldRegionKind) {}
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenpublic:
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void print(llvm::raw_ostream& os) const;
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FieldDecl* getDecl() const { return cast<FieldDecl>(D); }
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QualType getType(ASTContext& C) const {
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return C.getCanonicalType(getDecl()->getType());
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
35772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
35872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD,
35972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                      const MemRegion* superRegion) {
36072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static bool classof(const MemRegion* R) {
36472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return R->getKind() == FieldRegionKind;
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
36772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ObjCObjectRegion : public DeclRegion {
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class MemRegionManager;
37172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
37272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg)
3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {}
3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCInterfaceDecl* ivd,
3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                            const MemRegion* superRegion) {
3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind);
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickpublic:
3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const ObjCInterfaceDecl* getInterface() const {
38272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return cast<ObjCInterfaceDecl>(D);
3833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
38472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  QualType getType(ASTContext& C) const {
3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ObjCInterfaceDecl* ID = const_cast<ObjCInterfaceDecl*>(getInterface());
3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return C.getObjCInterfaceType(ID);
3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static bool classof(const MemRegion* R) {
3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return R->getKind() == ObjCObjectRegionKind;
3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass ObjCIvarRegion : public DeclRegion {
3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  friend class MemRegionManager;
39872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg)
40072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd,
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      const MemRegion* superRegion) {
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
40672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
40772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenpublic:
40872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); }
40972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  QualType getType(ASTContext&) const { return getDecl()->getType(); }
41072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool classof(const MemRegion* R) {
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return R->getKind() == ObjCIvarRegionKind;
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
41472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass ElementRegion : public TypedRegion {
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class MemRegionManager;
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SVal Index;
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ElementRegion(SVal Idx, const MemRegion* sReg)
42272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : TypedRegion(sReg, ElementRegionKind), Index(Idx) {
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    assert((!isa<nonloc::ConcreteInt>(&Idx) ||
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) &&
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           "The index must be signed");
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx,
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            const MemRegion* superRegion);
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SVal getIndex() const { return Index; }
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  QualType getType(ASTContext&) const;
43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void print(llvm::raw_ostream& os) const;
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Profile(llvm::FoldingSetNodeID& ID) const;
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static bool classof(const MemRegion* R) {
44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return R->getKind() == ElementRegionKind;
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//===----------------------------------------------------------------------===//
44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// MemRegionManager - Factory object for creating regions.
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//===----------------------------------------------------------------------===//
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MemRegionManager {
45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  llvm::BumpPtrAllocator& A;
45272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  llvm::FoldingSet<MemRegion> Regions;
45372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MemSpaceRegion* globals;
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MemSpaceRegion* stack;
456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MemSpaceRegion* heap;
457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MemSpaceRegion* unknown;
458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenpublic:
460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MemRegionManager(llvm::BumpPtrAllocator& a)
461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : A(a), globals(0), stack(0), heap(0), unknown(0) {}
462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ~MemRegionManager() {}
464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  /// getStackRegion - Retrieve the memory region associated with the
466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ///  current stack frame.
467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MemSpaceRegion* getStackRegion();
468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  /// getGlobalsRegion - Retrieve the memory region associated with
470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ///  all global variables.
471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MemSpaceRegion* getGlobalsRegion();
472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  /// getHeapRegion - Retrieve the memory region associated with the
474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ///  generic "heap".
475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MemSpaceRegion* getHeapRegion();
476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  /// getUnknownRegion - Retrieve the memory region associated with unknown
478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  /// memory space.
479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MemSpaceRegion* getUnknownRegion();
480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool isGlobalsRegion(const MemRegion* R) {
482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    assert(R);
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return R == globals;
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
48772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  AllocaRegion* getAllocaRegion(const Expr* Ex, unsigned Cnt);
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /// getCompoundLiteralRegion - Retrieve the region associated with a
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ///  given CompoundLiteral.
49172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  CompoundLiteralRegion*
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  getCompoundLiteralRegion(const CompoundLiteralExpr* CL);
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  /// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SymbolicRegion* getSymbolicRegion(const SymbolRef sym);
496
497  StringRegion* getStringRegion(const StringLiteral* Str);
498
499  /// getVarRegion - Retrieve or create the memory region associated with
500  ///  a specified VarDecl.
501  VarRegion* getVarRegion(const VarDecl* vd);
502
503  ElementRegion* getElementRegion(SVal Idx, const MemRegion* superRegion);
504
505  /// getFieldRegion - Retrieve or create the memory region associated with
506  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
507  ///  memory region (which typically represents the memory representing
508  ///  a structure or class).
509  FieldRegion* getFieldRegion(const FieldDecl* fd, const MemRegion* superRegion);
510
511  /// getObjCObjectRegion - Retrieve or create the memory region associated with
512  ///  the instance of a specified Objective-C class.
513  ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID,
514                                  const MemRegion* superRegion);
515
516  /// getObjCIvarRegion - Retrieve or create the memory region associated with
517  ///   a specified Objective-c instance variable.  'superRegion' corresponds
518  ///   to the containing region (which typically represents the Objective-C
519  ///   object).
520  ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd,
521                                    const MemRegion* superRegion);
522
523  AnonTypedRegion* getAnonTypedRegion(QualType t, const MemRegion* superRegion);
524
525  AnonPointeeRegion* getAnonPointeeRegion(SymbolRef Sym, QualType T);
526
527  bool hasStackStorage(const MemRegion* R);
528
529private:
530  MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region);
531};
532
533
534
535} // end clang namespace
536#endif
537