MemRegion.h revision e3273e78da4716f9c999ae207f6898f376a6e1a4
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"
211309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include "clang/Checker/PathSensitive/SVals.h"
229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Casting.h"
239c1845dbed9817520f5a7db8bd80a560c6c6ae6bArgyrios Kyrtzidis#include "llvm/Support/ErrorHandling.h"
249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h"
259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string>
269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
275e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramernamespace llvm {
285e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass BumpPtrAllocator;
295e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass raw_ostream;
305e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer}
319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang {
331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager;
35d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass MemSpaceRegion;
36d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext;
3767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext;
3832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Roseclass ValueManager;
394240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion;
40dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass CodeTextRegion;
411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu/// Represent a region's offset within the top level base region.
43e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xuclass RegionOffset {
44e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The base region.
45e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *R;
46e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
47e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The bit offset within the base region. It shouldn't be negative.
48e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t Offset;
49e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
50e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xupublic:
51e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  RegionOffset(const MemRegion *r) : R(r), Offset(0) {}
52e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {}
53e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *getRegion() const { return R; }
55e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t getOffset() const { return Offset; }
56e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu};
57e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
5819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
5919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes.
6019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions.
639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode {
644240096011a187807058f887eb81df750ffa17feTed Kremenek  friend class MemRegionManager;
659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
6667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  enum Kind {
6767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Memory spaces.
68dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    GenericMemSpaceRegionKind,
6967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackLocalsSpaceRegionKind,
7067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackArgumentsSpaceRegionKind,
7167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    HeapSpaceRegionKind,
722b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    UnknownSpaceRegionKind,
73dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    NonStaticGlobalSpaceRegionKind,
74dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticGlobalSpaceRegionKind,
75dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    BEG_GLOBAL_MEMSPACES = NonStaticGlobalSpaceRegionKind,
76dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    END_GLOBAL_MEMSPACES = StaticGlobalSpaceRegionKind,
77dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    BEG_MEMSPACES = GenericMemSpaceRegionKind,
78dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    END_MEMSPACES = StaticGlobalSpaceRegionKind,
7967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Untyped regions.
8067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    SymbolicRegionKind,
8167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    AllocaRegionKind,
8267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Typed regions.
8367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_TYPED_REGIONS,
8467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FunctionTextRegionKind = BEG_TYPED_REGIONS,
8567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BlockTextRegionKind,
8667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BlockDataRegionKind,
8767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    CompoundLiteralRegionKind,
88de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    CXXThisRegionKind,
8967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StringRegionKind,
9067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ElementRegionKind,
9167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Decl Regions.
9267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_DECL_REGIONS,
9367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    VarRegionKind = BEG_DECL_REGIONS,
9467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FieldRegionKind,
9567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ObjCIvarRegionKind,
96bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu    CXXObjectRegionKind,
97bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu    END_DECL_REGIONS = CXXObjectRegionKind,
9867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    END_TYPED_REGIONS = END_DECL_REGIONS
9967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  };
10067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
1029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
1059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
1069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
1079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
109a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek  ASTContext &getContext() const;
1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
112a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
113a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  virtual MemRegionManager* getMemRegionManager() const = 0;
114a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
1159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::string getString() const;
1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
117bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemSpaceRegion *getMemorySpace() const;
1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
119adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *getBaseRegion() const;
120adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
121479529e679957fbb92b56e116e3c86734429331eZhongxing Xu  const MemRegion *StripCasts() const;
1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1231508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsOrParametersStorage() const;
1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
125de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackStorage() const;
126de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
127de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackNonParametersStorage() const;
128de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
129de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackParametersStorage() const;
130b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
131e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// Compute the offset within the top level memory object.
132e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  RegionOffset getAsOffset() const;
133e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1348800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  virtual void dumpToStream(llvm::raw_ostream& os) const;
1357f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
1368800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dump() const;
1371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Kind getKind() const { return kind; }
1391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
140ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  template<typename RegionTy> const RegionTy* getAs() const;
1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
142f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu  virtual bool isBoundable() const { return false; }
143b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
1449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion*) { return true; }
1459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space";
1489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
1499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
150a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected:
15167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
15267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
153a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager *Mgr;
154a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
15567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind)
15667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemRegion(k), Mgr(mgr) {
15767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
15867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
15967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
16067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemRegionManager* getMemRegionManager() const { return Mgr; }
1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
16367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  bool isBoundable() const { return false; }
16467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
16567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
16667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
16767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
16867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
16967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_MEMSPACES && k <= END_MEMSPACES;
170a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  }
17167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
17267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
17367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion {
174dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected:
175dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  GlobalsSpaceRegion(MemRegionManager *mgr, Kind k)
176dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : MemSpaceRegion(mgr, k) {}
177dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
178dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
179dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    Kind k = R->getKind();
180dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES;
181dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
182dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
183dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
184dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion {
18567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
186a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
187dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *CR;
188dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
189dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr)
190dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {}
191dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
192dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
193dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
194dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
195fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
196fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
197dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *getCodeRegion() const { return CR; }
198dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
199dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
200dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R->getKind() == StaticGlobalSpaceRegionKind;
201dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
202dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
203dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
204dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion {
205dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  friend class MemRegionManager;
206dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
207dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  NonStaticGlobalSpaceRegion(MemRegionManager *mgr)
208dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : GlobalsSpaceRegion(mgr, NonStaticGlobalSpaceRegionKind) {}
209dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
211fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
212fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
213fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
21467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
215dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R->getKind() == NonStaticGlobalSpaceRegionKind;
21667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
21767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
21867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
21967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion {
22067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
22167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
22267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion(MemRegionManager *mgr)
22367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, HeapSpaceRegionKind) {}
22467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
22567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
22667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == HeapSpaceRegionKind;
22767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
22867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
22967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
2302b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion {
2312b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  friend class MemRegionManager;
2322b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion(MemRegionManager *mgr)
2332b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {}
2342b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic:
2352b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  static bool classof(const MemRegion *R) {
2362b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    return R->getKind() == UnknownSpaceRegionKind;
2372b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  }
2382b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek};
2392b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
24067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion {
24167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
24267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *SFC;
2439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
24467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected:
24567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc)
24667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, k), SFC(sfc) {
24767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
24867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
24941168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
25067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
25167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *getStackFrame() const { return SFC; }
25267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
25367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
25467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
25567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
25667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
25767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= StackLocalsSpaceRegionKind &&
25867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek           k <= StackArgumentsSpaceRegionKind;
25967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
26067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
26167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
26267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion {
26367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
26467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
26567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
26667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {}
26767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
26867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
26967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackLocalsSpaceRegionKind;
27067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
27167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
27267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
27367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion {
27467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
27567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
27667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
27767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {}
27867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
27967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
28067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackArgumentsSpaceRegionKind;
2819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
2839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2847caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
285993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
286993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
287993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
2889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
2891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const MemRegion* superRegion;
290993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
2919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
2929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
2939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
2949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  /// getExtent - Returns the size of the region in bytes.
29732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  virtual DefinedOrUnknownSVal getExtent(ValueManager& ValMgr) const {
29832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    return UnknownVal();
29932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  }
30032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
301a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager* getMemRegionManager() const;
3021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3037e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  bool isSubRegionOf(const MemRegion* R) const;
3041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
30667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() > END_MEMSPACES;
307993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
308993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
31119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses.
3121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===//
313ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
31482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
31582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
31682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
31782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
31882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
31982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
32082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
32182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* Ex;
32282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
3237ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion *superRegion)
32482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
3271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* getExpr() const { return Ex; }
3299852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
3309852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
3319852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
33232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  DefinedOrUnknownSVal getExtent(ValueManager& ValMgr) const;
33332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
33482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
33582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
33682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,
3377ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                            unsigned Cnt, const MemRegion *superRegion);
3381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3398800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
3401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
34282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
34382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
3441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
3451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
346993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
347993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
348993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
349993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
3501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
351993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
352a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  virtual QualType getValueType(ASTContext &C) const = 0;
3531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
354ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  virtual QualType getLocationType(ASTContext& C) const {
3556eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can possibly optimize this later to cache this value.
356a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu    return C.getPointerType(getValueType(C));
3576eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
359a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getDesugaredValueType(ASTContext& C) const {
360a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu    QualType T = getValueType(C);
361bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall    return T.getTypePtr() ? T.getDesugaredType() : T;
36214553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
3631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
364ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  QualType getDesugaredLocationType(ASTContext& C) const {
365bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall    return getLocationType(C).getDesugaredType();
36614553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
3671b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek
368a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  bool isBoundable() const {
369a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    return !getValueType(getContext()).isNull();
37041168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek  }
3716eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
372993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
3739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
37467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS;
3759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
378ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
379eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion {
380eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected:
381eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {}
382ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
383a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext &C) const {
384ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    // Do not get the object type of a CodeTextRegion.
385ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    assert(0);
386ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    return QualType();
387ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
388eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
389eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  bool isBoundable() const { return false; }
390eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
391eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
392eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    Kind k = R->getKind();
393eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return k >= FunctionTextRegionKind && k <= BlockTextRegionKind;
394eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
395eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
396ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
397eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function.
398eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion {
399eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const FunctionDecl *FD;
400eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic:
401eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  FunctionTextRegion(const FunctionDecl* fd, const MemRegion* sreg)
402eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {}
403eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
404ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  QualType getLocationType(ASTContext &C) const {
405abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek    return C.getPointerType(FD->getType());
406ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
407eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
408abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  const FunctionDecl *getDecl() const {
409abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek    return FD;
41072e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  }
411eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
4128800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  virtual void dumpToStream(llvm::raw_ostream& os) const;
413eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
414ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
415eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
416abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD,
417abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek                            const MemRegion*);
418eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
419ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static bool classof(const MemRegion* R) {
420eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == FunctionTextRegionKind;
421eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
422eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
423eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
424eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
425eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures).
4260a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
4270a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
4280a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
4290a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
4300a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
431eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion {
43267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
43367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
434eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *BD;
43567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  AnalysisContext *AC;
436eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CanQualType locTy;
43767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
43867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockTextRegion(const BlockDecl *bd, CanQualType lTy,
43967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                  AnalysisContext *ac, const MemRegion* sreg)
44067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {}
44167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
44267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
443eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  QualType getLocationType(ASTContext &C) const {
444eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return locTy;
445eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
446eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
447eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *getDecl() const {
448eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return BD;
449eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
45067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
45167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  AnalysisContext *getAnalysisContext() const { return AC; }
452eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
453eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  virtual void dumpToStream(llvm::raw_ostream& os) const;
454eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
455eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
456eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
457eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD,
45867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            CanQualType, const AnalysisContext*,
45967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const MemRegion*);
460eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
461eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
462eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == BlockTextRegionKind;
463ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
464ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu};
4650a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
4660a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance.
4670a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
4680a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
4690a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
4700a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
4710a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
4720a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion {
47367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
4740a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *BC;
47567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const LocationContext *LC; // Can be null */
4764240096011a187807058f887eb81df750ffa17feTed Kremenek  void *ReferencedVars;
47767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
47867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc,
4790a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                  const MemRegion *sreg)
4804240096011a187807058f887eb81df750ffa17feTed Kremenek  : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc), ReferencedVars(0) {}
4810a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
48267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
4830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *getCodeRegion() const { return BC; }
4844240096011a187807058f887eb81df750ffa17feTed Kremenek
485d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek  const BlockDecl *getDecl() const { return BC->getDecl(); }
486d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek
48781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  class referenced_vars_iterator {
48881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const MemRegion * const *R;
48981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  public:
49081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    explicit referenced_vars_iterator(const MemRegion * const *r) : R(r) {}
49181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
49281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    operator const MemRegion * const *() const {
49381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return R;
49481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
49581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
49681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const VarRegion* operator*() const {
49781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return cast<VarRegion>(*R);
49881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
49981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
50081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator==(const referenced_vars_iterator &I) const {
50181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R == R;
50281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
50381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator!=(const referenced_vars_iterator &I) const {
50481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R != R;
50581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
50681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    referenced_vars_iterator& operator++() {
50781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      ++R;
50881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return *this;
50981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
51081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  };
51181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
5124240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_begin() const;
5134240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_end() const;
5140a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
5150a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  virtual void dumpToStream(llvm::raw_ostream& os) const;
5160a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
5170a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
5180a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
51967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *,
52067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const LocationContext *, const MemRegion *);
5210a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
5220a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  static bool classof(const MemRegion* R) {
5230a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek    return R->getKind() == BlockDataRegionKind;
5240a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  }
5254240096011a187807058f887eb81df750ffa17feTed Kremenekprivate:
5264240096011a187807058f887eb81df750ffa17feTed Kremenek  void LazyInitializeReferencedVars();
5270a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek};
528ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
529026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
530026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  clases, SymbolicRegion represents a region that serves as an alias for
531026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  either a real region, a NULL pointer, etc.  It essentially is used to
532026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  map the concept of symbolic values into the domain of regions.  Symbolic
533026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  regions do not need to be typed.
534e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion {
535026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected:
536026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  const SymbolRef sym;
537026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
538026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic:
5391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SymbolicRegion(const SymbolRef s, const MemRegion* sreg)
540e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek    : SubRegion(sreg, SymbolicRegionKind), sym(s) {}
5411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
542026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  SymbolRef getSymbol() const {
543026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return sym;
544026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
545026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
5469852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
5479852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
54832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  DefinedOrUnknownSVal getExtent(ValueManager& ValMgr) const;
54932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
550026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
551026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
552250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
553250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            SymbolRef sym,
554250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            const MemRegion* superRegion);
5551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5568800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
5571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
558026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  static bool classof(const MemRegion* R) {
559026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() == SymbolicRegionKind;
560026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
5611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
562026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
563e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
564e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion {
565e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
566e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
567e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
568e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
569250101353b711a409b075f1bc11070dddec7100bTed Kremenek  StringRegion(const StringLiteral* str, const MemRegion* sreg)
570e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    : TypedRegion(sreg, StringRegionKind), Str(str) {}
571e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
572e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
573e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
574e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
575e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
576e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
5776613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
5786613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
5791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
580a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
581ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return Str->getType();
582ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  }
583e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
58432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  DefinedOrUnknownSVal getExtent(ValueManager& ValMgr) const;
58532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
5860a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu  bool isBoundable() const { return false; }
5870a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
588e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
589e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
590e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
591e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
5928800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
593cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
594e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
595e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
596e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
597e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
598e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
599329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
600329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
601329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
60277cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion {
603329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
604329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
605329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  const CompoundLiteralExpr* CL;
606329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
607329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg)
60877cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
6091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
610329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
611329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const CompoundLiteralExpr* CL,
612329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
613329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
614a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
61577cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    return C.getCanonicalType(CL->getType());
61677cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
6170a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
6189a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu  bool isBoundable() const { return !CL->isFileScope(); }
6199a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu
620329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6228800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
623329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
62411a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek  const CompoundLiteralExpr* getLiteralExpr() const { return CL; }
6251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
626329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
627329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
628329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
629329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
630178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
6319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion {
6329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
6339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Decl* D;
6349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
635993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  DeclRegion(const Decl* d, const MemRegion* sReg, Kind k)
6369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : TypedRegion(sReg, k), D(d) {}
6379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
6389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D,
6399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
6401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
641bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
642bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu  const Decl* getDecl() const { return D; }
6439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
64532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  DefinedOrUnknownSVal getExtent(ValueManager& ValMgr) const;
64632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
647e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
648e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
64967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS;
650e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
6519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
6521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
6549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
655d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
656d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  // Constructors and private methods.
65767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  VarRegion(const VarDecl* vd, const MemRegion* sReg)
65867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
6599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
660250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* VD,
661d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                            const MemRegion *superRegion) {
6629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
6639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
6641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
665d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
668d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  const VarDecl *getDecl() const { return cast<VarDecl>(D); }
6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6705348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  const StackFrameContext *getStackFrame() const;
6715348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
6721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType getValueType(ASTContext& C) const {
6736eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
6746eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    return C.getCanonicalType(getDecl()->getType());
6751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
6761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6778800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
6781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
6809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
6811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
6829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
683de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
684de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter
685de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  in a call to a C++ method.  This region doesn't represent the object
686de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  referred to by 'this', but rather 'this' itself.
687de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekclass CXXThisRegion : public TypedRegion {
688de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  friend class MemRegionManager;
689de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  CXXThisRegion(const PointerType *thisPointerTy,
690de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                const MemRegion *sReg)
691de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    : TypedRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {}
692de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
693de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
694de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const PointerType *PT,
695de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const MemRegion *sReg);
696de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
697de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
698de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
699de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic:
700de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  QualType getValueType(ASTContext &C) const {
701de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return QualType(ThisPointerTy, 0);
702de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
7037caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
704de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
705de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
706de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static bool classof(const MemRegion* R) {
707de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return R->getKind() == CXXThisRegionKind;
708de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
709de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
710de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate:
711de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const PointerType *ThisPointerTy;
712de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek};
7139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
7149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
7159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
7169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
717993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  FieldRegion(const FieldDecl* fd, const MemRegion* sReg)
7189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
7199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
7204bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
7211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7228800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
7231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7244bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  const FieldDecl* getDecl() const { return cast<FieldDecl>(D); }
7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType getValueType(ASTContext& C) const {
7276eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
728e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu    return C.getCanonicalType(getDecl()->getType());
7291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
7304bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
73132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  DefinedOrUnknownSVal getExtent(ValueManager& ValMgr) const;
73232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
7336304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl* FD,
7346304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
7359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
7369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
7371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
7399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
7409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
7419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
7421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
7441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
7461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
747993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg)
7489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
7499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
7506304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl* ivd,
7516304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
7529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
7539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
7541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
7569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); }
757a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext&) const { return getDecl()->getType(); }
7581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
759bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
7601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
7629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
7639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
7649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
7657caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
7667caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu// Auxillary data classes for use with MemRegions.
7677caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
7687caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
7697caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion;
7707caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
7717caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset {
7727caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate:
7737caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  friend class ElementRegion;
7747caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
7757caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *Region;
7767caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  int64_t Offset;
7777caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
7787caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  RegionRawOffset(const MemRegion* reg, int64_t offset = 0)
7797caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu    : Region(reg), Offset(offset) {}
7807caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
7817caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic:
7827caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  // FIXME: Eventually support symbolic offsets.
7837caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  int64_t getByteOffset() const { return Offset; }
7847caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *getRegion() const { return Region; }
7857caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
7867caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  void dumpToStream(llvm::raw_ostream& os) const;
7877caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  void dump() const;
7887caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu};
789511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
79027b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion {
791511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
792511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
793f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType ElementType;
794511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  SVal Index;
795511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
796f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ElementRegion(QualType elementType, SVal Idx, const MemRegion* sReg)
797f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    : TypedRegion(sReg, ElementRegionKind),
798f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek      ElementType(elementType), Index(Idx) {
7993d8173c1c68f451c7492f92023d829c626845925Chris Lattner    assert((!isa<nonloc::ConcreteInt>(&Idx) ||
8003d8173c1c68f451c7492f92023d829c626845925Chris Lattner           cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) &&
80143b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
8020395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
8031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
804f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType,
805f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek                            SVal Idx, const MemRegion* superRegion);
806511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
807511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
808511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
8096e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu  SVal getIndex() const { return Index; }
8106e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
811a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext&) const {
812f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
813f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  }
8141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
815f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType getElementType() const {
816f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
817abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
8187caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  /// Compute the offset within the array. The array might also be a subobject.
8197caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  RegionRawOffset getAsArrayOffset() const;
8201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8218800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
822b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
823511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
824511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
825511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
826511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
827511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
828511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
82919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
830bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression.
831bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xuclass CXXObjectRegion : public TypedRegion {
832bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  friend class MemRegionManager;
833bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
834bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  Expr const *Ex;
835bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
836bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  CXXObjectRegion(Expr const *E, MemRegion const *sReg)
837bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu    : TypedRegion(sReg, CXXObjectRegionKind), Ex(E) {}
838bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
839bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
840bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu                            Expr const *E, const MemRegion *sReg);
841bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
842bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic:
843bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  QualType getValueType(ASTContext& C) const {
844bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu    return Ex->getType();
845bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
846bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
847bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
848bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
849bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static bool classof(const MemRegion* R) {
850bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu    return R->getKind() == CXXObjectRegionKind;
851bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
852bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu};
853bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
854ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy>
855ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const {
856f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  if (const RegionTy* RT = dyn_cast<RegionTy>(this))
857f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek    return RT;
8581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
859f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  return NULL;
860ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}
861511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
8629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
8639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
8649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
8659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
867a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &C;
8689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
8699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
8701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
871dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  NonStaticGlobalSpaceRegion *globals;
8722b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
873c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *>
874c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackLocalsSpaceRegions;
875c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *>
876c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackArgumentsSpaceRegions;
877dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *>
878dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticsGlobalSpaceRegions;
8792b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
88067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion *heap;
8812b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion *unknown;
882d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *code;
883dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
8849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
885a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a)
886c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    : C(c), A(a), globals(0), heap(0), unknown(0), code(0) {}
8871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8884240096011a187807058f887eb81df750ffa17feTed Kremenek  ~MemRegionManager();
8891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
890a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &getContext() { return C; }
8914240096011a187807058f887eb81df750ffa17feTed Kremenek
8924240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &getAllocator() { return A; }
8931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
89467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getStackLocalsRegion - Retrieve the memory region associated with the
89567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  specified stack frame.
89667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackLocalsSpaceRegion *
89767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackLocalsRegion(const StackFrameContext *STC);
898d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
899d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  /// getStackArgumentsRegion - Retrieve the memory region associated with
90067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  function/method arguments of the specified stack frame.
90167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackArgumentsSpaceRegion *
90267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackArgumentsRegion(const StackFrameContext *STC);
9031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
905dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ///  global variables.
906dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const GlobalsSpaceRegion *getGlobalsRegion(const CodeTextRegion *R = 0);
9071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
9099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
91067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const HeapSpaceRegion *getHeapRegion();
911178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
912178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
913178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
914b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getUnknownRegion();
915c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
916b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getCodeRegion();
917ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
9187090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
91967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const AllocaRegion *getAllocaRegion(const Expr* Ex, unsigned Cnt,
92067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                      const LocationContext *LC);
9211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
922329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
923329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
924b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const CompoundLiteralRegion*
92567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr* CL,
92667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                           const LocationContext *LC);
927de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
928de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  /// getCXXThisRegion - Retrieve the [artifical] region associated with the
929de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ///  parameter 'this'.
930de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy,
931de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                        const LocationContext *LC);
9321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
933993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  /// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
934b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const SymbolicRegion* getSymbolicRegion(SymbolRef sym);
935e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
936b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const StringRegion* getStringRegion(const StringLiteral* Str);
937e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
9389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
939d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  ///  a specified VarDecl and LocationContext.
940b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC);
9411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
94267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
94367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  a specified VarDecl and super region.
94467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR);
94567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
946f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  /// getElementRegion - Retrieve the memory region associated with the
947f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ///  associated element type, index, and super region.
948b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ElementRegion *getElementRegion(QualType elementType, SVal Idx,
949856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        const MemRegion *superRegion,
950856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        ASTContext &Ctx);
9511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
952b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER,
953856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                                 const MemRegion *superRegion) {
954a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getElementRegion(ER->getElementType(), ER->getIndex(),
955a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek                            superRegion, ER->getContext());
956a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
957511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
9589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
9599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
9609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
9619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
962b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegion(const FieldDecl* fd,
963b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                    const MemRegion* superRegion);
9641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
965b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR,
966b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                             const MemRegion *superRegion) {
967a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getFieldRegion(FR->getDecl(), superRegion);
968a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
9691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
9719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
9729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
9739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
974b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl* ivd,
975b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                          const MemRegion* superRegion);
9761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
977bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  const CXXObjectRegion *getCXXObjectRegion(Expr const *Ex,
978bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu                                            LocationContext const *LC);
979bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
980b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD);
981b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD,
98267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            CanQualType locTy,
98367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            AnalysisContext *AC);
98467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
98567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getBlockDataRegion - Get the memory region associated with an instance
98667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  of a block.  Unlike many other MemRegions, the LocationContext*
98767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  argument is allowed to be NULL for cases where we have no known
98867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  context.
989b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc,
99067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            const LocationContext *lc = NULL);
9911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
992bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  bool isGlobalsRegion(const MemRegion* R) {
993bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    assert(R);
994bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    return R == globals;
995bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
996bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
997bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate:
998250101353b711a409b075f1bc11070dddec7100bTed Kremenek  template <typename RegionTy, typename A1>
999250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* getRegion(const A1 a1);
10001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10016304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  template <typename RegionTy, typename A1>
1002eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion);
10031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10047ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  template <typename RegionTy, typename A1, typename A2>
10057ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* getRegion(const A1 a1, const A2 a2);
1006dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
10070a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  template <typename RegionTy, typename A1, typename A2>
10080a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2,
10090a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                         const MemRegion* superRegion);
10100a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
101167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename RegionTy, typename A1, typename A2, typename A3>
101267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3,
101367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                         const MemRegion* superRegion);
101467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
101567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG>
101667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region);
101767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
101867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG, typename ARG>
101967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region, ARG a);
1020ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek};
10211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1022250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1023a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions.
1024250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1025250101353b711a409b075f1bc11070dddec7100bTed Kremenek
1026a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekinline ASTContext& MemRegion::getContext() const {
1027a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  return getMemRegionManager()->getContext();
1028a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
1029eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
1030be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace
10319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1032250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1033250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions.
1034250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1035250101353b711a409b075f1bc11070dddec7100bTed Kremenek
1036be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm {
10378800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekstatic inline raw_ostream& operator<<(raw_ostream& os,
10381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                      const clang::MemRegion* R) {
10398800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  R->dumpToStream(os);
10408800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  return os;
1041be91224894e1501133e224934285ba6440bf5b59Ted Kremenek}
1042be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace
10439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
10449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
1045