MemRegion.h revision 79d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813
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"
259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h"
2630a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/Support/ErrorHandling.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:
555375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman  // We're using a const instead of an enumeration due to the size required;
565375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman  // Visual Studio will only create enumerations of size int, not long long.
575375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman  static const int64_t Symbolic = INT64_MAX;
58824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
59e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  RegionOffset() : R(0) {}
60e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {}
61e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
62e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *getRegion() const { return R; }
63824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
64824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  bool hasSymbolicOffset() const { return Offset == Symbolic; }
65824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
66824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  int64_t getOffset() const {
67824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose    assert(!hasSymbolicOffset());
68824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose    return Offset;
69824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  }
70e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
71e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  bool isValid() const { return R; }
72e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu};
73e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
7419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
7519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes.
7619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions.
799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode {
804240096011a187807058f887eb81df750ffa17feTed Kremenek  friend class MemRegionManager;
819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
8267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  enum Kind {
8367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Memory spaces.
84dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    GenericMemSpaceRegionKind,
8567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackLocalsSpaceRegionKind,
8667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackArgumentsSpaceRegionKind,
8767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    HeapSpaceRegionKind,
882b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    UnknownSpaceRegionKind,
89dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticGlobalSpaceRegionKind,
90eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalInternalSpaceRegionKind,
91eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalSystemSpaceRegionKind,
92eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalImmutableSpaceRegionKind,
93eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    BEG_NON_STATIC_GLOBAL_MEMSPACES = GlobalInternalSpaceRegionKind,
94eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_NON_STATIC_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind,
95eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    BEG_GLOBAL_MEMSPACES = StaticGlobalSpaceRegionKind,
96eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind,
97dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    BEG_MEMSPACES = GenericMemSpaceRegionKind,
98eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_MEMSPACES = GlobalImmutableSpaceRegionKind,
9967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Untyped regions.
10067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    SymbolicRegionKind,
10167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    AllocaRegionKind,
10267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Typed regions.
10367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_TYPED_REGIONS,
10467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FunctionTextRegionKind = BEG_TYPED_REGIONS,
10567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BlockTextRegionKind,
1068ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose    BlockDataRegionKind,
1079697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    BEG_TYPED_VALUE_REGIONS,
1089697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    CompoundLiteralRegionKind = BEG_TYPED_VALUE_REGIONS,
109de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    CXXThisRegionKind,
11067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StringRegionKind,
1114c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    ObjCStringRegionKind,
11267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ElementRegionKind,
11367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Decl Regions.
11467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_DECL_REGIONS,
11567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    VarRegionKind = BEG_DECL_REGIONS,
11667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FieldRegionKind,
11767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ObjCIvarRegionKind,
1184fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    END_DECL_REGIONS = ObjCIvarRegionKind,
11902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    CXXTempObjectRegionKind,
1204fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    CXXBaseObjectRegionKind,
121096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose    END_TYPED_VALUE_REGIONS = CXXBaseObjectRegionKind,
122096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose    END_TYPED_REGIONS = CXXBaseObjectRegionKind
12367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  };
12467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
1269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
1299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
1309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
1319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
133a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek  ASTContext &getContext() const;
1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
136a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
137a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  virtual MemRegionManager* getMemRegionManager() const = 0;
138a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
139bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemSpaceRegion *getMemorySpace() const;
1401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
141adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *getBaseRegion() const;
142adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
143522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks  /// Check if the region is a subregion of the given region.
1445f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaks  virtual bool isSubRegionOf(const MemRegion *R) const;
145522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks
146b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  const MemRegion *StripCasts(bool StripBaseCasts = true) const;
1471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1481508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsOrParametersStorage() const;
1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
150de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackStorage() const;
151de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
152de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackNonParametersStorage() const;
153de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
154de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackParametersStorage() const;
155b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
156e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// Compute the offset within the top level memory object.
157e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  RegionOffset getAsOffset() const;
158e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1593d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief Get a string representation of a region for debug use.
1603d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  std::string getString() const;
1613d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
1629c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
1637f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
1648800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dump() const;
1651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
166919e8a1c6698bfa6848571d366430126bced727dJordan Rose  /// \brief Returns true if this region can be printed in a user-friendly way.
167919e8a1c6698bfa6848571d366430126bced727dJordan Rose  virtual bool canPrintPretty() const;
168919e8a1c6698bfa6848571d366430126bced727dJordan Rose
1693d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief Print the region for use in diagnostics.
170919e8a1c6698bfa6848571d366430126bced727dJordan Rose  virtual void printPretty(raw_ostream &os) const;
1713d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
17279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// \brief Returns true if this region's textual representation can be used
17379d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// as part of a larger expression.
17479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  virtual bool canPrintPrettyAsExpr() const;
17579d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks
17679d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// \brief Print the region as expression.
17779d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  ///
17879d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// When this region represents a subexpression, the method is for printing
17979d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// an expression containing it.
18079d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  virtual void printPrettyAsExpr(raw_ostream &os) const;
1819e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks
1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Kind getKind() const { return kind; }
1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
184ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  template<typename RegionTy> const RegionTy* getAs() const;
1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
186f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu  virtual bool isBoundable() const { return false; }
1879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
189eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// MemSpaceRegion - A memory region that represents a "memory space";
1909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
1919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
192a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected:
19367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
19467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
195a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager *Mgr;
196a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
19767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind)
19867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemRegion(k), Mgr(mgr) {
19967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
20067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
20167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
20267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemRegionManager* getMemRegionManager() const { return Mgr; }
2031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
20567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  bool isBoundable() const { return false; }
20667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
20767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
20867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
20967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
21067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
21167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_MEMSPACES && k <= END_MEMSPACES;
212a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  }
21367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
21467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
21567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion {
21699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
217dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected:
218dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  GlobalsSpaceRegion(MemRegionManager *mgr, Kind k)
219dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : MemSpaceRegion(mgr, k) {}
220dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
221dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
222dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    Kind k = R->getKind();
223dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES;
224dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
225dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
226eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
227914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region of the static variables within the current CodeTextRegion
228eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// scope.
229914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie///
230eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// Currently, only the static locals are placed there, so we know that these
231eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// variables do not get invalidated by calls to other functions.
232dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion {
23367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
234a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
235dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *CR;
236dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
237dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr)
238dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {}
239dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
240dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
241dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
242dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2439c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
244fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
245dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *getCodeRegion() const { return CR; }
246dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
247dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
248dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R->getKind() == StaticGlobalSpaceRegionKind;
249dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
250dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
251eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
252914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region for all the non-static global variables.
253eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks///
254eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// This class is further split into subclasses for efficient implementation of
255eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// invalidating a set of related global values as is done in
256eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// RegionStoreManager::invalidateRegions (instead of finding all the dependent
257eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// globals, we invalidate the whole parent region).
258dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion {
259dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  friend class MemRegionManager;
260dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
261eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksprotected:
262eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  NonStaticGlobalSpaceRegion(MemRegionManager *mgr, Kind k)
263eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : GlobalsSpaceRegion(mgr, k) {}
264dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
266fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
26767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
268eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    Kind k = R->getKind();
269eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return k >= BEG_NON_STATIC_GLOBAL_MEMSPACES &&
270eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks           k <= END_NON_STATIC_GLOBAL_MEMSPACES;
27167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
27267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
273eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
274914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are defined in system/external
275eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// headers and are considered modifiable by system calls (ex: errno).
276eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalSystemSpaceRegion : public NonStaticGlobalSpaceRegion {
277eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
278eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
279eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalSystemSpaceRegion(MemRegionManager *mgr)
280eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalSystemSpaceRegionKind) {}
281eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
282eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
283eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
284eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
285eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
286eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
287eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalSystemSpaceRegionKind;
288eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
289eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
290eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
291914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are considered not to be modified
292eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// or point to data which could be modified as a result of a function call
293eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// (system or internal). Ex: Const global scalars would be modeled as part of
294eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// this region. This region also includes most system globals since they have
295eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// low chance of being modified.
296eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalImmutableSpaceRegion : public NonStaticGlobalSpaceRegion {
297eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
298eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
299eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalImmutableSpaceRegion(MemRegionManager *mgr)
300eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalImmutableSpaceRegionKind) {}
301eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
302eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
303eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
304eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
305eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
306eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
307eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalImmutableSpaceRegionKind;
308eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
309eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
310eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
311914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which can be modified by calls to
312eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// "internally" defined functions - (for now just) functions other then system
313eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// calls.
314eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalInternalSpaceRegion : public NonStaticGlobalSpaceRegion {
315eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
316eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
317eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalInternalSpaceRegion(MemRegionManager *mgr)
318eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalInternalSpaceRegionKind) {}
319eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
320eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
321eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
322eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
323eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
324eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
325eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalInternalSpaceRegionKind;
326eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
327eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
328eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
32967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion {
33099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
33167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
33267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion(MemRegionManager *mgr)
33467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, HeapSpaceRegionKind) {}
33567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
33636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
33736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
33836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
33967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
34067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == HeapSpaceRegionKind;
34167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
34267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
34367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
3442b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion {
34599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
3462b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  friend class MemRegionManager;
3472b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion(MemRegionManager *mgr)
3482b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {}
3492b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic:
35036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
35136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
35236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
3532b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  static bool classof(const MemRegion *R) {
3542b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    return R->getKind() == UnknownSpaceRegionKind;
3552b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  }
3562b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek};
3572b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
35867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion {
35967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
36067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *SFC;
3619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
36267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected:
36367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc)
36467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, k), SFC(sfc) {
36567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
36667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
36741168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
36867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
36967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *getStackFrame() const { return SFC; }
37067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
37167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
37367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
37467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
37567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= StackLocalsSpaceRegionKind &&
37667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek           k <= StackArgumentsSpaceRegionKind;
37767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
37867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
37967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion {
38199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
38267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
38367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
38467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {}
38567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
38636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
38736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
38836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
38967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
39067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackLocalsSpaceRegionKind;
39167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
39267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
39367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
39467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion {
39567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
39699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
39767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
39867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
39967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {}
40067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
40136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
40236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
40336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
40467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
40567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackArgumentsSpaceRegionKind;
4069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
4089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4097caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
410993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
411993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
412993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
41399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikieprivate:
41499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
4159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const MemRegion* superRegion;
417993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
4189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
4199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
4209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
4219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  /// getExtent - Returns the size of the region in bytes.
424c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const {
42532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    return UnknownVal();
42632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  }
42732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
428a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager* getMemRegionManager() const;
4291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4305f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaks  virtual bool isSubRegionOf(const MemRegion* R) const;
4311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
43367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() > END_MEMSPACES;
434993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
435993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
4361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
43819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses.
4391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===//
440ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
44182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
44282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
44382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
44482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
44582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
44682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
44782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
4489c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Expr *Ex;
44982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
4509c378f705405d37f49795d5e915989de774fe11fTed Kremenek  AllocaRegion(const Expr *ex, unsigned cnt, const MemRegion *superRegion)
45182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
4541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4559c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Expr *getExpr() const { return Ex; }
4569852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
4579852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
4589852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
459c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
46032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
46182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
46282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
4639c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr *Ex,
4647ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                            unsigned Cnt, const MemRegion *superRegion);
4651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4669c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
4671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
46982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
47082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
4711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
4721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
473993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
474993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
47599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
47699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
477993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
478993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
4791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
480993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
4819697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  virtual QualType getLocationType() const = 0;
4829697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4839697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  QualType getDesugaredLocationType(ASTContext &Context) const {
4849697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return getLocationType().getDesugaredType(Context);
4859697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
4869697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4879697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  bool isBoundable() const { return true; }
4889697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4899697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  static bool classof(const MemRegion* R) {
4909697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    unsigned k = R->getKind();
4919697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS;
4929697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
4939697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek};
4949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4959697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value.
4969697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion {
49799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
49899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
4999697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected:
5009697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {}
5019697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
5029697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic:
503018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getValueType() const = 0;
5041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
505018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getLocationType() const {
5066eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can possibly optimize this later to cache this value.
507a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    QualType T = getValueType();
508a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    ASTContext &ctx = getContext();
509a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    if (T->getAs<ObjCObjectType>())
510a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek      return ctx.getObjCObjectPointerType(T);
511a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    return ctx.getPointerType(getValueType());
5126eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
5131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51449f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall  QualType getDesugaredValueType(ASTContext &Context) const {
515018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    QualType T = getValueType();
5161ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor    return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T;
51714553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
5181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
519e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
520e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
521993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
5229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
5239697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return k >= BEG_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS;
5249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
5259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
5269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
527ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
528eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion {
52999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
53099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
531eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected:
532eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {}
533ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
534eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  bool isBoundable() const { return false; }
535eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
536eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
537eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    Kind k = R->getKind();
538eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return k >= FunctionTextRegionKind && k <= BlockTextRegionKind;
539eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
540eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
541ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
542eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function.
543eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion {
5445fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  const NamedDecl *FD;
545eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic:
5465fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  FunctionTextRegion(const NamedDecl *fd, const MemRegion* sreg)
5475fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {
5485fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    assert(isa<ObjCMethodDecl>(fd) || isa<FunctionDecl>(fd));
5495fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  }
550eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
551018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getLocationType() const {
5525fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    const ASTContext &Ctx = getContext();
5535fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    if (const FunctionDecl *D = dyn_cast<FunctionDecl>(FD)) {
5545fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks      return Ctx.getPointerType(D->getType());
5555fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    }
5565fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks
5575fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    assert(isa<ObjCMethodDecl>(FD));
5585fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    assert(false && "Getting the type of ObjCMethod is not supported yet");
5595fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks
5605fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    // TODO: We might want to return a different type here (ex: id (*ty)(...))
5615fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    //       depending on how it is used.
5625fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    return QualType();
563ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
5645fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks
5655fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  const NamedDecl *getDecl() const {
566abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek    return FD;
56772e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  }
568eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
5699c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
570eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
571ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
572eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
5735fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const NamedDecl *FD,
574abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek                            const MemRegion*);
575eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
576ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static bool classof(const MemRegion* R) {
577eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == FunctionTextRegionKind;
578eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
579eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
580eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
581eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
582eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures).
5830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
5840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
5850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
5860a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
5870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
588eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion {
58967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
59067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
591eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *BD;
5921d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *AC;
593eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CanQualType locTy;
59467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
59567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockTextRegion(const BlockDecl *bd, CanQualType lTy,
5961d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                  AnalysisDeclContext *ac, const MemRegion* sreg)
59767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {}
59867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
59967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
600018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getLocationType() const {
601eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return locTy;
602eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
603eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
604eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *getDecl() const {
605eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return BD;
606eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
60767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
6081d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *getAnalysisDeclContext() const { return AC; }
609eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
6109c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
611eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
612eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
613eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
614eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD,
6151d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                            CanQualType, const AnalysisDeclContext*,
61667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const MemRegion*);
617eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
618eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
619eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == BlockTextRegionKind;
620ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
621ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu};
6220a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6230a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance.
6240a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
6250a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
6260a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
6270a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
6280a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
6298ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Roseclass BlockDataRegion : public TypedRegion {
63067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
6310a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *BC;
63267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const LocationContext *LC; // Can be null */
6334240096011a187807058f887eb81df750ffa17feTed Kremenek  void *ReferencedVars;
63485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  void *OriginalVars;
63567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
63667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc,
6370a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                  const MemRegion *sreg)
6388ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose  : TypedRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc),
63985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    ReferencedVars(0), OriginalVars(0) {}
6400a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
64185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenekpublic:
6420a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *getCodeRegion() const { return BC; }
6434240096011a187807058f887eb81df750ffa17feTed Kremenek
644d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek  const BlockDecl *getDecl() const { return BC->getDecl(); }
6458ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose
6468ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose  QualType getLocationType() const { return BC->getLocationType(); }
647d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek
64881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  class referenced_vars_iterator {
64981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const MemRegion * const *R;
65085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion * const *OriginalR;
65181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  public:
65285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    explicit referenced_vars_iterator(const MemRegion * const *r,
65385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                      const MemRegion * const *originalR)
65485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      : R(r), OriginalR(originalR) {}
65585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
656e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek    const VarRegion *getCapturedRegion() const {
65781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return cast<VarRegion>(*R);
65881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
659e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek    const VarRegion *getOriginalRegion() const {
660e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek      return cast<VarRegion>(*OriginalR);
661e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek    }
662e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek
66381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator==(const referenced_vars_iterator &I) const {
66441f3f3a4792f46787632fdb94f952f6b3ce3f4aeJordan Rose      assert((R == 0) == (I.R == 0));
66581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R == R;
66681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
66781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator!=(const referenced_vars_iterator &I) const {
66841f3f3a4792f46787632fdb94f952f6b3ce3f4aeJordan Rose      assert((R == 0) == (I.R == 0));
66981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R != R;
67081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
6719c378f705405d37f49795d5e915989de774fe11fTed Kremenek    referenced_vars_iterator &operator++() {
67281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      ++R;
67385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      ++OriginalR;
67481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return *this;
67581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
67681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  };
6775846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek
6785846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  /// Return the original region for a captured region, if
6795846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  /// one exists.
6805846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  const VarRegion *getOriginalRegion(const VarRegion *VR) const;
68181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
6824240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_begin() const;
6834240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_end() const;
6840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6859c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
6860a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
68967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *,
69067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const LocationContext *, const MemRegion *);
6910a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6920a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  static bool classof(const MemRegion* R) {
6930a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek    return R->getKind() == BlockDataRegionKind;
6940a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  }
6954240096011a187807058f887eb81df750ffa17feTed Kremenekprivate:
6964240096011a187807058f887eb81df750ffa17feTed Kremenek  void LazyInitializeReferencedVars();
69724570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  std::pair<const VarRegion *, const VarRegion *>
69824570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  getCaptureRegions(const VarDecl *VD);
6990a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek};
700ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
701026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
702026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  clases, SymbolicRegion represents a region that serves as an alias for
703026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  either a real region, a NULL pointer, etc.  It essentially is used to
704026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  map the concept of symbolic values into the domain of regions.  Symbolic
705026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  regions do not need to be typed.
706e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion {
707026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected:
708026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  const SymbolRef sym;
709026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
710026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic:
7111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SymbolicRegion(const SymbolRef s, const MemRegion* sreg)
712e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek    : SubRegion(sreg, SymbolicRegionKind), sym(s) {}
7131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
714026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  SymbolRef getSymbol() const {
715026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return sym;
716026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
717026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
7189852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
7199852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
720c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
72132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
722026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
723026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
724250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
725250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            SymbolRef sym,
726250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            const MemRegion* superRegion);
7271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7289c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
7291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
730026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  static bool classof(const MemRegion* R) {
731026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() == SymbolicRegionKind;
732026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
7331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
734026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
735e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
7369697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion {
737e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
738e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
739e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
740e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
741250101353b711a409b075f1bc11070dddec7100bTed Kremenek  StringRegion(const StringLiteral* str, const MemRegion* sreg)
7429697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sreg, StringRegionKind), Str(str) {}
743e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
744e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
745e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
746e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
747e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
748e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
7496613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
7506613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
7511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
752018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
753ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return Str->getType();
754ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  }
755e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
756c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
75732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
7580a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu  bool isBoundable() const { return false; }
7590a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
760e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
761e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
762e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
763e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
7649c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
765cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
766e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
767e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
768e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
769e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
7704c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7714c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek/// The region associated with an ObjCStringLiteral.
7724c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekclass ObjCStringRegion : public TypedValueRegion {
7734c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  friend class MemRegionManager;
7744c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringLiteral* Str;
7754c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekprotected:
7764c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7774c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ObjCStringRegion(const ObjCStringLiteral* str, const MemRegion* sreg)
7784c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  : TypedValueRegion(sreg, ObjCStringRegionKind), Str(str) {}
7794c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7804c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
7814c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                            const ObjCStringLiteral* Str,
7824c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                            const MemRegion* superRegion);
7834c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7844c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekpublic:
7854c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7864c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringLiteral* getObjCStringLiteral() const { return Str; }
7874c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7884c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  QualType getValueType() const {
7894c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    return Str->getType();
7904c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7914c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7924c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  bool isBoundable() const { return false; }
7934c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7944c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const {
7954c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    ProfileRegion(ID, Str, superRegion);
7964c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7974c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7984c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  void dumpToStream(raw_ostream &os) const;
7994c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
8004c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  static bool classof(const MemRegion* R) {
8014c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    return R->getKind() == ObjCStringRegionKind;
8024c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
8034c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek};
804e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
805329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
806329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
807329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
8089697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion {
809329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
810329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
8119c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const CompoundLiteralExpr *CL;
812329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
8139c378f705405d37f49795d5e915989de774fe11fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr *cl, const MemRegion* sReg)
8149697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
8151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
816329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
8179c378f705405d37f49795d5e915989de774fe11fTed Kremenek                            const CompoundLiteralExpr *CL,
818329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
819329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
820018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
821018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return CL->getType();
82277cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
8230a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
8249a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu  bool isBoundable() const { return !CL->isFileScope(); }
8259a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu
826329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
8271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8289c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
829329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
8309c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const CompoundLiteralExpr *getLiteralExpr() const { return CL; }
8311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
832329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
833329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
834329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
835329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
836178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
8379697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion {
8389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
8399c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Decl *D;
8409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8419c378f705405d37f49795d5e915989de774fe11fTed Kremenek  DeclRegion(const Decl *d, const MemRegion* sReg, Kind k)
8429697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, k), D(d) {}
8439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8449c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D,
8459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
8461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
847bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
8489c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Decl *getDecl() const { return D; }
8499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
8501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
851e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
852e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
85367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS;
854e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
8559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
8561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
8589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
859d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
860d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  // Constructors and private methods.
8619c378f705405d37f49795d5e915989de774fe11fTed Kremenek  VarRegion(const VarDecl *vd, const MemRegion* sReg)
86267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
8639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8649c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl *VD,
865d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                            const MemRegion *superRegion) {
8669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
8679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
8681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
869d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
8701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
872d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  const VarDecl *getDecl() const { return cast<VarDecl>(D); }
8731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8745348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  const StackFrameContext *getStackFrame() const;
8755348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
876018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
8776eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
878018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
8791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8819c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
8821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
8849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
8851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8863d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
887919e8a1c6698bfa6848571d366430126bced727dJordan Rose  bool canPrintPretty() const;
8889e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks
88979d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  void printPrettyAsExpr(raw_ostream &os) const;
8909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
891de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
892de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter
893de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  in a call to a C++ method.  This region doesn't represent the object
894de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  referred to by 'this', but rather 'this' itself.
8959697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion {
896de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  friend class MemRegionManager;
897de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  CXXThisRegion(const PointerType *thisPointerTy,
898de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                const MemRegion *sReg)
8999697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {}
900de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
901de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
902de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const PointerType *PT,
903de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const MemRegion *sReg);
904de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
905de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
906de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
907de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic:
908018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
909de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return QualType(ThisPointerTy, 0);
910de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
9117caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9129c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
913de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
914de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static bool classof(const MemRegion* R) {
915de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return R->getKind() == CXXThisRegionKind;
916de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
917de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
918de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate:
919de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const PointerType *ThisPointerTy;
920de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek};
9219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
9239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
9249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9259c378f705405d37f49795d5e915989de774fe11fTed Kremenek  FieldRegion(const FieldDecl *fd, const MemRegion* sReg)
9269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
9279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9284bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
9299c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const FieldDecl *getDecl() const { return cast<FieldDecl>(D); }
9301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
931018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
9326eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
933018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
9341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
9354bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
936c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
93732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
9389c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl *FD,
9396304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
9409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
9419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
9449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
9459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9463d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
9473d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  void dumpToStream(raw_ostream &os) const;
948919e8a1c6698bfa6848571d366430126bced727dJordan Rose
949919e8a1c6698bfa6848571d366430126bced727dJordan Rose  bool canPrintPretty() const;
950919e8a1c6698bfa6848571d366430126bced727dJordan Rose  void printPretty(raw_ostream &os) const;
95179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  bool canPrintPrettyAsExpr() const;
95279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  void printPrettyAsExpr(raw_ostream &os) const;
9539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
9541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
9561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
9581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
959c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg);
9609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9619c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl *ivd,
962c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer                            const MemRegion* superRegion);
9631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
965c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  const ObjCIvarDecl *getDecl() const;
966c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  QualType getValueType() const;
9671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
96843b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek  bool canPrintPretty() const;
96979d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  void printPrettyAsExpr(raw_ostream &os) const;
97043b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek
9719c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
9721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
9749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
9759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
9777caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
978fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions.
9797caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
9807caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9817caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion;
9827caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9837caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset {
9847caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate:
9857caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  friend class ElementRegion;
9867caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9877caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *Region;
9889ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits Offset;
9897caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9909ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero())
9917caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu    : Region(reg), Offset(offset) {}
9927caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9937caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic:
9947caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  // FIXME: Eventually support symbolic offsets.
9959ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits getOffset() const { return Offset; }
9967caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *getRegion() const { return Region; }
9977caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9989c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
9997caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  void dump() const;
10007caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu};
1001511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
10021437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks/// \brief ElementRegin is used to represent both array elements and casts.
10039697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion {
1004511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
1005511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
1006f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType ElementType;
100702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc Index;
1008511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
100902282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg)
10109697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, ElementRegionKind),
1011f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek      ElementType(elementType), Index(Idx) {
10125251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie    assert((!Idx.getAs<nonloc::ConcreteInt>() ||
10135251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie            Idx.castAs<nonloc::ConcreteInt>().getValue().isSigned()) &&
101443b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
10150395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
10161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1017f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType,
1018f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek                            SVal Idx, const MemRegion* superRegion);
1019511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
1020511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
1021511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
102202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc getIndex() const { return Index; }
10236e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
1024018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
1025f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
1026f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  }
10271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1028f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType getElementType() const {
1029f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
1030abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
10317caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  /// Compute the offset within the array. The array might also be a subobject.
10327caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  RegionRawOffset getAsArrayOffset() const;
10331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10349c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
1035b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
1036511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
1037511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
1038511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
1039511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
1040511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
1041511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
104219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
1043bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression.
10449697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion {
1045bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  friend class MemRegionManager;
1046bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1047bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  Expr const *Ex;
1048bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
104902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  CXXTempObjectRegion(Expr const *E, MemRegion const *sReg)
10509697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {}
1051bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1052bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
1053bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu                            Expr const *E, const MemRegion *sReg);
1054bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1055bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic:
1056782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin  const Expr *getExpr() const { return Ex; }
1057782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin
1058018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
1059bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu    return Ex->getType();
1060bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
1061bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
10629c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
1063e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu
1064bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
1065bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1066bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static bool classof(const MemRegion* R) {
106702fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    return R->getKind() == CXXTempObjectRegionKind;
1068bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
1069bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu};
1070bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
10714fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is
10724fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object.
10739697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion {
10744fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  friend class MemRegionManager;
10754fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10764411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  llvm::PointerIntPair<const CXXRecordDecl *, 1, bool> Data;
10774fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10784411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  CXXBaseObjectRegion(const CXXRecordDecl *RD, bool IsVirtual,
10794411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                      const MemRegion *SReg)
10804411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    : TypedValueRegion(SReg, CXXBaseObjectRegionKind), Data(RD, IsVirtual) {}
10814fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10824411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  static void ProfileRegion(llvm::FoldingSetNodeID &ID, const CXXRecordDecl *RD,
10834411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                            bool IsVirtual, const MemRegion *SReg);
10844fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10854fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic:
10864411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  const CXXRecordDecl *getDecl() const { return Data.getPointer(); }
10874411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  bool isVirtual() const { return Data.getInt(); }
1088d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
10894fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  QualType getValueType() const;
10904fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10919c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
10924fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10934fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
10944fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10954fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  static bool classof(const MemRegion *region) {
10964fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    return region->getKind() == CXXBaseObjectRegionKind;
10974fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  }
10984fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu};
10994fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1100ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy>
1101ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const {
1102f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  if (const RegionTy* RT = dyn_cast<RegionTy>(this))
1103f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek    return RT;
11041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1105f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  return NULL;
1106ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}
1107511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
11089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
11099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
11109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
11119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
11129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
1113a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &C;
11149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
11159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
11161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1117eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalInternalSpaceRegion *InternalGlobals;
1118eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalSystemSpaceRegion *SystemGlobals;
1119eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalImmutableSpaceRegion *ImmutableGlobals;
1120eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
11212b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
1122c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *>
1123c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackLocalsSpaceRegions;
1124c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *>
1125c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackArgumentsSpaceRegions;
1126dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *>
1127dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticsGlobalSpaceRegions;
11282b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
112967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion *heap;
11302b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion *unknown;
1131d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *code;
1132dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
11339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1134a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a)
1135eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : C(c), A(a), InternalGlobals(0), SystemGlobals(0), ImmutableGlobals(0),
1136eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      heap(0), unknown(0), code(0) {}
11371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11384240096011a187807058f887eb81df750ffa17feTed Kremenek  ~MemRegionManager();
11391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1140a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &getContext() { return C; }
11414240096011a187807058f887eb81df750ffa17feTed Kremenek
11424240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &getAllocator() { return A; }
11431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
114467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getStackLocalsRegion - Retrieve the memory region associated with the
114567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  specified stack frame.
114667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackLocalsSpaceRegion *
114767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackLocalsRegion(const StackFrameContext *STC);
1148d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
1149d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  /// getStackArgumentsRegion - Retrieve the memory region associated with
115067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  function/method arguments of the specified stack frame.
115167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackArgumentsSpaceRegion *
115267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackArgumentsRegion(const StackFrameContext *STC);
11531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
1155dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ///  global variables.
1156eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  const GlobalsSpaceRegion *getGlobalsRegion(
1157eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      MemRegion::Kind K = MemRegion::GlobalInternalSpaceRegionKind,
1158eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      const CodeTextRegion *R = 0);
11591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
11619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
116267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const HeapSpaceRegion *getHeapRegion();
1163178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
1164178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
1165178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
1166b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getUnknownRegion();
1167c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
1168b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getCodeRegion();
1169ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
11707090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
11719c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const AllocaRegion *getAllocaRegion(const Expr *Ex, unsigned Cnt,
117267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                      const LocationContext *LC);
11731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1174329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
1175329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
1176b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const CompoundLiteralRegion*
11779c378f705405d37f49795d5e915989de774fe11fTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr *CL,
117867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                           const LocationContext *LC);
1179de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
1180fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  /// getCXXThisRegion - Retrieve the [artificial] region associated with the
1181de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ///  parameter 'this'.
1182de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy,
1183de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                        const LocationContext *LC);
11841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1185e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  /// \brief Retrieve or create a "symbolic" memory region.
1186e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  const SymbolicRegion* getSymbolicRegion(SymbolRef Sym);
1187e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks
1188e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  /// \brief Return a unique symbolic region belonging to heap memory space.
1189e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  const SymbolicRegion *getSymbolicHeapRegion(SymbolRef sym);
1190e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
11914c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const StringRegion *getStringRegion(const StringLiteral* Str);
11924c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
11934c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringRegion *getObjCStringRegion(const ObjCStringLiteral *Str);
1194e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
11959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
1196d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  ///  a specified VarDecl and LocationContext.
1197b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC);
11981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
119967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
120067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  a specified VarDecl and super region.
120167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR);
120267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1203f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  /// getElementRegion - Retrieve the memory region associated with the
1204f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ///  associated element type, index, and super region.
120502282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx,
1206856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        const MemRegion *superRegion,
1207856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        ASTContext &Ctx);
12081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1209b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER,
1210856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                                 const MemRegion *superRegion) {
1211a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getElementRegion(ER->getElementType(), ER->getIndex(),
1212a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek                            superRegion, ER->getContext());
1213a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
1214511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
12159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
12169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
12179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
12189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
12199c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const FieldRegion *getFieldRegion(const FieldDecl *fd,
1220b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                    const MemRegion* superRegion);
12211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1222b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR,
1223b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                             const MemRegion *superRegion) {
1224a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getFieldRegion(FR->getDecl(), superRegion);
1225a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
12261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
12289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
12299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
12309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
12319c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl *ivd,
1232b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                          const MemRegion* superRegion);
12331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
123402fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex,
123502fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                                    LocationContext const *LC);
1236bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
12374411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  /// Create a CXXBaseObjectRegion with the given base class for region
12384411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  /// \p Super.
12394411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  ///
12404411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  /// The type of \p Super is assumed be a class deriving from \p BaseClass.
12414411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  const CXXBaseObjectRegion *
12424411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  getCXXBaseObjectRegion(const CXXRecordDecl *BaseClass, const MemRegion *Super,
12434411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                         bool IsVirtual);
12444fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1245d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different
1246d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// super region.
1247d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  const CXXBaseObjectRegion *
1248d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg,
1249d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu                                  const MemRegion *superRegion) {
12504411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion,
12514411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                  baseReg->isVirtual());
1252d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  }
1253d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
12545fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  const FunctionTextRegion *getFunctionTextRegion(const NamedDecl *FD);
1255b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD,
125667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            CanQualType locTy,
12571d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                            AnalysisDeclContext *AC);
125867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
125967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getBlockDataRegion - Get the memory region associated with an instance
126067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  of a block.  Unlike many other MemRegions, the LocationContext*
126167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  argument is allowed to be NULL for cases where we have no known
126267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  context.
1263b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc,
126467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            const LocationContext *lc = NULL);
12651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1266bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate:
1267250101353b711a409b075f1bc11070dddec7100bTed Kremenek  template <typename RegionTy, typename A1>
1268250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* getRegion(const A1 a1);
12691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12706304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  template <typename RegionTy, typename A1>
1271eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion);
12721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12737ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  template <typename RegionTy, typename A1, typename A2>
12747ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* getRegion(const A1 a1, const A2 a2);
1275dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
12760a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  template <typename RegionTy, typename A1, typename A2>
12770a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2,
12780a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                         const MemRegion* superRegion);
12790a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
128067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename RegionTy, typename A1, typename A2, typename A3>
128167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3,
128267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                         const MemRegion* superRegion);
128367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
128467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG>
128567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region);
128667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
128767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG, typename ARG>
128867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region, ARG a);
1289ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek};
12901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1291250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1292a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions.
1293250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1294250101353b711a409b075f1bc11070dddec7100bTed Kremenek
12959c378f705405d37f49795d5e915989de774fe11fTed Kremenekinline ASTContext &MemRegion::getContext() const {
1296a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  return getMemRegionManager()->getContext();
1297a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
1298eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
12995a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace
13005a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
1301be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace
13029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1303250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1304250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions.
1305250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1306250101353b711a409b075f1bc11070dddec7100bTed Kremenek
1307be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm {
13089c378f705405d37f49795d5e915989de774fe11fTed Kremenekstatic inline raw_ostream &operator<<(raw_ostream &os,
13099ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek                                      const clang::ento::MemRegion* R) {
13108800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  R->dumpToStream(os);
13118800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  return os;
1312be91224894e1501133e224934285ba6440bf5b59Ted Kremenek}
1313be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace
13149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
13159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
1316