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
16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_MEMREGION_H
17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_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"
224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/AST/DeclCXX.h"
234c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek#include "clang/AST/ExprObjC.h"
244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Analysis/AnalysisContext.h"
25d47d3b0cfeb7e8564ff77f48130fe63282b6d127Chris Lattner#include "clang/Basic/LLVM.h"
269b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h"
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/Allocator.h"
2930a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/Support/ErrorHandling.h"
309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string>
319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang {
331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext;
3567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext;
365a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
379ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento {
385a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
398ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaksclass CodeTextRegion;
405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemRegionManager;
415a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemSpaceRegion;
42c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenekclass SValBuilder;
438ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaksclass SymbolicRegion;
444240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion;
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu/// Represent a region's offset within the top level base region.
47e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xuclass RegionOffset {
48e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The base region.
49e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *R;
50e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// The bit offset within the base region. Can be negative.
52e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t Offset;
53e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xupublic:
555375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman  // We're using a const instead of an enumeration due to the size required;
565375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman  // Visual Studio will only create enumerations of size int, not long long.
575375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballman  static const int64_t Symbolic = INT64_MAX;
58824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  RegionOffset() : R(nullptr) {}
60e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {}
61e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
62e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *getRegion() const { return R; }
63824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
64824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  bool hasSymbolicOffset() const { return Offset == Symbolic; }
65824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
66824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  int64_t getOffset() const {
67824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose    assert(!hasSymbolicOffset());
68824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose    return Offset;
69824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  }
70e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
71e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  bool isValid() const { return R; }
72e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu};
73e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
7419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
7519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes.
7619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions.
799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode {
809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
8167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  enum Kind {
824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define REGION(Id, Parent) Id ## Kind,
834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define REGION_RANGE(Id, First, Last) BEGIN_##Id = First, END_##Id = Last,
844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/StaticAnalyzer/Core/PathSensitive/Regions.def"
8567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  };
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
95a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek  ASTContext &getContext() const;
961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
98a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
99a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  virtual MemRegionManager* getMemRegionManager() const = 0;
100a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
101bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemSpaceRegion *getMemorySpace() const;
1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
103adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *getBaseRegion() const;
104adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
105522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks  /// Check if the region is a subregion of the given region.
1065f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaks  virtual bool isSubRegionOf(const MemRegion *R) const;
107522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks
108b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  const MemRegion *StripCasts(bool StripBaseCasts = true) const;
1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1108ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks  /// \brief If this is a symbolic region, returns the region. Otherwise,
1118ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks  /// goes up the base chain looking for the first symbolic base region.
1128ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks  const SymbolicRegion *getSymbolicBase() const;
1138ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks
1141508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsOrParametersStorage() const;
1151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
116de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackStorage() const;
117de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
118de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackNonParametersStorage() const;
119de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
120de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackParametersStorage() const;
121b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
122e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// Compute the offset within the top level memory object.
123e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  RegionOffset getAsOffset() const;
124e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1253d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief Get a string representation of a region for debug use.
1263d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  std::string getString() const;
1273d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
1289c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
1297f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
1308800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dump() const;
1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
132919e8a1c6698bfa6848571d366430126bced727dJordan Rose  /// \brief Returns true if this region can be printed in a user-friendly way.
133919e8a1c6698bfa6848571d366430126bced727dJordan Rose  virtual bool canPrintPretty() const;
134919e8a1c6698bfa6848571d366430126bced727dJordan Rose
1353d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief Print the region for use in diagnostics.
136919e8a1c6698bfa6848571d366430126bced727dJordan Rose  virtual void printPretty(raw_ostream &os) const;
1373d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
13879d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// \brief Returns true if this region's textual representation can be used
13979d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// as part of a larger expression.
14079d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  virtual bool canPrintPrettyAsExpr() const;
14179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks
14279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// \brief Print the region as expression.
14379d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  ///
14479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// When this region represents a subexpression, the method is for printing
14579d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  /// an expression containing it.
14679d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  virtual void printPrettyAsExpr(raw_ostream &os) const;
1479e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks
1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Kind getKind() const { return kind; }
1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
150ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  template<typename RegionTy> const RegionTy* getAs() const;
1511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
152f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu  virtual bool isBoundable() const { return false; }
1534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Get descriptive name for memory region. The name is obtained from
1564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// the variable/field declaration retrieved from the memory region.
1574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Regions that point to an element of an array are returned as: "arr[0]".
1584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Regions that point to a struct are returned as: "st.var".
1594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  //
1604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param UseQuotes Set if the name should be quoted.
1614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
1624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \returns variable name for memory region
1634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string getDescriptiveName(bool UseQuotes = true) const;
1644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Retrieve source range from memory region. The range retrieval
1674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// is based on the decl obtained from the memory region.
1684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// For a VarRegion the range of the base region is returned.
1694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// For a FieldRegion the range of the field is returned.
1704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// If no declaration is found, an empty source range is returned.
1714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// The client is responsible for checking if the returned range is valid.
1724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
1734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \returns source range for declaration retrieved from memory region
1744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  clang::SourceRange sourceRange() const;
1759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
177eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// MemSpaceRegion - A memory region that represents a "memory space";
1789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
1799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
180a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected:
181a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager *Mgr;
182a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
1834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  MemSpaceRegion(MemRegionManager *mgr, Kind k) : MemRegion(k), Mgr(mgr) {
18467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
18567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
18667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  MemRegionManager* getMemRegionManager() const override { return Mgr; }
1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
18967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool isBoundable() const override { return false; }
191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID &ID) const override;
19367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
19467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
19567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
1964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return k >= BEGIN_MEMSPACES && k <= END_MEMSPACES;
197a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  }
19867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
1994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// CodeSpaceRegion - The memory space that holds the executable code of
2014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// functions and blocks.
2024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CodeSpaceRegion : public MemSpaceRegion {
2034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend class MemRegionManager;
2044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CodeSpaceRegion(MemRegionManager *mgr)
2064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : MemSpaceRegion(mgr, CodeSpaceRegionKind) {}
2074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
2094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void dumpToStream(raw_ostream &os) const override;
2104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static bool classof(const MemRegion *R) {
2124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return R->getKind() == CodeSpaceRegionKind;
2134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
2144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
2154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
21667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion {
21799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
218dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected:
219dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  GlobalsSpaceRegion(MemRegionManager *mgr, Kind k)
220dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : MemSpaceRegion(mgr, k) {}
221dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
222dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
223dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    Kind k = R->getKind();
2244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return k >= BEGIN_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES;
225dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
226dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
227eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
228914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region of the static variables within the current CodeTextRegion
229eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// scope.
230914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie///
231eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// Currently, only the static locals are placed there, so we know that these
232eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// variables do not get invalidated by calls to other functions.
233dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion {
23467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
235a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
236dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *CR;
237dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
238dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr)
239dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {}
240dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
241dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID &ID) const override;
243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
245fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
246dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *getCodeRegion() const { return CR; }
247dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
248dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
249dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R->getKind() == StaticGlobalSpaceRegionKind;
250dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
251dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
252eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
253914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region for all the non-static global variables.
254eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks///
255eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// This class is further split into subclasses for efficient implementation of
256eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// invalidating a set of related global values as is done in
257eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// RegionStoreManager::invalidateRegions (instead of finding all the dependent
258eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// globals, we invalidate the whole parent region).
259dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion {
260eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksprotected:
261eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  NonStaticGlobalSpaceRegion(MemRegionManager *mgr, Kind k)
262eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : GlobalsSpaceRegion(mgr, k) {}
2634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
265fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
26667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
267eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    Kind k = R->getKind();
2684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return k >= BEGIN_NON_STATIC_GLOBAL_MEMSPACES &&
269eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks           k <= END_NON_STATIC_GLOBAL_MEMSPACES;
27067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
27167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
272eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
273914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are defined in system/external
274eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// headers and are considered modifiable by system calls (ex: errno).
275eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalSystemSpaceRegion : public NonStaticGlobalSpaceRegion {
276eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
277eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
278eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalSystemSpaceRegion(MemRegionManager *mgr)
279eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalSystemSpaceRegionKind) {}
280eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
281eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
282eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
284eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
285eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
286eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalSystemSpaceRegionKind;
287eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
288eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
289eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
290914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are considered not to be modified
291eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// or point to data which could be modified as a result of a function call
292eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// (system or internal). Ex: Const global scalars would be modeled as part of
293eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// this region. This region also includes most system globals since they have
294eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// low chance of being modified.
295eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalImmutableSpaceRegion : public NonStaticGlobalSpaceRegion {
296eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
297eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
298eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalImmutableSpaceRegion(MemRegionManager *mgr)
299eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalImmutableSpaceRegionKind) {}
300eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
301eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
302eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
303651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
304eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
305eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
306eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalImmutableSpaceRegionKind;
307eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
308eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
309eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
310914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which can be modified by calls to
311eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// "internally" defined functions - (for now just) functions other then system
312eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// calls.
313eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalInternalSpaceRegion : public NonStaticGlobalSpaceRegion {
314eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
315eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
316eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalInternalSpaceRegion(MemRegionManager *mgr)
317eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalInternalSpaceRegionKind) {}
318eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
319eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
320eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
322eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
323eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
324eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalInternalSpaceRegionKind;
325eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
326eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
327eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
32867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion {
32999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
33067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
33167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
33267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion(MemRegionManager *mgr)
33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, HeapSpaceRegionKind) {}
33467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
33536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
33736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
33867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
33967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == HeapSpaceRegionKind;
34067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
34167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
34267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
3432b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion {
34499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
3452b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  friend class MemRegionManager;
3462b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion(MemRegionManager *mgr)
3472b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {}
3482b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic:
34936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
35136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
3522b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  static bool classof(const MemRegion *R) {
3532b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    return R->getKind() == UnknownSpaceRegionKind;
3542b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  }
3552b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek};
3564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion {
35867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
35967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *SFC;
3609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
36167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected:
36267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc)
36367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, k), SFC(sfc) {
36467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
36567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
36641168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
3674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
36867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *getStackFrame() const { return SFC; }
3694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID &ID) const override;
37167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
37367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return k >= BEGIN_STACK_MEMSPACES && k <= END_STACK_MEMSPACES;
3754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
37667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
3774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
37867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion {
37999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
38167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
38267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {}
38367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
38436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
38636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
38767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
38867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackLocalsSpaceRegionKind;
38967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
39067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
39167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
39267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion {
39367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
39499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
39567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
39667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
39767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {}
39867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
39936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
40136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
40267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
40367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackArgumentsSpaceRegionKind;
4049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
4069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4077caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
408993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
409993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
410993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
41199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikieprivate:
41299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
4139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
4141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const MemRegion* superRegion;
415993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
4169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
4179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
4189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
4199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  /// getExtent - Returns the size of the region in bytes.
422c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const {
42332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    return UnknownVal();
42432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  }
42532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  MemRegionManager* getMemRegionManager() const override;
4271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
428651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool isSubRegionOf(const MemRegion* R) const override;
4291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
43167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() > END_MEMSPACES;
432993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
433993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
4341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
43619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses.
4371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===//
438ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
43982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
44082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
44182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
44282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
44382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
44482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
44582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
4469c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Expr *Ex;
44782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
4489c378f705405d37f49795d5e915989de774fe11fTed Kremenek  AllocaRegion(const Expr *ex, unsigned cnt, const MemRegion *superRegion)
44982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
4501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4539c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Expr *getExpr() const { return Ex; }
4549852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool isBoundable() const override { return true; }
4569852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const override;
45832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID& ID) const override;
46082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
4619c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr *Ex,
4627ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                            unsigned Cnt, const MemRegion *superRegion);
4631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
464651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
4651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
46782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
46882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
4701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
471993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
472993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
47399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
474651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
475993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
476993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
4771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
478993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
4799697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  virtual QualType getLocationType() const = 0;
4809697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4819697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  QualType getDesugaredLocationType(ASTContext &Context) const {
4829697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return getLocationType().getDesugaredType(Context);
4839697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
4849697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
485651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool isBoundable() const override { return true; }
4869697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4879697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  static bool classof(const MemRegion* R) {
4889697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    unsigned k = R->getKind();
4894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return k >= BEGIN_TYPED_REGIONS && k <= END_TYPED_REGIONS;
4909697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
4919697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek};
4929697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4939697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value.
4949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion {
49599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
4979697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected:
4989697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {}
4999697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
5009697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic:
501018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getValueType() const = 0;
5021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType getLocationType() const override {
5046eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can possibly optimize this later to cache this value.
505a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    QualType T = getValueType();
506a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    ASTContext &ctx = getContext();
507a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    if (T->getAs<ObjCObjectType>())
508a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek      return ctx.getObjCObjectPointerType(T);
509a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    return ctx.getPointerType(getValueType());
5106eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
5111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51249f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall  QualType getDesugaredValueType(ASTContext &Context) const {
513018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    QualType T = getValueType();
5141ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor    return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T;
51514553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
5161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
517651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const override;
518e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
519993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
5209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
5214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return k >= BEGIN_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS;
5229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
5239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
5249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
525ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
526eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion {
52799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
528651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
529eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected:
530eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {}
531ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
532651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool isBoundable() const override { return false; }
533651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
534eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
535eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    Kind k = R->getKind();
5364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return k >= BEGIN_CODE_TEXT_REGIONS && k <= END_CODE_TEXT_REGIONS;
537eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
538eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
539ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
5404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// FunctionCodeRegion - A region that represents code texts of function.
5414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass FunctionCodeRegion : public CodeTextRegion {
5425fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  const NamedDecl *FD;
543eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic:
5444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  FunctionCodeRegion(const NamedDecl *fd, const MemRegion* sreg)
5454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : CodeTextRegion(sreg, FunctionCodeRegionKind), FD(fd) {
5465fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    assert(isa<ObjCMethodDecl>(fd) || isa<FunctionDecl>(fd));
5475fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  }
548651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
549651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType getLocationType() const override {
5505fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    const ASTContext &Ctx = getContext();
5515fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    if (const FunctionDecl *D = dyn_cast<FunctionDecl>(FD)) {
5525fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks      return Ctx.getPointerType(D->getType());
5535fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    }
5545fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks
5555fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    assert(isa<ObjCMethodDecl>(FD));
5565fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    assert(false && "Getting the type of ObjCMethod is not supported yet");
5575fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks
5585fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    // TODO: We might want to return a different type here (ex: id (*ty)(...))
5595fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    //       depending on how it is used.
5605fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks    return QualType();
561ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
5625fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks
5635fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  const NamedDecl *getDecl() const {
564abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek    return FD;
56572e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  }
566651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
567651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID& ID) const override;
570651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
5715fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const NamedDecl *FD,
572abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek                            const MemRegion*);
573eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
574ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static bool classof(const MemRegion* R) {
5754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return R->getKind() == FunctionCodeRegionKind;
576eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
577eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
578eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
579eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
5804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// BlockCodeRegion - A region that represents code texts of blocks (closures).
5814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///  Blocks are represented with two kinds of regions.  BlockCodeRegions
5820a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
5830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
5840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
5850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
5864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass BlockCodeRegion : public CodeTextRegion {
58767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
58867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
589eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *BD;
5901d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *AC;
591eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CanQualType locTy;
59267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
5934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  BlockCodeRegion(const BlockDecl *bd, CanQualType lTy,
5941d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                  AnalysisDeclContext *ac, const MemRegion* sreg)
5954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : CodeTextRegion(sreg, BlockCodeRegionKind), BD(bd), AC(ac), locTy(lTy) {}
59667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
59767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType getLocationType() const override {
599eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return locTy;
600eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
601eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
602eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *getDecl() const {
603eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return BD;
604eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
60567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
6061d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *getAnalysisDeclContext() const { return AC; }
607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
60858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  void dumpToStream(raw_ostream &os) const override;
609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID& ID) const override;
611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
612eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD,
6131d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                            CanQualType, const AnalysisDeclContext*,
61467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const MemRegion*);
615eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
616eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
6174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return R->getKind() == BlockCodeRegionKind;
618ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
619ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu};
6200a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6210a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance.
6224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///  Blocks are represented with two kinds of regions.  BlockCodeRegions
6230a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
6240a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
6250a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
6260a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
6278ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Roseclass BlockDataRegion : public TypedRegion {
62867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
6294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const BlockCodeRegion *BC;
63067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const LocationContext *LC; // Can be null */
6313eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling  unsigned BlockCount;
6324240096011a187807058f887eb81df750ffa17feTed Kremenek  void *ReferencedVars;
63385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  void *OriginalVars;
63467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
6354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  BlockDataRegion(const BlockCodeRegion *bc, const LocationContext *lc,
6363eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling                  unsigned count, const MemRegion *sreg)
6378ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose  : TypedRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc),
6383eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling     BlockCount(count),
6396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    ReferencedVars(nullptr), OriginalVars(nullptr) {}
6400a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
64185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenekpublic:
6424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const BlockCodeRegion *getCodeRegion() const { return BC; }
6434240096011a187807058f887eb81df750ffa17feTed Kremenek
644d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek  const BlockDecl *getDecl() const { return BC->getDecl(); }
6458ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose
646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType getLocationType() const override { return BC->getLocationType(); }
647651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
64881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  class referenced_vars_iterator {
64981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const MemRegion * const *R;
65085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion * const *OriginalR;
65181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  public:
65285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    explicit referenced_vars_iterator(const MemRegion * const *r,
65385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                      const MemRegion * const *originalR)
65485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      : R(r), OriginalR(originalR) {}
65585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
656e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek    const VarRegion *getCapturedRegion() const {
65781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return cast<VarRegion>(*R);
65881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
659e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek    const VarRegion *getOriginalRegion() const {
660e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek      return cast<VarRegion>(*OriginalR);
661e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek    }
662e3ce2c10c3f6ae7b26700d758de909deab190d42Ted Kremenek
66381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator==(const referenced_vars_iterator &I) const {
6646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      assert((R == nullptr) == (I.R == nullptr));
66581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R == R;
66681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
66781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator!=(const referenced_vars_iterator &I) const {
6686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      assert((R == nullptr) == (I.R == nullptr));
66981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R != R;
67081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
6719c378f705405d37f49795d5e915989de774fe11fTed Kremenek    referenced_vars_iterator &operator++() {
67281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      ++R;
67385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      ++OriginalR;
67481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return *this;
67581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
67681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  };
6775846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek
6785846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  /// Return the original region for a captured region, if
6795846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  /// one exists.
6805846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  const VarRegion *getOriginalRegion(const VarRegion *VR) const;
68181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
6824240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_begin() const;
6834240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_end() const;
684651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
685651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
686651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID& ID) const override;
688651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
6894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockCodeRegion *,
6903eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling                            const LocationContext *, unsigned,
6913eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling                            const MemRegion *);
6920a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6930a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  static bool classof(const MemRegion* R) {
6940a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek    return R->getKind() == BlockDataRegionKind;
6950a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  }
6964240096011a187807058f887eb81df750ffa17feTed Kremenekprivate:
6974240096011a187807058f887eb81df750ffa17feTed Kremenek  void LazyInitializeReferencedVars();
69824570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  std::pair<const VarRegion *, const VarRegion *>
69924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  getCaptureRegions(const VarDecl *VD);
7000a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek};
701ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
702026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
70358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar///  classes, SymbolicRegion represents a region that serves as an alias for
704026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  either a real region, a NULL pointer, etc.  It essentially is used to
705026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  map the concept of symbolic values into the domain of regions.  Symbolic
706026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  regions do not need to be typed.
707e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion {
708026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected:
709026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  const SymbolRef sym;
710026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
711026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic:
7121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SymbolicRegion(const SymbolRef s, const MemRegion* sreg)
713e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek    : SubRegion(sreg, SymbolicRegionKind), sym(s) {}
7141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
715026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  SymbolRef getSymbol() const {
716026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return sym;
717026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
718026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
719651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool isBoundable() const override { return true; }
7209852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const override;
72232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
723651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID& ID) const override;
724026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
725250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
726250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            SymbolRef sym,
727250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            const MemRegion* superRegion);
7281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
729651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
7301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
731026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  static bool classof(const MemRegion* R) {
732026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() == SymbolicRegionKind;
733026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
735026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
736e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
7379697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion {
738e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
739e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
740e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
741e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
742250101353b711a409b075f1bc11070dddec7100bTed Kremenek  StringRegion(const StringLiteral* str, const MemRegion* sreg)
7439697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sreg, StringRegionKind), Str(str) {}
744e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
745e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
746e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
747e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
748e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
749e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
7506613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
7516613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
7521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType getValueType() const override {
754ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return Str->getType();
755ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  }
756e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
757651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const override;
75832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
759651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool isBoundable() const override { return false; }
7600a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
761651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID& ID) const override {
762e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
763e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
764e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
765651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
766cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
767e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
768e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
769e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
770e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
7714c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7724c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek/// The region associated with an ObjCStringLiteral.
7734c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekclass ObjCStringRegion : public TypedValueRegion {
7744c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  friend class MemRegionManager;
7754c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringLiteral* Str;
7764c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekprotected:
7774c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7784c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ObjCStringRegion(const ObjCStringLiteral* str, const MemRegion* sreg)
7794c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  : TypedValueRegion(sreg, ObjCStringRegionKind), Str(str) {}
7804c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7814c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
7824c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                            const ObjCStringLiteral* Str,
7834c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                            const MemRegion* superRegion);
7844c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7854c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekpublic:
7864c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7874c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringLiteral* getObjCStringLiteral() const { return Str; }
788651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
789651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType getValueType() const override {
7904c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    return Str->getType();
7914c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
792651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
793651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool isBoundable() const override { return false; }
794651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
795651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID& ID) const override {
7964c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    ProfileRegion(ID, Str, superRegion);
7974c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
798651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
799651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
800651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
8014c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  static bool classof(const MemRegion* R) {
8024c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    return R->getKind() == ObjCStringRegionKind;
8034c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
8044c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek};
805e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
806329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
807329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
808329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
8099697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion {
810329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
811329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
8129c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const CompoundLiteralExpr *CL;
813329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
8149c378f705405d37f49795d5e915989de774fe11fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr *cl, const MemRegion* sReg)
8159697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
8161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
817329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
8189c378f705405d37f49795d5e915989de774fe11fTed Kremenek                            const CompoundLiteralExpr *CL,
819329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
820329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
821651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType getValueType() const override {
822018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return CL->getType();
82377cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
8240a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
825651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool isBoundable() const override { return !CL->isFileScope(); }
8269a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu
827651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID& ID) const override;
8281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
829651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
830329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
8319c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const CompoundLiteralExpr *getLiteralExpr() const { return CL; }
8321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
833329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
834329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
835329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
836329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
837178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
8389697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion {
8399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
8409c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Decl *D;
8419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8429c378f705405d37f49795d5e915989de774fe11fTed Kremenek  DeclRegion(const Decl *d, const MemRegion* sReg, Kind k)
8439697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, k), D(d) {}
8449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8459c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D,
8469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
8471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
848bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
8499c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Decl *getDecl() const { return D; }
850651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID& ID) const override;
8511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
852e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
853e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
8544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return k >= BEGIN_DECL_REGIONS && k <= END_DECL_REGIONS;
855e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
8569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
8571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
8599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
860d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
861d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  // Constructors and private methods.
8629c378f705405d37f49795d5e915989de774fe11fTed Kremenek  VarRegion(const VarDecl *vd, const MemRegion* sReg)
86367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
8649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8659c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl *VD,
866d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                            const MemRegion *superRegion) {
8679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
8689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
8691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
870651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID& ID) const override;
8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
873d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  const VarDecl *getDecl() const { return cast<VarDecl>(D); }
8741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8755348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  const StackFrameContext *getStackFrame() const;
876651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
877651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType getValueType() const override {
8786eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
879018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
882651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
8831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
8859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
8861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8873d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
888651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool canPrintPrettyAsExpr() const override;
8899e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks
890651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void printPrettyAsExpr(raw_ostream &os) const override;
8919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
892de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
893de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter
894de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  in a call to a C++ method.  This region doesn't represent the object
895de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  referred to by 'this', but rather 'this' itself.
8969697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion {
897de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  friend class MemRegionManager;
898de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  CXXThisRegion(const PointerType *thisPointerTy,
899de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                const MemRegion *sReg)
9009697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {}
901de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
902de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
903de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const PointerType *PT,
904de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const MemRegion *sReg);
905de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
906651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID &ID) const override;
907de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
908651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
909651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType getValueType() const override {
910de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return QualType(ThisPointerTy, 0);
911de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
9127caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
913651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
914651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
915de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static bool classof(const MemRegion* R) {
916de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return R->getKind() == CXXThisRegionKind;
917de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
918de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
919de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate:
920de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const PointerType *ThisPointerTy;
921de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek};
9229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
9249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
9259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9269c378f705405d37f49795d5e915989de774fe11fTed Kremenek  FieldRegion(const FieldDecl *fd, const MemRegion* sReg)
9279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
9289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9294bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
9309c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const FieldDecl *getDecl() const { return cast<FieldDecl>(D); }
9311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
932651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType getValueType() const override {
9336eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
934018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
9351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
9364bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
937651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const override;
93832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
9399c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl *FD,
9406304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
9419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
9429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
9459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
9469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9473d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
948651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
949919e8a1c6698bfa6848571d366430126bced727dJordan Rose
950651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool canPrintPretty() const override;
951651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void printPretty(raw_ostream &os) const override;
952651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool canPrintPrettyAsExpr() const override;
953651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void printPrettyAsExpr(raw_ostream &os) const override;
9549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
9551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
9571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
9591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
960c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg);
9619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9629c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl *ivd,
963c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer                            const MemRegion* superRegion);
9641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
966c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  const ObjCIvarDecl *getDecl() const;
967651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType getValueType() const override;
9681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
969651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool canPrintPrettyAsExpr() const override;
970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void printPrettyAsExpr(raw_ostream &os) const override;
97143b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek
972651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
9731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
9759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
9769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
9787caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
979fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions.
9807caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
9817caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9827caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion;
9837caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9847caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset {
9857caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate:
9867caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  friend class ElementRegion;
9877caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9887caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *Region;
9899ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits Offset;
9907caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9919ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero())
9927caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu    : Region(reg), Offset(offset) {}
9937caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9947caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic:
9957caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  // FIXME: Eventually support symbolic offsets.
9969ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits getOffset() const { return Offset; }
9977caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *getRegion() const { return Region; }
9987caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9999c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
10007caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  void dump() const;
10017caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu};
1002511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
10031437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks/// \brief ElementRegin is used to represent both array elements and casts.
10049697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion {
1005511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
1006511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
1007f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType ElementType;
100802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc Index;
1009511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
101002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg)
10119697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, ElementRegionKind),
1012f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek      ElementType(elementType), Index(Idx) {
10135251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie    assert((!Idx.getAs<nonloc::ConcreteInt>() ||
10145251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie            Idx.castAs<nonloc::ConcreteInt>().getValue().isSigned()) &&
101543b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
10160395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
10171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1018f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType,
1019f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek                            SVal Idx, const MemRegion* superRegion);
1020511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
1021511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
1022511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
102302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc getIndex() const { return Index; }
10246e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
1025651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType getValueType() const override {
1026f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
1027f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  }
10281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1029f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType getElementType() const {
1030f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
1031abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
10327caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  /// Compute the offset within the array. The array might also be a subobject.
10337caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  RegionRawOffset getAsArrayOffset() const;
10341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1035651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
1036b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
1037651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID& ID) const override;
1038511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
1039511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
1040511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
1041511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
1042511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
104319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
1044bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression.
10459697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion {
1046bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  friend class MemRegionManager;
1047bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1048bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  Expr const *Ex;
1049bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
105002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  CXXTempObjectRegion(Expr const *E, MemRegion const *sReg)
10519697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {}
1052bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1053bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
1054bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu                            Expr const *E, const MemRegion *sReg);
1055bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1056bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic:
1057782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin  const Expr *getExpr() const { return Ex; }
1058782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin
1059651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType getValueType() const override {
1060bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu    return Ex->getType();
1061bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
1062bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1063651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
1064e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu
1065651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID &ID) const override;
1066bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1067bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static bool classof(const MemRegion* R) {
106802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    return R->getKind() == CXXTempObjectRegionKind;
1069bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
1070bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu};
1071bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
10724fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is
10734fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object.
10749697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion {
10754fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  friend class MemRegionManager;
10764fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10774411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  llvm::PointerIntPair<const CXXRecordDecl *, 1, bool> Data;
10784fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10794411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  CXXBaseObjectRegion(const CXXRecordDecl *RD, bool IsVirtual,
10804411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                      const MemRegion *SReg)
10814411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    : TypedValueRegion(SReg, CXXBaseObjectRegionKind), Data(RD, IsVirtual) {}
10824fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10834411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  static void ProfileRegion(llvm::FoldingSetNodeID &ID, const CXXRecordDecl *RD,
10844411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                            bool IsVirtual, const MemRegion *SReg);
10854fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10864fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic:
10874411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  const CXXRecordDecl *getDecl() const { return Data.getPointer(); }
10884411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  bool isVirtual() const { return Data.getInt(); }
1089d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
1090651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  QualType getValueType() const override;
10914fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1092651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dumpToStream(raw_ostream &os) const override;
10934fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1094651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Profile(llvm::FoldingSetNodeID &ID) const override;
10954fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10964fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  static bool classof(const MemRegion *region) {
10974fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    return region->getKind() == CXXBaseObjectRegionKind;
10984fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  }
109907d8470effc0b0364801adddb6ff92bd22334402Anna Zaks
1100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool canPrintPrettyAsExpr() const override;
1101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void printPrettyAsExpr(raw_ostream &os) const override;
11034fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu};
11044fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1105ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy>
1106ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const {
1107f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  if (const RegionTy* RT = dyn_cast<RegionTy>(this))
1108f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek    return RT;
11091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
1111ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}
1112511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
11139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
11149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
11159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
11169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
11179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
1118a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &C;
11199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
11209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
11211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1122eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalInternalSpaceRegion *InternalGlobals;
1123eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalSystemSpaceRegion *SystemGlobals;
1124eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalImmutableSpaceRegion *ImmutableGlobals;
1125eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
11262b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
1127c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *>
1128c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackLocalsSpaceRegions;
1129c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *>
1130c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackArgumentsSpaceRegions;
1131dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *>
1132dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticsGlobalSpaceRegions;
11332b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
113467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion *heap;
11352b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion *unknown;
11364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CodeSpaceRegion *code;
1137dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
11389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
11396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator &a)
11406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    : C(c), A(a), InternalGlobals(nullptr), SystemGlobals(nullptr),
11416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ImmutableGlobals(nullptr), heap(nullptr), unknown(nullptr),
11426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      code(nullptr) {}
11431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11444240096011a187807058f887eb81df750ffa17feTed Kremenek  ~MemRegionManager();
11451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1146a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &getContext() { return C; }
11474240096011a187807058f887eb81df750ffa17feTed Kremenek
11484240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &getAllocator() { return A; }
11491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
115067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getStackLocalsRegion - Retrieve the memory region associated with the
115167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  specified stack frame.
115267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackLocalsSpaceRegion *
115367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackLocalsRegion(const StackFrameContext *STC);
1154d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
1155d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  /// getStackArgumentsRegion - Retrieve the memory region associated with
115667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  function/method arguments of the specified stack frame.
115767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackArgumentsSpaceRegion *
115867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackArgumentsRegion(const StackFrameContext *STC);
11591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
1161dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ///  global variables.
1162eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  const GlobalsSpaceRegion *getGlobalsRegion(
1163eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      MemRegion::Kind K = MemRegion::GlobalInternalSpaceRegionKind,
11646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      const CodeTextRegion *R = nullptr);
11651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
11679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
116867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const HeapSpaceRegion *getHeapRegion();
1169178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
1170178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
1171178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
11724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const UnknownSpaceRegion *getUnknownRegion();
1173c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
11744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const CodeSpaceRegion *getCodeRegion();
1175ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
11767090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
11779c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const AllocaRegion *getAllocaRegion(const Expr *Ex, unsigned Cnt,
117867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                      const LocationContext *LC);
11791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1180329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
1181329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
1182b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const CompoundLiteralRegion*
11839c378f705405d37f49795d5e915989de774fe11fTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr *CL,
118467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                           const LocationContext *LC);
1185de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
1186fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  /// getCXXThisRegion - Retrieve the [artificial] region associated with the
1187de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ///  parameter 'this'.
1188de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy,
1189de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                        const LocationContext *LC);
11901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1191e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  /// \brief Retrieve or create a "symbolic" memory region.
1192e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  const SymbolicRegion* getSymbolicRegion(SymbolRef Sym);
1193e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks
1194e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  /// \brief Return a unique symbolic region belonging to heap memory space.
1195e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  const SymbolicRegion *getSymbolicHeapRegion(SymbolRef sym);
1196e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
11974c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const StringRegion *getStringRegion(const StringLiteral* Str);
11984c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
11994c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringRegion *getObjCStringRegion(const ObjCStringLiteral *Str);
1200e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
12019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
1202d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  ///  a specified VarDecl and LocationContext.
1203b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC);
12041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
120567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
120667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  a specified VarDecl and super region.
120767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR);
120867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1209f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  /// getElementRegion - Retrieve the memory region associated with the
1210f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ///  associated element type, index, and super region.
121102282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx,
1212856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        const MemRegion *superRegion,
1213856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        ASTContext &Ctx);
12141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1215b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER,
1216856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                                 const MemRegion *superRegion) {
1217a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getElementRegion(ER->getElementType(), ER->getIndex(),
1218a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek                            superRegion, ER->getContext());
1219a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
1220511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
12219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
12229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
12239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
12249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
12259c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const FieldRegion *getFieldRegion(const FieldDecl *fd,
1226b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                    const MemRegion* superRegion);
12271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1228b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR,
1229b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                             const MemRegion *superRegion) {
1230a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getFieldRegion(FR->getDecl(), superRegion);
1231a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
12321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
12349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
12359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
12369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
12379c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl *ivd,
1238b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                          const MemRegion* superRegion);
12391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
124002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex,
124102fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                                    LocationContext const *LC);
1242bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
12434411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  /// Create a CXXBaseObjectRegion with the given base class for region
12444411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  /// \p Super.
12454411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  ///
12464411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  /// The type of \p Super is assumed be a class deriving from \p BaseClass.
12474411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  const CXXBaseObjectRegion *
12484411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  getCXXBaseObjectRegion(const CXXRecordDecl *BaseClass, const MemRegion *Super,
12494411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                         bool IsVirtual);
12504fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1251d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different
1252d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// super region.
1253d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  const CXXBaseObjectRegion *
1254d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg,
1255d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu                                  const MemRegion *superRegion) {
12564411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion,
12574411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                  baseReg->isVirtual());
1258d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  }
1259d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
12604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const FunctionCodeRegion *getFunctionCodeRegion(const NamedDecl *FD);
12614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const BlockCodeRegion *getBlockCodeRegion(const BlockDecl *BD,
126267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            CanQualType locTy,
12631d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                            AnalysisDeclContext *AC);
126467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
126567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getBlockDataRegion - Get the memory region associated with an instance
126667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  of a block.  Unlike many other MemRegions, the LocationContext*
126767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  argument is allowed to be NULL for cases where we have no known
126867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  context.
12694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const BlockDataRegion *getBlockDataRegion(const BlockCodeRegion *bc,
12703eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling                                            const LocationContext *lc,
12713eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling                                            unsigned blockCount);
12721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
127376b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath  /// Create a CXXTempObjectRegion for temporaries which are lifetime-extended
127476b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath  /// by static references. This differs from getCXXTempObjectRegion in the
127576b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath  /// super-region used.
127676b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath  const CXXTempObjectRegion *getCXXStaticTempObjectRegion(const Expr *Ex);
127776b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath
1278bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate:
1279250101353b711a409b075f1bc11070dddec7100bTed Kremenek  template <typename RegionTy, typename A1>
1280250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* getRegion(const A1 a1);
12811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12826304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  template <typename RegionTy, typename A1>
1283eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion);
12841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12857ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  template <typename RegionTy, typename A1, typename A2>
12867ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* getRegion(const A1 a1, const A2 a2);
1287dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
12880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  template <typename RegionTy, typename A1, typename A2>
12890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2,
12900a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                         const MemRegion* superRegion);
12910a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
129267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename RegionTy, typename A1, typename A2, typename A3>
129367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3,
129467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                         const MemRegion* superRegion);
129567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
129667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG>
129767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region);
129867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
129967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG, typename ARG>
130067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region, ARG a);
1301ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek};
13021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1303250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1304a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions.
1305250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1306250101353b711a409b075f1bc11070dddec7100bTed Kremenek
13079c378f705405d37f49795d5e915989de774fe11fTed Kremenekinline ASTContext &MemRegion::getContext() const {
1308a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  return getMemRegionManager()->getContext();
1309a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
1310da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1311da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev//===----------------------------------------------------------------------===//
1312da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev// Means for storing region/symbol handling traits.
1313da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev//===----------------------------------------------------------------------===//
1314da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1315da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev/// Information about invalidation for a particular region/symbol.
1316da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsevclass RegionAndSymbolInvalidationTraits {
1317da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  typedef unsigned char StorageTypeForKinds;
1318da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  llvm::DenseMap<const MemRegion *, StorageTypeForKinds> MRTraitsMap;
1319da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  llvm::DenseMap<SymbolRef, StorageTypeForKinds> SymTraitsMap;
1320da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1321da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  typedef llvm::DenseMap<const MemRegion *, StorageTypeForKinds>::const_iterator
1322da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev      const_region_iterator;
1323da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  typedef llvm::DenseMap<SymbolRef, StorageTypeForKinds>::const_iterator
1324da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev      const_symbol_iterator;
1325da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1326da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsevpublic:
1327da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  /// \brief Describes different invalidation traits.
1328da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  enum InvalidationKinds {
1329da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev    /// Tells that a region's contents is not changed.
1330b7a747b0c271faeeb8d0f886f0e691eb25f637d9Anton Yartsev    TK_PreserveContents = 0x1,
1331b7a747b0c271faeeb8d0f886f0e691eb25f637d9Anton Yartsev    /// Suppress pointer-escaping of a region.
133287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TK_SuppressEscape = 0x2,
133387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // Do not invalidate super region.
133487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TK_DoNotInvalidateSuperRegion = 0x4,
133587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    /// When applied to a MemSpaceRegion, indicates the entire memory space
133687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    /// should be invalidated.
133787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TK_EntireMemSpace = 0x8
1338da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1339da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev    // Do not forget to extend StorageTypeForKinds if number of traits exceed
1340da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev    // the number of bits StorageTypeForKinds can store.
1341da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  };
1342da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1343da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  void setTrait(SymbolRef Sym, InvalidationKinds IK);
1344da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  void setTrait(const MemRegion *MR, InvalidationKinds IK);
13454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool hasTrait(SymbolRef Sym, InvalidationKinds IK) const;
13464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool hasTrait(const MemRegion *MR, InvalidationKinds IK) const;
1347da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev};
1348eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
13495a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace
13505a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
1351be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace
13529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1353250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1354250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions.
1355250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1356250101353b711a409b075f1bc11070dddec7100bTed Kremenek
1357be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm {
13589c378f705405d37f49795d5e915989de774fe11fTed Kremenekstatic inline raw_ostream &operator<<(raw_ostream &os,
13599ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek                                      const clang::ento::MemRegion* R) {
13608800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  R->dumpToStream(os);
13618800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  return os;
1362be91224894e1501133e224934285ba6440bf5b59Ted Kremenek}
1363be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace
13649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
13659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
1366