MemRegion.h revision 85d87df66a50a15a1957f7213802000b451a8ec9
19e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//== MemRegion.h - Abstract memory regions for static analysis --*- C++ -*--==//
29e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
39e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//                     The LLVM Compiler Infrastructure
49e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
59e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// This file is distributed under the University of Illinois Open Source
69e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// License. See LICENSE.TXT for details.
79e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
89e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
99e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  This file defines MemRegion and its subclasses.  MemRegion defines a
119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  partially-typed abstraction of memory useful for path-sensitive dataflow
129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  analyses.
139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
165a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#ifndef LLVM_CLANG_GR_MEMREGION_H
175a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#define LLVM_CLANG_GR_MEMREGION_H
189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
199ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck#include "clang/AST/CharUnits.h"
20993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/Decl.h"
214c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek#include "clang/AST/ExprObjC.h"
22d47d3b0cfeb7e8564ff77f48130fe63282b6d127Chris Lattner#include "clang/Basic/LLVM.h"
239b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
249c1845dbed9817520f5a7db8bd80a560c6c6ae6bArgyrios Kyrtzidis#include "llvm/Support/ErrorHandling.h"
259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h"
269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string>
279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
285e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramernamespace llvm {
295e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass BumpPtrAllocator;
305e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer}
319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang {
331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext;
3567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext;
365a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
379ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento {
385a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
395a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemRegionManager;
405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemSpaceRegion;
41c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenekclass SValBuilder;
424240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion;
43dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass CodeTextRegion;
441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu/// Represent a region's offset within the top level base region.
46e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xuclass RegionOffset {
47e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The base region.
48e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *R;
49e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
50e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The bit offset within the base region. It shouldn't be negative.
51e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t Offset;
52e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
53e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xupublic:
54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  RegionOffset(const MemRegion *r) : R(r), Offset(0) {}
55e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {}
56e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
57e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *getRegion() const { return R; }
58e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t getOffset() const { return Offset; }
59e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu};
60e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
6119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
6219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes.
6319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions.
669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode {
674240096011a187807058f887eb81df750ffa17feTed Kremenek  friend class MemRegionManager;
689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
6967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  enum Kind {
7067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Memory spaces.
71dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    GenericMemSpaceRegionKind,
7267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackLocalsSpaceRegionKind,
7367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackArgumentsSpaceRegionKind,
7467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    HeapSpaceRegionKind,
752b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    UnknownSpaceRegionKind,
76dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticGlobalSpaceRegionKind,
77eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalInternalSpaceRegionKind,
78eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalSystemSpaceRegionKind,
79eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalImmutableSpaceRegionKind,
80eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    BEG_NON_STATIC_GLOBAL_MEMSPACES = GlobalInternalSpaceRegionKind,
81eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_NON_STATIC_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind,
82eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    BEG_GLOBAL_MEMSPACES = StaticGlobalSpaceRegionKind,
83eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind,
84dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    BEG_MEMSPACES = GenericMemSpaceRegionKind,
85eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_MEMSPACES = GlobalImmutableSpaceRegionKind,
8667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Untyped regions.
8767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    SymbolicRegionKind,
8867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    AllocaRegionKind,
899697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    BlockDataRegionKind,
9067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Typed regions.
9167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_TYPED_REGIONS,
9267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FunctionTextRegionKind = BEG_TYPED_REGIONS,
9367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BlockTextRegionKind,
949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    BEG_TYPED_VALUE_REGIONS,
959697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    CompoundLiteralRegionKind = BEG_TYPED_VALUE_REGIONS,
96de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    CXXThisRegionKind,
9767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StringRegionKind,
984c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    ObjCStringRegionKind,
9967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ElementRegionKind,
10067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Decl Regions.
10167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_DECL_REGIONS,
10267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    VarRegionKind = BEG_DECL_REGIONS,
10367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FieldRegionKind,
10467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ObjCIvarRegionKind,
1054fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    END_DECL_REGIONS = ObjCIvarRegionKind,
10602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    CXXTempObjectRegionKind,
1074fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    CXXBaseObjectRegionKind,
108096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose    END_TYPED_VALUE_REGIONS = CXXBaseObjectRegionKind,
109096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose    END_TYPED_REGIONS = CXXBaseObjectRegionKind
11067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  };
11167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
1139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
1169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
1179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
1189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
120a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek  ASTContext &getContext() const;
1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
123a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
124a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  virtual MemRegionManager* getMemRegionManager() const = 0;
125a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
126bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemSpaceRegion *getMemorySpace() const;
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
128adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *getBaseRegion() const;
129adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
130479529e679957fbb92b56e116e3c86734429331eZhongxing Xu  const MemRegion *StripCasts() const;
1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1321508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsOrParametersStorage() const;
1331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
134de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackStorage() const;
135de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
136de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackNonParametersStorage() const;
137de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
138de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackParametersStorage() const;
139b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
140e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// Compute the offset within the top level memory object.
141e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  RegionOffset getAsOffset() const;
142e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1433d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief Get a string representation of a region for debug use.
1443d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  std::string getString() const;
1453d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
1469c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
1477f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
1488800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dump() const;
1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1503d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief Print the region for use in diagnostics.
1513d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  virtual void dumpPretty(raw_ostream &os) const;
1523d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
1531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Kind getKind() const { return kind; }
1541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
155ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  template<typename RegionTy> const RegionTy* getAs() const;
1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
157f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu  virtual bool isBoundable() const { return false; }
158b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
1599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion*) { return true; }
1609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
162eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// MemSpaceRegion - A memory region that represents a "memory space";
1639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
1649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
165a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected:
16667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
16767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
168a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager *Mgr;
169a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
17067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind)
17167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemRegion(k), Mgr(mgr) {
17267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
17367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
17467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
17567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemRegionManager* getMemRegionManager() const { return Mgr; }
1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
17867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  bool isBoundable() const { return false; }
17967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
18067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
18167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
18267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
18367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
18467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_MEMSPACES && k <= END_MEMSPACES;
185a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  }
18667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
18767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
18867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion {
18999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
190dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected:
191dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  GlobalsSpaceRegion(MemRegionManager *mgr, Kind k)
192dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : MemSpaceRegion(mgr, k) {}
193dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
194dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
195dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    Kind k = R->getKind();
196dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES;
197dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
198dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
199eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
200914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region of the static variables within the current CodeTextRegion
201eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// scope.
202914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie///
203eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// Currently, only the static locals are placed there, so we know that these
204eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// variables do not get invalidated by calls to other functions.
205dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion {
20667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
207a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
208dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *CR;
209dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
210dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr)
211dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {}
212dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
213dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
214dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
215dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2169c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
217fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
218dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *getCodeRegion() const { return CR; }
219dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
220dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
221dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R->getKind() == StaticGlobalSpaceRegionKind;
222dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
223dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
224eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
225914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region for all the non-static global variables.
226eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks///
227eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// This class is further split into subclasses for efficient implementation of
228eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// invalidating a set of related global values as is done in
229eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// RegionStoreManager::invalidateRegions (instead of finding all the dependent
230eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// globals, we invalidate the whole parent region).
231dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion {
232dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  friend class MemRegionManager;
233dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
234eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksprotected:
235eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  NonStaticGlobalSpaceRegion(MemRegionManager *mgr, Kind k)
236eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : GlobalsSpaceRegion(mgr, k) {}
237dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
239fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
2409c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
241fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
24267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
243eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    Kind k = R->getKind();
244eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return k >= BEG_NON_STATIC_GLOBAL_MEMSPACES &&
245eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks           k <= END_NON_STATIC_GLOBAL_MEMSPACES;
24667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
24767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
248eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
249914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are defined in system/external
250eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// headers and are considered modifiable by system calls (ex: errno).
251eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalSystemSpaceRegion : public NonStaticGlobalSpaceRegion {
252eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
253eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
254eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalSystemSpaceRegion(MemRegionManager *mgr)
255eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalSystemSpaceRegionKind) {}
256eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
257eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
258eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
259eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
260eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
261eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
262eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalSystemSpaceRegionKind;
263eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
264eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
265eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
266914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are considered not to be modified
267eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// or point to data which could be modified as a result of a function call
268eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// (system or internal). Ex: Const global scalars would be modeled as part of
269eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// this region. This region also includes most system globals since they have
270eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// low chance of being modified.
271eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalImmutableSpaceRegion : public NonStaticGlobalSpaceRegion {
272eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
273eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
274eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalImmutableSpaceRegion(MemRegionManager *mgr)
275eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalImmutableSpaceRegionKind) {}
276eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
277eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
278eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
279eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
280eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
281eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
282eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalImmutableSpaceRegionKind;
283eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
284eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
285eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
286914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which can be modified by calls to
287eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// "internally" defined functions - (for now just) functions other then system
288eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// calls.
289eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalInternalSpaceRegion : public NonStaticGlobalSpaceRegion {
290eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
291eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
292eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalInternalSpaceRegion(MemRegionManager *mgr)
293eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalInternalSpaceRegionKind) {}
294eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
295eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
296eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
297eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
298eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
299eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
300eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalInternalSpaceRegionKind;
301eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
302eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
303eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
30467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion {
30599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
30667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
30767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
30867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion(MemRegionManager *mgr)
30967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, HeapSpaceRegionKind) {}
31067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
31167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
31267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == HeapSpaceRegionKind;
31367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
31467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
31567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
3162b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion {
31799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
3182b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  friend class MemRegionManager;
3192b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion(MemRegionManager *mgr)
3202b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {}
3212b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic:
3222b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  static bool classof(const MemRegion *R) {
3232b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    return R->getKind() == UnknownSpaceRegionKind;
3242b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  }
3252b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek};
3262b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
32767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion {
32867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
32967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *SFC;
3309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
33167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected:
33267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc)
33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, k), SFC(sfc) {
33467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
33567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
33641168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
33767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
33867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *getStackFrame() const { return SFC; }
33967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
34067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
34167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
34267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
34367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
34467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= StackLocalsSpaceRegionKind &&
34567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek           k <= StackArgumentsSpaceRegionKind;
34667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
34767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
34867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
34967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion {
35099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
35167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
35267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
35367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {}
35467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
35567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
35667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackLocalsSpaceRegionKind;
35767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
35867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
35967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
36067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion {
36167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
36299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
36367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
36467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
36567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {}
36667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
36767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
36867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackArgumentsSpaceRegionKind;
3699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3727caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
373993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
374993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
375993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
37699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikieprivate:
37799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
3789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
3791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const MemRegion* superRegion;
380993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
3819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
3829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
3839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
3849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  /// getExtent - Returns the size of the region in bytes.
387c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const {
38832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    return UnknownVal();
38932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  }
39032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
391a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager* getMemRegionManager() const;
3921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3937e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  bool isSubRegionOf(const MemRegion* R) const;
3941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
39667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() > END_MEMSPACES;
397993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
398993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
3991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
40119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses.
4021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===//
403ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
40482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
40582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
40682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
40782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
40882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
40982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
41082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
4119c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Expr *Ex;
41282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
4139c378f705405d37f49795d5e915989de774fe11fTed Kremenek  AllocaRegion(const Expr *ex, unsigned cnt, const MemRegion *superRegion)
41482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
4171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4189c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Expr *getExpr() const { return Ex; }
4199852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
4209852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
4219852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
422c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
42332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
42482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
42582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
4269c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr *Ex,
4277ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                            unsigned Cnt, const MemRegion *superRegion);
4281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4299c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
4301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
43282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
43382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
4341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
4351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
436993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
437993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
43899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
43999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
440993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
441993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
4421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
443993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
4449697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  virtual QualType getLocationType() const = 0;
4459697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4469697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  QualType getDesugaredLocationType(ASTContext &Context) const {
4479697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return getLocationType().getDesugaredType(Context);
4489697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
4499697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4509697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  bool isBoundable() const { return true; }
4519697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4529697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  static bool classof(const MemRegion* R) {
4539697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    unsigned k = R->getKind();
4549697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS;
4559697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
4569697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek};
4579697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4589697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value.
4599697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion {
46099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
46199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
4629697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected:
4639697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {}
4649697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4659697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic:
466018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getValueType() const = 0;
4671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
468018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getLocationType() const {
4696eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can possibly optimize this later to cache this value.
470a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    QualType T = getValueType();
471a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    ASTContext &ctx = getContext();
472a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    if (T->getAs<ObjCObjectType>())
473a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek      return ctx.getObjCObjectPointerType(T);
474a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    return ctx.getPointerType(getValueType());
4756eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
4761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47749f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall  QualType getDesugaredValueType(ASTContext &Context) const {
478018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    QualType T = getValueType();
4791ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor    return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T;
48014553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
4811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
482993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
4839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
4849697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return k >= BEG_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS;
4859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
4879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
488ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
489eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion {
49099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
49199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
492eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected:
493eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {}
494ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
495eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  bool isBoundable() const { return false; }
496eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
497eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
498eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    Kind k = R->getKind();
499eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return k >= FunctionTextRegionKind && k <= BlockTextRegionKind;
500eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
501eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
502ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
503eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function.
504eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion {
505eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const FunctionDecl *FD;
506eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic:
5079c378f705405d37f49795d5e915989de774fe11fTed Kremenek  FunctionTextRegion(const FunctionDecl *fd, const MemRegion* sreg)
508eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {}
509eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
510018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getLocationType() const {
511018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getContext().getPointerType(FD->getType());
512ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
513eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
514abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  const FunctionDecl *getDecl() const {
515abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek    return FD;
51672e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  }
517eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
5189c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
519eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
520ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
521eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
522abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD,
523abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek                            const MemRegion*);
524eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
525ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static bool classof(const MemRegion* R) {
526eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == FunctionTextRegionKind;
527eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
528eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
529eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
530eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
531eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures).
5320a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
5330a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
5340a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
5350a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
5360a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
537eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion {
53867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
53967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
540eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *BD;
5411d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *AC;
542eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CanQualType locTy;
54367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
54467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockTextRegion(const BlockDecl *bd, CanQualType lTy,
5451d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                  AnalysisDeclContext *ac, const MemRegion* sreg)
54667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {}
54767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
54867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
549018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getLocationType() const {
550eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return locTy;
551eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
552eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
553eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *getDecl() const {
554eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return BD;
555eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
55667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
5571d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *getAnalysisDeclContext() const { return AC; }
558eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
5599c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
560eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
561eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
562eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
563eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD,
5641d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                            CanQualType, const AnalysisDeclContext*,
56567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const MemRegion*);
566eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
567eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
568eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == BlockTextRegionKind;
569ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
570ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu};
5710a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
5720a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance.
5730a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
5740a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
5750a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
5760a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
5770a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
5780a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion {
57967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
5800a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *BC;
58167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const LocationContext *LC; // Can be null */
5824240096011a187807058f887eb81df750ffa17feTed Kremenek  void *ReferencedVars;
58385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  void *OriginalVars;
58467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
58567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc,
5860a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                  const MemRegion *sreg)
58785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc),
58885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    ReferencedVars(0), OriginalVars(0) {}
5890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
59085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenekpublic:
5910a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *getCodeRegion() const { return BC; }
5924240096011a187807058f887eb81df750ffa17feTed Kremenek
593d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek  const BlockDecl *getDecl() const { return BC->getDecl(); }
594d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek
59581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  class referenced_vars_iterator {
59681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const MemRegion * const *R;
59785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion * const *OriginalR;
59881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  public:
59985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    explicit referenced_vars_iterator(const MemRegion * const *r,
60085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                      const MemRegion * const *originalR)
60185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      : R(r), OriginalR(originalR) {}
60281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
60381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    operator const MemRegion * const *() const {
60481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return R;
60581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
60685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
60785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion *getCapturedRegion() const {
60885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      return *R;
60985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    }
61085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion *getOriginalRegion() const {
61185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      return *OriginalR;
61285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    }
61385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
61481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const VarRegion* operator*() const {
61581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return cast<VarRegion>(*R);
61681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
61781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
61881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator==(const referenced_vars_iterator &I) const {
61981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R == R;
62081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
62181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator!=(const referenced_vars_iterator &I) const {
62281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R != R;
62381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
6249c378f705405d37f49795d5e915989de774fe11fTed Kremenek    referenced_vars_iterator &operator++() {
62581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      ++R;
62685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      ++OriginalR;
62781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return *this;
62881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
62981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  };
63081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
6314240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_begin() const;
6324240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_end() const;
6330a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6349c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
6350a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6360a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6370a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
63867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *,
63967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const LocationContext *, const MemRegion *);
6400a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6410a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  static bool classof(const MemRegion* R) {
6420a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek    return R->getKind() == BlockDataRegionKind;
6430a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  }
6444240096011a187807058f887eb81df750ffa17feTed Kremenekprivate:
6454240096011a187807058f887eb81df750ffa17feTed Kremenek  void LazyInitializeReferencedVars();
6460a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek};
647ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
648026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
649026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  clases, SymbolicRegion represents a region that serves as an alias for
650026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  either a real region, a NULL pointer, etc.  It essentially is used to
651026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  map the concept of symbolic values into the domain of regions.  Symbolic
652026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  regions do not need to be typed.
653e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion {
654026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected:
655026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  const SymbolRef sym;
656026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
657026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic:
6581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SymbolicRegion(const SymbolRef s, const MemRegion* sreg)
659e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek    : SubRegion(sreg, SymbolicRegionKind), sym(s) {}
6601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
661026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  SymbolRef getSymbol() const {
662026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return sym;
663026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
664026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
6659852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
6669852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
667c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
66832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
669026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
670026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
671250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
672250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            SymbolRef sym,
673250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            const MemRegion* superRegion);
6741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6759c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
6761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
677026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  static bool classof(const MemRegion* R) {
678026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() == SymbolicRegionKind;
679026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
6801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
681026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
682e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
6839697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion {
684e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
685e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
686e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
687e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
688250101353b711a409b075f1bc11070dddec7100bTed Kremenek  StringRegion(const StringLiteral* str, const MemRegion* sreg)
6899697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sreg, StringRegionKind), Str(str) {}
690e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
691e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
692e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
693e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
694e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
695e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
6966613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
6976613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
6981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
699018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
700ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return Str->getType();
701ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  }
702e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
703c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
70432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
7050a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu  bool isBoundable() const { return false; }
7060a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
707e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
708e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
709e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
710e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
7119c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
712cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
713e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
714e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
715e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
716e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
7174c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7184c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek/// The region associated with an ObjCStringLiteral.
7194c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekclass ObjCStringRegion : public TypedValueRegion {
7204c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  friend class MemRegionManager;
7214c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringLiteral* Str;
7224c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekprotected:
7234c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7244c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ObjCStringRegion(const ObjCStringLiteral* str, const MemRegion* sreg)
7254c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  : TypedValueRegion(sreg, ObjCStringRegionKind), Str(str) {}
7264c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7274c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
7284c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                            const ObjCStringLiteral* Str,
7294c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                            const MemRegion* superRegion);
7304c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7314c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekpublic:
7324c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7334c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringLiteral* getObjCStringLiteral() const { return Str; }
7344c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7354c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  QualType getValueType() const {
7364c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    return Str->getType();
7374c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7384c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7394c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  bool isBoundable() const { return false; }
7404c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7414c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const {
7424c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    ProfileRegion(ID, Str, superRegion);
7434c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7444c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7454c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  void dumpToStream(raw_ostream &os) const;
7464c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7474c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  static bool classof(const MemRegion* R) {
7484c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    return R->getKind() == ObjCStringRegionKind;
7494c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7504c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek};
751e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
752329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
753329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
754329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
7559697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion {
756329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
757329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
7589c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const CompoundLiteralExpr *CL;
759329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
7609c378f705405d37f49795d5e915989de774fe11fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr *cl, const MemRegion* sReg)
7619697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
7621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
763329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
7649c378f705405d37f49795d5e915989de774fe11fTed Kremenek                            const CompoundLiteralExpr *CL,
765329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
766329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
767018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
768018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return CL->getType();
76977cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
7700a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
7719a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu  bool isBoundable() const { return !CL->isFileScope(); }
7729a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu
773329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
7741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7759c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
776329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
7779c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const CompoundLiteralExpr *getLiteralExpr() const { return CL; }
7781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
779329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
780329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
781329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
782329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
783178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
7849697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion {
7859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
7869c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Decl *D;
7879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
7889c378f705405d37f49795d5e915989de774fe11fTed Kremenek  DeclRegion(const Decl *d, const MemRegion* sReg, Kind k)
7899697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, k), D(d) {}
7909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
7919c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D,
7929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
7931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
794bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
7959c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Decl *getDecl() const { return D; }
7969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
7971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
798c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
79932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
800e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
801e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
80267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS;
803e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
8049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
8051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
8079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
808d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
809d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  // Constructors and private methods.
8109c378f705405d37f49795d5e915989de774fe11fTed Kremenek  VarRegion(const VarDecl *vd, const MemRegion* sReg)
81167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
8129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8139c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl *VD,
814d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                            const MemRegion *superRegion) {
8159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
8169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
8171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
818d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
8191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
821d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  const VarDecl *getDecl() const { return cast<VarDecl>(D); }
8221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8235348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  const StackFrameContext *getStackFrame() const;
8245348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
825018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
8266eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
827018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
8281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8309c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
8311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
8339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
8341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8353d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
8363d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  void dumpPretty(raw_ostream &os) const;
8379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
838de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
839de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter
840de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  in a call to a C++ method.  This region doesn't represent the object
841de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  referred to by 'this', but rather 'this' itself.
8429697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion {
843de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  friend class MemRegionManager;
844de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  CXXThisRegion(const PointerType *thisPointerTy,
845de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                const MemRegion *sReg)
8469697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {}
847de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
848de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
849de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const PointerType *PT,
850de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const MemRegion *sReg);
851de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
852de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
853de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
854de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic:
855018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
856de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return QualType(ThisPointerTy, 0);
857de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
8587caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
8599c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
860de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
861de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static bool classof(const MemRegion* R) {
862de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return R->getKind() == CXXThisRegionKind;
863de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
864de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
865de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate:
866de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const PointerType *ThisPointerTy;
867de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek};
8689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
8709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
8719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8729c378f705405d37f49795d5e915989de774fe11fTed Kremenek  FieldRegion(const FieldDecl *fd, const MemRegion* sReg)
8739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
8749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8754bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
8769c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const FieldDecl *getDecl() const { return cast<FieldDecl>(D); }
8771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
878018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
8796eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
880018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
8811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8824bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
883c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
88432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
8859c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl *FD,
8866304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
8879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
8889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
8891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
8919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
8929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
8933d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
8943d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  void dumpToStream(raw_ostream &os) const;
8953d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  void dumpPretty(raw_ostream &os) const;
8969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
8971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
8991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
902c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg);
9039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9049c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl *ivd,
905c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer                            const MemRegion* superRegion);
9061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
908c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  const ObjCIvarDecl *getDecl() const;
909c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  QualType getValueType() const;
9101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9119c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
9121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
9149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
9159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
9177caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
918fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions.
9197caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
9207caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9217caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion;
9227caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9237caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset {
9247caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate:
9257caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  friend class ElementRegion;
9267caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9277caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *Region;
9289ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits Offset;
9297caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9309ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero())
9317caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu    : Region(reg), Offset(offset) {}
9327caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9337caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic:
9347caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  // FIXME: Eventually support symbolic offsets.
9359ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits getOffset() const { return Offset; }
9367caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *getRegion() const { return Region; }
9377caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9389c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
9397caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  void dump() const;
9407caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu};
941511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
9421437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks/// \brief ElementRegin is used to represent both array elements and casts.
9439697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion {
944511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
945511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
946f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType ElementType;
94702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc Index;
948511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
94902282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg)
9509697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, ElementRegionKind),
951f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek      ElementType(elementType), Index(Idx) {
9523d8173c1c68f451c7492f92023d829c626845925Chris Lattner    assert((!isa<nonloc::ConcreteInt>(&Idx) ||
9533d8173c1c68f451c7492f92023d829c626845925Chris Lattner           cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) &&
95443b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
9550395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
9561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
957f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType,
958f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek                            SVal Idx, const MemRegion* superRegion);
959511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
960511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
961511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
96202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc getIndex() const { return Index; }
9636e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
964018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
965f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
966f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  }
9671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
968f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType getElementType() const {
969f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
970abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
9717caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  /// Compute the offset within the array. The array might also be a subobject.
9727caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  RegionRawOffset getAsArrayOffset() const;
9731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9749c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
975b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
976511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
977511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
978511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
979511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
980511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
981511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
98219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
983bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression.
9849697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion {
985bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  friend class MemRegionManager;
986bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
987bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  Expr const *Ex;
988bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
98902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  CXXTempObjectRegion(Expr const *E, MemRegion const *sReg)
9909697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {}
991bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
992bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
993bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu                            Expr const *E, const MemRegion *sReg);
994bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
995bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic:
996782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin  const Expr *getExpr() const { return Ex; }
997782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin
998018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
999bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu    return Ex->getType();
1000bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
1001bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
10029c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
1003e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu
1004bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
1005bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1006bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static bool classof(const MemRegion* R) {
100702fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    return R->getKind() == CXXTempObjectRegionKind;
1008bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
1009bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu};
1010bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
10114fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is
10124fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object.
10139697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion {
10144fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  friend class MemRegionManager;
10154fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10164fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  const CXXRecordDecl *decl;
10174fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10184fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  CXXBaseObjectRegion(const CXXRecordDecl *d, const MemRegion *sReg)
10199697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXBaseObjectRegionKind), decl(d) {}
10204fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10214fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
10224fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                            const CXXRecordDecl *decl, const MemRegion *sReg);
10234fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10244fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic:
1025d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  const CXXRecordDecl *getDecl() const { return decl; }
1026d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
10274fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  QualType getValueType() const;
10284fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10299c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
10304fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10314fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
10324fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10334fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  static bool classof(const MemRegion *region) {
10344fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    return region->getKind() == CXXBaseObjectRegionKind;
10354fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  }
10364fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu};
10374fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1038ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy>
1039ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const {
1040f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  if (const RegionTy* RT = dyn_cast<RegionTy>(this))
1041f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek    return RT;
10421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1043f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  return NULL;
1044ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}
1045511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
10469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
10479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
10489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
10499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
10509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
1051a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &C;
10529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
10539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
10541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1055eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalInternalSpaceRegion *InternalGlobals;
1056eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalSystemSpaceRegion *SystemGlobals;
1057eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalImmutableSpaceRegion *ImmutableGlobals;
1058eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
10592b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
1060c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *>
1061c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackLocalsSpaceRegions;
1062c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *>
1063c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackArgumentsSpaceRegions;
1064dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *>
1065dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticsGlobalSpaceRegions;
10662b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
106767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion *heap;
10682b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion *unknown;
1069d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *code;
1070dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
10719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1072a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a)
1073eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : C(c), A(a), InternalGlobals(0), SystemGlobals(0), ImmutableGlobals(0),
1074eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      heap(0), unknown(0), code(0) {}
10751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10764240096011a187807058f887eb81df750ffa17feTed Kremenek  ~MemRegionManager();
10771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1078a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &getContext() { return C; }
10794240096011a187807058f887eb81df750ffa17feTed Kremenek
10804240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &getAllocator() { return A; }
10811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
108267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getStackLocalsRegion - Retrieve the memory region associated with the
108367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  specified stack frame.
108467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackLocalsSpaceRegion *
108567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackLocalsRegion(const StackFrameContext *STC);
1086d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
1087d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  /// getStackArgumentsRegion - Retrieve the memory region associated with
108867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  function/method arguments of the specified stack frame.
108967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackArgumentsSpaceRegion *
109067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackArgumentsRegion(const StackFrameContext *STC);
10911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
1093dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ///  global variables.
1094eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  const GlobalsSpaceRegion *getGlobalsRegion(
1095eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      MemRegion::Kind K = MemRegion::GlobalInternalSpaceRegionKind,
1096eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      const CodeTextRegion *R = 0);
10971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
10999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
110067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const HeapSpaceRegion *getHeapRegion();
1101178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
1102178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
1103178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
1104b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getUnknownRegion();
1105c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
1106b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getCodeRegion();
1107ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
11087090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
11099c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const AllocaRegion *getAllocaRegion(const Expr *Ex, unsigned Cnt,
111067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                      const LocationContext *LC);
11111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1112329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
1113329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
1114b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const CompoundLiteralRegion*
11159c378f705405d37f49795d5e915989de774fe11fTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr *CL,
111667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                           const LocationContext *LC);
1117de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
1118fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  /// getCXXThisRegion - Retrieve the [artificial] region associated with the
1119de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ///  parameter 'this'.
1120de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy,
1121de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                        const LocationContext *LC);
11221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1123993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  /// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
1124b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const SymbolicRegion* getSymbolicRegion(SymbolRef sym);
1125e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
11264c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const StringRegion *getStringRegion(const StringLiteral* Str);
11274c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
11284c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringRegion *getObjCStringRegion(const ObjCStringLiteral *Str);
1129e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
11309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
1131d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  ///  a specified VarDecl and LocationContext.
1132b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC);
11331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
113467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
113567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  a specified VarDecl and super region.
113667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR);
113767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1138f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  /// getElementRegion - Retrieve the memory region associated with the
1139f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ///  associated element type, index, and super region.
114002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx,
1141856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        const MemRegion *superRegion,
1142856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        ASTContext &Ctx);
11431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1144b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER,
1145856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                                 const MemRegion *superRegion) {
1146a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getElementRegion(ER->getElementType(), ER->getIndex(),
1147a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek                            superRegion, ER->getContext());
1148a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
1149511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
11509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
11519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
11529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
11539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
11549c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const FieldRegion *getFieldRegion(const FieldDecl *fd,
1155b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                    const MemRegion* superRegion);
11561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1157b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR,
1158b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                             const MemRegion *superRegion) {
1159a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getFieldRegion(FR->getDecl(), superRegion);
1160a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
11611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
11639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
11649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
11659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
11669c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl *ivd,
1167b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                          const MemRegion* superRegion);
11681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
116902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex,
117002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                                    LocationContext const *LC);
1171bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
11724fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  const CXXBaseObjectRegion *getCXXBaseObjectRegion(const CXXRecordDecl *decl,
11734fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                                                  const MemRegion *superRegion);
11744fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1175d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different
1176d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// super region.
1177d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  const CXXBaseObjectRegion *
1178d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg,
1179d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu                                  const MemRegion *superRegion) {
1180d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu    return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion);
1181d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  }
1182d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
1183b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD);
1184b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD,
118567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            CanQualType locTy,
11861d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                            AnalysisDeclContext *AC);
118767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
118867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getBlockDataRegion - Get the memory region associated with an instance
118967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  of a block.  Unlike many other MemRegions, the LocationContext*
119067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  argument is allowed to be NULL for cases where we have no known
119167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  context.
1192b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc,
119367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            const LocationContext *lc = NULL);
11941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1195bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate:
1196250101353b711a409b075f1bc11070dddec7100bTed Kremenek  template <typename RegionTy, typename A1>
1197250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* getRegion(const A1 a1);
11981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11996304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  template <typename RegionTy, typename A1>
1200eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion);
12011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12027ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  template <typename RegionTy, typename A1, typename A2>
12037ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* getRegion(const A1 a1, const A2 a2);
1204dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
12050a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  template <typename RegionTy, typename A1, typename A2>
12060a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2,
12070a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                         const MemRegion* superRegion);
12080a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
120967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename RegionTy, typename A1, typename A2, typename A3>
121067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3,
121167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                         const MemRegion* superRegion);
121267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
121367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG>
121467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region);
121567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
121667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG, typename ARG>
121767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region, ARG a);
1218ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek};
12191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1220250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1221a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions.
1222250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1223250101353b711a409b075f1bc11070dddec7100bTed Kremenek
12249c378f705405d37f49795d5e915989de774fe11fTed Kremenekinline ASTContext &MemRegion::getContext() const {
1225a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  return getMemRegionManager()->getContext();
1226a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
1227eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
12285a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace
12295a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
1230be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace
12319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1232250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1233250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions.
1234250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1235250101353b711a409b075f1bc11070dddec7100bTed Kremenek
1236be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm {
12379c378f705405d37f49795d5e915989de774fe11fTed Kremenekstatic inline raw_ostream &operator<<(raw_ostream &os,
12389ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek                                      const clang::ento::MemRegion* R) {
12398800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  R->dumpToStream(os);
12408800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  return os;
1241be91224894e1501133e224934285ba6440bf5b59Ted Kremenek}
1242be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace
12439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
12449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
1245