MemRegion.h revision 7ae7ad9951f032d0a33b64c964f7cdcb9cc6f59b
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"
26dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu#include "llvm/ADT/ImmutableList.h"
27dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu#include "llvm/ADT/ImmutableMap.h"
289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Allocator.h"
299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string>
309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace llvm { class raw_ostream; }
329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang {
349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager;
369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions.
399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode {
409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
41026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  enum Kind { MemSpaceRegionKind,
42e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek              SymbolicRegionKind,
4382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek              AllocaRegionKind,
449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              // Typed regions.
459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              BEG_TYPED_REGIONS,
46369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu               CodeTextRegionKind,
4777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu               CompoundLiteralRegionKind,
48329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek               StringRegionKind, ElementRegionKind,
490312c0e09c9de480d78607972ac64a88f4e94a33Ted Kremenek               TypedViewRegionKind,
50329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek               // Decl Regions.
51329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                 BEG_DECL_REGIONS,
52329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                  VarRegionKind, FieldRegionKind,
53329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                  ObjCIvarRegionKind, ObjCObjectRegionKind,
54329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                 END_DECL_REGIONS,
559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              END_TYPED_REGIONS };
569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // virtual MemExtent getExtent(MemRegionManager& mrm) const = 0;
659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::string getString() const;
68b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void print(llvm::raw_ostream& os) const;
709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  Kind getKind() const { return kind; }
7241168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
73ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  template<typename RegionTy> const RegionTy* getAs() const;
74ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek
7541168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek  virtual bool isBoundable(ASTContext&) const { return true; }
76b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion*) { return true; }
789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space";
819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion() : MemRegion(MemSpaceRegionKind) {}
859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  //RegionExtent getExtent() const { return UndefinedExtent(); }
889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9141168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek  bool isBoundable(ASTContext &) const { return false; }
9241168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == MemSpaceRegionKind;
959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
98993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
99993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
100993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
1019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
102993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  const MemRegion* superRegion;
103993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
1049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
1079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
1089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1094193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu
1107e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  bool isSubRegionOf(const MemRegion* R) const;
1117e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu
1129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
113026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() > MemSpaceRegionKind;
114993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
115993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
116ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
11782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
11882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
11982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
12082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
12182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
12282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
12382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
12482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* Ex;
12582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
1267ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion *superRegion)
12782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
12882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
12982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
13082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
13182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* getExpr() const { return Ex; }
13282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
13382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
13482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
13582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,
1367ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                            unsigned Cnt, const MemRegion *superRegion);
13782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
13882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void print(llvm::raw_ostream& os) const;
13982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
14082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
14182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
14282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
14382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek};
14482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
145993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
146993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
147993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
148993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
149993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
150993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
151a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  virtual QualType getValueType(ASTContext &C) const = 0;
1526eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
153ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  virtual QualType getLocationType(ASTContext& C) const {
1546eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can possibly optimize this later to cache this value.
155a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu    return C.getPointerType(getValueType(C));
1566eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
15714553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek
158a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getDesugaredValueType(ASTContext& C) const {
159a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu    QualType T = getValueType(C);
1601b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek    return T.getTypePtr() ? T->getDesugaredType() : T;
16114553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
16214553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek
163ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  QualType getDesugaredLocationType(ASTContext& C) const {
164ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return getLocationType(C)->getDesugaredType();
16514553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
1661b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek
16741168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek  bool isBoundable(ASTContext &C) const {
168a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu    return !getValueType(C).isNull();
16941168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek  }
1706eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
171993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
1729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
1739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS;
1749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
177ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// CodeTextRegion - A region that represents code texts of a function. It wraps
178ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// two kinds of code texts: real function and symbolic function. Real function
179ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// is a function declared in the program. Symbolic function is a function
180ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// pointer that we don't know which function it points to.
181ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xuclass CodeTextRegion : public TypedRegion {
182ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
183ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  enum CodeKind { Declared, Symbolic };
184ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
185ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xuprivate:
186ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  // The function pointer kind that this CodeTextRegion represents.
187ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  CodeKind codekind;
188ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
189ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  // Data may be a SymbolRef or FunctionDecl*.
190ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  const void* Data;
191ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
192ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  // Cached function pointer type.
193ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  QualType LocationType;
194ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
195ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
196ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
197ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  CodeTextRegion(const FunctionDecl* fd, QualType t, const MemRegion* sreg)
198ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    : TypedRegion(sreg, CodeTextRegionKind),
199ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu      codekind(Declared),
200ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu      Data(fd),
201ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu      LocationType(t) {}
202ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
203ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  CodeTextRegion(SymbolRef sym, QualType t, const MemRegion* sreg)
204ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    : TypedRegion(sreg, CodeTextRegionKind),
205ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu      codekind(Symbolic),
206ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu      Data(sym),
207ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu      LocationType(t) {}
208ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
209a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext &C) const {
210ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    // Do not get the object type of a CodeTextRegion.
211ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    assert(0);
212ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    return QualType();
213ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
214ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
215ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  QualType getLocationType(ASTContext &C) const {
216ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    return LocationType;
217ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
218369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu
219369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu  bool isDeclared() const { return codekind == Declared; }
220264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu  bool isSymbolic() const { return codekind == Symbolic; }
221369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu
222369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu  const FunctionDecl* getDecl() const {
223369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu    assert(codekind == Declared);
224369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu    return static_cast<const FunctionDecl*>(Data);
225369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu  }
2268ec3d7dbff9d526fcdce4fbea683830192340c90Ted Kremenek
22772e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  SymbolRef getSymbol() const {
22872e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek    assert(codekind == Symbolic);
22972e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek    return const_cast<SymbolRef>(static_cast<const SymbolRef>(Data));
23072e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  }
23172e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek
23272e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  bool isBoundable(ASTContext&) const { return false; }
23372e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek
23472e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  virtual void print(llvm::raw_ostream& os) const;
235ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
236ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
237ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
238ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
239ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu                            const void* data, QualType t);
240ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
241ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static bool classof(const MemRegion* R) {
242ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    return R->getKind() == CodeTextRegionKind;
243ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
244ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu};
245ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
246026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
247026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  clases, SymbolicRegion represents a region that serves as an alias for
248026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  either a real region, a NULL pointer, etc.  It essentially is used to
249026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  map the concept of symbolic values into the domain of regions.  Symbolic
250026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  regions do not need to be typed.
251e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion {
252026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected:
253026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  const SymbolRef sym;
254026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
255026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic:
256e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek  SymbolicRegion(const SymbolRef s, const MemRegion* sreg)
257e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek    : SubRegion(sreg, SymbolicRegionKind), sym(s) {}
258026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
259026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  SymbolRef getSymbol() const {
260026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return sym;
261026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
262026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
263026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
264026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
265250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
266250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            SymbolRef sym,
267250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            const MemRegion* superRegion);
268026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
269026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  void print(llvm::raw_ostream& os) const;
270026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
271026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  static bool classof(const MemRegion* R) {
272026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() == SymbolicRegionKind;
273026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
274026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu};
275026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
276e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
277e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion {
278e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
279e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
280e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
281e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
282250101353b711a409b075f1bc11070dddec7100bTed Kremenek  StringRegion(const StringLiteral* str, const MemRegion* sreg)
283e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    : TypedRegion(sreg, StringRegionKind), Str(str) {}
284e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
285e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
286e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
287e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
288e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
289e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
2906613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
2916613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
2926eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
293a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
294ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return Str->getType();
295ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  }
296e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
297e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
298e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
299e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
300e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
301cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu  void print(llvm::raw_ostream& os) const;
302cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
303e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
304e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
305e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
306e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
307e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
3080312c0e09c9de480d78607972ac64a88f4e94a33Ted Kremenekclass TypedViewRegion : public TypedRegion {
309dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  friend class MemRegionManager;
310b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek  QualType LValueType;
311dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
312b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek  TypedViewRegion(QualType lvalueType, const MemRegion* sreg)
313b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek    : TypedRegion(sreg, TypedViewRegionKind), LValueType(lvalueType) {}
314dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
315dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T,
316dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu                            const MemRegion* superRegion);
317dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
318dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xupublic:
319dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
320500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek  void print(llvm::raw_ostream& os) const;
321500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek
322ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  QualType getLocationType(ASTContext&) const {
323e6fbdf538bc50122876639e08a1401e2bc9555baTed Kremenek    return LValueType;
324e6fbdf538bc50122876639e08a1401e2bc9555baTed Kremenek  }
325e6fbdf538bc50122876639e08a1401e2bc9555baTed Kremenek
326a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext&) const {
327b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek    const PointerType* PTy = LValueType->getAsPointerType();
3282e3f73b963b5831d6230f69e157b0964b11eff91Zhongxing Xu    assert(PTy);
3292e3f73b963b5831d6230f69e157b0964b11eff91Zhongxing Xu    return PTy->getPointeeType();
330dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
331b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek
332b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek  bool isBoundable(ASTContext &C) const {
333b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek    return isa<PointerType>(LValueType);
334b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek  }
335dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
336dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
337b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek    ProfileRegion(ID, LValueType, superRegion);
338dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
339dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
340dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  static bool classof(const MemRegion* R) {
3410312c0e09c9de480d78607972ac64a88f4e94a33Ted Kremenek    return R->getKind() == TypedViewRegionKind;
342dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
3431670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
3441670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek  const MemRegion *removeViews() const;
345dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu};
3466eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
347178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
348329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
349329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
350329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
35177cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion {
352329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
353329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
354329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  const CompoundLiteralExpr* CL;
355329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
356329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg)
35777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
358329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
359329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
360329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const CompoundLiteralExpr* CL,
361329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
362329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
363a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
36477cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    return C.getCanonicalType(CL->getType());
36577cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
3666eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
367329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
368329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
369329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void print(llvm::raw_ostream& os) const;
370329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
37111a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek  const CompoundLiteralExpr* getLiteralExpr() const { return CL; }
37211a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek
373329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
374329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
375329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
376329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
377178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
3789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion {
3799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
3809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Decl* D;
3819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
382993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  DeclRegion(const Decl* d, const MemRegion* sReg, Kind k)
3839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : TypedRegion(sReg, k), D(d) {}
3849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D,
3869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
3879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
388bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
389bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu  const Decl* getDecl() const { return D; }
3909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
3916eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
392e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
393e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
394e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS;
395e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
3969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
3999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
4009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
401993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  VarRegion(const VarDecl* vd, const MemRegion* sReg)
4029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
4039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
404250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* VD,
4056304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
4069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
4079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
4106eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  const VarDecl* getDecl() const { return cast<VarDecl>(D); }
4119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
412a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
4136eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
4146eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    return C.getCanonicalType(getDecl()->getType());
4156eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
4166eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
4179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void print(llvm::raw_ostream& os) const;
4189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
4209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
4219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
4239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
4259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
4269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
427993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  FieldRegion(const FieldDecl* fd, const MemRegion* sReg)
4289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
4299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4304bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
4314bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
4324bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  void print(llvm::raw_ostream& os) const;
4334bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
4344bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  const FieldDecl* getDecl() const { return cast<FieldDecl>(D); }
4356eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
436a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
4376eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
438e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu    return C.getCanonicalType(getDecl()->getType());
4396eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
4404bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
4416304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl* FD,
4426304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
4439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
4449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
4479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
4489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
4509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
451a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion {
452a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
453a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  friend class MemRegionManager;
454a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
455a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg)
456a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {}
457a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
4586304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
4596304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const ObjCInterfaceDecl* ivd,
460a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek                            const MemRegion* superRegion) {
461a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind);
462a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
463a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
464a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic:
465a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  const ObjCInterfaceDecl* getInterface() const {
466a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return cast<ObjCInterfaceDecl>(D);
467a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
468a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
469a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
4703b3a45858c6b2a45114e91902c3bf3c4b7f5f302Daniel Dunbar    return C.getObjCInterfaceType(getInterface());
471a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
472a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
473a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  static bool classof(const MemRegion* R) {
474a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return R->getKind() == ObjCObjectRegionKind;
475a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
476a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek};
477a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
4789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
4799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
4819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
482993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg)
4839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
4849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4856304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl* ivd,
4866304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
4879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
4889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
4919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); }
492a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext&) const { return getDecl()->getType(); }
4939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
4959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
4969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
498511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
49927b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion {
500511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
501511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
502f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType ElementType;
503511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  SVal Index;
504511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
505f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ElementRegion(QualType elementType, SVal Idx, const MemRegion* sReg)
506f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    : TypedRegion(sReg, ElementRegionKind),
507f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek      ElementType(elementType), Index(Idx) {
5083d8173c1c68f451c7492f92023d829c626845925Chris Lattner    assert((!isa<nonloc::ConcreteInt>(&Idx) ||
5093d8173c1c68f451c7492f92023d829c626845925Chris Lattner           cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) &&
51043b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
5110395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
512abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek
513f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType,
514f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek                            SVal Idx, const MemRegion* superRegion);
515511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
516511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
517511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
5186e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu  SVal getIndex() const { return Index; }
5196e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
520a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext&) const {
521f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
522f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  }
523f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek
524f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType getElementType() const {
525f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
526abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
527abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek
528b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu  void print(llvm::raw_ostream& os) const;
529b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
530511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
531511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
532511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
533511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
534511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
535511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
536ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek
537ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy>
538ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const {
539ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  const MemRegion *R = this;
540ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek
541ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  do {
542ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek    if (const RegionTy* RT = dyn_cast<RegionTy>(R))
543ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek      return RT;
544ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek
545ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek    if (const TypedViewRegion *TR = dyn_cast<TypedViewRegion>(R)) {
546ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek      R = TR->getSuperRegion();
547ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek      continue;
548ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek    }
549ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek
550ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek    break;
551ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  }
552ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  while (R);
553ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek
554ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  return 0;
555ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}
556511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
5579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
5589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
5599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
5609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
5629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
5639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
5649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* globals;
5669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* stack;
5679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* heap;
568178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  MemSpaceRegion* unknown;
569ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  MemSpaceRegion* code;
570dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
5719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
5729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegionManager(llvm::BumpPtrAllocator& a)
57383a1d1d1a28aafca1f2a271189b78a299b4c9d65Ted Kremenek    : A(a), globals(0), stack(0), heap(0), unknown(0), code(0) {}
5749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ~MemRegionManager() {}
5769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getStackRegion - Retrieve the memory region associated with the
5789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  current stack frame.
5799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getStackRegion();
5809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
5829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  all global variables.
5839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getGlobalsRegion();
5849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
5869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
5879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getHeapRegion();
588178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
589178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
590178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
591178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  MemSpaceRegion* getUnknownRegion();
592c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
593ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  MemSpaceRegion* getCodeRegion();
594ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
595c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu  bool isGlobalsRegion(const MemRegion* R) {
596ce63911d6bdd795f63365723d4cdaa6998529e1eZhongxing Xu    assert(R);
597c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu    return R == globals;
598c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu  }
5994193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu
6004193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu  /// onStack - check if the region is allocated on the stack.
6014193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu  bool onStack(const MemRegion* R);
6024193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu
6034193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu  /// onHeap - check if the region is allocated on the heap, usually by malloc.
6044193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu  bool onHeap(const MemRegion* R);
6059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
606250101353b711a409b075f1bc11070dddec7100bTed Kremenek  bool hasStackStorage(const MemRegion* R);
607250101353b711a409b075f1bc11070dddec7100bTed Kremenek
6087090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
6097090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  AllocaRegion* getAllocaRegion(const Expr* Ex, unsigned Cnt);
6107090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
611329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
612329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
613329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion*
614329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr* CL);
615329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
616993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  /// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
617e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek  SymbolicRegion* getSymbolicRegion(SymbolRef sym);
618e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
619e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  StringRegion* getStringRegion(const StringLiteral* Str);
620e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
6219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
6229a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek  ///  a specified VarDecl.
6239a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek  VarRegion* getVarRegion(const VarDecl* vd);
624329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
625f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  /// getElementRegion - Retrieve the memory region associated with the
626f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ///  associated element type, index, and super region.
627f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ElementRegion* getElementRegion(QualType elementType, SVal Idx,
628143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu                                  const MemRegion* superRegion,ASTContext &Ctx);
629511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
6309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
6319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
6329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
6339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
634abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  FieldRegion* getFieldRegion(const FieldDecl* fd,
635abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek                              const MemRegion* superRegion);
6369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
637a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  /// getObjCObjectRegion - Retrieve or create the memory region associated with
638a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ///  the instance of a specified Objective-C class.
639a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID,
640a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek                                  const MemRegion* superRegion);
641a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
6429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
6439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
6449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
6459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
6469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd,
647993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek                                    const MemRegion* superRegion);
648178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
649b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek  TypedViewRegion* getTypedViewRegion(QualType LValueType,
650b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek                                      const MemRegion* superRegion);
651dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
652ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  CodeTextRegion* getCodeTextRegion(SymbolRef sym, QualType t);
653ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  CodeTextRegion* getCodeTextRegion(const FunctionDecl* fd, QualType t);
654250101353b711a409b075f1bc11070dddec7100bTed Kremenek
655250101353b711a409b075f1bc11070dddec7100bTed Kremenek  template <typename RegionTy, typename A1>
656250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* getRegion(const A1 a1);
6576304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek
6586304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  template <typename RegionTy, typename A1>
6596304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  RegionTy* getRegion(const A1 a1, const MemRegion* superRegion);
6607ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
6617ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  template <typename RegionTy, typename A1, typename A2>
6627ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* getRegion(const A1 a1, const A2 a2);
663dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
6649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
6659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region);
666ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek};
667250101353b711a409b075f1bc11070dddec7100bTed Kremenek
668250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
669250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Out-of-line member template definitions.
670250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
671250101353b711a409b075f1bc11070dddec7100bTed Kremenek
672250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate<typename RegionTy> struct MemRegionManagerTrait;
673250101353b711a409b075f1bc11070dddec7100bTed Kremenek
674250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <typename RegionTy, typename A1>
675250101353b711a409b075f1bc11070dddec7100bTed KremenekRegionTy* MemRegionManager::getRegion(const A1 a1) {
676250101353b711a409b075f1bc11070dddec7100bTed Kremenek
677250101353b711a409b075f1bc11070dddec7100bTed Kremenek  const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion =
678250101353b711a409b075f1bc11070dddec7100bTed Kremenek    MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1);
679250101353b711a409b075f1bc11070dddec7100bTed Kremenek
680250101353b711a409b075f1bc11070dddec7100bTed Kremenek  llvm::FoldingSetNodeID ID;
681250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy::ProfileRegion(ID, a1, superRegion);
682250101353b711a409b075f1bc11070dddec7100bTed Kremenek  void* InsertPos;
683250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
684250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                                                   InsertPos));
685250101353b711a409b075f1bc11070dddec7100bTed Kremenek
686250101353b711a409b075f1bc11070dddec7100bTed Kremenek  if (!R) {
6876304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
6886304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek    new (R) RegionTy(a1, superRegion);
6896304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek    Regions.InsertNode(R, InsertPos);
6906304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  }
6916304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek
6926304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  return R;
6936304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek}
6946304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek
6956304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenektemplate <typename RegionTy, typename A1>
6966304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed KremenekRegionTy* MemRegionManager::getRegion(const A1 a1, const MemRegion *superRegion)
6976304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek{
6986304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  llvm::FoldingSetNodeID ID;
6996304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  RegionTy::ProfileRegion(ID, a1, superRegion);
7006304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  void* InsertPos;
7016304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
7026304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                                                                   InsertPos));
7036304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek
7046304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  if (!R) {
705250101353b711a409b075f1bc11070dddec7100bTed Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
706250101353b711a409b075f1bc11070dddec7100bTed Kremenek    new (R) RegionTy(a1, superRegion);
707250101353b711a409b075f1bc11070dddec7100bTed Kremenek    Regions.InsertNode(R, InsertPos);
708250101353b711a409b075f1bc11070dddec7100bTed Kremenek  }
709250101353b711a409b075f1bc11070dddec7100bTed Kremenek
710250101353b711a409b075f1bc11070dddec7100bTed Kremenek  return R;
711250101353b711a409b075f1bc11070dddec7100bTed Kremenek}
712250101353b711a409b075f1bc11070dddec7100bTed Kremenek
7137ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenektemplate <typename RegionTy, typename A1, typename A2>
7147ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed KremenekRegionTy* MemRegionManager::getRegion(const A1 a1, const A2 a2) {
7157ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
7167ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion =
7177ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek    MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1, a2);
7187ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
7197ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  llvm::FoldingSetNodeID ID;
7207ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy::ProfileRegion(ID, a1, a2, superRegion);
7217ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  void* InsertPos;
7227ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
7237ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                                                                   InsertPos));
7247ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
7257ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  if (!R) {
7267ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
7277ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek    new (R) RegionTy(a1, a2, superRegion);
7287ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek    Regions.InsertNode(R, InsertPos);
7297ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  }
7307ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
7317ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  return R;
7327ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek}
7337ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
734250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
735250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Traits for constructing regions.
736250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
737250101353b711a409b075f1bc11070dddec7100bTed Kremenek
7387ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenektemplate <> struct MemRegionManagerTrait<AllocaRegion> {
7397ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  typedef MemRegion SuperRegionTy;
7407ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr,
7417ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                                             const Expr *, unsigned) {
7427ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek    return MRMgr.getStackRegion();
7437ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  }
7447ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek};
7457ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
746250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<CompoundLiteralRegion> {
747250101353b711a409b075f1bc11070dddec7100bTed Kremenek  typedef MemRegion SuperRegionTy;
748250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr,
749250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                             const CompoundLiteralExpr *CL) {
750250101353b711a409b075f1bc11070dddec7100bTed Kremenek
751250101353b711a409b075f1bc11070dddec7100bTed Kremenek    return CL->isFileScope() ? MRMgr.getGlobalsRegion()
752250101353b711a409b075f1bc11070dddec7100bTed Kremenek                             : MRMgr.getStackRegion();
753250101353b711a409b075f1bc11070dddec7100bTed Kremenek  }
754250101353b711a409b075f1bc11070dddec7100bTed Kremenek};
755250101353b711a409b075f1bc11070dddec7100bTed Kremenek
756250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<StringRegion> {
757250101353b711a409b075f1bc11070dddec7100bTed Kremenek  typedef MemSpaceRegion SuperRegionTy;
758250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr,
759250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                             const StringLiteral*) {
760250101353b711a409b075f1bc11070dddec7100bTed Kremenek    return MRMgr.getGlobalsRegion();
761250101353b711a409b075f1bc11070dddec7100bTed Kremenek  }
762250101353b711a409b075f1bc11070dddec7100bTed Kremenek};
763250101353b711a409b075f1bc11070dddec7100bTed Kremenek
764250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<VarRegion> {
765250101353b711a409b075f1bc11070dddec7100bTed Kremenek  typedef MemRegion SuperRegionTy;
766250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr,
767250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                             const VarDecl *d) {
768250101353b711a409b075f1bc11070dddec7100bTed Kremenek    return d->hasLocalStorage() ? MRMgr.getStackRegion()
769250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                : MRMgr.getGlobalsRegion();
770250101353b711a409b075f1bc11070dddec7100bTed Kremenek  }
771250101353b711a409b075f1bc11070dddec7100bTed Kremenek};
772250101353b711a409b075f1bc11070dddec7100bTed Kremenek
773250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<SymbolicRegion> {
774250101353b711a409b075f1bc11070dddec7100bTed Kremenek  typedef MemRegion SuperRegionTy;
775250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr,
776250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                             SymbolRef) {
777250101353b711a409b075f1bc11070dddec7100bTed Kremenek    return MRMgr.getUnknownRegion();
778250101353b711a409b075f1bc11070dddec7100bTed Kremenek  }
779250101353b711a409b075f1bc11070dddec7100bTed Kremenek};
780250101353b711a409b075f1bc11070dddec7100bTed Kremenek
781250101353b711a409b075f1bc11070dddec7100bTed Kremenek
782be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace
7839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
784250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
785250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions.
786250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
787250101353b711a409b075f1bc11070dddec7100bTed Kremenek
788be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm {
789be91224894e1501133e224934285ba6440bf5b59Ted Kremenekstatic inline raw_ostream& operator<<(raw_ostream& O,
790be91224894e1501133e224934285ba6440bf5b59Ted Kremenek                                      const clang::MemRegion* R) {
791be91224894e1501133e224934285ba6440bf5b59Ted Kremenek  R->print(O);
792be91224894e1501133e224934285ba6440bf5b59Ted Kremenek  return O;
793be91224894e1501133e224934285ba6440bf5b59Ted Kremenek}
794be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace
7959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
7969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
797