MemRegion.h revision eeea45611d45238c34474c183cee96d47ae79e24
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;
36bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekclass MemSpaceRegion;
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();
62a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &getContext() const;
639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
66a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
67a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  virtual MemRegionManager* getMemRegionManager() const = 0;
68a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::string getString() const;
70bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek
71bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemSpaceRegion *getMemorySpace() const;
72ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek
73ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek  bool hasStackStorage() const;
74ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek
751508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasParametersStorage() const;
761508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek
771508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsStorage() const;
781508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek
791508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsOrParametersStorage() const;
801508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek
81ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek  bool hasHeapStorage() const;
82bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek
83bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  bool hasHeapOrStackStorage() const;
84b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
857f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek  virtual void print(llvm::raw_ostream& os) const;
867f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
877f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek  void printStdErr() const;
889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  Kind getKind() const { return kind; }
9041168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
91ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  template<typename RegionTy> const RegionTy* getAs() const;
92ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek
93f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu  virtual bool isBoundable() const { return false; }
94b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion*) { return true; }
969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space";
999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
1009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
1019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
102a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
103a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected:
104a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager *Mgr;
105a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
106a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemSpaceRegion(MemRegionManager *mgr) : MemRegion(MemSpaceRegionKind),
107a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek                                          Mgr(mgr) {}
1089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
109a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager* getMemRegionManager() const {
110a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    return Mgr;
111a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  }
112a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
1139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
1159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
116a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  bool isBoundable() const { return false; }
11741168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
1189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
1199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == MemSpaceRegionKind;
1209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
123993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
124993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
125993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
1269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
127993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  const MemRegion* superRegion;
128993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
1299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
1319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
1329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
133a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
134a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager* getMemRegionManager() const;
1354193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu
1367e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  bool isSubRegionOf(const MemRegion* R) const;
1377e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu
1389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
139026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() > MemSpaceRegionKind;
140993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
141993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
142ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
14382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
14482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
14582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
14682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
14782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
14882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
14982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
15082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* Ex;
15182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
1527ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion *superRegion)
15382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
15482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
15582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
15682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
15782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* getExpr() const { return Ex; }
1589852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
1599852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
1609852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
16182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
16282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
16382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,
1647ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                            unsigned Cnt, const MemRegion *superRegion);
16582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
16682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void print(llvm::raw_ostream& os) const;
16782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
16882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
16982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
17082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
17182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek};
17282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
173993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
174993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
175993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
176993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
177993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
178993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
179a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  virtual QualType getValueType(ASTContext &C) const = 0;
1806eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
181ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  virtual QualType getLocationType(ASTContext& C) const {
1826eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can possibly optimize this later to cache this value.
183a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu    return C.getPointerType(getValueType(C));
1846eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
18514553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek
186a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getDesugaredValueType(ASTContext& C) const {
187a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu    QualType T = getValueType(C);
1881b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek    return T.getTypePtr() ? T->getDesugaredType() : T;
18914553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
19014553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek
191ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  QualType getDesugaredLocationType(ASTContext& C) const {
192ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return getLocationType(C)->getDesugaredType();
19314553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
1941b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek
195a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  bool isBoundable() const {
196a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    return !getValueType(getContext()).isNull();
19741168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek  }
1986eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
199993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
2009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
2019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS;
2029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
2049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
205ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// CodeTextRegion - A region that represents code texts of a function. It wraps
206ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// two kinds of code texts: real function and symbolic function. Real function
207ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// is a function declared in the program. Symbolic function is a function
208ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu/// pointer that we don't know which function it points to.
209ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xuclass CodeTextRegion : public TypedRegion {
210ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
211ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  enum CodeKind { Declared, Symbolic };
212ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
213ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xuprivate:
214ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  // The function pointer kind that this CodeTextRegion represents.
215ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  CodeKind codekind;
216ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
217ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  // Data may be a SymbolRef or FunctionDecl*.
218ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  const void* Data;
219ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
220ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  // Cached function pointer type.
221ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  QualType LocationType;
222ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
223ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
224ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
225ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  CodeTextRegion(const FunctionDecl* fd, QualType t, const MemRegion* sreg)
226ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    : TypedRegion(sreg, CodeTextRegionKind),
227ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu      codekind(Declared),
228ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu      Data(fd),
229ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu      LocationType(t) {}
230ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
231ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  CodeTextRegion(SymbolRef sym, QualType t, const MemRegion* sreg)
232ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    : TypedRegion(sreg, CodeTextRegionKind),
233ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu      codekind(Symbolic),
234ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu      Data(sym),
235ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu      LocationType(t) {}
236ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
237a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext &C) const {
238ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    // Do not get the object type of a CodeTextRegion.
239ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    assert(0);
240ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    return QualType();
241ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
242ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
243ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  QualType getLocationType(ASTContext &C) const {
244ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    return LocationType;
245ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
246369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu
247369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu  bool isDeclared() const { return codekind == Declared; }
248264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu  bool isSymbolic() const { return codekind == Symbolic; }
249369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu
250369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu  const FunctionDecl* getDecl() const {
251369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu    assert(codekind == Declared);
252369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu    return static_cast<const FunctionDecl*>(Data);
253369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu  }
2548ec3d7dbff9d526fcdce4fbea683830192340c90Ted Kremenek
25572e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  SymbolRef getSymbol() const {
25672e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek    assert(codekind == Symbolic);
25772e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek    return const_cast<SymbolRef>(static_cast<const SymbolRef>(Data));
25872e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  }
25972e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek
260a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  bool isBoundable() const { return false; }
26172e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek
26272e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  virtual void print(llvm::raw_ostream& os) const;
263ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
264ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
265ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
266ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
2670dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu                            const void* data, QualType t, const MemRegion*);
268ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
269ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static bool classof(const MemRegion* R) {
270ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    return R->getKind() == CodeTextRegionKind;
271ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
272ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu};
273ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
274026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
275026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  clases, SymbolicRegion represents a region that serves as an alias for
276026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  either a real region, a NULL pointer, etc.  It essentially is used to
277026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  map the concept of symbolic values into the domain of regions.  Symbolic
278026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  regions do not need to be typed.
279e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion {
280026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected:
281026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  const SymbolRef sym;
282026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
283026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic:
284e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek  SymbolicRegion(const SymbolRef s, const MemRegion* sreg)
285e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek    : SubRegion(sreg, SymbolicRegionKind), sym(s) {}
286026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
287026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  SymbolRef getSymbol() const {
288026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return sym;
289026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
290026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
2919852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
2929852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
293026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
294026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
295250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
296250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            SymbolRef sym,
297250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            const MemRegion* superRegion);
298026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
299026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  void print(llvm::raw_ostream& os) const;
300026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
301026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  static bool classof(const MemRegion* R) {
302026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() == SymbolicRegionKind;
303026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
304026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu};
305026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
306e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
307e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion {
308e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
309e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
310e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
311e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
312250101353b711a409b075f1bc11070dddec7100bTed Kremenek  StringRegion(const StringLiteral* str, const MemRegion* sreg)
313e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    : TypedRegion(sreg, StringRegionKind), Str(str) {}
314e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
315e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
316e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
317e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
318e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
319e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
3206613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
3216613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
3226eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
323a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
324ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return Str->getType();
325ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  }
326e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
3270a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu  bool isBoundable() const { return false; }
3280a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
329e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
330e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
331e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
332e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
333cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu  void print(llvm::raw_ostream& os) const;
334cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
335e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
336e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
337e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
338e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
339e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
3400312c0e09c9de480d78607972ac64a88f4e94a33Ted Kremenekclass TypedViewRegion : public TypedRegion {
341dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  friend class MemRegionManager;
342b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek  QualType LValueType;
343dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
344b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek  TypedViewRegion(QualType lvalueType, const MemRegion* sreg)
345b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek    : TypedRegion(sreg, TypedViewRegionKind), LValueType(lvalueType) {}
346dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
347dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T,
348dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu                            const MemRegion* superRegion);
349dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
350dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xupublic:
351dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
352500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek  void print(llvm::raw_ostream& os) const;
353500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek
354ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  QualType getLocationType(ASTContext&) const {
355e6fbdf538bc50122876639e08a1401e2bc9555baTed Kremenek    return LValueType;
356e6fbdf538bc50122876639e08a1401e2bc9555baTed Kremenek  }
357e6fbdf538bc50122876639e08a1401e2bc9555baTed Kremenek
358a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext&) const {
359b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek    const PointerType* PTy = LValueType->getAsPointerType();
3602e3f73b963b5831d6230f69e157b0964b11eff91Zhongxing Xu    assert(PTy);
3612e3f73b963b5831d6230f69e157b0964b11eff91Zhongxing Xu    return PTy->getPointeeType();
362dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
363b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek
364a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  bool isBoundable() const {
365b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek    return isa<PointerType>(LValueType);
366b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek  }
367dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
368dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
369b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek    ProfileRegion(ID, LValueType, superRegion);
370dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
371dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
372dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  static bool classof(const MemRegion* R) {
3730312c0e09c9de480d78607972ac64a88f4e94a33Ted Kremenek    return R->getKind() == TypedViewRegionKind;
374dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
3751670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
3761670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek  const MemRegion *removeViews() const;
377dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu};
3786eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
379178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
380329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
381329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
382329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
38377cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion {
384329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
385329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
386329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  const CompoundLiteralExpr* CL;
387329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
388329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg)
38977cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
390329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
391329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
392329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const CompoundLiteralExpr* CL,
393329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
394329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
395a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
39677cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    return C.getCanonicalType(CL->getType());
39777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
3980a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
3999a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu  bool isBoundable() const { return !CL->isFileScope(); }
4009a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu
401329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
402329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
403329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void print(llvm::raw_ostream& os) const;
404329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
40511a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek  const CompoundLiteralExpr* getLiteralExpr() const { return CL; }
40611a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek
407329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
408329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
409329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
410329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
411178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
4129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion {
4139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
4149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Decl* D;
4159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
416993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  DeclRegion(const Decl* d, const MemRegion* sReg, Kind k)
4179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : TypedRegion(sReg, k), D(d) {}
4189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D,
4209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
4219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
422bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
423bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu  const Decl* getDecl() const { return D; }
4249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
4256eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
426e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
427e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
428e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS;
429e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
4309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
4319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
4339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
4349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
435993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  VarRegion(const VarDecl* vd, const MemRegion* sReg)
4369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
4379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
438250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* VD,
4396304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
4409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
4419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
4446eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  const VarDecl* getDecl() const { return cast<VarDecl>(D); }
4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
446a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
4476eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
4486eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    return C.getCanonicalType(getDecl()->getType());
4496eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
4506eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
4519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void print(llvm::raw_ostream& os) const;
4529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
4549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
4559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
4579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
4599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
4609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
461993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  FieldRegion(const FieldDecl* fd, const MemRegion* sReg)
4629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
4639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4644bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
4654bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
4664bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  void print(llvm::raw_ostream& os) const;
4674bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
4684bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  const FieldDecl* getDecl() const { return cast<FieldDecl>(D); }
4696eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
470a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
4716eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
472e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu    return C.getCanonicalType(getDecl()->getType());
4736eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
4744bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
4756304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl* FD,
4766304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
4779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
4789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
4819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
4829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
4849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
485a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion {
486a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
487a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  friend class MemRegionManager;
488a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
489a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg)
490a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {}
491a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
4926304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
4936304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const ObjCInterfaceDecl* ivd,
494a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek                            const MemRegion* superRegion) {
495a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind);
496a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
497a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
498a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic:
499a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  const ObjCInterfaceDecl* getInterface() const {
500a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return cast<ObjCInterfaceDecl>(D);
501a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
502a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
503a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
5043b3a45858c6b2a45114e91902c3bf3c4b7f5f302Daniel Dunbar    return C.getObjCInterfaceType(getInterface());
505a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
506a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
507a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  static bool classof(const MemRegion* R) {
508a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return R->getKind() == ObjCObjectRegionKind;
509a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
510a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek};
511a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
5129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
5139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
5159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
516993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg)
5179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
5189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5196304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl* ivd,
5206304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
5219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
5229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
5239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
5259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); }
526a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext&) const { return getDecl()->getType(); }
5279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
5299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
5309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
5319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
532511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
53327b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion {
534511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
535511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
536f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType ElementType;
537511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  SVal Index;
538511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
539f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ElementRegion(QualType elementType, SVal Idx, const MemRegion* sReg)
540f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    : TypedRegion(sReg, ElementRegionKind),
541f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek      ElementType(elementType), Index(Idx) {
5423d8173c1c68f451c7492f92023d829c626845925Chris Lattner    assert((!isa<nonloc::ConcreteInt>(&Idx) ||
5433d8173c1c68f451c7492f92023d829c626845925Chris Lattner           cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) &&
54443b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
5450395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
546abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek
547f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType,
548f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek                            SVal Idx, const MemRegion* superRegion);
549511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
550511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
551511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
5526e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu  SVal getIndex() const { return Index; }
5536e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
554a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext&) const {
555f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
556f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  }
557f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek
558f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType getElementType() const {
559f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
560abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
561abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek
562b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu  void print(llvm::raw_ostream& os) const;
563b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
564511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
565511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
566511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
567511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
568511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
569511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
570ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek
571ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy>
572ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const {
573ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  const MemRegion *R = this;
574ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek
575ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  do {
576ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek    if (const RegionTy* RT = dyn_cast<RegionTy>(R))
577ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek      return RT;
578ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek
579ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek    if (const TypedViewRegion *TR = dyn_cast<TypedViewRegion>(R)) {
580ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek      R = TR->getSuperRegion();
581ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek      continue;
582ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek    }
583ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek
584ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek    break;
585ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  }
586ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  while (R);
587ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek
588ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  return 0;
589ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}
590511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
5919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
5929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
5939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
5949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
596a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &C;
5979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
5989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
5999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
600d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *globals;
601d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *stack;
602d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *stackArguments;
603d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *heap;
604d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *unknown;
605d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *code;
606dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
6079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
608a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a)
609d05552a21377f493c882298c59e8829040b01d34Ted Kremenek    : C(c), A(a), globals(0), stack(0), stackArguments(0), heap(0),
610d05552a21377f493c882298c59e8829040b01d34Ted Kremenek      unknown(0), code(0) {}
6119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
6129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ~MemRegionManager() {}
6139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
614a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &getContext() { return C; }
615a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
6169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getStackRegion - Retrieve the memory region associated with the
6179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  current stack frame.
618d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *getStackRegion();
619d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
620d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  /// getStackArgumentsRegion - Retrieve the memory region associated with
621d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  ///  function/method arguments of the current stack frame.
622d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *getStackArgumentsRegion();
6239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
6249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
6259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  all global variables.
626d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *getGlobalsRegion();
6279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
6289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
6299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
630d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *getHeapRegion();
631178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
632178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
633178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
634d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *getUnknownRegion();
635c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
636d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *getCodeRegion();
637ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
6387090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
639d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  AllocaRegion *getAllocaRegion(const Expr* Ex, unsigned Cnt);
6407090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
641329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
642329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
643329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion*
644329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr* CL);
645329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
646993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  /// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
647e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek  SymbolicRegion* getSymbolicRegion(SymbolRef sym);
648e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
649e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  StringRegion* getStringRegion(const StringLiteral* Str);
650e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
6519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
6529a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek  ///  a specified VarDecl.
6539a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek  VarRegion* getVarRegion(const VarDecl* vd);
654329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
655f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  /// getElementRegion - Retrieve the memory region associated with the
656f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ///  associated element type, index, and super region.
657f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ElementRegion* getElementRegion(QualType elementType, SVal Idx,
658143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu                                  const MemRegion* superRegion,ASTContext &Ctx);
659511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
6609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
6619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
6629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
6639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
664abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  FieldRegion* getFieldRegion(const FieldDecl* fd,
665abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek                              const MemRegion* superRegion);
6669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
667a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  /// getObjCObjectRegion - Retrieve or create the memory region associated with
668a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ///  the instance of a specified Objective-C class.
669a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID,
670a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek                                  const MemRegion* superRegion);
671a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
6729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
6739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
6749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
6759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
6769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd,
677993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek                                    const MemRegion* superRegion);
678178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
679b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek  TypedViewRegion* getTypedViewRegion(QualType LValueType,
680b2dea734527ae75281642a1c6ace28f9e00cab11Ted Kremenek                                      const MemRegion* superRegion);
681dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
682ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  CodeTextRegion* getCodeTextRegion(SymbolRef sym, QualType t);
683ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  CodeTextRegion* getCodeTextRegion(const FunctionDecl* fd, QualType t);
684250101353b711a409b075f1bc11070dddec7100bTed Kremenek
685250101353b711a409b075f1bc11070dddec7100bTed Kremenek  template <typename RegionTy, typename A1>
686250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* getRegion(const A1 a1);
6876304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek
6886304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  template <typename RegionTy, typename A1>
689eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion);
6907ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
6917ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  template <typename RegionTy, typename A1, typename A2>
6927ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* getRegion(const A1 a1, const A2 a2);
693dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
694dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu  bool isGlobalsRegion(const MemRegion* R) {
695dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu    assert(R);
696dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu    return R == globals;
697dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu  }
698dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu
6999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
7009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region);
701ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek};
702250101353b711a409b075f1bc11070dddec7100bTed Kremenek
703250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
704a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions.
705250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
706250101353b711a409b075f1bc11070dddec7100bTed Kremenek
707a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekinline ASTContext& MemRegion::getContext() const {
708a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  return getMemRegionManager()->getContext();
709a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
710a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
711250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate<typename RegionTy> struct MemRegionManagerTrait;
712250101353b711a409b075f1bc11070dddec7100bTed Kremenek
713250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <typename RegionTy, typename A1>
714250101353b711a409b075f1bc11070dddec7100bTed KremenekRegionTy* MemRegionManager::getRegion(const A1 a1) {
715250101353b711a409b075f1bc11070dddec7100bTed Kremenek
716250101353b711a409b075f1bc11070dddec7100bTed Kremenek  const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion =
717250101353b711a409b075f1bc11070dddec7100bTed Kremenek    MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1);
718250101353b711a409b075f1bc11070dddec7100bTed Kremenek
719250101353b711a409b075f1bc11070dddec7100bTed Kremenek  llvm::FoldingSetNodeID ID;
720250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy::ProfileRegion(ID, a1, superRegion);
721250101353b711a409b075f1bc11070dddec7100bTed Kremenek  void* InsertPos;
722250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
723250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                                                   InsertPos));
724250101353b711a409b075f1bc11070dddec7100bTed Kremenek
725250101353b711a409b075f1bc11070dddec7100bTed Kremenek  if (!R) {
7266304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
7276304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek    new (R) RegionTy(a1, superRegion);
7286304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek    Regions.InsertNode(R, InsertPos);
7296304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  }
7306304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek
7316304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  return R;
7326304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek}
7336304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek
7346304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenektemplate <typename RegionTy, typename A1>
735eeea45611d45238c34474c183cee96d47ae79e24Ted KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1,
736eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek                                         const MemRegion *superRegion) {
7376304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  llvm::FoldingSetNodeID ID;
7386304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  RegionTy::ProfileRegion(ID, a1, superRegion);
7396304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  void* InsertPos;
7406304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
7416304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                                                                   InsertPos));
7426304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek
7436304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  if (!R) {
744250101353b711a409b075f1bc11070dddec7100bTed Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
745250101353b711a409b075f1bc11070dddec7100bTed Kremenek    new (R) RegionTy(a1, superRegion);
746250101353b711a409b075f1bc11070dddec7100bTed Kremenek    Regions.InsertNode(R, InsertPos);
747250101353b711a409b075f1bc11070dddec7100bTed Kremenek  }
748250101353b711a409b075f1bc11070dddec7100bTed Kremenek
749250101353b711a409b075f1bc11070dddec7100bTed Kremenek  return R;
750250101353b711a409b075f1bc11070dddec7100bTed Kremenek}
751250101353b711a409b075f1bc11070dddec7100bTed Kremenek
7527ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenektemplate <typename RegionTy, typename A1, typename A2>
7537ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed KremenekRegionTy* MemRegionManager::getRegion(const A1 a1, const A2 a2) {
7547ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
7557ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion =
7567ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek    MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1, a2);
7577ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
7587ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  llvm::FoldingSetNodeID ID;
7597ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy::ProfileRegion(ID, a1, a2, superRegion);
7607ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  void* InsertPos;
7617ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
7627ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                                                                   InsertPos));
7637ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
7647ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  if (!R) {
7657ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
7667ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek    new (R) RegionTy(a1, a2, superRegion);
7677ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek    Regions.InsertNode(R, InsertPos);
7687ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  }
7697ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
7707ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  return R;
7717ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek}
7727ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
773250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
774250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Traits for constructing regions.
775250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
776250101353b711a409b075f1bc11070dddec7100bTed Kremenek
7777ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenektemplate <> struct MemRegionManagerTrait<AllocaRegion> {
7787ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  typedef MemRegion SuperRegionTy;
7797ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr,
7807ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                                             const Expr *, unsigned) {
7817ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek    return MRMgr.getStackRegion();
7827ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  }
7837ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek};
7847ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
785250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<CompoundLiteralRegion> {
786250101353b711a409b075f1bc11070dddec7100bTed Kremenek  typedef MemRegion SuperRegionTy;
787250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr,
788250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                             const CompoundLiteralExpr *CL) {
789250101353b711a409b075f1bc11070dddec7100bTed Kremenek
790250101353b711a409b075f1bc11070dddec7100bTed Kremenek    return CL->isFileScope() ? MRMgr.getGlobalsRegion()
791250101353b711a409b075f1bc11070dddec7100bTed Kremenek                             : MRMgr.getStackRegion();
792250101353b711a409b075f1bc11070dddec7100bTed Kremenek  }
793250101353b711a409b075f1bc11070dddec7100bTed Kremenek};
794250101353b711a409b075f1bc11070dddec7100bTed Kremenek
795250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<StringRegion> {
796250101353b711a409b075f1bc11070dddec7100bTed Kremenek  typedef MemSpaceRegion SuperRegionTy;
797250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr,
798250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                             const StringLiteral*) {
799250101353b711a409b075f1bc11070dddec7100bTed Kremenek    return MRMgr.getGlobalsRegion();
800250101353b711a409b075f1bc11070dddec7100bTed Kremenek  }
801250101353b711a409b075f1bc11070dddec7100bTed Kremenek};
802250101353b711a409b075f1bc11070dddec7100bTed Kremenek
803250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<VarRegion> {
804250101353b711a409b075f1bc11070dddec7100bTed Kremenek  typedef MemRegion SuperRegionTy;
805250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr,
806250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                             const VarDecl *d) {
807d05552a21377f493c882298c59e8829040b01d34Ted Kremenek    if (d->hasLocalStorage()) {
808d05552a21377f493c882298c59e8829040b01d34Ted Kremenek      return isa<ParmVarDecl>(d) || isa<ImplicitParamDecl>(d)
809d05552a21377f493c882298c59e8829040b01d34Ted Kremenek             ? MRMgr.getStackArgumentsRegion() : MRMgr.getStackRegion();
810d05552a21377f493c882298c59e8829040b01d34Ted Kremenek    }
811d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
812d05552a21377f493c882298c59e8829040b01d34Ted Kremenek    return MRMgr.getGlobalsRegion();
813250101353b711a409b075f1bc11070dddec7100bTed Kremenek  }
814250101353b711a409b075f1bc11070dddec7100bTed Kremenek};
815250101353b711a409b075f1bc11070dddec7100bTed Kremenek
816250101353b711a409b075f1bc11070dddec7100bTed Kremenektemplate <> struct MemRegionManagerTrait<SymbolicRegion> {
817250101353b711a409b075f1bc11070dddec7100bTed Kremenek  typedef MemRegion SuperRegionTy;
818250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr,
819250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                             SymbolRef) {
820250101353b711a409b075f1bc11070dddec7100bTed Kremenek    return MRMgr.getUnknownRegion();
821250101353b711a409b075f1bc11070dddec7100bTed Kremenek  }
822250101353b711a409b075f1bc11070dddec7100bTed Kremenek};
8230dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu
8240dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xutemplate<> struct MemRegionManagerTrait<CodeTextRegion> {
8250dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu  typedef MemSpaceRegion SuperRegionTy;
8260dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu  static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr,
8270dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu                                             const FunctionDecl*, QualType) {
8280dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu    return MRMgr.getCodeRegion();
8290dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu  }
8300dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu  static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr,
8310dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu                                             SymbolRef, QualType) {
8320dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu    return MRMgr.getCodeRegion();
8330dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu  }
8340dea5241bca707789d706ed1fda3a29a8fedc4c0Zhongxing Xu};
835250101353b711a409b075f1bc11070dddec7100bTed Kremenek
836be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace
8379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
838250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
839250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions.
840250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
841250101353b711a409b075f1bc11070dddec7100bTed Kremenek
842be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm {
843be91224894e1501133e224934285ba6440bf5b59Ted Kremenekstatic inline raw_ostream& operator<<(raw_ostream& O,
844be91224894e1501133e224934285ba6440bf5b59Ted Kremenek                                      const clang::MemRegion* R) {
845be91224894e1501133e224934285ba6440bf5b59Ted Kremenek  R->print(O);
846be91224894e1501133e224934285ba6440bf5b59Ted Kremenek  return O;
847be91224894e1501133e224934285ba6440bf5b59Ted Kremenek}
848be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace
8499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
851