MemRegion.h revision 7e5d6ed47dcedce35043de59ee00464b681bc786
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  }
1024193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu
1037e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  bool isSubRegionOf(const MemRegion* R) const;
1047e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu
1059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
106993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek    return R->getKind() > SymbolicRegionKind;
107993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
108993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
109993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
11082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
11182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
11282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
11382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
11482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
11582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
11682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
11782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* Ex;
11882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
11982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion* superRegion)
12082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
12182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
12282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
12382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
12482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* getExpr() const { return Ex; }
12582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
12682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
12782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
12882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,
12982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                            unsigned Cnt);
13082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
13182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void print(llvm::raw_ostream& os) const;
13282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
13382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
13482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
13582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
13682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek};
13782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
138993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
139993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  clases, SymbolicRegion represents a region that serves as an alias for
140993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  either a real region, a NULL pointer, etc.  It essentially is used to
141993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  map the concept of symbolic values into the domain of regions.  Symbolic
142993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  regions do not need to be typed.
143993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SymbolicRegion : public MemRegion {
144993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
1452dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek  const SymbolRef sym;
146993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
147993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
1482dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek  SymbolicRegion(const SymbolRef s) : MemRegion(SymbolicRegionKind), sym(s) {}
149993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
1502dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek  SymbolRef getSymbol() const {
151993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek    return sym;
152993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
153993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
154993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
1552dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym);
156993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
157993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  void print(llvm::raw_ostream& os) const;
158993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
159993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
160993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek    return R->getKind() == SymbolicRegionKind;
161993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
162993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
163993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
164993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
165993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
166993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
167993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
168993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
169993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
1706eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  virtual QualType getRValueType(ASTContext &C) const = 0;
1716eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
1726eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  virtual QualType getLValueType(ASTContext& C) const {
1736eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can possibly optimize this later to cache this value.
1746eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    return C.getPointerType(getRValueType(C));
1756eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
1766eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
177993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
1789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
1799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS;
1809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
183e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
184e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion {
185e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
186e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
187e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
188e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
189e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  StringRegion(const StringLiteral* str, MemRegion* sreg)
190e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    : TypedRegion(sreg, StringRegionKind), Str(str) {}
191e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
192e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
193e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
194e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
195e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
196e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
1976613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
1986613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
1996eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
2006eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext& C) const;
201e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
202e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
203e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
204e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
205e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
206cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu  void print(llvm::raw_ostream& os) const;
207cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
208e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
209e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
210e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
211e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
212e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
213dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xuclass AnonTypedRegion : public TypedRegion {
214dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  friend class MemRegionManager;
215dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
216dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  QualType T;
217dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
218dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  AnonTypedRegion(QualType t, const MemRegion* sreg)
219dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu    : TypedRegion(sreg, AnonTypedRegionKind), T(t) {}
220dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
221dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T,
222dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu                            const MemRegion* superRegion);
223dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
224dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xupublic:
225dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
226500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek  void print(llvm::raw_ostream& os) const;
227500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek
2286eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext&) const {
229dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu    return T;
230dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
231dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
232dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
233dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu    ProfileRegion(ID, T, superRegion);
234dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
235dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
236dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  static bool classof(const MemRegion* R) {
237dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu    return R->getKind() == AnonTypedRegionKind;
238dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
239dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu};
2406eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
241178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
242329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
243329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
244329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
24577cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion {
246329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
247329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
248329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  const CompoundLiteralExpr* CL;
249329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
250329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg)
25177cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
252329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
253329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
254329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const CompoundLiteralExpr* CL,
255329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
256329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
2576eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext& C) const {
25877cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    return C.getCanonicalType(CL->getType());
25977cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
2606eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
261329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
262329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
263329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void print(llvm::raw_ostream& os) const;
264329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
26511a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek  const CompoundLiteralExpr* getLiteralExpr() const { return CL; }
26611a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek
267329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
268329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
269329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
270329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
271178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
2729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion {
2739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
2749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Decl* D;
2759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
276993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  DeclRegion(const Decl* d, const MemRegion* sReg, Kind k)
2779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : TypedRegion(sReg, k), D(d) {}
2789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D,
2809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
2819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
282bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
283bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu  const Decl* getDecl() const { return D; }
2849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
2856eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
2866eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext& C) const = 0;
2876eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
288e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
289e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
290e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS;
291e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
2929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
2939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
2959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
2969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
297993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  VarRegion(const VarDecl* vd, const MemRegion* sReg)
2989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
2999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD,
3019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
3029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
3039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
3066eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  const VarDecl* getDecl() const { return cast<VarDecl>(D); }
3079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3086eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext& C) const {
3096eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
3106eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    return C.getCanonicalType(getDecl()->getType());
3116eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
3126eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
3139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void print(llvm::raw_ostream& os) const;
3149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
3169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
3179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
3219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
3229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
323993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  FieldRegion(const FieldDecl* fd, const MemRegion* sReg)
3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3264bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
3274bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
3284bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  void print(llvm::raw_ostream& os) const;
3294bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
3304bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  const FieldDecl* getDecl() const { return cast<FieldDecl>(D); }
3316eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
3326eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext& C) const {
3336eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
334e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu    return C.getCanonicalType(getDecl()->getType());
3356eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
3364bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
3379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD,
3389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
3399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
3409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
3439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
3449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
347a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion {
348a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
349a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  friend class MemRegionManager;
350a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
351a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg)
352a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {}
353a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
354a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCInterfaceDecl* ivd,
355a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek                            const MemRegion* superRegion) {
356a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind);
357a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
358a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
359a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic:
360a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  const ObjCInterfaceDecl* getInterface() const {
361a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return cast<ObjCInterfaceDecl>(D);
362a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
363a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
3646eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext& C) const {
365a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    ObjCInterfaceDecl* ID = const_cast<ObjCInterfaceDecl*>(getInterface());
366a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return C.getObjCInterfaceType(ID);
367a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
368a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
369a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  static bool classof(const MemRegion* R) {
370a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return R->getKind() == ObjCObjectRegionKind;
371a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
372a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek};
373a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
3749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
3759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
3779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
378993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg)
3799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
3809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd,
3829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
3839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
3849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
3879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); }
3886eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext&) const { return getDecl()->getType(); }
3899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
3919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
3929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
394511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
39527b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion {
396511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
397511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
398511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  SVal Index;
399511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
400511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ElementRegion(SVal Idx, const MemRegion* sReg)
4010395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu    : TypedRegion(sReg, ElementRegionKind), Index(Idx) {
4023d8173c1c68f451c7492f92023d829c626845925Chris Lattner    assert((!isa<nonloc::ConcreteInt>(&Idx) ||
4033d8173c1c68f451c7492f92023d829c626845925Chris Lattner           cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) &&
40443b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
4050395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
406abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek
407511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx,
408511191ce8920160525611be2be754c32a0724c3eZhongxing Xu                            const MemRegion* superRegion);
409511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
410511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
411511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
4126e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu  SVal getIndex() const { return Index; }
4136e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
4146eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext&) const;
41527b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu
416abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  /// getArrayRegion - Return the region of the enclosing array.  This is
417abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  ///  the same as getSuperRegion() except that this returns a TypedRegion*
418abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  ///  instead of a MemRegion*.
419abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  const TypedRegion* getArrayRegion() const {
420abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek    return cast<TypedRegion>(getSuperRegion());
421abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
422abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek
423b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu  void print(llvm::raw_ostream& os) const;
424b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
425511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
426511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
427511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
428511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
429511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
430511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
431511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
4329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
4339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
4349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
4359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
4379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
4389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
4399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* globals;
4419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* stack;
4429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* heap;
443178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  MemSpaceRegion* unknown;
444dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
4469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegionManager(llvm::BumpPtrAllocator& a)
4470bc27eab2079c01771cf025a77fd2205378182d8Zhongxing Xu    : A(a), globals(0), stack(0), heap(0), unknown(0) {}
4489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ~MemRegionManager() {}
4509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getStackRegion - Retrieve the memory region associated with the
4529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  current stack frame.
4539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getStackRegion();
4549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
4569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  all global variables.
4579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getGlobalsRegion();
4589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
4609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
4619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getHeapRegion();
462178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
463178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
464178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
465178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  MemSpaceRegion* getUnknownRegion();
466c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
467c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu  bool isGlobalsRegion(const MemRegion* R) {
468ce63911d6bdd795f63365723d4cdaa6998529e1eZhongxing Xu    assert(R);
469c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu    return R == globals;
470c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu  }
4714193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu
4724193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu  /// onStack - check if the region is allocated on the stack.
4734193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu  bool onStack(const MemRegion* R);
4744193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu
4754193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu  /// onHeap - check if the region is allocated on the heap, usually by malloc.
4764193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu  bool onHeap(const MemRegion* R);
4779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4787090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
4797090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  AllocaRegion* getAllocaRegion(const Expr* Ex, unsigned Cnt);
4807090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
481329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
482329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
483329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion*
484329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr* CL);
485329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
486993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  /// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
4872dabd4372c50019fa00aae223ce634e0e754a3f2Ted Kremenek  SymbolicRegion* getSymbolicRegion(const SymbolRef sym);
488e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
489e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  StringRegion* getStringRegion(const StringLiteral* Str);
490e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
4919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
4929a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek  ///  a specified VarDecl.
4939a1f03afc569abbdcc182379c99d1fe1ece67c9dTed Kremenek  VarRegion* getVarRegion(const VarDecl* vd);
494329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
495abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  ElementRegion* getElementRegion(SVal Idx, const TypedRegion* superRegion);
496511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
4979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
4989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
4999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
5009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
501abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  FieldRegion* getFieldRegion(const FieldDecl* fd,
502abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek                              const MemRegion* superRegion);
5039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
504a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  /// getObjCObjectRegion - Retrieve or create the memory region associated with
505a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ///  the instance of a specified Objective-C class.
506a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID,
507a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek                                  const MemRegion* superRegion);
508a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
5099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
5109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
5119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
5129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
5139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd,
514993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek                                    const MemRegion* superRegion);
515178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
516dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  AnonTypedRegion* getAnonTypedRegion(QualType t, const MemRegion* superRegion);
517dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
5189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  bool hasStackStorage(const MemRegion* R);
519dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
5209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
5219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region);
5229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
5239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace
5279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
528