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
408ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaksclass CodeTextRegion;
415a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemRegionManager;
425a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemSpaceRegion;
43c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenekclass SValBuilder;
448ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaksclass SymbolicRegion;
454240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion;
461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu/// Represent a region's offset within the top level base region.
48e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xuclass RegionOffset {
49e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The base region.
50e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *R;
51e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
52e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The bit offset within the base region. It shouldn't be negative.
53e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t Offset;
54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
55e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xupublic:
565375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman  // We're using a const instead of an enumeration due to the size required;
575375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman  // Visual Studio will only create enumerations of size int, not long long.
585375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman  static const int64_t Symbolic = INT64_MAX;
59824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
60e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  RegionOffset() : R(0) {}
61e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {}
62e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
63e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *getRegion() const { return R; }
64824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
65824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  bool hasSymbolicOffset() const { return Offset == Symbolic; }
66824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
67824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  int64_t getOffset() const {
68824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose    assert(!hasSymbolicOffset());
69824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose    return Offset;
70824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  }
71e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
72e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  bool isValid() const { return R; }
73e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu};
74e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
7519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
7619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes.
7719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions.
809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode {
814240096011a187807058f887eb81df750ffa17feTed Kremenek  friend class MemRegionManager;
829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
8367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  enum Kind {
8467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Memory spaces.
85dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    GenericMemSpaceRegionKind,
8667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackLocalsSpaceRegionKind,
8767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackArgumentsSpaceRegionKind,
8867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    HeapSpaceRegionKind,
892b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    UnknownSpaceRegionKind,
90dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticGlobalSpaceRegionKind,
91eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalInternalSpaceRegionKind,
92eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalSystemSpaceRegionKind,
93eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalImmutableSpaceRegionKind,
94eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    BEG_NON_STATIC_GLOBAL_MEMSPACES = GlobalInternalSpaceRegionKind,
95eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_NON_STATIC_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind,
96eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    BEG_GLOBAL_MEMSPACES = StaticGlobalSpaceRegionKind,
97eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind,
98dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    BEG_MEMSPACES = GenericMemSpaceRegionKind,
99eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_MEMSPACES = GlobalImmutableSpaceRegionKind,
10067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Untyped regions.
10167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    SymbolicRegionKind,
10267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    AllocaRegionKind,
10367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Typed regions.
10467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_TYPED_REGIONS,
10567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FunctionTextRegionKind = BEG_TYPED_REGIONS,
10667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BlockTextRegionKind,
1078ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose    BlockDataRegionKind,
1089697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    BEG_TYPED_VALUE_REGIONS,
1099697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    CompoundLiteralRegionKind = BEG_TYPED_VALUE_REGIONS,
110de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    CXXThisRegionKind,
11167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StringRegionKind,
1124c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    ObjCStringRegionKind,
11367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ElementRegionKind,
11467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Decl Regions.
11567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_DECL_REGIONS,
11667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    VarRegionKind = BEG_DECL_REGIONS,
11767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FieldRegionKind,
11867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ObjCIvarRegionKind,
1194fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    END_DECL_REGIONS = ObjCIvarRegionKind,
12002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    CXXTempObjectRegionKind,
1214fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    CXXBaseObjectRegionKind,
122096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose    END_TYPED_VALUE_REGIONS = CXXBaseObjectRegionKind,
123096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose    END_TYPED_REGIONS = CXXBaseObjectRegionKind
12467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  };
12567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
1279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
1309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
1319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
1329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
134a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek  ASTContext &getContext() const;
1351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
137a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
138a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  virtual MemRegionManager* getMemRegionManager() const = 0;
139a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
140bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemSpaceRegion *getMemorySpace() const;
1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
142adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *getBaseRegion() const;
143adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
144522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks  /// Check if the region is a subregion of the given region.
1455f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaks  virtual bool isSubRegionOf(const MemRegion *R) const;
146522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks
147b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  const MemRegion *StripCasts(bool StripBaseCasts = true) const;
1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1498ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks  /// \brief If this is a symbolic region, returns the region. Otherwise,
1508ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks  /// goes up the base chain looking for the first symbolic base region.
1518ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks  const SymbolicRegion *getSymbolicBase() const;
1528ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks
1531508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsOrParametersStorage() const;
1541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
155de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackStorage() const;
156de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
157de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackNonParametersStorage() const;
158de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
159de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackParametersStorage() const;
160b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
161e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// Compute the offset within the top level memory object.
162e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  RegionOffset getAsOffset() const;
163e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1643d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief Get a string representation of a region for debug use.
1653d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  std::string getString() const;
1663d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
1679c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
1687f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
1698800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dump() const;
1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
171919e8a1c6698bfa6848571d366430126bced727dJordan Rose  /// \brief Returns true if this region can be printed in a user-friendly way.
172919e8a1c6698bfa6848571d366430126bced727dJordan Rose  virtual bool canPrintPretty() const;
173919e8a1c6698bfa6848571d366430126bced727dJordan Rose
1743d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief Print the region for use in diagnostics.
175919e8a1c6698bfa6848571d366430126bced727dJordan Rose  virtual void printPretty(raw_ostream &os) const;
1763d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
17779d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// \brief Returns true if this region's textual representation can be used
17879d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// as part of a larger expression.
17979d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  virtual bool canPrintPrettyAsExpr() const;
18079d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks
18179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// \brief Print the region as expression.
18279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  ///
18379d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// When this region represents a subexpression, the method is for printing
18479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// an expression containing it.
18579d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  virtual void printPrettyAsExpr(raw_ostream &os) const;
1869e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks
1871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Kind getKind() const { return kind; }
1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
189ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  template<typename RegionTy> const RegionTy* getAs() const;
1901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
191f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu  virtual bool isBoundable() const { return false; }
1929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
194eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// MemSpaceRegion - A memory region that represents a "memory space";
1959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
1969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
197a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected:
19867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
19967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
200a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager *Mgr;
201a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
20267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind)
20367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemRegion(k), Mgr(mgr) {
20467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
20567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
20667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
20767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemRegionManager* getMemRegionManager() const { return Mgr; }
2081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
21067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  bool isBoundable() const { return false; }
21167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
21267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
21367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
21467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
21567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
21667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_MEMSPACES && k <= END_MEMSPACES;
217a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  }
21867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
21967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
22067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion {
22199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
222dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected:
223dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  GlobalsSpaceRegion(MemRegionManager *mgr, Kind k)
224dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : MemSpaceRegion(mgr, k) {}
225dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
226dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
227dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    Kind k = R->getKind();
228dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES;
229dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
230dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
231eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
232914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region of the static variables within the current CodeTextRegion
233eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// scope.
234914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie///
235eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// Currently, only the static locals are placed there, so we know that these
236eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// variables do not get invalidated by calls to other functions.
237dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion {
23867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
239a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
240dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *CR;
241dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
242dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr)
243dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {}
244dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
245dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
246dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
247dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2489c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
249fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
250dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *getCodeRegion() const { return CR; }
251dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
252dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
253dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R->getKind() == StaticGlobalSpaceRegionKind;
254dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
255dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
256eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
257914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region for all the non-static global variables.
258eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks///
259eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// This class is further split into subclasses for efficient implementation of
260eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// invalidating a set of related global values as is done in
261eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// RegionStoreManager::invalidateRegions (instead of finding all the dependent
262eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// globals, we invalidate the whole parent region).
263dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion {
264dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  friend class MemRegionManager;
265dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
266eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksprotected:
267eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  NonStaticGlobalSpaceRegion(MemRegionManager *mgr, Kind k)
268eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : GlobalsSpaceRegion(mgr, k) {}
269dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
271fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
27267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
273eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    Kind k = R->getKind();
274eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return k >= BEG_NON_STATIC_GLOBAL_MEMSPACES &&
275eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks           k <= END_NON_STATIC_GLOBAL_MEMSPACES;
27667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
27767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
278eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
279914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are defined in system/external
280eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// headers and are considered modifiable by system calls (ex: errno).
281eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalSystemSpaceRegion : public NonStaticGlobalSpaceRegion {
282eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
283eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
284eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalSystemSpaceRegion(MemRegionManager *mgr)
285eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalSystemSpaceRegionKind) {}
286eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
287eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
288eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
289eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
290eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
291eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
292eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalSystemSpaceRegionKind;
293eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
294eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
295eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
296914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are considered not to be modified
297eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// or point to data which could be modified as a result of a function call
298eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// (system or internal). Ex: Const global scalars would be modeled as part of
299eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// this region. This region also includes most system globals since they have
300eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// low chance of being modified.
301eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalImmutableSpaceRegion : public NonStaticGlobalSpaceRegion {
302eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
303eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
304eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalImmutableSpaceRegion(MemRegionManager *mgr)
305eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalImmutableSpaceRegionKind) {}
306eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
307eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
308eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
309eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
310eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
311eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
312eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalImmutableSpaceRegionKind;
313eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
314eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
315eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
316914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which can be modified by calls to
317eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// "internally" defined functions - (for now just) functions other then system
318eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// calls.
319eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalInternalSpaceRegion : public NonStaticGlobalSpaceRegion {
320eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
321eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
322eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalInternalSpaceRegion(MemRegionManager *mgr)
323eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalInternalSpaceRegionKind) {}
324eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
325eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
326eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
327eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
328eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
329eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
330eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalInternalSpaceRegionKind;
331eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
332eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
333eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
33467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion {
33599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
33667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
33767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
33867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion(MemRegionManager *mgr)
33967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, HeapSpaceRegionKind) {}
34067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
34136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
34236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
34336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
34467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
34567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == HeapSpaceRegionKind;
34667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
34767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
34867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
3492b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion {
35099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
3512b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  friend class MemRegionManager;
3522b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion(MemRegionManager *mgr)
3532b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {}
3542b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic:
35536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
35636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
35736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
3582b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  static bool classof(const MemRegion *R) {
3592b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    return R->getKind() == UnknownSpaceRegionKind;
3602b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  }
3612b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek};
3622b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
36367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion {
36467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
36567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *SFC;
3669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
36767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected:
36867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc)
36967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, k), SFC(sfc) {
37067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
37167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
37241168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
37367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
37467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *getStackFrame() const { return SFC; }
37567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
37667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
37767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
37867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
37967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= StackLocalsSpaceRegionKind &&
38167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek           k <= StackArgumentsSpaceRegionKind;
38267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
38367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
38467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
38567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion {
38699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
38767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
38867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
38967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {}
39067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
39136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
39236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
39336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
39467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
39567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackLocalsSpaceRegionKind;
39667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
39767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
39867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
39967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion {
40067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
40199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
40267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
40367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
40467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {}
40567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
40636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
40736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
40836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
40967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
41067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackArgumentsSpaceRegionKind;
4119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
4139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4147caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
415993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
416993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
417993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
41899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikieprivate:
41999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
4209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
4211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const MemRegion* superRegion;
422993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
4239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
4249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
4259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
4269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  /// getExtent - Returns the size of the region in bytes.
429c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const {
43032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    return UnknownVal();
43132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  }
43232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
433a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager* getMemRegionManager() const;
4341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4355f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaks  virtual bool isSubRegionOf(const MemRegion* R) const;
4361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
43867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() > END_MEMSPACES;
439993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
440993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
44319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses.
4441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===//
445ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
44682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
44782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
44882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
44982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
45082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
45182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
45282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
4539c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Expr *Ex;
45482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
4559c378f705405d37f49795d5e915989de774fe11fTed Kremenek  AllocaRegion(const Expr *ex, unsigned cnt, const MemRegion *superRegion)
45682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
4591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4609c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Expr *getExpr() const { return Ex; }
4619852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
4629852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
4639852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
464c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
46532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
46682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
46782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
4689c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr *Ex,
4697ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                            unsigned Cnt, const MemRegion *superRegion);
4701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4719c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
4721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
47482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
47582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
4761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
4771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
478993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
479993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
48099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
48199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
482993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
483993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
4841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
485993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
4869697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  virtual QualType getLocationType() const = 0;
4879697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4889697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  QualType getDesugaredLocationType(ASTContext &Context) const {
4899697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return getLocationType().getDesugaredType(Context);
4909697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
4919697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4929697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  bool isBoundable() const { return true; }
4939697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  static bool classof(const MemRegion* R) {
4959697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    unsigned k = R->getKind();
4969697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS;
4979697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
4989697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek};
4999697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
5009697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value.
5019697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion {
50299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
50399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
5049697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected:
5059697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {}
5069697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
5079697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic:
508018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getValueType() const = 0;
5091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
510018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getLocationType() const {
5116eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can possibly optimize this later to cache this value.
512a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    QualType T = getValueType();
513a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    ASTContext &ctx = getContext();
514a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    if (T->getAs<ObjCObjectType>())
515a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek      return ctx.getObjCObjectPointerType(T);
516a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    return ctx.getPointerType(getValueType());
5176eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
5181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51949f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall  QualType getDesugaredValueType(ASTContext &Context) const {
520018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    QualType T = getValueType();
5211ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor    return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T;
52214553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
5231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
524e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
525e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
526993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
5279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
5289697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return k >= BEG_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS;
5299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
5309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
5319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
532ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
533eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion {
53499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
53599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
536eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected:
537eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {}
538ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
539eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  bool isBoundable() const { return false; }
540eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
541eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
542eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    Kind k = R->getKind();
543eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return k >= FunctionTextRegionKind && k <= BlockTextRegionKind;
544eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
545eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
546ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
547eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function.
548eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion {
5495fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  const NamedDecl *FD;
550eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic:
5515fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  FunctionTextRegion(const NamedDecl *fd, const MemRegion* sreg)
5525fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {
5535fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    assert(isa<ObjCMethodDecl>(fd) || isa<FunctionDecl>(fd));
5545fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  }
555eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
556018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getLocationType() const {
5575fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    const ASTContext &Ctx = getContext();
5585fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    if (const FunctionDecl *D = dyn_cast<FunctionDecl>(FD)) {
5595fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks      return Ctx.getPointerType(D->getType());
5605fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    }
5615fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks
5625fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    assert(isa<ObjCMethodDecl>(FD));
5635fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    assert(false && "Getting the type of ObjCMethod is not supported yet");
5645fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks
5655fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    // TODO: We might want to return a different type here (ex: id (*ty)(...))
5665fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    //       depending on how it is used.
5675fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    return QualType();
568ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
5695fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks
5705fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  const NamedDecl *getDecl() const {
571abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek    return FD;
57272e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  }
573eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
5749c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
575eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
576ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
577eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
5785fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const NamedDecl *FD,
579abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek                            const MemRegion*);
580eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
581ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static bool classof(const MemRegion* R) {
582eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == FunctionTextRegionKind;
583eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
584eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
585eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
586eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
587eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures).
5880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
5890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
5900a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
5910a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
5920a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
593eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion {
59467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
59567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
596eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *BD;
5971d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *AC;
598eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CanQualType locTy;
59967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
60067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockTextRegion(const BlockDecl *bd, CanQualType lTy,
6011d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                  AnalysisDeclContext *ac, const MemRegion* sreg)
60267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {}
60367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
60467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
605018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getLocationType() const {
606eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return locTy;
607eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
608eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
609eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *getDecl() const {
610eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return BD;
611eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
61267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
6131d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *getAnalysisDeclContext() const { return AC; }
614eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
6159c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
616eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
617eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
618eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
619eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD,
6201d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                            CanQualType, const AnalysisDeclContext*,
62167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const MemRegion*);
622eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
623eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
624eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == BlockTextRegionKind;
625ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
626ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu};
6270a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6280a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance.
6290a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
6300a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
6310a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
6320a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
6330a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
6348ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Roseclass BlockDataRegion : public TypedRegion {
63567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
6360a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *BC;
63767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const LocationContext *LC; // Can be null */
6384240096011a187807058f887eb81df750ffa17feTed Kremenek  void *ReferencedVars;
63985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  void *OriginalVars;
64067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
64167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc,
6420a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                  const MemRegion *sreg)
6438ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose  : TypedRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc),
64485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    ReferencedVars(0), OriginalVars(0) {}
6450a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
64685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenekpublic:
6470a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *getCodeRegion() const { return BC; }
6484240096011a187807058f887eb81df750ffa17feTed Kremenek
649d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek  const BlockDecl *getDecl() const { return BC->getDecl(); }
6508ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose
6518ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose  QualType getLocationType() const { return BC->getLocationType(); }
652d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek
65381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  class referenced_vars_iterator {
65481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const MemRegion * const *R;
65585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion * const *OriginalR;
65681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  public:
65785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    explicit referenced_vars_iterator(const MemRegion * const *r,
65885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                      const MemRegion * const *originalR)
65985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      : R(r), OriginalR(originalR) {}
66085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
661e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek    const VarRegion *getCapturedRegion() const {
66281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return cast<VarRegion>(*R);
66381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
664e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek    const VarRegion *getOriginalRegion() const {
665e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek      return cast<VarRegion>(*OriginalR);
666e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek    }
667e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek
66881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator==(const referenced_vars_iterator &I) const {
66941f3f3a4792f46787632fdb94f952f6b3ce3f4aeJordan Rose      assert((R == 0) == (I.R == 0));
67081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R == R;
67181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
67281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator!=(const referenced_vars_iterator &I) const {
67341f3f3a4792f46787632fdb94f952f6b3ce3f4aeJordan Rose      assert((R == 0) == (I.R == 0));
67481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R != R;
67581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
6769c378f705405d37f49795d5e915989de774fe11fTed Kremenek    referenced_vars_iterator &operator++() {
67781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      ++R;
67885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      ++OriginalR;
67981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return *this;
68081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
68181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  };
6825846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek
6835846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  /// Return the original region for a captured region, if
6845846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  /// one exists.
6855846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  const VarRegion *getOriginalRegion(const VarRegion *VR) const;
68681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
6874240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_begin() const;
6884240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_end() const;
6890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6909c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
6910a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6920a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6930a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
69467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *,
69567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const LocationContext *, const MemRegion *);
6960a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6970a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  static bool classof(const MemRegion* R) {
6980a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek    return R->getKind() == BlockDataRegionKind;
6990a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  }
7004240096011a187807058f887eb81df750ffa17feTed Kremenekprivate:
7014240096011a187807058f887eb81df750ffa17feTed Kremenek  void LazyInitializeReferencedVars();
70224570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  std::pair<const VarRegion *, const VarRegion *>
70324570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  getCaptureRegions(const VarDecl *VD);
7040a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek};
705ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
706026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
707026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  clases, SymbolicRegion represents a region that serves as an alias for
708026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  either a real region, a NULL pointer, etc.  It essentially is used to
709026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  map the concept of symbolic values into the domain of regions.  Symbolic
710026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  regions do not need to be typed.
711e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion {
712026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected:
713026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  const SymbolRef sym;
714026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
715026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic:
7161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SymbolicRegion(const SymbolRef s, const MemRegion* sreg)
717e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek    : SubRegion(sreg, SymbolicRegionKind), sym(s) {}
7181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
719026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  SymbolRef getSymbol() const {
720026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return sym;
721026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
722026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
7239852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
7249852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
725c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
72632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
727026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
728026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
729250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
730250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            SymbolRef sym,
731250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            const MemRegion* superRegion);
7321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7339c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
735026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  static bool classof(const MemRegion* R) {
736026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() == SymbolicRegionKind;
737026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
7381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
739026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
740e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
7419697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion {
742e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
743e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
744e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
745e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
746250101353b711a409b075f1bc11070dddec7100bTed Kremenek  StringRegion(const StringLiteral* str, const MemRegion* sreg)
7479697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sreg, StringRegionKind), Str(str) {}
748e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
749e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
750e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
751e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
752e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
753e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
7546613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
7556613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
7561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
757018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
758ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return Str->getType();
759ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  }
760e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
761c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
76232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
7630a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu  bool isBoundable() const { return false; }
7640a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
765e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
766e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
767e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
768e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
7699c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
770cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
771e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
772e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
773e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
774e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
7754c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7764c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek/// The region associated with an ObjCStringLiteral.
7774c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekclass ObjCStringRegion : public TypedValueRegion {
7784c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  friend class MemRegionManager;
7794c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringLiteral* Str;
7804c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekprotected:
7814c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7824c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ObjCStringRegion(const ObjCStringLiteral* str, const MemRegion* sreg)
7834c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  : TypedValueRegion(sreg, ObjCStringRegionKind), Str(str) {}
7844c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7854c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
7864c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                            const ObjCStringLiteral* Str,
7874c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                            const MemRegion* superRegion);
7884c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7894c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekpublic:
7904c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7914c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringLiteral* getObjCStringLiteral() const { return Str; }
7924c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7934c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  QualType getValueType() const {
7944c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    return Str->getType();
7954c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7964c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7974c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  bool isBoundable() const { return false; }
7984c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7994c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const {
8004c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    ProfileRegion(ID, Str, superRegion);
8014c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
8024c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
8034c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  void dumpToStream(raw_ostream &os) const;
8044c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
8054c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  static bool classof(const MemRegion* R) {
8064c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    return R->getKind() == ObjCStringRegionKind;
8074c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
8084c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek};
809e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
810329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
811329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
812329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
8139697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion {
814329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
815329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
8169c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const CompoundLiteralExpr *CL;
817329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
8189c378f705405d37f49795d5e915989de774fe11fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr *cl, const MemRegion* sReg)
8199697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
8201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
821329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
8229c378f705405d37f49795d5e915989de774fe11fTed Kremenek                            const CompoundLiteralExpr *CL,
823329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
824329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
825018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
826018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return CL->getType();
82777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
8280a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
8299a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu  bool isBoundable() const { return !CL->isFileScope(); }
8309a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu
831329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
8321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8339c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
834329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
8359c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const CompoundLiteralExpr *getLiteralExpr() const { return CL; }
8361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
837329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
838329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
839329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
840329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
841178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
8429697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion {
8439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
8449c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Decl *D;
8459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8469c378f705405d37f49795d5e915989de774fe11fTed Kremenek  DeclRegion(const Decl *d, const MemRegion* sReg, Kind k)
8479697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, k), D(d) {}
8489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8499c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D,
8509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
8511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
852bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
8539c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Decl *getDecl() const { return D; }
8549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
8551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
856e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
857e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
85867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS;
859e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
8609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
8611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
8639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
864d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
865d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  // Constructors and private methods.
8669c378f705405d37f49795d5e915989de774fe11fTed Kremenek  VarRegion(const VarDecl *vd, const MemRegion* sReg)
86767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
8689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8699c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl *VD,
870d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                            const MemRegion *superRegion) {
8719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
8729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
8731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
874d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
8751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
877d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  const VarDecl *getDecl() const { return cast<VarDecl>(D); }
8781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8795348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  const StackFrameContext *getStackFrame() const;
8805348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
881018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
8826eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
883018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
8841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8869c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
8871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
8899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
8901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8913d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
892716859df842e5a56e816d820d8326ead152dd9e4Anna Zaks  bool canPrintPrettyAsExpr() const;
8939e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks
89479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  void printPrettyAsExpr(raw_ostream &os) const;
8959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
896de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
897de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter
898de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  in a call to a C++ method.  This region doesn't represent the object
899de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  referred to by 'this', but rather 'this' itself.
9009697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion {
901de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  friend class MemRegionManager;
902de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  CXXThisRegion(const PointerType *thisPointerTy,
903de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                const MemRegion *sReg)
9049697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {}
905de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
906de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
907de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const PointerType *PT,
908de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const MemRegion *sReg);
909de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
910de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
911de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
912de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic:
913018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
914de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return QualType(ThisPointerTy, 0);
915de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
9167caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9179c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
918de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
919de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static bool classof(const MemRegion* R) {
920de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return R->getKind() == CXXThisRegionKind;
921de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
922de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
923de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate:
924de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const PointerType *ThisPointerTy;
925de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek};
9269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
9289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
9299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9309c378f705405d37f49795d5e915989de774fe11fTed Kremenek  FieldRegion(const FieldDecl *fd, const MemRegion* sReg)
9319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
9329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9334bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
9349c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const FieldDecl *getDecl() const { return cast<FieldDecl>(D); }
9351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
936018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
9376eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
938018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
9391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
9404bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
941c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
94232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
9439c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl *FD,
9446304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
9459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
9469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
9499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
9509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9513d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
9523d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  void dumpToStream(raw_ostream &os) const;
953919e8a1c6698bfa6848571d366430126bced727dJordan Rose
954919e8a1c6698bfa6848571d366430126bced727dJordan Rose  bool canPrintPretty() const;
955919e8a1c6698bfa6848571d366430126bced727dJordan Rose  void printPretty(raw_ostream &os) const;
95679d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  bool canPrintPrettyAsExpr() const;
95779d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  void printPrettyAsExpr(raw_ostream &os) const;
9589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
9591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
9611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
9631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
964c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg);
9659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9669c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl *ivd,
967c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer                            const MemRegion* superRegion);
9681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
970c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  const ObjCIvarDecl *getDecl() const;
971c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  QualType getValueType() const;
9721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
973716859df842e5a56e816d820d8326ead152dd9e4Anna Zaks  bool canPrintPrettyAsExpr() const;
97479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  void printPrettyAsExpr(raw_ostream &os) const;
97543b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek
9769c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
9771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
9799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
9809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
9827caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
983fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions.
9847caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
9857caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9867caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion;
9877caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9887caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset {
9897caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate:
9907caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  friend class ElementRegion;
9917caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9927caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *Region;
9939ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits Offset;
9947caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9959ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero())
9967caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu    : Region(reg), Offset(offset) {}
9977caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9987caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic:
9997caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  // FIXME: Eventually support symbolic offsets.
10009ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits getOffset() const { return Offset; }
10017caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *getRegion() const { return Region; }
10027caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
10039c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
10047caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  void dump() const;
10057caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu};
1006511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
10071437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks/// \brief ElementRegin is used to represent both array elements and casts.
10089697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion {
1009511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
1010511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
1011f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType ElementType;
101202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc Index;
1013511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
101402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg)
10159697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, ElementRegionKind),
1016f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek      ElementType(elementType), Index(Idx) {
10175251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie    assert((!Idx.getAs<nonloc::ConcreteInt>() ||
10185251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie            Idx.castAs<nonloc::ConcreteInt>().getValue().isSigned()) &&
101943b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
10200395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
10211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1022f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType,
1023f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek                            SVal Idx, const MemRegion* superRegion);
1024511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
1025511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
1026511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
102702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc getIndex() const { return Index; }
10286e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
1029018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
1030f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
1031f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  }
10321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1033f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType getElementType() const {
1034f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
1035abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
10367caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  /// Compute the offset within the array. The array might also be a subobject.
10377caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  RegionRawOffset getAsArrayOffset() const;
10381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10399c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
1040b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
1041511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
1042511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
1043511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
1044511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
1045511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
1046511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
104719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
1048bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression.
10499697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion {
1050bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  friend class MemRegionManager;
1051bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1052bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  Expr const *Ex;
1053bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
105402fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  CXXTempObjectRegion(Expr const *E, MemRegion const *sReg)
10559697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {}
1056bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1057bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
1058bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu                            Expr const *E, const MemRegion *sReg);
1059bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1060bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic:
1061782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin  const Expr *getExpr() const { return Ex; }
1062782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin
1063018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
1064bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu    return Ex->getType();
1065bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
1066bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
10679c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
1068e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu
1069bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
1070bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1071bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static bool classof(const MemRegion* R) {
107202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    return R->getKind() == CXXTempObjectRegionKind;
1073bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
1074bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu};
1075bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
10764fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is
10774fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object.
10789697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion {
10794fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  friend class MemRegionManager;
10804fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10814411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  llvm::PointerIntPair<const CXXRecordDecl *, 1, bool> Data;
10824fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10834411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  CXXBaseObjectRegion(const CXXRecordDecl *RD, bool IsVirtual,
10844411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                      const MemRegion *SReg)
10854411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    : TypedValueRegion(SReg, CXXBaseObjectRegionKind), Data(RD, IsVirtual) {}
10864fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10874411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  static void ProfileRegion(llvm::FoldingSetNodeID &ID, const CXXRecordDecl *RD,
10884411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                            bool IsVirtual, const MemRegion *SReg);
10894fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10904fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic:
10914411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  const CXXRecordDecl *getDecl() const { return Data.getPointer(); }
10924411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  bool isVirtual() const { return Data.getInt(); }
1093d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
10944fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  QualType getValueType() const;
10954fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10969c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
10974fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10984fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
10994fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
11004fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  static bool classof(const MemRegion *region) {
11014fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    return region->getKind() == CXXBaseObjectRegionKind;
11024fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  }
110307d8470effc0b0364801adddb6ff92bd22334402Anna Zaks
110407d8470effc0b0364801adddb6ff92bd22334402Anna Zaks  bool canPrintPrettyAsExpr() const;
110507d8470effc0b0364801adddb6ff92bd22334402Anna Zaks
110607d8470effc0b0364801adddb6ff92bd22334402Anna Zaks  void printPrettyAsExpr(raw_ostream &os) const;
11074fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu};
11084fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1109ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy>
1110ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const {
1111f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  if (const RegionTy* RT = dyn_cast<RegionTy>(this))
1112f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek    return RT;
11131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1114f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  return NULL;
1115ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}
1116511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
11179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
11189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
11199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
11209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
11219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
1122a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &C;
11239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
11249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
11251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1126eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalInternalSpaceRegion *InternalGlobals;
1127eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalSystemSpaceRegion *SystemGlobals;
1128eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalImmutableSpaceRegion *ImmutableGlobals;
1129eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
11302b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
1131c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *>
1132c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackLocalsSpaceRegions;
1133c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *>
1134c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackArgumentsSpaceRegions;
1135dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *>
1136dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticsGlobalSpaceRegions;
11372b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
113867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion *heap;
11392b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion *unknown;
1140d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *code;
1141dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
11429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1143a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a)
1144eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : C(c), A(a), InternalGlobals(0), SystemGlobals(0), ImmutableGlobals(0),
1145eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      heap(0), unknown(0), code(0) {}
11461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11474240096011a187807058f887eb81df750ffa17feTed Kremenek  ~MemRegionManager();
11481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1149a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &getContext() { return C; }
11504240096011a187807058f887eb81df750ffa17feTed Kremenek
11514240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &getAllocator() { return A; }
11521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
115367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getStackLocalsRegion - Retrieve the memory region associated with the
115467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  specified stack frame.
115567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackLocalsSpaceRegion *
115667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackLocalsRegion(const StackFrameContext *STC);
1157d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
1158d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  /// getStackArgumentsRegion - Retrieve the memory region associated with
115967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  function/method arguments of the specified stack frame.
116067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackArgumentsSpaceRegion *
116167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackArgumentsRegion(const StackFrameContext *STC);
11621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
1164dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ///  global variables.
1165eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  const GlobalsSpaceRegion *getGlobalsRegion(
1166eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      MemRegion::Kind K = MemRegion::GlobalInternalSpaceRegionKind,
1167eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      const CodeTextRegion *R = 0);
11681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
11709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
117167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const HeapSpaceRegion *getHeapRegion();
1172178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
1173178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
1174178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
1175b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getUnknownRegion();
1176c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
1177b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getCodeRegion();
1178ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
11797090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
11809c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const AllocaRegion *getAllocaRegion(const Expr *Ex, unsigned Cnt,
118167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                      const LocationContext *LC);
11821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1183329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
1184329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
1185b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const CompoundLiteralRegion*
11869c378f705405d37f49795d5e915989de774fe11fTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr *CL,
118767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                           const LocationContext *LC);
1188de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
1189fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  /// getCXXThisRegion - Retrieve the [artificial] region associated with the
1190de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ///  parameter 'this'.
1191de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy,
1192de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                        const LocationContext *LC);
11931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1194e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  /// \brief Retrieve or create a "symbolic" memory region.
1195e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  const SymbolicRegion* getSymbolicRegion(SymbolRef Sym);
1196e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks
1197e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  /// \brief Return a unique symbolic region belonging to heap memory space.
1198e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  const SymbolicRegion *getSymbolicHeapRegion(SymbolRef sym);
1199e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
12004c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const StringRegion *getStringRegion(const StringLiteral* Str);
12014c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
12024c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringRegion *getObjCStringRegion(const ObjCStringLiteral *Str);
1203e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
12049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
1205d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  ///  a specified VarDecl and LocationContext.
1206b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC);
12071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
120867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
120967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  a specified VarDecl and super region.
121067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR);
121167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1212f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  /// getElementRegion - Retrieve the memory region associated with the
1213f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ///  associated element type, index, and super region.
121402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx,
1215856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        const MemRegion *superRegion,
1216856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        ASTContext &Ctx);
12171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1218b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER,
1219856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                                 const MemRegion *superRegion) {
1220a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getElementRegion(ER->getElementType(), ER->getIndex(),
1221a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek                            superRegion, ER->getContext());
1222a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
1223511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
12249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
12259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
12269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
12279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
12289c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const FieldRegion *getFieldRegion(const FieldDecl *fd,
1229b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                    const MemRegion* superRegion);
12301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1231b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR,
1232b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                             const MemRegion *superRegion) {
1233a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getFieldRegion(FR->getDecl(), superRegion);
1234a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
12351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
12379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
12389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
12399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
12409c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl *ivd,
1241b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                          const MemRegion* superRegion);
12421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
124302fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex,
124402fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                                    LocationContext const *LC);
1245bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
12464411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  /// Create a CXXBaseObjectRegion with the given base class for region
12474411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  /// \p Super.
12484411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  ///
12494411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  /// The type of \p Super is assumed be a class deriving from \p BaseClass.
12504411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  const CXXBaseObjectRegion *
12514411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  getCXXBaseObjectRegion(const CXXRecordDecl *BaseClass, const MemRegion *Super,
12524411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                         bool IsVirtual);
12534fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1254d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different
1255d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// super region.
1256d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  const CXXBaseObjectRegion *
1257d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg,
1258d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu                                  const MemRegion *superRegion) {
12594411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion,
12604411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                  baseReg->isVirtual());
1261d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  }
1262d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
12635fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  const FunctionTextRegion *getFunctionTextRegion(const NamedDecl *FD);
1264b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD,
126567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            CanQualType locTy,
12661d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                            AnalysisDeclContext *AC);
126767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
126867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getBlockDataRegion - Get the memory region associated with an instance
126967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  of a block.  Unlike many other MemRegions, the LocationContext*
127067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  argument is allowed to be NULL for cases where we have no known
127167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  context.
1272b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc,
127367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            const LocationContext *lc = NULL);
12741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
127576b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath  /// Create a CXXTempObjectRegion for temporaries which are lifetime-extended
127676b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath  /// by static references. This differs from getCXXTempObjectRegion in the
127776b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath  /// super-region used.
127876b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath  const CXXTempObjectRegion *getCXXStaticTempObjectRegion(const Expr *Ex);
127976b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath
1280bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate:
1281250101353b711a409b075f1bc11070dddec7100bTed Kremenek  template <typename RegionTy, typename A1>
1282250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* getRegion(const A1 a1);
12831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12846304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  template <typename RegionTy, typename A1>
1285eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion);
12861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12877ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  template <typename RegionTy, typename A1, typename A2>
12887ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* getRegion(const A1 a1, const A2 a2);
1289dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
12900a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  template <typename RegionTy, typename A1, typename A2>
12910a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2,
12920a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                         const MemRegion* superRegion);
12930a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
129467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename RegionTy, typename A1, typename A2, typename A3>
129567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3,
129667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                         const MemRegion* superRegion);
129767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
129867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG>
129967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region);
130067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
130167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG, typename ARG>
130267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region, ARG a);
1303ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek};
13041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1305250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1306a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions.
1307250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1308250101353b711a409b075f1bc11070dddec7100bTed Kremenek
13099c378f705405d37f49795d5e915989de774fe11fTed Kremenekinline ASTContext &MemRegion::getContext() const {
1310a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  return getMemRegionManager()->getContext();
1311a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
1312eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
13135a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace
13145a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
1315be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace
13169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1317250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1318250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions.
1319250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1320250101353b711a409b075f1bc11070dddec7100bTed Kremenek
1321be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm {
13229c378f705405d37f49795d5e915989de774fe11fTed Kremenekstatic inline raw_ostream &operator<<(raw_ostream &os,
13239ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek                                      const clang::ento::MemRegion* R) {
13248800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  R->dumpToStream(os);
13258800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  return os;
1326be91224894e1501133e224934285ba6440bf5b59Ted Kremenek}
1327be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace
13289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
13299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
1330