MemRegion.h revision 14553abd17d303b0b310b3ab1523eb0d30d8121c
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  }
17614553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek
17714553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  QualType getDesugaredRValueType(ASTContext& C) const {
17814553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek    return getRValueType(C)->getDesugaredType();
17914553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
18014553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek
18114553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  QualType getDesugaredLValueType(ASTContext& C) const {
18214553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek    return getLValueType(C)->getDesugaredType();
18314553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
1846eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
185993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
1869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
1879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS;
1889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
1899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
191e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
192e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion {
193e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
194e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
195e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
196e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
197e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  StringRegion(const StringLiteral* str, MemRegion* sreg)
198e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    : TypedRegion(sreg, StringRegionKind), Str(str) {}
199e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
200e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
201e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
202e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
203e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
204e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
2056613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
2066613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
2076eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
2086eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext& C) const;
209e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
210e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
211e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
212e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
213e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
214cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu  void print(llvm::raw_ostream& os) const;
215cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
216e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
217e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
218e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
219e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
220e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
221dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xuclass AnonTypedRegion : public TypedRegion {
222dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  friend class MemRegionManager;
223dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
224dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  QualType T;
225dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
226dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  AnonTypedRegion(QualType t, const MemRegion* sreg)
227dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu    : TypedRegion(sreg, AnonTypedRegionKind), T(t) {}
228dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
229dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T,
230dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu                            const MemRegion* superRegion);
231dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
232dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xupublic:
233dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
234500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek  void print(llvm::raw_ostream& os) const;
235500d2ee83d407106d80920fb4325fa2e06fa61a5Ted Kremenek
2366eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext&) const {
237dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu    return T;
238dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
239dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
240dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
241dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu    ProfileRegion(ID, T, superRegion);
242dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
243dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
244dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  static bool classof(const MemRegion* R) {
245dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu    return R->getKind() == AnonTypedRegionKind;
246dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  }
247dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu};
2486eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
249178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
250329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
251329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
252329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
25377cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion {
254329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
255329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
256329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  const CompoundLiteralExpr* CL;
257329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
258329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg)
25977cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
260329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
261329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
262329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const CompoundLiteralExpr* CL,
263329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
264329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
2656eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext& C) const {
26677cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    return C.getCanonicalType(CL->getType());
26777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
2686eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
269329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
270329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
271329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void print(llvm::raw_ostream& os) const;
272329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
27311a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek  const CompoundLiteralExpr* getLiteralExpr() const { return CL; }
27411a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek
275329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
276329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
277329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
278329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
279178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
2809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion {
2819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
2829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Decl* D;
2839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
284993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  DeclRegion(const Decl* d, const MemRegion* sReg, Kind k)
2859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : TypedRegion(sReg, k), D(d) {}
2869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D,
2889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
2899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
290bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
291bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu  const Decl* getDecl() const { return D; }
2929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
2936eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
2946eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext& C) const = 0;
2956eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
296e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
297e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
298e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS;
299e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
3039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
3049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
305993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  VarRegion(const VarDecl* vd, const MemRegion* sReg)
3069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
3079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD,
3099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
3109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
3119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
3146eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  const VarDecl* getDecl() const { return cast<VarDecl>(D); }
3159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3166eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext& C) const {
3176eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
3186eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    return C.getCanonicalType(getDecl()->getType());
3196eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
3206eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
3219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void print(llvm::raw_ostream& os) const;
3229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
3299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
3309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
331993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  FieldRegion(const FieldDecl* fd, const MemRegion* sReg)
3329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
3339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3344bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
3354bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
3364bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  void print(llvm::raw_ostream& os) const;
3374bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
3384bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  const FieldDecl* getDecl() const { return cast<FieldDecl>(D); }
3396eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
3406eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext& C) const {
3416eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
342e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu    return C.getCanonicalType(getDecl()->getType());
3436eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
3444bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
3459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD,
3469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
3479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
3489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
3519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
3529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
355a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion {
356a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
357a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  friend class MemRegionManager;
358a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
359a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg)
360a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {}
361a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
362a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCInterfaceDecl* ivd,
363a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek                            const MemRegion* superRegion) {
364a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind);
365a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
366a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
367a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic:
368a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  const ObjCInterfaceDecl* getInterface() const {
369a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return cast<ObjCInterfaceDecl>(D);
370a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
371a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
3726eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext& C) const {
373a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    ObjCInterfaceDecl* ID = const_cast<ObjCInterfaceDecl*>(getInterface());
374a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return C.getObjCInterfaceType(ID);
375a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
376a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
377a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  static bool classof(const MemRegion* R) {
378a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return R->getKind() == ObjCObjectRegionKind;
379a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
380a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek};
381a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
3829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
3839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
3859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
386993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg)
3879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
3889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd,
3909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion) {
3919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
3929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
3959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); }
3966eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext&) const { return getDecl()->getType(); }
3979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
3999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
4009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
402511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
40327b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion {
404511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
405511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
406511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  SVal Index;
407511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
408511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ElementRegion(SVal Idx, const MemRegion* sReg)
4090395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu    : TypedRegion(sReg, ElementRegionKind), Index(Idx) {
4103d8173c1c68f451c7492f92023d829c626845925Chris Lattner    assert((!isa<nonloc::ConcreteInt>(&Idx) ||
4113d8173c1c68f451c7492f92023d829c626845925Chris Lattner           cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) &&
41243b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
4130395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
414abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek
415511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx,
416511191ce8920160525611be2be754c32a0724c3eZhongxing Xu                            const MemRegion* superRegion);
417511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
418511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
419511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
4206e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu  SVal getIndex() const { return Index; }
4216e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
4226eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  QualType getRValueType(ASTContext&) const;
42327b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu
424abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  /// getArrayRegion - Return the region of the enclosing array.  This is
425abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  ///  the same as getSuperRegion() except that this returns a TypedRegion*
426abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  ///  instead of a MemRegion*.
427abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  const TypedRegion* getArrayRegion() const {
428abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek    return cast<TypedRegion>(getSuperRegion());
429abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
430abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek
431b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu  void print(llvm::raw_ostream& os) const;
432b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
433511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
434511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
435511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
436511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
437511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
438511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
439511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
4409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
4419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
4429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
4439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
4469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
4479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* globals;
4499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* stack;
4509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* heap;
451178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  MemSpaceRegion* unknown;
452dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
4539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
4549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegionManager(llvm::BumpPtrAllocator& a)
4550bc27eab2079c01771cf025a77fd2205378182d8Zhongxing Xu    : A(a), globals(0), stack(0), heap(0), unknown(0) {}
4569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ~MemRegionManager() {}
4589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getStackRegion - Retrieve the memory region associated with the
4609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  current stack frame.
4619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getStackRegion();
4629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
4649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  all global variables.
4659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getGlobalsRegion();
4669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
4689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
4699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* getHeapRegion();
470178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
471178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
472178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
473178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  MemSpaceRegion* getUnknownRegion();
474c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
475c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu  bool isGlobalsRegion(const MemRegion* R) {
476ce63911d6bdd795f63365723d4cdaa6998529e1eZhongxing Xu    assert(R);
477c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu    return R == globals;
478c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu  }
4794193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu
4804193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu  /// onStack - check if the region is allocated on the stack.
4814193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu  bool onStack(const MemRegion* R);
4824193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu
4834193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu  /// onHeap - check if the region is allocated on the heap, usually by malloc.
4844193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu  bool onHeap(const MemRegion* R);
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
503abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  ElementRegion* getElementRegion(SVal Idx, const TypedRegion* 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).
509abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  FieldRegion* getFieldRegion(const FieldDecl* fd,
510abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek                              const MemRegion* superRegion);
5119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
512a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  /// getObjCObjectRegion - Retrieve or create the memory region associated with
513a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ///  the instance of a specified Objective-C class.
514a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID,
515a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek                                  const MemRegion* superRegion);
516a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
5179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
5189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
5199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
5209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
5219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd,
522993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek                                    const MemRegion* superRegion);
523178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
524dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu  AnonTypedRegion* getAnonTypedRegion(QualType t, const MemRegion* superRegion);
525dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
5269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  bool hasStackStorage(const MemRegion* R);
527dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
5289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
5299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region);
5309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
5319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace
5359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
536