MemRegion.h revision 919e8a1c6698bfa6848571d366430126bced727d
19e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//== MemRegion.h - Abstract memory regions for static analysis --*- C++ -*--==//
29e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
39e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//                     The LLVM Compiler Infrastructure
49e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
59e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// This file is distributed under the University of Illinois Open Source
69e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// License. See LICENSE.TXT for details.
79e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
89e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
99e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  This file defines MemRegion and its subclasses.  MemRegion defines a
119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  partially-typed abstraction of memory useful for path-sensitive dataflow
129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  analyses.
139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
165a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#ifndef LLVM_CLANG_GR_MEMREGION_H
175a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#define LLVM_CLANG_GR_MEMREGION_H
189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
19478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer#include "clang/AST/ASTContext.h"
209ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck#include "clang/AST/CharUnits.h"
21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/Decl.h"
224c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek#include "clang/AST/ExprObjC.h"
23d47d3b0cfeb7e8564ff77f48130fe63282b6d127Chris Lattner#include "clang/Basic/LLVM.h"
249b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
259c1845dbed9817520f5a7db8bd80a560c6c6ae6bArgyrios Kyrtzidis#include "llvm/Support/ErrorHandling.h"
269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h"
279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string>
289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
295e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramernamespace llvm {
305e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass BumpPtrAllocator;
315e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer}
329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang {
341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext;
3667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext;
375a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
389ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento {
395a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemRegionManager;
415a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemSpaceRegion;
42c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenekclass SValBuilder;
434240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion;
44dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass CodeTextRegion;
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu/// Represent a region's offset within the top level base region.
47e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xuclass RegionOffset {
48e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The base region.
49e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *R;
50e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
51e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The bit offset within the base region. It shouldn't be negative.
52e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t Offset;
53e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xupublic:
55e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  RegionOffset() : R(0) {}
56e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {}
57e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
58e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *getRegion() const { return R; }
59e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t getOffset() const { return Offset; }
60e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
61e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  bool isValid() const { return R; }
62e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu};
63e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
6419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
6519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes.
6619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions.
699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode {
704240096011a187807058f887eb81df750ffa17feTed Kremenek  friend class MemRegionManager;
719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
7267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  enum Kind {
7367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Memory spaces.
74dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    GenericMemSpaceRegionKind,
7567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackLocalsSpaceRegionKind,
7667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackArgumentsSpaceRegionKind,
7767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    HeapSpaceRegionKind,
782b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    UnknownSpaceRegionKind,
79dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticGlobalSpaceRegionKind,
80eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalInternalSpaceRegionKind,
81eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalSystemSpaceRegionKind,
82eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalImmutableSpaceRegionKind,
83eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    BEG_NON_STATIC_GLOBAL_MEMSPACES = GlobalInternalSpaceRegionKind,
84eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_NON_STATIC_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind,
85eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    BEG_GLOBAL_MEMSPACES = StaticGlobalSpaceRegionKind,
86eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind,
87dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    BEG_MEMSPACES = GenericMemSpaceRegionKind,
88eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_MEMSPACES = GlobalImmutableSpaceRegionKind,
8967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Untyped regions.
9067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    SymbolicRegionKind,
9167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    AllocaRegionKind,
929697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    BlockDataRegionKind,
9367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Typed regions.
9467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_TYPED_REGIONS,
9567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FunctionTextRegionKind = BEG_TYPED_REGIONS,
9667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BlockTextRegionKind,
979697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    BEG_TYPED_VALUE_REGIONS,
989697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    CompoundLiteralRegionKind = BEG_TYPED_VALUE_REGIONS,
99de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    CXXThisRegionKind,
10067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StringRegionKind,
1014c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    ObjCStringRegionKind,
10267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ElementRegionKind,
10367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Decl Regions.
10467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_DECL_REGIONS,
10567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    VarRegionKind = BEG_DECL_REGIONS,
10667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FieldRegionKind,
10767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ObjCIvarRegionKind,
1084fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    END_DECL_REGIONS = ObjCIvarRegionKind,
10902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    CXXTempObjectRegionKind,
1104fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    CXXBaseObjectRegionKind,
111096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose    END_TYPED_VALUE_REGIONS = CXXBaseObjectRegionKind,
112096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose    END_TYPED_REGIONS = CXXBaseObjectRegionKind
11367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  };
11467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
1169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
1199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
1209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
1219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
123a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek  ASTContext &getContext() const;
1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
126a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
127a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  virtual MemRegionManager* getMemRegionManager() const = 0;
128a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
129bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemSpaceRegion *getMemorySpace() const;
1301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
131adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *getBaseRegion() const;
132adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
133479529e679957fbb92b56e116e3c86734429331eZhongxing Xu  const MemRegion *StripCasts() const;
1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1351508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsOrParametersStorage() const;
1361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
137de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackStorage() const;
138de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
139de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackNonParametersStorage() const;
140de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
141de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackParametersStorage() const;
142b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
143e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// Compute the offset within the top level memory object.
144e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  RegionOffset getAsOffset() const;
145e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1463d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief Get a string representation of a region for debug use.
1473d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  std::string getString() const;
1483d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
1499c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
1507f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
1518800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dump() const;
1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
153919e8a1c6698bfa6848571d366430126bced727dJordan Rose  /// \brief Returns true if this region can be printed in a user-friendly way.
154919e8a1c6698bfa6848571d366430126bced727dJordan Rose  virtual bool canPrintPretty() const;
155919e8a1c6698bfa6848571d366430126bced727dJordan Rose
1563d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief Print the region for use in diagnostics.
157919e8a1c6698bfa6848571d366430126bced727dJordan Rose  virtual void printPretty(raw_ostream &os) const;
1583d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
1591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Kind getKind() const { return kind; }
1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
161ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  template<typename RegionTy> const RegionTy* getAs() const;
1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
163f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu  virtual bool isBoundable() const { return false; }
164b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
1659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion*) { return true; }
1669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
168eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// MemSpaceRegion - A memory region that represents a "memory space";
1699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
1709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
171a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected:
17267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
17367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
174a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager *Mgr;
175a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
17667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind)
17767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemRegion(k), Mgr(mgr) {
17867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
17967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
18067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
18167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemRegionManager* getMemRegionManager() const { return Mgr; }
1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
18367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
18467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  bool isBoundable() const { return false; }
18567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
18667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
18767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
18867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
18967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
19067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_MEMSPACES && k <= END_MEMSPACES;
191a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  }
19267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
19367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
19467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion {
19599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
196dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected:
197dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  GlobalsSpaceRegion(MemRegionManager *mgr, Kind k)
198dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : MemSpaceRegion(mgr, k) {}
199dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
200dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
201dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    Kind k = R->getKind();
202dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES;
203dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
204dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
205eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
206914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region of the static variables within the current CodeTextRegion
207eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// scope.
208914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie///
209eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// Currently, only the static locals are placed there, so we know that these
210eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// variables do not get invalidated by calls to other functions.
211dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion {
21267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
213a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
214dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *CR;
215dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
216dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr)
217dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {}
218dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
219dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
220dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
221dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2229c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
223fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
224dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *getCodeRegion() const { return CR; }
225dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
226dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
227dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R->getKind() == StaticGlobalSpaceRegionKind;
228dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
229dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
230eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
231914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region for all the non-static global variables.
232eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks///
233eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// This class is further split into subclasses for efficient implementation of
234eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// invalidating a set of related global values as is done in
235eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// RegionStoreManager::invalidateRegions (instead of finding all the dependent
236eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// globals, we invalidate the whole parent region).
237dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion {
238dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  friend class MemRegionManager;
239dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
240eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksprotected:
241eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  NonStaticGlobalSpaceRegion(MemRegionManager *mgr, Kind k)
242eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : GlobalsSpaceRegion(mgr, k) {}
243dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
245fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
24667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
247eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    Kind k = R->getKind();
248eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return k >= BEG_NON_STATIC_GLOBAL_MEMSPACES &&
249eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks           k <= END_NON_STATIC_GLOBAL_MEMSPACES;
25067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
25167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
252eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
253914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are defined in system/external
254eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// headers and are considered modifiable by system calls (ex: errno).
255eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalSystemSpaceRegion : public NonStaticGlobalSpaceRegion {
256eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
257eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
258eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalSystemSpaceRegion(MemRegionManager *mgr)
259eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalSystemSpaceRegionKind) {}
260eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
261eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
262eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
263eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
264eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
265eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
266eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalSystemSpaceRegionKind;
267eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
268eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
269eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
270914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are considered not to be modified
271eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// or point to data which could be modified as a result of a function call
272eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// (system or internal). Ex: Const global scalars would be modeled as part of
273eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// this region. This region also includes most system globals since they have
274eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// low chance of being modified.
275eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalImmutableSpaceRegion : public NonStaticGlobalSpaceRegion {
276eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
277eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
278eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalImmutableSpaceRegion(MemRegionManager *mgr)
279eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalImmutableSpaceRegionKind) {}
280eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
281eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
282eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
283eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
284eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
285eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
286eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalImmutableSpaceRegionKind;
287eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
288eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
289eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
290914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which can be modified by calls to
291eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// "internally" defined functions - (for now just) functions other then system
292eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// calls.
293eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalInternalSpaceRegion : public NonStaticGlobalSpaceRegion {
294eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
295eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
296eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalInternalSpaceRegion(MemRegionManager *mgr)
297eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalInternalSpaceRegionKind) {}
298eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
299eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
300eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
301eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
302eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
303eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
304eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalInternalSpaceRegionKind;
305eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
306eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
307eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
30867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion {
30999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
31067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
31167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
31267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion(MemRegionManager *mgr)
31367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, HeapSpaceRegionKind) {}
31467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
31536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
31636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
31736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
31867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
31967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == HeapSpaceRegionKind;
32067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
32167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
32267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
3232b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion {
32499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
3252b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  friend class MemRegionManager;
3262b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion(MemRegionManager *mgr)
3272b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {}
3282b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic:
32936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
33036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
33136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
3322b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  static bool classof(const MemRegion *R) {
3332b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    return R->getKind() == UnknownSpaceRegionKind;
3342b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  }
3352b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek};
3362b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
33767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion {
33867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
33967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *SFC;
3409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
34167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected:
34267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc)
34367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, k), SFC(sfc) {
34467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
34567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
34641168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
34767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
34867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *getStackFrame() const { return SFC; }
34967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
35067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
35167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
35267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
35367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
35467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= StackLocalsSpaceRegionKind &&
35567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek           k <= StackArgumentsSpaceRegionKind;
35667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
35767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
35867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
35967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion {
36099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
36167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
36267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
36367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {}
36467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
36536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
36636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
36736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
36867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
36967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackLocalsSpaceRegionKind;
37067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
37167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
37367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion {
37467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
37599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
37667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
37767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
37867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {}
37967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
38036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
38136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
38236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
38367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
38467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackArgumentsSpaceRegionKind;
3859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3887caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
389993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
390993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
391993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
39299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikieprivate:
39399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
3949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
3951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const MemRegion* superRegion;
396993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
3979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
3989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
3999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
4009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  /// getExtent - Returns the size of the region in bytes.
403c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const {
40432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    return UnknownVal();
40532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  }
40632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
407a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager* getMemRegionManager() const;
4081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4097e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  bool isSubRegionOf(const MemRegion* R) const;
4101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
41267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() > END_MEMSPACES;
413993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
414993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
41719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses.
4181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===//
419ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
42082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
42182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
42282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
42382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
42482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
42582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
42682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
4279c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Expr *Ex;
42882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
4299c378f705405d37f49795d5e915989de774fe11fTed Kremenek  AllocaRegion(const Expr *ex, unsigned cnt, const MemRegion *superRegion)
43082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
4311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
4331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4349c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Expr *getExpr() const { return Ex; }
4359852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
4369852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
4379852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
438c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
43932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
44082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
44182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
4429c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr *Ex,
4437ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                            unsigned Cnt, const MemRegion *superRegion);
4441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4459c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
4461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
44882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
44982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
4501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
4511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
452993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
453993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
45499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
45599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
456993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
457993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
459993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
4609697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  virtual QualType getLocationType() const = 0;
4619697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4629697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  QualType getDesugaredLocationType(ASTContext &Context) const {
4639697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return getLocationType().getDesugaredType(Context);
4649697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
4659697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4669697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  bool isBoundable() const { return true; }
4679697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4689697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  static bool classof(const MemRegion* R) {
4699697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    unsigned k = R->getKind();
4709697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS;
4719697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
4729697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek};
4739697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4749697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value.
4759697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion {
47699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
47799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
4789697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected:
4799697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {}
4809697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4819697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic:
482018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getValueType() const = 0;
4831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
484018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getLocationType() const {
4856eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can possibly optimize this later to cache this value.
486a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    QualType T = getValueType();
487a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    ASTContext &ctx = getContext();
488a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    if (T->getAs<ObjCObjectType>())
489a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek      return ctx.getObjCObjectPointerType(T);
490a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    return ctx.getPointerType(getValueType());
4916eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
4921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49349f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall  QualType getDesugaredValueType(ASTContext &Context) const {
494018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    QualType T = getValueType();
4951ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor    return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T;
49614553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
4971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
498e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
499e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
500993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
5019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
5029697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return k >= BEG_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS;
5039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
5049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
5059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
506ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
507eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion {
50899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
50999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
510eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected:
511eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {}
512ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
513eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  bool isBoundable() const { return false; }
514eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
515eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
516eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    Kind k = R->getKind();
517eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return k >= FunctionTextRegionKind && k <= BlockTextRegionKind;
518eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
519eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
520ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
521eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function.
522eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion {
523eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const FunctionDecl *FD;
524eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic:
5259c378f705405d37f49795d5e915989de774fe11fTed Kremenek  FunctionTextRegion(const FunctionDecl *fd, const MemRegion* sreg)
526eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {}
527eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
528018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getLocationType() const {
529018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getContext().getPointerType(FD->getType());
530ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
531eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
532abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  const FunctionDecl *getDecl() const {
533abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek    return FD;
53472e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  }
535eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
5369c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
537eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
538ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
539eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
540abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD,
541abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek                            const MemRegion*);
542eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
543ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static bool classof(const MemRegion* R) {
544eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == FunctionTextRegionKind;
545eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
546eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
547eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
548eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
549eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures).
5500a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
5510a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
5520a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
5530a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
5540a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
555eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion {
55667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
55767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
558eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *BD;
5591d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *AC;
560eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CanQualType locTy;
56167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
56267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockTextRegion(const BlockDecl *bd, CanQualType lTy,
5631d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                  AnalysisDeclContext *ac, const MemRegion* sreg)
56467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {}
56567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
56667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
567018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getLocationType() const {
568eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return locTy;
569eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
570eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
571eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *getDecl() const {
572eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return BD;
573eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
57467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
5751d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *getAnalysisDeclContext() const { return AC; }
576eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
5779c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
578eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
579eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
580eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
581eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD,
5821d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                            CanQualType, const AnalysisDeclContext*,
58367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const MemRegion*);
584eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
585eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
586eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == BlockTextRegionKind;
587ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
588ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu};
5890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
5900a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance.
5910a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
5920a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
5930a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
5940a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
5950a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
5960a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion {
59767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
5980a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *BC;
59967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const LocationContext *LC; // Can be null */
6004240096011a187807058f887eb81df750ffa17feTed Kremenek  void *ReferencedVars;
60185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  void *OriginalVars;
60267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
60367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc,
6040a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                  const MemRegion *sreg)
60585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc),
60685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    ReferencedVars(0), OriginalVars(0) {}
6070a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
60885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenekpublic:
6090a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *getCodeRegion() const { return BC; }
6104240096011a187807058f887eb81df750ffa17feTed Kremenek
611d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek  const BlockDecl *getDecl() const { return BC->getDecl(); }
612d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek
61381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  class referenced_vars_iterator {
61481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const MemRegion * const *R;
61585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion * const *OriginalR;
61681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  public:
61785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    explicit referenced_vars_iterator(const MemRegion * const *r,
61885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                      const MemRegion * const *originalR)
61985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      : R(r), OriginalR(originalR) {}
62081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
62181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    operator const MemRegion * const *() const {
62281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return R;
62381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
62485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
62585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion *getCapturedRegion() const {
62685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      return *R;
62785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    }
62885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion *getOriginalRegion() const {
62985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      return *OriginalR;
63085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    }
63185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
63281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const VarRegion* operator*() const {
63381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return cast<VarRegion>(*R);
63481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
63581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
63681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator==(const referenced_vars_iterator &I) const {
63781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R == R;
63881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
63981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator!=(const referenced_vars_iterator &I) const {
64081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R != R;
64181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
6429c378f705405d37f49795d5e915989de774fe11fTed Kremenek    referenced_vars_iterator &operator++() {
64381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      ++R;
64485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      ++OriginalR;
64581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return *this;
64681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
64781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  };
64881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
6494240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_begin() const;
6504240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_end() const;
6510a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6529c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
6530a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6540a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6550a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
65667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *,
65767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const LocationContext *, const MemRegion *);
6580a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6590a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  static bool classof(const MemRegion* R) {
6600a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek    return R->getKind() == BlockDataRegionKind;
6610a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  }
6624240096011a187807058f887eb81df750ffa17feTed Kremenekprivate:
6634240096011a187807058f887eb81df750ffa17feTed Kremenek  void LazyInitializeReferencedVars();
6640a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek};
665ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
666026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
667026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  clases, SymbolicRegion represents a region that serves as an alias for
668026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  either a real region, a NULL pointer, etc.  It essentially is used to
669026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  map the concept of symbolic values into the domain of regions.  Symbolic
670026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  regions do not need to be typed.
671e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion {
672026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected:
673026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  const SymbolRef sym;
674026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
675026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic:
6761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SymbolicRegion(const SymbolRef s, const MemRegion* sreg)
677e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek    : SubRegion(sreg, SymbolicRegionKind), sym(s) {}
6781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
679026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  SymbolRef getSymbol() const {
680026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return sym;
681026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
682026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
6839852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
6849852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
685c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
68632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
687026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
688026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
689250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
690250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            SymbolRef sym,
691250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            const MemRegion* superRegion);
6921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6939c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
6941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
695026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  static bool classof(const MemRegion* R) {
696026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() == SymbolicRegionKind;
697026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
6981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
699026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
700e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
7019697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion {
702e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
703e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
704e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
705e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
706250101353b711a409b075f1bc11070dddec7100bTed Kremenek  StringRegion(const StringLiteral* str, const MemRegion* sreg)
7079697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sreg, StringRegionKind), Str(str) {}
708e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
709e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
710e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
711e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
712e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
713e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
7146613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
7156613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
7161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
717018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
718ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return Str->getType();
719ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  }
720e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
721c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
72232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
7230a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu  bool isBoundable() const { return false; }
7240a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
725e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
726e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
727e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
728e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
7299c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
730cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
731e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
732e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
733e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
734e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
7354c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7364c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek/// The region associated with an ObjCStringLiteral.
7374c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekclass ObjCStringRegion : public TypedValueRegion {
7384c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  friend class MemRegionManager;
7394c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringLiteral* Str;
7404c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekprotected:
7414c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7424c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ObjCStringRegion(const ObjCStringLiteral* str, const MemRegion* sreg)
7434c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  : TypedValueRegion(sreg, ObjCStringRegionKind), Str(str) {}
7444c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7454c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
7464c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                            const ObjCStringLiteral* Str,
7474c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                            const MemRegion* superRegion);
7484c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7494c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekpublic:
7504c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7514c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringLiteral* getObjCStringLiteral() const { return Str; }
7524c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7534c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  QualType getValueType() const {
7544c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    return Str->getType();
7554c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7564c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7574c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  bool isBoundable() const { return false; }
7584c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7594c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const {
7604c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    ProfileRegion(ID, Str, superRegion);
7614c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7624c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7634c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  void dumpToStream(raw_ostream &os) const;
7644c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7654c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  static bool classof(const MemRegion* R) {
7664c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    return R->getKind() == ObjCStringRegionKind;
7674c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7684c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek};
769e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
770329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
771329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
772329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
7739697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion {
774329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
775329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
7769c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const CompoundLiteralExpr *CL;
777329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
7789c378f705405d37f49795d5e915989de774fe11fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr *cl, const MemRegion* sReg)
7799697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
7801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
781329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
7829c378f705405d37f49795d5e915989de774fe11fTed Kremenek                            const CompoundLiteralExpr *CL,
783329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
784329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
785018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
786018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return CL->getType();
78777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
7880a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
7899a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu  bool isBoundable() const { return !CL->isFileScope(); }
7909a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu
791329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
7921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7939c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
794329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
7959c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const CompoundLiteralExpr *getLiteralExpr() const { return CL; }
7961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
797329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
798329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
799329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
800329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
801178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
8029697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion {
8039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
8049c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Decl *D;
8059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8069c378f705405d37f49795d5e915989de774fe11fTed Kremenek  DeclRegion(const Decl *d, const MemRegion* sReg, Kind k)
8079697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, k), D(d) {}
8089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8099c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D,
8109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
8111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
812bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
8139c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Decl *getDecl() const { return D; }
8149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
8151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
816e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
817e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
81867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS;
819e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
8209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
8211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
8239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
824d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
825d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  // Constructors and private methods.
8269c378f705405d37f49795d5e915989de774fe11fTed Kremenek  VarRegion(const VarDecl *vd, const MemRegion* sReg)
82767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
8289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8299c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl *VD,
830d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                            const MemRegion *superRegion) {
8319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
8329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
8331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
834d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
8351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
837d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  const VarDecl *getDecl() const { return cast<VarDecl>(D); }
8381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8395348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  const StackFrameContext *getStackFrame() const;
8405348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
841018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
8426eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
843018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8469c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
8471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
8499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
8501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8513d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
852919e8a1c6698bfa6848571d366430126bced727dJordan Rose  bool canPrintPretty() const;
853919e8a1c6698bfa6848571d366430126bced727dJordan Rose  void printPretty(raw_ostream &os) const;
8549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
855de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
856de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter
857de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  in a call to a C++ method.  This region doesn't represent the object
858de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  referred to by 'this', but rather 'this' itself.
8599697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion {
860de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  friend class MemRegionManager;
861de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  CXXThisRegion(const PointerType *thisPointerTy,
862de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                const MemRegion *sReg)
8639697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {}
864de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
865de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
866de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const PointerType *PT,
867de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const MemRegion *sReg);
868de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
869de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
870de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
871de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic:
872018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
873de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return QualType(ThisPointerTy, 0);
874de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
8757caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
8769c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
877de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
878de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static bool classof(const MemRegion* R) {
879de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return R->getKind() == CXXThisRegionKind;
880de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
881de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
882de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate:
883de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const PointerType *ThisPointerTy;
884de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek};
8859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
8879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
8889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8899c378f705405d37f49795d5e915989de774fe11fTed Kremenek  FieldRegion(const FieldDecl *fd, const MemRegion* sReg)
8909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
8919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8924bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
8939c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const FieldDecl *getDecl() const { return cast<FieldDecl>(D); }
8941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
895018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
8966eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
897018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
8981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8994bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
900c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
90132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
9029c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl *FD,
9036304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
9049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
9059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
9089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
9099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9103d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
9113d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  void dumpToStream(raw_ostream &os) const;
912919e8a1c6698bfa6848571d366430126bced727dJordan Rose
913919e8a1c6698bfa6848571d366430126bced727dJordan Rose  bool canPrintPretty() const;
914919e8a1c6698bfa6848571d366430126bced727dJordan Rose  void printPretty(raw_ostream &os) const;
9159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
9161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
9181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
9201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
921c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg);
9229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9239c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl *ivd,
924c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer                            const MemRegion* superRegion);
9251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
927c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  const ObjCIvarDecl *getDecl() const;
928c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  QualType getValueType() const;
9291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9309c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
9311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
9339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
9349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
9367caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
937fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions.
9387caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
9397caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9407caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion;
9417caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9427caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset {
9437caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate:
9447caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  friend class ElementRegion;
9457caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9467caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *Region;
9479ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits Offset;
9487caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9499ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero())
9507caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu    : Region(reg), Offset(offset) {}
9517caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9527caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic:
9537caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  // FIXME: Eventually support symbolic offsets.
9549ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits getOffset() const { return Offset; }
9557caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *getRegion() const { return Region; }
9567caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9579c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
9587caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  void dump() const;
9597caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu};
960511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
9611437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks/// \brief ElementRegin is used to represent both array elements and casts.
9629697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion {
963511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
964511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
965f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType ElementType;
96602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc Index;
967511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
96802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg)
9699697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, ElementRegionKind),
970f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek      ElementType(elementType), Index(Idx) {
9713d8173c1c68f451c7492f92023d829c626845925Chris Lattner    assert((!isa<nonloc::ConcreteInt>(&Idx) ||
9723d8173c1c68f451c7492f92023d829c626845925Chris Lattner           cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) &&
97343b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
9740395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
9751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
976f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType,
977f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek                            SVal Idx, const MemRegion* superRegion);
978511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
979511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
980511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
98102282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc getIndex() const { return Index; }
9826e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
983018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
984f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
985f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  }
9861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
987f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType getElementType() const {
988f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
989abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
9907caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  /// Compute the offset within the array. The array might also be a subobject.
9917caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  RegionRawOffset getAsArrayOffset() const;
9921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9939c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
994b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
995511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
996511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
997511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
998511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
999511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
1000511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
100119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
1002bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression.
10039697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion {
1004bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  friend class MemRegionManager;
1005bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1006bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  Expr const *Ex;
1007bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
100802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  CXXTempObjectRegion(Expr const *E, MemRegion const *sReg)
10099697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {}
1010bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1011bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
1012bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu                            Expr const *E, const MemRegion *sReg);
1013bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1014bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic:
1015782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin  const Expr *getExpr() const { return Ex; }
1016782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin
1017018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
1018bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu    return Ex->getType();
1019bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
1020bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
10219c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
1022e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu
1023bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
1024bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1025bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static bool classof(const MemRegion* R) {
102602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    return R->getKind() == CXXTempObjectRegionKind;
1027bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
1028bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu};
1029bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
10304fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is
10314fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object.
10329697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion {
10334fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  friend class MemRegionManager;
10344fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10354fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  const CXXRecordDecl *decl;
10364fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10374fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  CXXBaseObjectRegion(const CXXRecordDecl *d, const MemRegion *sReg)
10389697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXBaseObjectRegionKind), decl(d) {}
10394fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10404fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
10414fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                            const CXXRecordDecl *decl, const MemRegion *sReg);
10424fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10434fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic:
1044d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  const CXXRecordDecl *getDecl() const { return decl; }
1045d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
10464fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  QualType getValueType() const;
10474fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10489c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
10494fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10504fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
10514fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10524fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  static bool classof(const MemRegion *region) {
10534fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    return region->getKind() == CXXBaseObjectRegionKind;
10544fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  }
10554fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu};
10564fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1057ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy>
1058ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const {
1059f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  if (const RegionTy* RT = dyn_cast<RegionTy>(this))
1060f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek    return RT;
10611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1062f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  return NULL;
1063ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}
1064511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
10659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
10669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
10679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
10689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
10699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
1070a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &C;
10719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
10729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
10731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1074eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalInternalSpaceRegion *InternalGlobals;
1075eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalSystemSpaceRegion *SystemGlobals;
1076eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalImmutableSpaceRegion *ImmutableGlobals;
1077eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
10782b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
1079c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *>
1080c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackLocalsSpaceRegions;
1081c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *>
1082c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackArgumentsSpaceRegions;
1083dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *>
1084dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticsGlobalSpaceRegions;
10852b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
108667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion *heap;
10872b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion *unknown;
1088d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *code;
1089dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
10909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1091a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a)
1092eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : C(c), A(a), InternalGlobals(0), SystemGlobals(0), ImmutableGlobals(0),
1093eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      heap(0), unknown(0), code(0) {}
10941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10954240096011a187807058f887eb81df750ffa17feTed Kremenek  ~MemRegionManager();
10961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1097a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &getContext() { return C; }
10984240096011a187807058f887eb81df750ffa17feTed Kremenek
10994240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &getAllocator() { return A; }
11001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
110167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getStackLocalsRegion - Retrieve the memory region associated with the
110267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  specified stack frame.
110367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackLocalsSpaceRegion *
110467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackLocalsRegion(const StackFrameContext *STC);
1105d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
1106d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  /// getStackArgumentsRegion - Retrieve the memory region associated with
110767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  function/method arguments of the specified stack frame.
110867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackArgumentsSpaceRegion *
110967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackArgumentsRegion(const StackFrameContext *STC);
11101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
1112dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ///  global variables.
1113eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  const GlobalsSpaceRegion *getGlobalsRegion(
1114eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      MemRegion::Kind K = MemRegion::GlobalInternalSpaceRegionKind,
1115eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      const CodeTextRegion *R = 0);
11161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
11189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
111967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const HeapSpaceRegion *getHeapRegion();
1120178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
1121178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
1122178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
1123b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getUnknownRegion();
1124c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
1125b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getCodeRegion();
1126ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
11277090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
11289c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const AllocaRegion *getAllocaRegion(const Expr *Ex, unsigned Cnt,
112967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                      const LocationContext *LC);
11301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1131329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
1132329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
1133b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const CompoundLiteralRegion*
11349c378f705405d37f49795d5e915989de774fe11fTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr *CL,
113567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                           const LocationContext *LC);
1136de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
1137fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  /// getCXXThisRegion - Retrieve the [artificial] region associated with the
1138de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ///  parameter 'this'.
1139de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy,
1140de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                        const LocationContext *LC);
11411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1142e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  /// \brief Retrieve or create a "symbolic" memory region.
1143e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  const SymbolicRegion* getSymbolicRegion(SymbolRef Sym);
1144e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks
1145e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  /// \brief Return a unique symbolic region belonging to heap memory space.
1146e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  const SymbolicRegion *getSymbolicHeapRegion(SymbolRef sym);
1147e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
11484c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const StringRegion *getStringRegion(const StringLiteral* Str);
11494c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
11504c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringRegion *getObjCStringRegion(const ObjCStringLiteral *Str);
1151e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
11529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
1153d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  ///  a specified VarDecl and LocationContext.
1154b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC);
11551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
115667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
115767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  a specified VarDecl and super region.
115867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR);
115967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1160f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  /// getElementRegion - Retrieve the memory region associated with the
1161f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ///  associated element type, index, and super region.
116202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx,
1163856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        const MemRegion *superRegion,
1164856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        ASTContext &Ctx);
11651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1166b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER,
1167856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                                 const MemRegion *superRegion) {
1168a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getElementRegion(ER->getElementType(), ER->getIndex(),
1169a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek                            superRegion, ER->getContext());
1170a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
1171511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
11729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
11739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
11749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
11759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
11769c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const FieldRegion *getFieldRegion(const FieldDecl *fd,
1177b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                    const MemRegion* superRegion);
11781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1179b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR,
1180b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                             const MemRegion *superRegion) {
1181a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getFieldRegion(FR->getDecl(), superRegion);
1182a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
11831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
11859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
11869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
11879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
11889c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl *ivd,
1189b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                          const MemRegion* superRegion);
11901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
119102fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex,
119202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                                    LocationContext const *LC);
1193bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
11944fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  const CXXBaseObjectRegion *getCXXBaseObjectRegion(const CXXRecordDecl *decl,
11954fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                                                  const MemRegion *superRegion);
11964fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1197d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different
1198d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// super region.
1199d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  const CXXBaseObjectRegion *
1200d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg,
1201d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu                                  const MemRegion *superRegion) {
1202d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu    return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion);
1203d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  }
1204d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
1205b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD);
1206b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD,
120767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            CanQualType locTy,
12081d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                            AnalysisDeclContext *AC);
120967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
121067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getBlockDataRegion - Get the memory region associated with an instance
121167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  of a block.  Unlike many other MemRegions, the LocationContext*
121267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  argument is allowed to be NULL for cases where we have no known
121367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  context.
1214b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc,
121567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            const LocationContext *lc = NULL);
12161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1217bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate:
1218250101353b711a409b075f1bc11070dddec7100bTed Kremenek  template <typename RegionTy, typename A1>
1219250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* getRegion(const A1 a1);
12201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12216304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  template <typename RegionTy, typename A1>
1222eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion);
12231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12247ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  template <typename RegionTy, typename A1, typename A2>
12257ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* getRegion(const A1 a1, const A2 a2);
1226dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
12270a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  template <typename RegionTy, typename A1, typename A2>
12280a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2,
12290a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                         const MemRegion* superRegion);
12300a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
123167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename RegionTy, typename A1, typename A2, typename A3>
123267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3,
123367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                         const MemRegion* superRegion);
123467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
123567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG>
123667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region);
123767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
123867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG, typename ARG>
123967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region, ARG a);
1240ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek};
12411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1242250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1243a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions.
1244250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1245250101353b711a409b075f1bc11070dddec7100bTed Kremenek
12469c378f705405d37f49795d5e915989de774fe11fTed Kremenekinline ASTContext &MemRegion::getContext() const {
1247a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  return getMemRegionManager()->getContext();
1248a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
1249eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
12505a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace
12515a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
1252be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace
12539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1254250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1255250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions.
1256250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1257250101353b711a409b075f1bc11070dddec7100bTed Kremenek
1258be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm {
12599c378f705405d37f49795d5e915989de774fe11fTed Kremenekstatic inline raw_ostream &operator<<(raw_ostream &os,
12609ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek                                      const clang::ento::MemRegion* R) {
12618800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  R->dumpToStream(os);
12628800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  return os;
1263be91224894e1501133e224934285ba6440bf5b59Ted Kremenek}
1264be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace
12659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
12669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
1267