MemRegion.h revision cc128b32429494fe04ed36d7ba30c011cb4e173a
19e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//== MemRegion.h - Abstract memory regions for static analysis --*- C++ -*--==//
29e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
39e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//                     The LLVM Compiler Infrastructure
49e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
59e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// This file is distributed under the University of Illinois Open Source
69e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// License. See LICENSE.TXT for details.
79e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
89e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
99e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  This file defines MemRegion and its subclasses.  MemRegion defines a
119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  partially-typed abstraction of memory useful for path-sensitive dataflow
129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  analyses.
139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#ifndef LLVM_CLANG_ANALYSIS_MEMREGION_H
179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#define LLVM_CLANG_ANALYSIS_MEMREGION_H
189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
19993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/Decl.h"
20993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/DeclObjC.h"
21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/Analysis/PathSensitive/SymbolManager.h"
2222ab7a4d900ed53285fd0b6720e7b43af84724d8Zhongxing Xu#include "clang/Analysis/PathSensitive/SVals.h"
23a693d4fa7a6dc31b23837cf38cba7aa2af8f00f3Ted Kremenek#include "clang/AST/ASTContext.h"
249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Casting.h"
259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h"
269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Allocator.h"
279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string>
289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace llvm { class raw_ostream; }
309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang {
329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager;
349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions.
379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode {
389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
39993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  enum Kind { MemSpaceRegionKind, SymbolicRegionKind,
407090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek              AllocaRegionKind,
419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              // Typed regions.
429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              BEG_TYPED_REGIONS,
4377cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu               CompoundLiteralRegionKind,
44329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek               StringRegionKind, ElementRegionKind,
45329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek               // Decl Regions.
46329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                 BEG_DECL_REGIONS,
47329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                  VarRegionKind, FieldRegionKind,
48329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                  ObjCIvarRegionKind, ObjCObjectRegionKind,
49329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                 END_DECL_REGIONS,
50817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu               AnonPointeeRegionKind,
519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              END_TYPED_REGIONS };
529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // virtual MemExtent getExtent(MemRegionManager& mrm) const = 0;
619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::string getString() const;
64b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void print(llvm::raw_ostream& os) const;
669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  Kind getKind() const { return kind; }
68b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion*) { return true; }
709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space";
739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion() : MemRegion(MemSpaceRegionKind) {}
779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  //RegionExtent getExtent() const { return UndefinedExtent(); }
809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == MemSpaceRegionKind;
859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
88993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
89993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
90993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
92993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  const MemRegion* superRegion;
93993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
101993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek    return R->getKind() > SymbolicRegionKind;
102993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
103993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
104993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
1057090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
1067090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek///  by a call to 'alloca'.
1077090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekclass AllocaRegion : public SubRegion {
1087090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  friend class MemRegionManager;
1097090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekprotected:
1107090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
1117090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek                // memory allocated by alloca at the same call site.
1127090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  const Expr* Ex;
1137090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
1147090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion* superRegion)
1157090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
1167090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
1177090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekpublic:
1187090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
1197090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  const Expr* getExpr() const { return Ex; }
1207090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
1217090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
1227090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
1237090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,
1247090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek                            unsigned Cnt);
1257090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
1267090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  void print(llvm::raw_ostream& os) const;
1277090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
1287090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  static bool classof(const MemRegion* R) {
1297090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek    return R->getKind() == AllocaRegionKind;
1307090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  }
1317090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek};
1327090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
133993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
134993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  clases, SymbolicRegion represents a region that serves as an alias for
135993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  either a real region, a NULL pointer, etc.  It essentially is used to
136993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  map the concept of symbolic values into the domain of regions.  Symbolic
137993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  regions do not need to be typed.
138993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SymbolicRegion : public MemRegion {
139993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
140993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  const SymbolID sym;
141993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
142993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
143993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SymbolicRegion(const SymbolID s) : MemRegion(SymbolicRegionKind), sym(s) {}
144993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
145993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SymbolID getSymbol() const {
146993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek    return sym;
147993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
148993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
149993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
150993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolID sym);
151993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
152993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  void print(llvm::raw_ostream& os) const;
153993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
154993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
155993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek    return R->getKind() == SymbolicRegionKind;
156993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
157993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
158993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
159993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
160993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
161993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
162993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
163993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
164993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
165a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  virtual QualType getType(ASTContext&) const = 0;
166993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
167993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
1689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
1699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS;
1709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
173e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
174e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion {
175e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
176e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
177e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
178e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
179e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
180e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
181e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  StringRegion(const StringLiteral* str, MemRegion* sreg)
182e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    : TypedRegion(sreg, StringRegionKind), Str(str) {}
183e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
184e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
185e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
186e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
187e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
188e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
189e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu  QualType getType(ASTContext& C) const {
190e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu    return C.getCanonicalType(Str->getType());
191e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
192e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
193e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
194e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
195e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
196e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
197cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu  void print(llvm::raw_ostream& os) const;
198cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
199e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
200e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
201e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
202e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
203e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
204817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu/// AnonPointeeRegion - anonymous regions pointed-to by pointer function
205817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu///  parameters or pointer globals. In RegionStoreManager, we assume pointer
206817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu///  parameters or globals point at some anonymous region. Such regions are not
207817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu///  the regions associated with the pointer variables themselves.  They are
208817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu///  identified with the VarDecl of the pointer variable. We create them lazily.
2099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
210817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xuclass AnonPointeeRegion : public TypedRegion {
2119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
212817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu  // VD - the pointer variable that points at this region.
213817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu  const VarDecl* Pointer;
2149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
215817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu  AnonPointeeRegion(const VarDecl* d, MemRegion* sreg)
216817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu    : TypedRegion(sreg, AnonPointeeRegionKind), Pointer(d) {}
217178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
2189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
219817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu  QualType getType(ASTContext& C) const;
2209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
221817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* PVD,
222817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu                            const MemRegion* superRegion);
223178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
224817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
225817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu    ProfileRegion(ID, Pointer, superRegion);
226817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu  }
227178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
228817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu  static bool classof(const MemRegion* R) {
229817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu    return R->getKind() == AnonPointeeRegionKind;
230817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu  }
231178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu};
232178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
233329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
234329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
235329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
23677cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion {
237329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
238329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
239329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  const CompoundLiteralExpr* CL;
240329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
241329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg)
24277cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
243329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
244329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
245329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const CompoundLiteralExpr* CL,
246329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
247329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
24877cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  QualType getType(ASTContext& C) const {
24977cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    return C.getCanonicalType(CL->getType());
25077cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
25177cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu
252329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
253329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
254329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void print(llvm::raw_ostream& os) const;
255329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
25611a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek  const CompoundLiteralExpr* getLiteralExpr() const { return CL; }
25711a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek
258329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
259329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
260329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
261329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
262178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
2639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion {
2649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
2659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Decl* D;
2669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
267993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  DeclRegion(const Decl* d, const MemRegion* sReg, Kind k)
2689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : TypedRegion(sReg, k), D(d) {}
2699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D,
2719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
2729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
273bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
274bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu  const Decl* getDecl() const { return D; }
2759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
276e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
277e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
278e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
279e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS;
280e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
2819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
2829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
2849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
2859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
286993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  VarRegion(const VarDecl* vd, const MemRegion* sReg)
2879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
2889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD,
2909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
2919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
2929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
2959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const VarDecl* getDecl() const { return cast<VarDecl>(D); }
296e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu  QualType getType(ASTContext& C) const {
297e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu    return C.getCanonicalType(getDecl()->getType());
298e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu  }
2999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void print(llvm::raw_ostream& os) const;
3019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
3039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
3049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
3089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
3099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
310993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  FieldRegion(const FieldDecl* fd, const MemRegion* sReg)
3119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
3129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3134bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
3144bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
3154bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  void print(llvm::raw_ostream& os) const;
3164bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
3174bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  const FieldDecl* getDecl() const { return cast<FieldDecl>(D); }
318e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu  QualType getType(ASTContext& C) const {
319e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu    return C.getCanonicalType(getDecl()->getType());
320e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu  }
3214bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
3229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD,
3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
3289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
3299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
332a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion {
333a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
334a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  friend class MemRegionManager;
335a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
336a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg)
337a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {}
338a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
339a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCInterfaceDecl* ivd,
340a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek                            const MemRegion* superRegion) {
341a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind);
342a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
343a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
344a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic:
345a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  const ObjCInterfaceDecl* getInterface() const {
346a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return cast<ObjCInterfaceDecl>(D);
347a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
348a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
349a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  QualType getType(ASTContext& C) const {
350a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    ObjCInterfaceDecl* ID = const_cast<ObjCInterfaceDecl*>(getInterface());
351a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return C.getObjCInterfaceType(ID);
352a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
353a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
354a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  static bool classof(const MemRegion* R) {
355a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return R->getKind() == ObjCObjectRegionKind;
356a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
357a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek};
358a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
3599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
3609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
3629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
363993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg)
3649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
3659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd,
3679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
3689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
3699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
3729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); }
373a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  QualType getType(ASTContext&) const { return getDecl()->getType(); }
3749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
3769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
3779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
379511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
38027b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion {
381511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
382511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
383511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  SVal Index;
384511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
385511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ElementRegion(SVal Idx, const MemRegion* sReg)
38627b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu    : TypedRegion(sReg, ElementRegionKind), Index(Idx) {}
387511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
388511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx,
389511191ce8920160525611be2be754c32a0724c3eZhongxing Xu                            const MemRegion* superRegion);
390511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
391511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
392511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
3936e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu  SVal getIndex() const { return Index; }
3946e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
39527b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu  QualType getType(ASTContext&) const;
39627b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu
397b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu  void print(llvm::raw_ostream& os) const;
398b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
399511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
400511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
401511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
402511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
403511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
404511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
405511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
406a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// RegionExtent - Represents the size, or extent, of an abstract memory chunk
407a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// (a region).  Sizes are in bits.  RegionExtent is essentially a variant with
408a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// three subclasses: UnknownExtent, FixedExtent, and SymbolicExtent.
409a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu
410a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xuclass RegionExtent {
411a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xupublic:
412a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  enum Kind { Unknown = 0, Fixed = 0, Sym = 1 };
413a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu
414a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xuprotected:
415a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  const uintptr_t Raw;
416a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  RegionExtent(uintptr_t raw, Kind k) : Raw(raw | k) {}
417a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  uintptr_t getData() const { return Raw & ~0x1; }
418a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu
419a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xupublic:
420a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  // Folding-set profiling.
421a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
422a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu    ID.AddPointer((void*) Raw);
423a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  }
424a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  // Comparing extents.
425a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  bool operator==(const RegionExtent& R) const {
426a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu    return Raw == R.Raw;
427a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  }
428a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  bool operator!=(const RegionExtent& R) const {
429a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu    return Raw != R.Raw;
430a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  }
431a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  // Implement isa<T> support.
432a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  Kind getKind() const { return Kind(Raw & 0x1); }
433a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  uintptr_t getRaw() const { return Raw; }
434a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu
435a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  static inline bool classof(const RegionExtent*) {
436a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu    return true;
437a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  }
438a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu};
439a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu
440a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// UnknownExtent - Represents a region extent with no available information
441a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu///  about the size of the region.
442a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xuclass UnknownExtent : public RegionExtent {
443a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xupublic:
444a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  UnknownExtent() : RegionExtent(0,Unknown) {}
445a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu
446a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  // Implement isa<T> support.
447a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  static inline bool classof(const RegionExtent* E) {
448a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu    return E->getRaw() == 0;
449a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  }
450a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu};
451a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu
452a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// FixedExtent - Represents a region extent with a known fixed size.
453a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu///  Typically FixedExtents are used to represent the size of variables, but
454a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu///  they can also be used to represent the size of a constant-sized array.
455a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xuclass FixedExtent : public RegionExtent {
456a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xupublic:
457a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  FixedExtent(const llvm::APSInt& X) : RegionExtent((uintptr_t) &X, Fixed) {}
458a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu
459a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  const llvm::APSInt& getInt() const {
460a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu    return *((llvm::APSInt*) getData());
461a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  }
462a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu
463a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  // Implement isa<T> support.
464a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  static inline bool classof(const RegionExtent* E) {
465a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu    return E->getKind() == Fixed && E->getRaw() != 0;
466a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  }
467a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu};
468a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu
469a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu/// SymbolicExtent - Represents the extent of a region where the extent
470a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu///  itself is a symbolic value.  These extents can be used to represent
471a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu///  the sizes of dynamically allocated chunks of memory with variable size.
472a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xuclass SymbolicExtent : public RegionExtent {
473a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xupublic:
474a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  SymbolicExtent(SymbolID S) : RegionExtent(S.getNumber() << 1, Sym) {}
475a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu
476a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  SymbolID getSymbol() const { return SymbolID(getData() >> 1); }
477a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu
478a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  // Implement isa<T> support.
479a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  static inline bool classof(const RegionExtent* E) {
480a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu    return E->getKind() == Sym;
481a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu  }
482a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu};
483a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu
484a3d9ea8d93a0a4dbba0fd95c6a54c33faebc277cZhongxing Xu
4859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
4869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
4879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
4889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
4909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
4919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
4929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* globals;
4949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* stack;
4959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* heap;
496178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  MemSpaceRegion* unknown;
4979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
4999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegionManager(llvm::BumpPtrAllocator& a)
5009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  : A(a), globals(0), stack(0), heap(0) {}
5019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ~MemRegionManager() {}
5039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getStackRegion - Retrieve the memory region associated with the
5059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  current stack frame.
5069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getStackRegion();
5079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
5099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  all global variables.
5109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getGlobalsRegion();
5119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
5139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
5149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getHeapRegion();
515178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
516178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
517178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
518178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  MemSpaceRegion* getUnknownRegion();
519c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
520c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu  bool isGlobalsRegion(const MemRegion* R) {
521ce63911d6bdd795f63365723d4cdaa6998529e1eZhongxing Xu    assert(R);
522c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu    return R == globals;
523c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu  }
5249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5257090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
5267090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  AllocaRegion* getAllocaRegion(const Expr* Ex, unsigned Cnt);
5277090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
528329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
529329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
530329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion*
531329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr* CL);
532329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
533993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  /// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
534993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SymbolicRegion* getSymbolicRegion(const SymbolID sym);
535e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
536e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  StringRegion* getStringRegion(const StringLiteral* Str);
537e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
5389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
5399a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek  ///  a specified VarDecl.
5409a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek  VarRegion* getVarRegion(const VarDecl* vd);
541329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
542511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ElementRegion* getElementRegion(SVal Idx, const MemRegion* superRegion);
543511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
5449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
5459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
5469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
5479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
548993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  FieldRegion* getFieldRegion(const FieldDecl* fd, const MemRegion* superRegion);
5499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
550a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  /// getObjCObjectRegion - Retrieve or create the memory region associated with
551a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ///  the instance of a specified Objective-C class.
552a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID,
553a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek                                  const MemRegion* superRegion);
554a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
5559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
5569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
5579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
5589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
5599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd,
560993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek                                    const MemRegion* superRegion);
561178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
562178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  AnonPointeeRegion* getAnonPointeeRegion(const VarDecl* d);
563178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
5649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  bool hasStackStorage(const MemRegion* R);
5659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
5679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region);
5689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
5699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace
5739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
574