MemRegion.h revision 43b28d07019bc78447ecbbb721526de4ffd83f20
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:
41993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  enum Kind { MemSpaceRegionKind, SymbolicRegionKind,
4282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek              AllocaRegionKind,
439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              // Typed regions.
449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              BEG_TYPED_REGIONS,
4577cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu               CompoundLiteralRegionKind,
46329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek               StringRegionKind, ElementRegionKind,
47dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu               AnonTypedRegionKind,
48dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu               AnonPointeeRegionKind,
49329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek               // Decl Regions.
50329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                 BEG_DECL_REGIONS,
51329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                  VarRegionKind, FieldRegionKind,
52329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                  ObjCIvarRegionKind, ObjCObjectRegionKind,
53329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                 END_DECL_REGIONS,
549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek              END_TYPED_REGIONS };
559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // virtual MemExtent getExtent(MemRegionManager& mrm) const = 0;
649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::string getString() const;
67b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void print(llvm::raw_ostream& os) const;
699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  Kind getKind() const { return kind; }
71b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion*) { return true; }
739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space";
769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion() : MemRegion(MemSpaceRegionKind) {}
809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  //RegionExtent getExtent() const { return UndefinedExtent(); }
839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == MemSpaceRegionKind;
889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
91993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
92993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
93993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
95993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  const MemRegion* superRegion;
96993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
1009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
1019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
104993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek    return R->getKind() > SymbolicRegionKind;
105993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
106993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
107993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
10882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
10982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
11082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
11182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
11282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
11382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
11482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
11582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* Ex;
11682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
11782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion* superRegion)
11882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
11982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
12082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
12182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
12282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* getExpr() const { return Ex; }
12382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
12482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
12582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
12682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,
12782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                            unsigned Cnt);
12882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
12982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void print(llvm::raw_ostream& os) const;
13082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
13182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
13282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
13382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
13482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek};
13582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
136993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
137993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  clases, SymbolicRegion represents a region that serves as an alias for
138993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  either a real region, a NULL pointer, etc.  It essentially is used to
139993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  map the concept of symbolic values into the domain of regions.  Symbolic
140993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  regions do not need to be typed.
141993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SymbolicRegion : public MemRegion {
142993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
1432dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek  const SymbolRef sym;
144993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
145993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
1462dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek  SymbolicRegion(const SymbolRef s) : MemRegion(SymbolicRegionKind), sym(s) {}
147993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
1482dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek  SymbolRef getSymbol() const {
149993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek    return sym;
150993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
151993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
152993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
1532dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym);
154993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
155993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  void print(llvm::raw_ostream& os) const;
156993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
157993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
158993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek    return R->getKind() == SymbolicRegionKind;
159993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
160993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
161993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
162993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
163993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
164993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
165993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
166993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
167993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
168a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  virtual QualType getType(ASTContext&) const = 0;
169993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
170993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
1719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
1729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS;
1739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
176e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
177e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion {
178e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
179e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
180e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
181e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
182e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
183e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
184e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  StringRegion(const StringLiteral* str, MemRegion* sreg)
185e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    : TypedRegion(sreg, StringRegionKind), Str(str) {}
186e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
187e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
188e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
189e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
190e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
191e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
1926613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
1936613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
1946613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
195e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu  QualType getType(ASTContext& C) const {
196e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu    return C.getCanonicalType(Str->getType());
197e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
198e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
199e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
200e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
201e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
202e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
203cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu  void print(llvm::raw_ostream& os) const;
204cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
205e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
206e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
207e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
208e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
209e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
210dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xuclass AnonTypedRegion : public TypedRegion {
211dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  friend class MemRegionManager;
212dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
213dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  QualType T;
214dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
215dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  AnonTypedRegion(QualType t, const MemRegion* sreg)
216dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu    : TypedRegion(sreg, AnonTypedRegionKind), T(t) {}
217dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
218dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T,
219dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu                            const MemRegion* superRegion);
220dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
221dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xupublic:
222dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
223dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  QualType getType(ASTContext& C) const {
224dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu    return T;
225dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
226dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
227dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
228dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu    ProfileRegion(ID, T, superRegion);
229dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
230dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
231dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  static bool classof(const MemRegion* R) {
232dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu    return R->getKind() == AnonTypedRegionKind;
233dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
234dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu};
235dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
236817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu/// AnonPointeeRegion - anonymous regions pointed-to by pointer function
237817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu///  parameters or pointer globals. In RegionStoreManager, we assume pointer
238817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu///  parameters or globals point at some anonymous region. Such regions are not
239817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu///  the regions associated with the pointer variables themselves.  They are
240c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu///  identified by the symbols that are concretized. We create them lazily.
2419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
242817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xuclass AnonPointeeRegion : public TypedRegion {
2439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
2449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
245c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu  // Sym - the symbol that is concretized.
246c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu  SymbolRef Sym;
247c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu
248c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu  // Ty - the type of the region.
249c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu  QualType T;
250c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu
251c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu  AnonPointeeRegion(SymbolRef sym, QualType t, MemRegion* sreg)
252c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu    : TypedRegion(sreg, AnonPointeeRegionKind), Sym(sym), T(t) {}
253178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
2549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
255817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu  QualType getType(ASTContext& C) const;
2569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
257c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef Sym,
258817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu                            const MemRegion* superRegion);
259178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
260817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
261c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu    ProfileRegion(ID, Sym, superRegion);
262817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu  }
263178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
264817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu  static bool classof(const MemRegion* R) {
265817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu    return R->getKind() == AnonPointeeRegionKind;
266817c67daf845b35a242cd9b68e9c5eccf09c63dfZhongxing Xu  }
267178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu};
268178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
269329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
270329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
271329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
27277cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion {
273329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
274329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
275329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  const CompoundLiteralExpr* CL;
276329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
277329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg)
27877cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
279329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
280329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
281329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const CompoundLiteralExpr* CL,
282329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
283329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
28477cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  QualType getType(ASTContext& C) const {
28577cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    return C.getCanonicalType(CL->getType());
28677cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
28777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu
288329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
289329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
290329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void print(llvm::raw_ostream& os) const;
291329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
29211a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek  const CompoundLiteralExpr* getLiteralExpr() const { return CL; }
29311a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek
294329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
295329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
296329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
297329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
298178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
2999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion {
3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
3019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Decl* D;
3029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
303993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  DeclRegion(const Decl* d, const MemRegion* sReg, Kind k)
3049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : TypedRegion(sReg, k), D(d) {}
3059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D,
3079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
3089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
309bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
310bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu  const Decl* getDecl() const { return D; }
3119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
312e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
313e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
314e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
315e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS;
316e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
3179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
3209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
3219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
322993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  VarRegion(const VarDecl* vd, const MemRegion* sReg)
3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD,
3269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
3279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
3289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
3319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const VarDecl* getDecl() const { return cast<VarDecl>(D); }
332e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu  QualType getType(ASTContext& C) const {
333e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu    return C.getCanonicalType(getDecl()->getType());
334e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu  }
3359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void print(llvm::raw_ostream& os) const;
3379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
3399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
3409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
3449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
3459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
346993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  FieldRegion(const FieldDecl* fd, const MemRegion* sReg)
3479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
3489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3494bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
3504bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
3514bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  void print(llvm::raw_ostream& os) const;
3524bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
3534bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  const FieldDecl* getDecl() const { return cast<FieldDecl>(D); }
354e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu  QualType getType(ASTContext& C) const {
355e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu    return C.getCanonicalType(getDecl()->getType());
356e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu  }
3574bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
3589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD,
3599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
3609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
3619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
3649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
3659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
368a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion {
369a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
370a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  friend class MemRegionManager;
371a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
372a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg)
373a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {}
374a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
375a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCInterfaceDecl* ivd,
376a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek                            const MemRegion* superRegion) {
377a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind);
378a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
379a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
380a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic:
381a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  const ObjCInterfaceDecl* getInterface() const {
382a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return cast<ObjCInterfaceDecl>(D);
383a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
384a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
385a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  QualType getType(ASTContext& C) const {
386a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    ObjCInterfaceDecl* ID = const_cast<ObjCInterfaceDecl*>(getInterface());
387a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return C.getObjCInterfaceType(ID);
388a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
389a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
390a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  static bool classof(const MemRegion* R) {
391a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return R->getKind() == ObjCObjectRegionKind;
392a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
393a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek};
394a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
3959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
3969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
3989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
399993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg)
4009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
4019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd,
4039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
4049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
4059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
4089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); }
409a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  QualType getType(ASTContext&) const { return getDecl()->getType(); }
4109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
4129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
4139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
415511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
41627b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion {
417511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
418511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
419511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  SVal Index;
420511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
421511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ElementRegion(SVal Idx, const MemRegion* sReg)
4220395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu    : TypedRegion(sReg, ElementRegionKind), Index(Idx) {
42343b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner    assert(isa<nonloc::ConcreteInt>(&Idx) &&
42443b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned() &&
42543b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
4260395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
427511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
428511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx,
429511191ce8920160525611be2be754c32a0724c3eZhongxing Xu                            const MemRegion* superRegion);
430511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
431511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
432511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
4336e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu  SVal getIndex() const { return Index; }
4346e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
43527b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu  QualType getType(ASTContext&) const;
43627b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu
437b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu  void print(llvm::raw_ostream& os) const;
438b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
439511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
440511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
441511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
442511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
443511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
444511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
445511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
4469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
4479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
4489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
4499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
4519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
4529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
4539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* globals;
4559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* stack;
4569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* heap;
457178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  MemSpaceRegion* unknown;
458dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
4599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
4609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegionManager(llvm::BumpPtrAllocator& a)
4610bc27eab2079c01771cf025a77fd2205378182d8Zhongxing Xu    : A(a), globals(0), stack(0), heap(0), unknown(0) {}
4629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ~MemRegionManager() {}
4649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getStackRegion - Retrieve the memory region associated with the
4669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  current stack frame.
4679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getStackRegion();
4689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
4709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  all global variables.
4719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getGlobalsRegion();
4729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
4749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
4759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getHeapRegion();
476178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
477178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
478178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
479178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  MemSpaceRegion* getUnknownRegion();
480c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
481c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu  bool isGlobalsRegion(const MemRegion* R) {
482ce63911d6bdd795f63365723d4cdaa6998529e1eZhongxing Xu    assert(R);
483c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu    return R == globals;
484c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu  }
4859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4867090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
4877090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  AllocaRegion* getAllocaRegion(const Expr* Ex, unsigned Cnt);
4887090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
489329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
490329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
491329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion*
492329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr* CL);
493329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
494993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  /// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
4952dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek  SymbolicRegion* getSymbolicRegion(const SymbolRef sym);
496e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
497e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  StringRegion* getStringRegion(const StringLiteral* Str);
498e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
4999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
5009a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek  ///  a specified VarDecl.
5019a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek  VarRegion* getVarRegion(const VarDecl* vd);
502329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
503511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ElementRegion* getElementRegion(SVal Idx, const MemRegion* superRegion);
504511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
5059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
5069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
5079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
5089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
509993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  FieldRegion* getFieldRegion(const FieldDecl* fd, const MemRegion* superRegion);
5109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
511a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  /// getObjCObjectRegion - Retrieve or create the memory region associated with
512a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ///  the instance of a specified Objective-C class.
513a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID,
514a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek                                  const MemRegion* superRegion);
515a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
5169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
5179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
5189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
5199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
5209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd,
521993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek                                    const MemRegion* superRegion);
522178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
523dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  AnonTypedRegion* getAnonTypedRegion(QualType t, const MemRegion* superRegion);
524dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
525c5458622a30ede903e8d1e800cbf9382bd45b69fZhongxing Xu  AnonPointeeRegion* getAnonPointeeRegion(SymbolRef Sym, QualType T);
526178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
5279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  bool hasStackStorage(const MemRegion* R);
528dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
5299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
5309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region);
5319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
5329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace
5369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
537