MemRegion.h revision 178927517fa09ddbb04dc8ef725b5716c18aae21
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
199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Casting.h"
209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h"
219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Allocator.h"
229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "clang/AST/Decl.h"
239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "clang/AST/DeclObjC.h"
249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string>
259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace llvm { class raw_ostream; }
279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang {
299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager;
319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions.
349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode {
359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  enum Kind { MemSpaceRegionKind,
379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              // Typed regions.
389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              BEG_TYPED_REGIONS,
399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              VarRegionKind, FieldRegionKind, ObjCIvarRegionKind,
40178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu              AnonTypedRegionKind, AnonPointeeRegionKind,
419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              END_TYPED_REGIONS };
429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // virtual MemExtent getExtent(MemRegionManager& mrm) const = 0;
519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual const MemRegion* getSuperRegion() const = 0;
529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::string getString() const;
559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void print(llvm::raw_ostream& os) const;
569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  Kind getKind() const { return kind; }
589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion*) { return true; }
599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space";
629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion() : MemRegion(MemSpaceRegionKind) {}
669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  //RegionExtent getExtent() const { return UndefinedExtent(); }
699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return 0;
729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  //static void ProfileRegion(llvm::FoldingSetNodeID& ID);
759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == MemSpaceRegionKind;
799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// TypedRegion - An abstract class representing regions that are typed.
839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass TypedRegion : public MemRegion {
849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* superRegion;
869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  TypedRegion(const MemRegion* sReg, Kind k)
889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : MemRegion(k), superRegion(sReg) {};
899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual QualType getType() const = 0;
929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // MemExtent getExtent(MemRegionManager& mrm) const;
949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
1009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS;
1019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// AnonTypedRegion - An "anonymous" region that simply types a chunk
1059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  of memory.
1069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass AnonTypedRegion : public TypedRegion {
107178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuprotected:
1089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  QualType T;
1099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
1119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  AnonTypedRegion(QualType t, MemRegion* sreg)
1139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : TypedRegion(sreg, AnonTypedRegionKind), T(t) {}
1149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T,
116178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu                            const MemRegion* superRegion);
117178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
1189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  QualType getType() const { return T; }
1209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
1239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
1259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == AnonTypedRegionKind;
1269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
129178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// AnonPointeeRegion - anonymous regions pointed-at by pointer function
130178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu///  parameters or pointer globals. In RegionStoreManager, we assume pointer
131178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu///  parameters or globals point at some anonymous region initially. Such
132178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu///  regions are not the regions associated with the pointers themselves, but
133178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu///  are identified with the VarDecl of the parameters or globals.
134178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuclass AnonPointeeRegion : public AnonTypedRegion {
135178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  friend class MemRegionManager;
136178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  // VD - the pointer variable that points at this region.
137178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  const VarDecl* VD;
138178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
139178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  AnonPointeeRegion(const VarDecl* d, QualType t, MemRegion* sreg)
140178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu    : AnonTypedRegion(t, sreg), VD(d) {}
141178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
142178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xupublic:
143178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* PVD,
144178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu                            QualType T, const MemRegion* superRegion);
145178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu};
146178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
147178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu/// AnonHeapRegion - anonymous region created by malloc().
148178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xuclass AnonHeapRegion : public AnonTypedRegion {
149178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu};
150178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
1519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion {
1529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
1539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Decl* D;
1549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  DeclRegion(const Decl* d, MemRegion* sReg, Kind k)
1569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : TypedRegion(sReg, k), D(d) {}
1579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D,
1599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
1609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
1639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
1669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
1679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  VarRegion(const VarDecl* vd, MemRegion* sReg)
1699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
1709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD,
1729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
1739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
1749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const VarDecl* getDecl() const { return cast<VarDecl>(D); }
1789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  QualType getType() const { return getDecl()->getType(); }
1799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void print(llvm::raw_ostream& os) const;
1819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
1839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
1849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
1889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
1899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  FieldRegion(const FieldDecl* fd, MemRegion* sReg)
1919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
1929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD,
1949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
1959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
1969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const FieldDecl* getDecl() const { return cast<FieldDecl>(D); }
2009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  QualType getType() const { return getDecl()->getType(); }
2019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
2039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
2049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
2069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
2089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
2109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ObjCIvarRegion(const ObjCIvarDecl* ivd, MemRegion* sReg)
2129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
2139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd,
2159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
2169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
2179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
2209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); }
2219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  QualType getType() const { return getDecl()->getType(); }
2229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
2249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
2259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
2279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
2299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
2309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
2319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
2339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
2349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
2359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* globals;
2379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* stack;
2389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* heap;
239178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  MemSpaceRegion* unknown;
2409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
2429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegionManager(llvm::BumpPtrAllocator& a)
2439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  : A(a), globals(0), stack(0), heap(0) {}
2449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ~MemRegionManager() {}
2469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getStackRegion - Retrieve the memory region associated with the
2489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  current stack frame.
2499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getStackRegion();
2509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
2529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  all global variables.
2539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getGlobalsRegion();
2549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
2569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
2579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getHeapRegion();
258178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
259178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
260178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
261178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  MemSpaceRegion* getUnknownRegion();
2629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
2649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified VarDecl.  'superRegion' corresponds to the containing
2659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region, and 'off' is the offset within the containing region.
2669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  VarRegion* getVarRegion(const VarDecl* vd, MemRegion* superRegion);
2679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  VarRegion* getVarRegion(const VarDecl* vd) {
2699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return getVarRegion(vd, vd->hasLocalStorage() ? getStackRegion()
2709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                        : getGlobalsRegion());
2719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
2749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
2759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
2769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
2779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  FieldRegion* getFieldRegion(const FieldDecl* fd, MemRegion* superRegion);
2789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
2809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
2819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
2829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
2839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd,
2849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                                    MemRegion* superRegion);
285178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
286178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  AnonPointeeRegion* getAnonPointeeRegion(const VarDecl* d);
287178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
2889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  bool hasStackStorage(const MemRegion* R);
2899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
2919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region);
2929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
2939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace
2979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
298