MemRegion.h revision 478851c3ed6bd784e7377dffd8e57b200c1b9ba9
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
19478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer#include "clang/AST/ASTContext.h"
209ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck#include "clang/AST/CharUnits.h"
21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/Decl.h"
224c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek#include "clang/AST/ExprObjC.h"
23d47d3b0cfeb7e8564ff77f48130fe63282b6d127Chris Lattner#include "clang/Basic/LLVM.h"
249b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
259c1845dbed9817520f5a7db8bd80a560c6c6ae6bArgyrios Kyrtzidis#include "llvm/Support/ErrorHandling.h"
269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h"
279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string>
289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
295e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramernamespace llvm {
305e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass BumpPtrAllocator;
315e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer}
329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang {
341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext;
3667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext;
375a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
389ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento {
395a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemRegionManager;
415a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemSpaceRegion;
42c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenekclass SValBuilder;
434240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion;
44dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass CodeTextRegion;
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu/// Represent a region's offset within the top level base region.
47e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xuclass RegionOffset {
48e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The base region.
49e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *R;
50e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
51e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The bit offset within the base region. It shouldn't be negative.
52e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t Offset;
53e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xupublic:
55e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  RegionOffset(const MemRegion *r) : R(r), Offset(0) {}
56e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {}
57e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
58e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *getRegion() const { return R; }
59e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t getOffset() const { return Offset; }
60e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu};
61e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
6219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
6319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes.
6419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions.
679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode {
684240096011a187807058f887eb81df750ffa17feTed Kremenek  friend class MemRegionManager;
699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
7067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  enum Kind {
7167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Memory spaces.
72dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    GenericMemSpaceRegionKind,
7367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackLocalsSpaceRegionKind,
7467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackArgumentsSpaceRegionKind,
7567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    HeapSpaceRegionKind,
762b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    UnknownSpaceRegionKind,
77dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticGlobalSpaceRegionKind,
78eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalInternalSpaceRegionKind,
79eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalSystemSpaceRegionKind,
80eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalImmutableSpaceRegionKind,
81eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    BEG_NON_STATIC_GLOBAL_MEMSPACES = GlobalInternalSpaceRegionKind,
82eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_NON_STATIC_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind,
83eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    BEG_GLOBAL_MEMSPACES = StaticGlobalSpaceRegionKind,
84eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind,
85dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    BEG_MEMSPACES = GenericMemSpaceRegionKind,
86eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_MEMSPACES = GlobalImmutableSpaceRegionKind,
8767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Untyped regions.
8867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    SymbolicRegionKind,
8967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    AllocaRegionKind,
909697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    BlockDataRegionKind,
9167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Typed regions.
9267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_TYPED_REGIONS,
9367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FunctionTextRegionKind = BEG_TYPED_REGIONS,
9467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BlockTextRegionKind,
959697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    BEG_TYPED_VALUE_REGIONS,
969697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    CompoundLiteralRegionKind = BEG_TYPED_VALUE_REGIONS,
97de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    CXXThisRegionKind,
9867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StringRegionKind,
994c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    ObjCStringRegionKind,
10067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ElementRegionKind,
10167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Decl Regions.
10267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_DECL_REGIONS,
10367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    VarRegionKind = BEG_DECL_REGIONS,
10467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FieldRegionKind,
10567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ObjCIvarRegionKind,
1064fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    END_DECL_REGIONS = ObjCIvarRegionKind,
10702fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    CXXTempObjectRegionKind,
1084fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    CXXBaseObjectRegionKind,
109096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose    END_TYPED_VALUE_REGIONS = CXXBaseObjectRegionKind,
110096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose    END_TYPED_REGIONS = CXXBaseObjectRegionKind
11167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  };
11267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
1149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
1151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
1179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
1189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
1199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
121a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek  ASTContext &getContext() const;
1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
124a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
125a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  virtual MemRegionManager* getMemRegionManager() const = 0;
126a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
127bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemSpaceRegion *getMemorySpace() const;
1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
129adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *getBaseRegion() const;
130adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
131479529e679957fbb92b56e116e3c86734429331eZhongxing Xu  const MemRegion *StripCasts() const;
1321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1331508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsOrParametersStorage() const;
1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
135de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackStorage() const;
136de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
137de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackNonParametersStorage() const;
138de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
139de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackParametersStorage() const;
140b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
141e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// Compute the offset within the top level memory object.
142e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  RegionOffset getAsOffset() const;
143e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1443d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief Get a string representation of a region for debug use.
1453d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  std::string getString() const;
1463d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
1479c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
1487f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
1498800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dump() const;
1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1513d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief Print the region for use in diagnostics.
1523d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  virtual void dumpPretty(raw_ostream &os) const;
1533d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
1541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Kind getKind() const { return kind; }
1551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
156ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  template<typename RegionTy> const RegionTy* getAs() const;
1571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
158f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu  virtual bool isBoundable() const { return false; }
159b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
1609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion*) { return true; }
1619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
163eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// MemSpaceRegion - A memory region that represents a "memory space";
1649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
1659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
166a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected:
16767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
16867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
169a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager *Mgr;
170a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
17167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind)
17267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemRegion(k), Mgr(mgr) {
17367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
17467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
17567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
17667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemRegionManager* getMemRegionManager() const { return Mgr; }
1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
17967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  bool isBoundable() const { return false; }
18067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
18167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
18267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
18367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
18467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
18567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_MEMSPACES && k <= END_MEMSPACES;
186a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  }
18767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
18867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
18967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion {
19099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
191dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected:
192dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  GlobalsSpaceRegion(MemRegionManager *mgr, Kind k)
193dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : MemSpaceRegion(mgr, k) {}
194dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
195dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
196dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    Kind k = R->getKind();
197dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES;
198dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
199dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
200eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
201914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region of the static variables within the current CodeTextRegion
202eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// scope.
203914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie///
204eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// Currently, only the static locals are placed there, so we know that these
205eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// variables do not get invalidated by calls to other functions.
206dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion {
20767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
208a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
209dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *CR;
210dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
211dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr)
212dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {}
213dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
214dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
215dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
216dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2179c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
218fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
219dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *getCodeRegion() const { return CR; }
220dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
221dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
222dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R->getKind() == StaticGlobalSpaceRegionKind;
223dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
224dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
225eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
226914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region for all the non-static global variables.
227eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks///
228eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// This class is further split into subclasses for efficient implementation of
229eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// invalidating a set of related global values as is done in
230eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// RegionStoreManager::invalidateRegions (instead of finding all the dependent
231eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// globals, we invalidate the whole parent region).
232dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion {
233dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  friend class MemRegionManager;
234dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
235eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksprotected:
236eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  NonStaticGlobalSpaceRegion(MemRegionManager *mgr, Kind k)
237eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : GlobalsSpaceRegion(mgr, k) {}
238dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
240fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
24167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
242eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    Kind k = R->getKind();
243eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return k >= BEG_NON_STATIC_GLOBAL_MEMSPACES &&
244eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks           k <= END_NON_STATIC_GLOBAL_MEMSPACES;
24567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
24667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
247eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
248914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are defined in system/external
249eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// headers and are considered modifiable by system calls (ex: errno).
250eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalSystemSpaceRegion : public NonStaticGlobalSpaceRegion {
251eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
252eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
253eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalSystemSpaceRegion(MemRegionManager *mgr)
254eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalSystemSpaceRegionKind) {}
255eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
256eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
257eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
258eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
259eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
260eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
261eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalSystemSpaceRegionKind;
262eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
263eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
264eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
265914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are considered not to be modified
266eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// or point to data which could be modified as a result of a function call
267eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// (system or internal). Ex: Const global scalars would be modeled as part of
268eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// this region. This region also includes most system globals since they have
269eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// low chance of being modified.
270eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalImmutableSpaceRegion : public NonStaticGlobalSpaceRegion {
271eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
272eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
273eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalImmutableSpaceRegion(MemRegionManager *mgr)
274eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalImmutableSpaceRegionKind) {}
275eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
276eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
277eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
278eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
279eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
280eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
281eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalImmutableSpaceRegionKind;
282eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
283eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
284eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
285914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which can be modified by calls to
286eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// "internally" defined functions - (for now just) functions other then system
287eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// calls.
288eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalInternalSpaceRegion : public NonStaticGlobalSpaceRegion {
289eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
290eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
291eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalInternalSpaceRegion(MemRegionManager *mgr)
292eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalInternalSpaceRegionKind) {}
293eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
294eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
295eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
296eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
297eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
298eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
299eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalInternalSpaceRegionKind;
300eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
301eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
302eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
30367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion {
30499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
30567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
30667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
30767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion(MemRegionManager *mgr)
30867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, HeapSpaceRegionKind) {}
30967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
31036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
31136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
31236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
31367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
31467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == HeapSpaceRegionKind;
31567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
31667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
31767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
3182b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion {
31999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
3202b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  friend class MemRegionManager;
3212b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion(MemRegionManager *mgr)
3222b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {}
3232b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic:
32436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
32536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
32636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
3272b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  static bool classof(const MemRegion *R) {
3282b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    return R->getKind() == UnknownSpaceRegionKind;
3292b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  }
3302b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek};
3312b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
33267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion {
33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
33467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *SFC;
3359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
33667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected:
33767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc)
33867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, k), SFC(sfc) {
33967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
34067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
34141168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
34267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
34367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *getStackFrame() const { return SFC; }
34467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
34567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
34667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
34767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
34867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
34967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= StackLocalsSpaceRegionKind &&
35067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek           k <= StackArgumentsSpaceRegionKind;
35167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
35267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
35367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
35467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion {
35599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
35667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
35767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
35867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {}
35967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
36036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
36136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
36236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
36367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
36467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackLocalsSpaceRegionKind;
36567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
36667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
36767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
36867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion {
36967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
37099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
37167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
37367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {}
37467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
37536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
37636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
37736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
37867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
37967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackArgumentsSpaceRegionKind;
3809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3837caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
384993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
385993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
386993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
38799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikieprivate:
38899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
3899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
3901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const MemRegion* superRegion;
391993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
3929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
3939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
3949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
3959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  /// getExtent - Returns the size of the region in bytes.
398c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const {
39932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    return UnknownVal();
40032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  }
40132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
402a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager* getMemRegionManager() const;
4031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4047e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  bool isSubRegionOf(const MemRegion* R) const;
4051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
40767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() > END_MEMSPACES;
408993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
409993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
4101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
41219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses.
4131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===//
414ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
41582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
41682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
41782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
41882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
41982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
42082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
42182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
4229c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Expr *Ex;
42382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
4249c378f705405d37f49795d5e915989de774fe11fTed Kremenek  AllocaRegion(const Expr *ex, unsigned cnt, const MemRegion *superRegion)
42582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
4261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
4281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4299c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Expr *getExpr() const { return Ex; }
4309852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
4319852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
4329852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
433c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
43432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
43582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
43682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
4379c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr *Ex,
4387ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                            unsigned Cnt, const MemRegion *superRegion);
4391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4409c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
44382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
44482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
4451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
4461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
447993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
448993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
44999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
45099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
451993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
452993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
4531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
454993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
4559697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  virtual QualType getLocationType() const = 0;
4569697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4579697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  QualType getDesugaredLocationType(ASTContext &Context) const {
4589697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return getLocationType().getDesugaredType(Context);
4599697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
4609697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4619697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  bool isBoundable() const { return true; }
4629697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4639697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  static bool classof(const MemRegion* R) {
4649697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    unsigned k = R->getKind();
4659697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS;
4669697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
4679697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek};
4689697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4699697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value.
4709697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion {
47199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
47299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
4739697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected:
4749697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {}
4759697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4769697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic:
477018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getValueType() const = 0;
4781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
479018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getLocationType() const {
4806eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can possibly optimize this later to cache this value.
481a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    QualType T = getValueType();
482a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    ASTContext &ctx = getContext();
483a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    if (T->getAs<ObjCObjectType>())
484a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek      return ctx.getObjCObjectPointerType(T);
485a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    return ctx.getPointerType(getValueType());
4866eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
4871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48849f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall  QualType getDesugaredValueType(ASTContext &Context) const {
489018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    QualType T = getValueType();
4901ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor    return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T;
49114553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
4921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
493993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
4949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
4959697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return k >= BEG_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS;
4969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
4989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
499ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
500eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion {
50199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
50299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
503eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected:
504eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {}
505ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
506eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  bool isBoundable() const { return false; }
507eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
508eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
509eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    Kind k = R->getKind();
510eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return k >= FunctionTextRegionKind && k <= BlockTextRegionKind;
511eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
512eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
513ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
514eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function.
515eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion {
516eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const FunctionDecl *FD;
517eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic:
5189c378f705405d37f49795d5e915989de774fe11fTed Kremenek  FunctionTextRegion(const FunctionDecl *fd, const MemRegion* sreg)
519eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {}
520eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
521018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getLocationType() const {
522018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getContext().getPointerType(FD->getType());
523ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
524eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
525abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  const FunctionDecl *getDecl() const {
526abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek    return FD;
52772e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  }
528eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
5299c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
530eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
531ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
532eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
533abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD,
534abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek                            const MemRegion*);
535eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
536ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static bool classof(const MemRegion* R) {
537eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == FunctionTextRegionKind;
538eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
539eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
540eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
541eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
542eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures).
5430a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
5440a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
5450a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
5460a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
5470a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
548eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion {
54967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
55067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
551eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *BD;
5521d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *AC;
553eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CanQualType locTy;
55467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
55567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockTextRegion(const BlockDecl *bd, CanQualType lTy,
5561d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                  AnalysisDeclContext *ac, const MemRegion* sreg)
55767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {}
55867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
55967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
560018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getLocationType() const {
561eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return locTy;
562eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
563eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
564eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *getDecl() const {
565eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return BD;
566eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
56767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
5681d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *getAnalysisDeclContext() const { return AC; }
569eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
5709c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
571eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
572eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
573eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
574eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD,
5751d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                            CanQualType, const AnalysisDeclContext*,
57667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const MemRegion*);
577eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
578eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
579eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == BlockTextRegionKind;
580ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
581ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu};
5820a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
5830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance.
5840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
5850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
5860a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
5870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
5880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
5890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion {
59067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
5910a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *BC;
59267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const LocationContext *LC; // Can be null */
5934240096011a187807058f887eb81df750ffa17feTed Kremenek  void *ReferencedVars;
59485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  void *OriginalVars;
59567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
59667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc,
5970a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                  const MemRegion *sreg)
59885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc),
59985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    ReferencedVars(0), OriginalVars(0) {}
6000a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
60185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenekpublic:
6020a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *getCodeRegion() const { return BC; }
6034240096011a187807058f887eb81df750ffa17feTed Kremenek
604d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek  const BlockDecl *getDecl() const { return BC->getDecl(); }
605d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek
60681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  class referenced_vars_iterator {
60781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const MemRegion * const *R;
60885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion * const *OriginalR;
60981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  public:
61085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    explicit referenced_vars_iterator(const MemRegion * const *r,
61185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                      const MemRegion * const *originalR)
61285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      : R(r), OriginalR(originalR) {}
61381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
61481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    operator const MemRegion * const *() const {
61581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return R;
61681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
61785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
61885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion *getCapturedRegion() const {
61985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      return *R;
62085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    }
62185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion *getOriginalRegion() const {
62285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      return *OriginalR;
62385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    }
62485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
62581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const VarRegion* operator*() const {
62681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return cast<VarRegion>(*R);
62781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
62881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
62981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator==(const referenced_vars_iterator &I) const {
63081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R == R;
63181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
63281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator!=(const referenced_vars_iterator &I) const {
63381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R != R;
63481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
6359c378f705405d37f49795d5e915989de774fe11fTed Kremenek    referenced_vars_iterator &operator++() {
63681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      ++R;
63785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      ++OriginalR;
63881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return *this;
63981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
64081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  };
64181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
6424240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_begin() const;
6434240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_end() const;
6440a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6459c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
6460a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6470a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6480a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
64967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *,
65067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const LocationContext *, const MemRegion *);
6510a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6520a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  static bool classof(const MemRegion* R) {
6530a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek    return R->getKind() == BlockDataRegionKind;
6540a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  }
6554240096011a187807058f887eb81df750ffa17feTed Kremenekprivate:
6564240096011a187807058f887eb81df750ffa17feTed Kremenek  void LazyInitializeReferencedVars();
6570a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek};
658ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
659026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
660026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  clases, SymbolicRegion represents a region that serves as an alias for
661026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  either a real region, a NULL pointer, etc.  It essentially is used to
662026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  map the concept of symbolic values into the domain of regions.  Symbolic
663026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  regions do not need to be typed.
664e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion {
665026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected:
666026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  const SymbolRef sym;
667026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
668026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic:
6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SymbolicRegion(const SymbolRef s, const MemRegion* sreg)
670e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek    : SubRegion(sreg, SymbolicRegionKind), sym(s) {}
6711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
672026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  SymbolRef getSymbol() const {
673026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return sym;
674026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
675026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
6769852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
6779852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
678c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
67932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
680026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
681026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
682250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
683250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            SymbolRef sym,
684250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            const MemRegion* superRegion);
6851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6869c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
6871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
688026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  static bool classof(const MemRegion* R) {
689026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() == SymbolicRegionKind;
690026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
6911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
692026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
693e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
6949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion {
695e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
696e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
697e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
698e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
699250101353b711a409b075f1bc11070dddec7100bTed Kremenek  StringRegion(const StringLiteral* str, const MemRegion* sreg)
7009697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sreg, StringRegionKind), Str(str) {}
701e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
702e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
703e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
704e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
705e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
706e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
7076613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
7086613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
7091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
710018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
711ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return Str->getType();
712ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  }
713e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
714c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
71532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
7160a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu  bool isBoundable() const { return false; }
7170a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
718e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
719e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
720e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
721e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
7229c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
723cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
724e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
725e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
726e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
727e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
7284c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7294c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek/// The region associated with an ObjCStringLiteral.
7304c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekclass ObjCStringRegion : public TypedValueRegion {
7314c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  friend class MemRegionManager;
7324c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringLiteral* Str;
7334c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekprotected:
7344c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7354c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ObjCStringRegion(const ObjCStringLiteral* str, const MemRegion* sreg)
7364c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  : TypedValueRegion(sreg, ObjCStringRegionKind), Str(str) {}
7374c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7384c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
7394c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                            const ObjCStringLiteral* Str,
7404c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                            const MemRegion* superRegion);
7414c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7424c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekpublic:
7434c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7444c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringLiteral* getObjCStringLiteral() const { return Str; }
7454c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7464c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  QualType getValueType() const {
7474c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    return Str->getType();
7484c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7494c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7504c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  bool isBoundable() const { return false; }
7514c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7524c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const {
7534c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    ProfileRegion(ID, Str, superRegion);
7544c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7554c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7564c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  void dumpToStream(raw_ostream &os) const;
7574c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7584c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  static bool classof(const MemRegion* R) {
7594c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    return R->getKind() == ObjCStringRegionKind;
7604c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7614c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek};
762e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
763329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
764329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
765329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
7669697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion {
767329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
768329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
7699c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const CompoundLiteralExpr *CL;
770329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
7719c378f705405d37f49795d5e915989de774fe11fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr *cl, const MemRegion* sReg)
7729697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
7731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
774329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
7759c378f705405d37f49795d5e915989de774fe11fTed Kremenek                            const CompoundLiteralExpr *CL,
776329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
777329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
778018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
779018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return CL->getType();
78077cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
7810a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
7829a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu  bool isBoundable() const { return !CL->isFileScope(); }
7839a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu
784329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
7851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7869c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
787329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
7889c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const CompoundLiteralExpr *getLiteralExpr() const { return CL; }
7891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
790329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
791329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
792329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
793329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
794178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
7959697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion {
7969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
7979c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Decl *D;
7989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
7999c378f705405d37f49795d5e915989de774fe11fTed Kremenek  DeclRegion(const Decl *d, const MemRegion* sReg, Kind k)
8009697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, k), D(d) {}
8019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8029c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D,
8039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
8041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
805bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
8069c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Decl *getDecl() const { return D; }
8079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
8081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
809c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
81032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
811e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
812e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
81367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS;
814e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
8159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
8161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
8189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
819d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
820d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  // Constructors and private methods.
8219c378f705405d37f49795d5e915989de774fe11fTed Kremenek  VarRegion(const VarDecl *vd, const MemRegion* sReg)
82267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
8239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8249c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl *VD,
825d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                            const MemRegion *superRegion) {
8269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
8279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
8281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
829d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
8301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
832d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  const VarDecl *getDecl() const { return cast<VarDecl>(D); }
8331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8345348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  const StackFrameContext *getStackFrame() const;
8355348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
836018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
8376eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
838018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
8391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8419c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
8421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
8449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
8451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8463d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
8473d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  void dumpPretty(raw_ostream &os) const;
8489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
849de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
850de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter
851de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  in a call to a C++ method.  This region doesn't represent the object
852de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  referred to by 'this', but rather 'this' itself.
8539697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion {
854de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  friend class MemRegionManager;
855de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  CXXThisRegion(const PointerType *thisPointerTy,
856de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                const MemRegion *sReg)
8579697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {}
858de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
859de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
860de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const PointerType *PT,
861de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const MemRegion *sReg);
862de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
863de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
864de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
865de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic:
866018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
867de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return QualType(ThisPointerTy, 0);
868de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
8697caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
8709c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
871de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
872de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static bool classof(const MemRegion* R) {
873de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return R->getKind() == CXXThisRegionKind;
874de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
875de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
876de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate:
877de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const PointerType *ThisPointerTy;
878de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek};
8799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
8819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
8829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8839c378f705405d37f49795d5e915989de774fe11fTed Kremenek  FieldRegion(const FieldDecl *fd, const MemRegion* sReg)
8849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
8859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8864bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
8879c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const FieldDecl *getDecl() const { return cast<FieldDecl>(D); }
8881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
889018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
8906eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
891018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
8921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8934bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
894c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
89532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
8969c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl *FD,
8976304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
8989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
8999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
9029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
9039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9043d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
9053d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  void dumpToStream(raw_ostream &os) const;
9063d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  void dumpPretty(raw_ostream &os) const;
9079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
9081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
9101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
9121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
913c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg);
9149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9159c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl *ivd,
916c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer                            const MemRegion* superRegion);
9171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
919c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  const ObjCIvarDecl *getDecl() const;
920c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  QualType getValueType() const;
9211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9229c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
9231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
9259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
9269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
9287caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
929fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions.
9307caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
9317caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9327caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion;
9337caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9347caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset {
9357caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate:
9367caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  friend class ElementRegion;
9377caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9387caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *Region;
9399ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits Offset;
9407caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9419ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero())
9427caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu    : Region(reg), Offset(offset) {}
9437caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9447caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic:
9457caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  // FIXME: Eventually support symbolic offsets.
9469ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits getOffset() const { return Offset; }
9477caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *getRegion() const { return Region; }
9487caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9499c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
9507caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  void dump() const;
9517caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu};
952511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
9531437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks/// \brief ElementRegin is used to represent both array elements and casts.
9549697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion {
955511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
956511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
957f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType ElementType;
95802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc Index;
959511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
96002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg)
9619697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, ElementRegionKind),
962f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek      ElementType(elementType), Index(Idx) {
9633d8173c1c68f451c7492f92023d829c626845925Chris Lattner    assert((!isa<nonloc::ConcreteInt>(&Idx) ||
9643d8173c1c68f451c7492f92023d829c626845925Chris Lattner           cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) &&
96543b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
9660395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
9671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
968f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType,
969f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek                            SVal Idx, const MemRegion* superRegion);
970511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
971511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
972511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
97302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc getIndex() const { return Index; }
9746e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
975018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
976f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
977f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  }
9781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
979f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType getElementType() const {
980f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
981abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
9827caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  /// Compute the offset within the array. The array might also be a subobject.
9837caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  RegionRawOffset getAsArrayOffset() const;
9841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9859c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
986b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
987511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
988511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
989511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
990511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
991511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
992511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
99319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
994bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression.
9959697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion {
996bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  friend class MemRegionManager;
997bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
998bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  Expr const *Ex;
999bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
100002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  CXXTempObjectRegion(Expr const *E, MemRegion const *sReg)
10019697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {}
1002bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1003bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
1004bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu                            Expr const *E, const MemRegion *sReg);
1005bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1006bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic:
1007782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin  const Expr *getExpr() const { return Ex; }
1008782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin
1009018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
1010bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu    return Ex->getType();
1011bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
1012bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
10139c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
1014e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu
1015bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
1016bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1017bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static bool classof(const MemRegion* R) {
101802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    return R->getKind() == CXXTempObjectRegionKind;
1019bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
1020bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu};
1021bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
10224fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is
10234fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object.
10249697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion {
10254fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  friend class MemRegionManager;
10264fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10274fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  const CXXRecordDecl *decl;
10284fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10294fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  CXXBaseObjectRegion(const CXXRecordDecl *d, const MemRegion *sReg)
10309697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXBaseObjectRegionKind), decl(d) {}
10314fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10324fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
10334fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                            const CXXRecordDecl *decl, const MemRegion *sReg);
10344fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10354fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic:
1036d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  const CXXRecordDecl *getDecl() const { return decl; }
1037d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
10384fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  QualType getValueType() const;
10394fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10409c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
10414fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10424fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
10434fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10444fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  static bool classof(const MemRegion *region) {
10454fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    return region->getKind() == CXXBaseObjectRegionKind;
10464fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  }
10474fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu};
10484fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1049ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy>
1050ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const {
1051f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  if (const RegionTy* RT = dyn_cast<RegionTy>(this))
1052f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek    return RT;
10531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1054f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  return NULL;
1055ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}
1056511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
10579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
10589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
10599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
10609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
10619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
1062a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &C;
10639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
10649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
10651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1066eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalInternalSpaceRegion *InternalGlobals;
1067eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalSystemSpaceRegion *SystemGlobals;
1068eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalImmutableSpaceRegion *ImmutableGlobals;
1069eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
10702b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
1071c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *>
1072c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackLocalsSpaceRegions;
1073c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *>
1074c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackArgumentsSpaceRegions;
1075dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *>
1076dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticsGlobalSpaceRegions;
10772b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
107867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion *heap;
10792b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion *unknown;
1080d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *code;
1081dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
10829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1083a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a)
1084eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : C(c), A(a), InternalGlobals(0), SystemGlobals(0), ImmutableGlobals(0),
1085eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      heap(0), unknown(0), code(0) {}
10861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10874240096011a187807058f887eb81df750ffa17feTed Kremenek  ~MemRegionManager();
10881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1089a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &getContext() { return C; }
10904240096011a187807058f887eb81df750ffa17feTed Kremenek
10914240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &getAllocator() { return A; }
10921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
109367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getStackLocalsRegion - Retrieve the memory region associated with the
109467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  specified stack frame.
109567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackLocalsSpaceRegion *
109667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackLocalsRegion(const StackFrameContext *STC);
1097d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
1098d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  /// getStackArgumentsRegion - Retrieve the memory region associated with
109967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  function/method arguments of the specified stack frame.
110067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackArgumentsSpaceRegion *
110167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackArgumentsRegion(const StackFrameContext *STC);
11021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
1104dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ///  global variables.
1105eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  const GlobalsSpaceRegion *getGlobalsRegion(
1106eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      MemRegion::Kind K = MemRegion::GlobalInternalSpaceRegionKind,
1107eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      const CodeTextRegion *R = 0);
11081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
11109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
111167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const HeapSpaceRegion *getHeapRegion();
1112178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
1113178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
1114178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
1115b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getUnknownRegion();
1116c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
1117b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getCodeRegion();
1118ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
11197090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
11209c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const AllocaRegion *getAllocaRegion(const Expr *Ex, unsigned Cnt,
112167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                      const LocationContext *LC);
11221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1123329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
1124329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
1125b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const CompoundLiteralRegion*
11269c378f705405d37f49795d5e915989de774fe11fTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr *CL,
112767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                           const LocationContext *LC);
1128de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
1129fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  /// getCXXThisRegion - Retrieve the [artificial] region associated with the
1130de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ///  parameter 'this'.
1131de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy,
1132de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                        const LocationContext *LC);
11331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1134e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  /// \brief Retrieve or create a "symbolic" memory region.
1135e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  const SymbolicRegion* getSymbolicRegion(SymbolRef Sym);
1136e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks
1137e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  /// \brief Return a unique symbolic region belonging to heap memory space.
1138e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  const SymbolicRegion *getSymbolicHeapRegion(SymbolRef sym);
1139e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
11404c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const StringRegion *getStringRegion(const StringLiteral* Str);
11414c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
11424c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringRegion *getObjCStringRegion(const ObjCStringLiteral *Str);
1143e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
11449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
1145d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  ///  a specified VarDecl and LocationContext.
1146b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC);
11471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
114867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
114967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  a specified VarDecl and super region.
115067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR);
115167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1152f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  /// getElementRegion - Retrieve the memory region associated with the
1153f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ///  associated element type, index, and super region.
115402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx,
1155856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        const MemRegion *superRegion,
1156856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        ASTContext &Ctx);
11571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1158b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER,
1159856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                                 const MemRegion *superRegion) {
1160a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getElementRegion(ER->getElementType(), ER->getIndex(),
1161a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek                            superRegion, ER->getContext());
1162a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
1163511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
11649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
11659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
11669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
11679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
11689c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const FieldRegion *getFieldRegion(const FieldDecl *fd,
1169b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                    const MemRegion* superRegion);
11701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1171b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR,
1172b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                             const MemRegion *superRegion) {
1173a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getFieldRegion(FR->getDecl(), superRegion);
1174a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
11751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
11779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
11789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
11799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
11809c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl *ivd,
1181b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                          const MemRegion* superRegion);
11821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
118302fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex,
118402fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                                    LocationContext const *LC);
1185bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
11864fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  const CXXBaseObjectRegion *getCXXBaseObjectRegion(const CXXRecordDecl *decl,
11874fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                                                  const MemRegion *superRegion);
11884fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1189d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different
1190d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// super region.
1191d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  const CXXBaseObjectRegion *
1192d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg,
1193d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu                                  const MemRegion *superRegion) {
1194d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu    return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion);
1195d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  }
1196d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
1197b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD);
1198b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD,
119967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            CanQualType locTy,
12001d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                            AnalysisDeclContext *AC);
120167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
120267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getBlockDataRegion - Get the memory region associated with an instance
120367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  of a block.  Unlike many other MemRegions, the LocationContext*
120467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  argument is allowed to be NULL for cases where we have no known
120567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  context.
1206b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc,
120767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            const LocationContext *lc = NULL);
12081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1209bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate:
1210250101353b711a409b075f1bc11070dddec7100bTed Kremenek  template <typename RegionTy, typename A1>
1211250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* getRegion(const A1 a1);
12121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12136304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  template <typename RegionTy, typename A1>
1214eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion);
12151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12167ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  template <typename RegionTy, typename A1, typename A2>
12177ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* getRegion(const A1 a1, const A2 a2);
1218dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
12190a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  template <typename RegionTy, typename A1, typename A2>
12200a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2,
12210a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                         const MemRegion* superRegion);
12220a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
122367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename RegionTy, typename A1, typename A2, typename A3>
122467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3,
122567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                         const MemRegion* superRegion);
122667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
122767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG>
122867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region);
122967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
123067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG, typename ARG>
123167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region, ARG a);
1232ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek};
12331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1234250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1235a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions.
1236250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1237250101353b711a409b075f1bc11070dddec7100bTed Kremenek
12389c378f705405d37f49795d5e915989de774fe11fTed Kremenekinline ASTContext &MemRegion::getContext() const {
1239a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  return getMemRegionManager()->getContext();
1240a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
1241eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
12425a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace
12435a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
1244be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace
12459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1246250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1247250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions.
1248250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1249250101353b711a409b075f1bc11070dddec7100bTed Kremenek
1250be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm {
12519c378f705405d37f49795d5e915989de774fe11fTed Kremenekstatic inline raw_ostream &operator<<(raw_ostream &os,
12529ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek                                      const clang::ento::MemRegion* R) {
12538800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  R->dumpToStream(os);
12548800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  return os;
1255be91224894e1501133e224934285ba6440bf5b59Ted Kremenek}
1256be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace
12579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
12589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
1259