MemRegion.h revision 096aef9597b263b4cd6a0feaacf9e7214fa9c75a
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
165a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#ifndef LLVM_CLANG_GR_MEMREGION_H
175a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#define LLVM_CLANG_GR_MEMREGION_H
189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
199ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck#include "clang/AST/CharUnits.h"
20993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/Decl.h"
21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/DeclObjC.h"
22d47d3b0cfeb7e8564ff77f48130fe63282b6d127Chris Lattner#include "clang/Basic/LLVM.h"
239b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
249c1845dbed9817520f5a7db8bd80a560c6c6ae6bArgyrios Kyrtzidis#include "llvm/Support/ErrorHandling.h"
259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h"
269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string>
279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
285e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramernamespace llvm {
295e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass BumpPtrAllocator;
305e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer}
319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang {
331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext;
3567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext;
365a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
379ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento {
385a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
395a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemRegionManager;
405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemSpaceRegion;
41c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenekclass SValBuilder;
424240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion;
43dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass CodeTextRegion;
441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu/// Represent a region's offset within the top level base region.
46e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xuclass RegionOffset {
47e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The base region.
48e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *R;
49e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
50e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The bit offset within the base region. It shouldn't be negative.
51e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t Offset;
52e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
53e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xupublic:
54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  RegionOffset(const MemRegion *r) : R(r), Offset(0) {}
55e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {}
56e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
57e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *getRegion() const { return R; }
58e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t getOffset() const { return Offset; }
59e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu};
60e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
6119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
6219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes.
6319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions.
669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode {
674240096011a187807058f887eb81df750ffa17feTed Kremenek  friend class MemRegionManager;
689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
6967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  enum Kind {
7067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Memory spaces.
71dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    GenericMemSpaceRegionKind,
7267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackLocalsSpaceRegionKind,
7367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackArgumentsSpaceRegionKind,
7467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    HeapSpaceRegionKind,
752b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    UnknownSpaceRegionKind,
76dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    NonStaticGlobalSpaceRegionKind,
77dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticGlobalSpaceRegionKind,
78dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    BEG_GLOBAL_MEMSPACES = NonStaticGlobalSpaceRegionKind,
79dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    END_GLOBAL_MEMSPACES = StaticGlobalSpaceRegionKind,
80dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    BEG_MEMSPACES = GenericMemSpaceRegionKind,
81dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    END_MEMSPACES = StaticGlobalSpaceRegionKind,
8267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Untyped regions.
8367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    SymbolicRegionKind,
8467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    AllocaRegionKind,
859697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    BlockDataRegionKind,
8667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Typed regions.
8767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_TYPED_REGIONS,
8867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FunctionTextRegionKind = BEG_TYPED_REGIONS,
8967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BlockTextRegionKind,
909697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    BEG_TYPED_VALUE_REGIONS,
919697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    CompoundLiteralRegionKind = BEG_TYPED_VALUE_REGIONS,
92de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    CXXThisRegionKind,
9367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StringRegionKind,
9467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ElementRegionKind,
9567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Decl Regions.
9667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_DECL_REGIONS,
9767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    VarRegionKind = BEG_DECL_REGIONS,
9867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FieldRegionKind,
9967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ObjCIvarRegionKind,
1004fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    END_DECL_REGIONS = ObjCIvarRegionKind,
10102fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    CXXTempObjectRegionKind,
1024fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    CXXBaseObjectRegionKind,
103096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose    END_TYPED_VALUE_REGIONS = CXXBaseObjectRegionKind,
104096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose    END_TYPED_REGIONS = CXXBaseObjectRegionKind
10567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  };
10667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
1089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
1119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
1129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
1139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
115a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek  ASTContext &getContext() const;
1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
118a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
119a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  virtual MemRegionManager* getMemRegionManager() const = 0;
120a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
1219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::string getString() const;
1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
123bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemSpaceRegion *getMemorySpace() const;
1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
125adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *getBaseRegion() const;
126adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
127479529e679957fbb92b56e116e3c86734429331eZhongxing Xu  const MemRegion *StripCasts() const;
1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1291508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsOrParametersStorage() const;
1301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
131de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackStorage() const;
132de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
133de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackNonParametersStorage() const;
134de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
135de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackParametersStorage() const;
136b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
137e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// Compute the offset within the top level memory object.
138e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  RegionOffset getAsOffset() const;
139e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1408cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  virtual void dumpToStream(raw_ostream& os) const;
1417f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
1428800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dump() const;
1431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Kind getKind() const { return kind; }
1451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
146ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  template<typename RegionTy> const RegionTy* getAs() const;
1471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
148f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu  virtual bool isBoundable() const { return false; }
149b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
1509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion*) { return true; }
1519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space";
1549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
1559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
156a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected:
15767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
15867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
159a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager *Mgr;
160a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
16167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind)
16267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemRegion(k), Mgr(mgr) {
16367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
16467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
16567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
16667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemRegionManager* getMemRegionManager() const { return Mgr; }
1671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
16967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  bool isBoundable() const { return false; }
17067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
17167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
17267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
17367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
17467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
17567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_MEMSPACES && k <= END_MEMSPACES;
176a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  }
17767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
17867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
17967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion {
180dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected:
181dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  GlobalsSpaceRegion(MemRegionManager *mgr, Kind k)
182dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : MemSpaceRegion(mgr, k) {}
183dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
184dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
185dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    Kind k = R->getKind();
186dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES;
187dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
188dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
189dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
190dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion {
19167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
192a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
193dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *CR;
194dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
195dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr)
196dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {}
197dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
198dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
199dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
200dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2018cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void dumpToStream(raw_ostream& os) const;
202fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
203dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *getCodeRegion() const { return CR; }
204dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
205dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
206dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R->getKind() == StaticGlobalSpaceRegionKind;
207dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
208dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
209dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
210dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion {
211dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  friend class MemRegionManager;
212dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
213dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  NonStaticGlobalSpaceRegion(MemRegionManager *mgr)
214dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : GlobalsSpaceRegion(mgr, NonStaticGlobalSpaceRegionKind) {}
215dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
217fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
2188cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void dumpToStream(raw_ostream& os) const;
219fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
22067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
221dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R->getKind() == NonStaticGlobalSpaceRegionKind;
22267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
22367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
22467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
22567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion {
22667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
22767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
22867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion(MemRegionManager *mgr)
22967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, HeapSpaceRegionKind) {}
23067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
23167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
23267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == HeapSpaceRegionKind;
23367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
23467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
23567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
2362b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion {
2372b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  friend class MemRegionManager;
2382b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion(MemRegionManager *mgr)
2392b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {}
2402b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic:
2412b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  static bool classof(const MemRegion *R) {
2422b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    return R->getKind() == UnknownSpaceRegionKind;
2432b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  }
2442b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek};
2452b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
24667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion {
24767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
24867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *SFC;
2499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
25067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected:
25167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc)
25267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, k), SFC(sfc) {
25367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
25467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
25541168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
25667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
25767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *getStackFrame() const { return SFC; }
25867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
25967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
26067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
26167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
26267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
26367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= StackLocalsSpaceRegionKind &&
26467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek           k <= StackArgumentsSpaceRegionKind;
26567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
26667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
26767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
26867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion {
26967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
27067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
27167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
27267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {}
27367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
27467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
27567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackLocalsSpaceRegionKind;
27667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
27767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
27867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
27967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion {
28067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
28167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
28267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
28367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {}
28467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
28567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
28667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackArgumentsSpaceRegionKind;
2879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
2899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2907caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
291993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
292993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
293993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
2949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
2951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const MemRegion* superRegion;
296993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
2979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
2989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
2999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
3009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  /// getExtent - Returns the size of the region in bytes.
303c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const {
30432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    return UnknownVal();
30532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  }
30632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
307a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager* getMemRegionManager() const;
3081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3097e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  bool isSubRegionOf(const MemRegion* R) const;
3101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
31267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() > END_MEMSPACES;
313993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
314993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
3151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
31719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses.
3181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===//
319ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
32082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
32182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
32282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
32382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
32482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
32582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
32682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
32782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* Ex;
32882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
3297ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion *superRegion)
33082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
3311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
3331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* getExpr() const { return Ex; }
3359852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
3369852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
3379852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
338c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
33932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
34082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
34182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
34282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,
3437ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                            unsigned Cnt, const MemRegion *superRegion);
3441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3458cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void dumpToStream(raw_ostream& os) const;
3461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
34882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
34982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
3501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
3511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
352993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
353993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
354993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
355993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
357993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
3589697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  virtual QualType getLocationType() const = 0;
3599697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
3609697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  QualType getDesugaredLocationType(ASTContext &Context) const {
3619697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return getLocationType().getDesugaredType(Context);
3629697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
3639697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
3649697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  bool isBoundable() const { return true; }
3659697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
3669697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  static bool classof(const MemRegion* R) {
3679697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    unsigned k = R->getKind();
3689697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS;
3699697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
3709697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek};
3719697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
3729697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value.
3739697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion {
3749697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected:
3759697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {}
3769697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
3779697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic:
378018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getValueType() const = 0;
3791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
380018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getLocationType() const {
3816eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can possibly optimize this later to cache this value.
382a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    QualType T = getValueType();
383a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    ASTContext &ctx = getContext();
384a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    if (T->getAs<ObjCObjectType>())
385a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek      return ctx.getObjCObjectPointerType(T);
386a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    return ctx.getPointerType(getValueType());
3876eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38949f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall  QualType getDesugaredValueType(ASTContext &Context) const {
390018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    QualType T = getValueType();
3911ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor    return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T;
39214553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
3931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
394993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
3959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
3969697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return k >= BEG_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS;
3979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
400ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
401eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion {
402eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected:
403eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {}
404ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
405eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  bool isBoundable() const { return false; }
406eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
407eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
408eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    Kind k = R->getKind();
409eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return k >= FunctionTextRegionKind && k <= BlockTextRegionKind;
410eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
411eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
412ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
413eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function.
414eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion {
415eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const FunctionDecl *FD;
416eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic:
417eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  FunctionTextRegion(const FunctionDecl* fd, const MemRegion* sreg)
418eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {}
419eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
420018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getLocationType() const {
421018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getContext().getPointerType(FD->getType());
422ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
423eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
424abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  const FunctionDecl *getDecl() const {
425abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek    return FD;
42672e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  }
427eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
4288cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  virtual void dumpToStream(raw_ostream& os) const;
429eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
430ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
431eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
432abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD,
433abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek                            const MemRegion*);
434eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
435ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static bool classof(const MemRegion* R) {
436eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == FunctionTextRegionKind;
437eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
438eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
439eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
440eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
441eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures).
4420a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
4430a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
4440a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
4450a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
4460a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
447eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion {
44867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
44967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
450eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *BD;
45167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  AnalysisContext *AC;
452eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CanQualType locTy;
45367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
45467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockTextRegion(const BlockDecl *bd, CanQualType lTy,
45567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                  AnalysisContext *ac, const MemRegion* sreg)
45667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {}
45767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
45867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
459018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getLocationType() const {
460eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return locTy;
461eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
462eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
463eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *getDecl() const {
464eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return BD;
465eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
46667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
46767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  AnalysisContext *getAnalysisContext() const { return AC; }
468eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
4698cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  virtual void dumpToStream(raw_ostream& os) const;
470eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
471eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
472eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
473eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD,
47467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            CanQualType, const AnalysisContext*,
47567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const MemRegion*);
476eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
477eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
478eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == BlockTextRegionKind;
479ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
480ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu};
4810a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
4820a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance.
4830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
4840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
4850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
4860a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
4870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
4880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion {
48967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
4900a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *BC;
49167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const LocationContext *LC; // Can be null */
4924240096011a187807058f887eb81df750ffa17feTed Kremenek  void *ReferencedVars;
49367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
49467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc,
4950a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                  const MemRegion *sreg)
4964240096011a187807058f887eb81df750ffa17feTed Kremenek  : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc), ReferencedVars(0) {}
4970a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
49867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
4990a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *getCodeRegion() const { return BC; }
5004240096011a187807058f887eb81df750ffa17feTed Kremenek
501d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek  const BlockDecl *getDecl() const { return BC->getDecl(); }
502d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek
50381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  class referenced_vars_iterator {
50481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const MemRegion * const *R;
50581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  public:
50681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    explicit referenced_vars_iterator(const MemRegion * const *r) : R(r) {}
50781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
50881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    operator const MemRegion * const *() const {
50981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return R;
51081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
51181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
51281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const VarRegion* operator*() const {
51381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return cast<VarRegion>(*R);
51481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
51581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
51681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator==(const referenced_vars_iterator &I) const {
51781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R == R;
51881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
51981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator!=(const referenced_vars_iterator &I) const {
52081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R != R;
52181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
52281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    referenced_vars_iterator& operator++() {
52381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      ++R;
52481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return *this;
52581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
52681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  };
52781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
5284240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_begin() const;
5294240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_end() const;
5300a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
5318cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  virtual void dumpToStream(raw_ostream& os) const;
5320a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
5330a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
5340a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
53567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *,
53667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const LocationContext *, const MemRegion *);
5370a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
5380a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  static bool classof(const MemRegion* R) {
5390a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek    return R->getKind() == BlockDataRegionKind;
5400a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  }
5414240096011a187807058f887eb81df750ffa17feTed Kremenekprivate:
5424240096011a187807058f887eb81df750ffa17feTed Kremenek  void LazyInitializeReferencedVars();
5430a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek};
544ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
545026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
546026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  clases, SymbolicRegion represents a region that serves as an alias for
547026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  either a real region, a NULL pointer, etc.  It essentially is used to
548026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  map the concept of symbolic values into the domain of regions.  Symbolic
549026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  regions do not need to be typed.
550e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion {
551026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected:
552026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  const SymbolRef sym;
553026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
554026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic:
5551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SymbolicRegion(const SymbolRef s, const MemRegion* sreg)
556e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek    : SubRegion(sreg, SymbolicRegionKind), sym(s) {}
5571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
558026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  SymbolRef getSymbol() const {
559026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return sym;
560026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
561026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
5629852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
5639852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
564c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
56532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
566026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
567026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
568250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
569250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            SymbolRef sym,
570250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            const MemRegion* superRegion);
5711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5728cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void dumpToStream(raw_ostream& os) const;
5731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
574026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  static bool classof(const MemRegion* R) {
575026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() == SymbolicRegionKind;
576026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
5771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
578026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
579e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
5809697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion {
581e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
582e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
583e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
584e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
585250101353b711a409b075f1bc11070dddec7100bTed Kremenek  StringRegion(const StringLiteral* str, const MemRegion* sreg)
5869697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sreg, StringRegionKind), Str(str) {}
587e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
588e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
589e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
590e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
591e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
592e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
5936613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
5946613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
5951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
596018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
597ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return Str->getType();
598ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  }
599e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
600c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
60132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
6020a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu  bool isBoundable() const { return false; }
6030a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
604e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
605e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
606e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
607e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
6088cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void dumpToStream(raw_ostream& os) const;
609cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
610e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
611e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
612e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
613e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
614e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
615329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
616329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
617329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
6189697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion {
619329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
620329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
621329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  const CompoundLiteralExpr* CL;
622329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
623329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg)
6249697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
6251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
626329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
627329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const CompoundLiteralExpr* CL,
628329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
629329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
630018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
631018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return CL->getType();
63277cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
6330a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
6349a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu  bool isBoundable() const { return !CL->isFileScope(); }
6359a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu
636329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6388cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void dumpToStream(raw_ostream& os) const;
639329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
64011a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek  const CompoundLiteralExpr* getLiteralExpr() const { return CL; }
6411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
642329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
643329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
644329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
645329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
646178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
6479697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion {
6489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
6499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Decl* D;
6509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
651993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  DeclRegion(const Decl* d, const MemRegion* sReg, Kind k)
6529697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, k), D(d) {}
6539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
6549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D,
6559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
6561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
657bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
658bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu  const Decl* getDecl() const { return D; }
6599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
661c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
66232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
663e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
664e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
66567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS;
666e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
6679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
6681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
6709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
671d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
672d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  // Constructors and private methods.
67367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  VarRegion(const VarDecl* vd, const MemRegion* sReg)
67467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
6759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
676250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* VD,
677d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                            const MemRegion *superRegion) {
6789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
6799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
6801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
681d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
684d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  const VarDecl *getDecl() const { return cast<VarDecl>(D); }
6851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6865348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  const StackFrameContext *getStackFrame() const;
6875348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
688018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
6896eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
690018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
6911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
6921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6938cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void dumpToStream(raw_ostream& os) const;
6941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
6969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
6971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
6989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
699de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
700de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter
701de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  in a call to a C++ method.  This region doesn't represent the object
702de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  referred to by 'this', but rather 'this' itself.
7039697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion {
704de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  friend class MemRegionManager;
705de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  CXXThisRegion(const PointerType *thisPointerTy,
706de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                const MemRegion *sReg)
7079697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {}
708de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
709de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
710de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const PointerType *PT,
711de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const MemRegion *sReg);
712de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
713de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
714de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
715de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic:
716018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
717de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return QualType(ThisPointerTy, 0);
718de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
7197caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
7208cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void dumpToStream(raw_ostream& os) const;
721de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
722de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static bool classof(const MemRegion* R) {
723de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return R->getKind() == CXXThisRegionKind;
724de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
725de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
726de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate:
727de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const PointerType *ThisPointerTy;
728de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek};
7299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
7309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
7319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
7329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
733993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  FieldRegion(const FieldDecl* fd, const MemRegion* sReg)
7349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
7359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
7364bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
7371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7388cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void dumpToStream(raw_ostream& os) const;
7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7404bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  const FieldDecl* getDecl() const { return cast<FieldDecl>(D); }
7411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
742018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
7436eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
744018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
7451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
7464bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
747c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
74832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
7496304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl* FD,
7506304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
7519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
7529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
7531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
7559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
7569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
7579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
7581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
7601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
7621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
763993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg)
7649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
7659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
7666304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl* ivd,
7676304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
7689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
7699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
7701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
7729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); }
773018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const { return getDecl()->getType(); }
7741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7758cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void dumpToStream(raw_ostream& os) const;
7761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
7789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
7799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
7809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
7817caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
782fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions.
7837caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
7847caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
7857caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion;
7867caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
7877caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset {
7887caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate:
7897caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  friend class ElementRegion;
7907caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
7917caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *Region;
7929ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits Offset;
7937caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
7949ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero())
7957caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu    : Region(reg), Offset(offset) {}
7967caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
7977caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic:
7987caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  // FIXME: Eventually support symbolic offsets.
7999ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits getOffset() const { return Offset; }
8007caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *getRegion() const { return Region; }
8017caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
8028cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void dumpToStream(raw_ostream& os) const;
8037caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  void dump() const;
8047caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu};
805511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
8069697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion {
807511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
808511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
809f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType ElementType;
81002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc Index;
811511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
81202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg)
8139697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, ElementRegionKind),
814f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek      ElementType(elementType), Index(Idx) {
8153d8173c1c68f451c7492f92023d829c626845925Chris Lattner    assert((!isa<nonloc::ConcreteInt>(&Idx) ||
8163d8173c1c68f451c7492f92023d829c626845925Chris Lattner           cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) &&
81743b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
8180395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
8191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
820f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType,
821f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek                            SVal Idx, const MemRegion* superRegion);
822511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
823511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
824511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
82502282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc getIndex() const { return Index; }
8266e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
827018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
828f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
829f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  }
8301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
831f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType getElementType() const {
832f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
833abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
8347caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  /// Compute the offset within the array. The array might also be a subobject.
8357caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  RegionRawOffset getAsArrayOffset() const;
8361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8378cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void dumpToStream(raw_ostream& os) const;
838b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
839511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
840511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
841511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
842511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
843511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
844511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
84519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
846bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression.
8479697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion {
848bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  friend class MemRegionManager;
849bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
850bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  Expr const *Ex;
851bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
85202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  CXXTempObjectRegion(Expr const *E, MemRegion const *sReg)
8539697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {}
854bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
855bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
856bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu                            Expr const *E, const MemRegion *sReg);
857bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
858bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic:
859018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
860bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu    return Ex->getType();
861bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
862bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
8638cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void dumpToStream(raw_ostream& os) const;
864e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu
865bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
866bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
867bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static bool classof(const MemRegion* R) {
86802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    return R->getKind() == CXXTempObjectRegionKind;
869bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
870bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu};
871bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
8724fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is
8734fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object.
8749697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion {
8754fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  friend class MemRegionManager;
8764fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
8774fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  const CXXRecordDecl *decl;
8784fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
8794fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  CXXBaseObjectRegion(const CXXRecordDecl *d, const MemRegion *sReg)
8809697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXBaseObjectRegionKind), decl(d) {}
8814fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
8824fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
8834fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                            const CXXRecordDecl *decl, const MemRegion *sReg);
8844fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
8854fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic:
886d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  const CXXRecordDecl *getDecl() const { return decl; }
887d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
8884fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  QualType getValueType() const;
8894fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
8908cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void dumpToStream(raw_ostream& os) const;
8914fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
8924fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
8934fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
8944fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  static bool classof(const MemRegion *region) {
8954fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    return region->getKind() == CXXBaseObjectRegionKind;
8964fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  }
8974fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu};
8984fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
899ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy>
900ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const {
901f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  if (const RegionTy* RT = dyn_cast<RegionTy>(this))
902f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek    return RT;
9031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
904f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  return NULL;
905ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}
906511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
9079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
9089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
9099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
9109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
912a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &C;
9139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
9149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
9151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
916dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  NonStaticGlobalSpaceRegion *globals;
9172b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
918c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *>
919c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackLocalsSpaceRegions;
920c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *>
921c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackArgumentsSpaceRegions;
922dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *>
923dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticsGlobalSpaceRegions;
9242b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
92567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion *heap;
9262b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion *unknown;
927d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *code;
928dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
9299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
930a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a)
931c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    : C(c), A(a), globals(0), heap(0), unknown(0), code(0) {}
9321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9334240096011a187807058f887eb81df750ffa17feTed Kremenek  ~MemRegionManager();
9341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
935a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &getContext() { return C; }
9364240096011a187807058f887eb81df750ffa17feTed Kremenek
9374240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &getAllocator() { return A; }
9381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
93967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getStackLocalsRegion - Retrieve the memory region associated with the
94067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  specified stack frame.
94167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackLocalsSpaceRegion *
94267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackLocalsRegion(const StackFrameContext *STC);
943d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
944d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  /// getStackArgumentsRegion - Retrieve the memory region associated with
94567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  function/method arguments of the specified stack frame.
94667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackArgumentsSpaceRegion *
94767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackArgumentsRegion(const StackFrameContext *STC);
9481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
950dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ///  global variables.
951dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const GlobalsSpaceRegion *getGlobalsRegion(const CodeTextRegion *R = 0);
9521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
9549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
95567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const HeapSpaceRegion *getHeapRegion();
956178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
957178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
958178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
959b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getUnknownRegion();
960c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
961b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getCodeRegion();
962ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
9637090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
96467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const AllocaRegion *getAllocaRegion(const Expr* Ex, unsigned Cnt,
96567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                      const LocationContext *LC);
9661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
967329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
968329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
969b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const CompoundLiteralRegion*
97067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr* CL,
97167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                           const LocationContext *LC);
972de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
973fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  /// getCXXThisRegion - Retrieve the [artificial] region associated with the
974de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ///  parameter 'this'.
975de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy,
976de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                        const LocationContext *LC);
9771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
978993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  /// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
979b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const SymbolicRegion* getSymbolicRegion(SymbolRef sym);
980e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
981b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const StringRegion* getStringRegion(const StringLiteral* Str);
982e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
9839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
984d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  ///  a specified VarDecl and LocationContext.
985b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC);
9861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
98767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
98867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  a specified VarDecl and super region.
98967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR);
99067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
991f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  /// getElementRegion - Retrieve the memory region associated with the
992f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ///  associated element type, index, and super region.
99302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx,
994856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        const MemRegion *superRegion,
995856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        ASTContext &Ctx);
9961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
997b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER,
998856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                                 const MemRegion *superRegion) {
999a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getElementRegion(ER->getElementType(), ER->getIndex(),
1000a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek                            superRegion, ER->getContext());
1001a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
1002511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
10039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
10049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
10059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
10069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
1007b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegion(const FieldDecl* fd,
1008b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                    const MemRegion* superRegion);
10091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1010b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR,
1011b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                             const MemRegion *superRegion) {
1012a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getFieldRegion(FR->getDecl(), superRegion);
1013a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
10141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
10169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
10179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
10189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
1019b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl* ivd,
1020b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                          const MemRegion* superRegion);
10211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
102202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex,
102302fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                                    LocationContext const *LC);
1024bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
10254fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  const CXXBaseObjectRegion *getCXXBaseObjectRegion(const CXXRecordDecl *decl,
10264fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                                                  const MemRegion *superRegion);
10274fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1028d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different
1029d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// super region.
1030d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  const CXXBaseObjectRegion *
1031d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg,
1032d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu                                  const MemRegion *superRegion) {
1033d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu    return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion);
1034d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  }
1035d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
1036b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD);
1037b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD,
103867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            CanQualType locTy,
103967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            AnalysisContext *AC);
104067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
104167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getBlockDataRegion - Get the memory region associated with an instance
104267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  of a block.  Unlike many other MemRegions, the LocationContext*
104367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  argument is allowed to be NULL for cases where we have no known
104467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  context.
1045b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc,
104667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            const LocationContext *lc = NULL);
10471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1048bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  bool isGlobalsRegion(const MemRegion* R) {
1049bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    assert(R);
1050bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    return R == globals;
1051bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
1052bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
1053bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate:
1054250101353b711a409b075f1bc11070dddec7100bTed Kremenek  template <typename RegionTy, typename A1>
1055250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* getRegion(const A1 a1);
10561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10576304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  template <typename RegionTy, typename A1>
1058eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion);
10591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10607ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  template <typename RegionTy, typename A1, typename A2>
10617ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* getRegion(const A1 a1, const A2 a2);
1062dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
10630a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  template <typename RegionTy, typename A1, typename A2>
10640a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2,
10650a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                         const MemRegion* superRegion);
10660a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
106767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename RegionTy, typename A1, typename A2, typename A3>
106867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3,
106967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                         const MemRegion* superRegion);
107067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
107167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG>
107267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region);
107367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
107467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG, typename ARG>
107567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region, ARG a);
1076ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek};
10771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1078250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1079a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions.
1080250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1081250101353b711a409b075f1bc11070dddec7100bTed Kremenek
1082a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekinline ASTContext& MemRegion::getContext() const {
1083a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  return getMemRegionManager()->getContext();
1084a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
1085eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
10865a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace
10875a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
1088be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace
10899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1090250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1091250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions.
1092250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1093250101353b711a409b075f1bc11070dddec7100bTed Kremenek
1094be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm {
10958800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekstatic inline raw_ostream& operator<<(raw_ostream& os,
10969ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek                                      const clang::ento::MemRegion* R) {
10978800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  R->dumpToStream(os);
10988800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  return os;
1099be91224894e1501133e224934285ba6440bf5b59Ted Kremenek}
1100be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace
11019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
11029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
1103