MemRegion.h revision 2b87ae45e129b941d0a4d221c9d4842385a119bd
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
169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#ifndef LLVM_CLANG_ANALYSIS_MEMREGION_H
179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#define LLVM_CLANG_ANALYSIS_MEMREGION_H
189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
19993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/Decl.h"
20993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/DeclObjC.h"
21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/Analysis/PathSensitive/SymbolManager.h"
2222ab7a4d900ed53285fd0b6720e7b43af84724d8Zhongxing Xu#include "clang/Analysis/PathSensitive/SVals.h"
23a693d4fa7a6dc31b23837cf38cba7aa2af8f00f3Ted Kremenek#include "clang/AST/ASTContext.h"
249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Casting.h"
259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h"
26dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu#include "llvm/ADT/ImmutableList.h"
27dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu#include "llvm/ADT/ImmutableMap.h"
289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Allocator.h"
299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string>
309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace llvm { class raw_ostream; }
329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang {
341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager;
36d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass MemSpaceRegion;
37d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext;
3867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext;
394240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion;
401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
4219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes.
4319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions.
469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode {
474240096011a187807058f887eb81df750ffa17feTed Kremenek  friend class MemRegionManager;
489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
4967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  enum Kind {
5067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Memory spaces.
5167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_MEMSPACES,
5267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    GenericMemSpaceRegionKind = BEG_MEMSPACES,
5367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackLocalsSpaceRegionKind,
5467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackArgumentsSpaceRegionKind,
5567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    HeapSpaceRegionKind,
562b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    UnknownSpaceRegionKind,
5767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    GlobalsSpaceRegionKind,
5867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    END_MEMSPACES = GlobalsSpaceRegionKind,
5967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Untyped regions.
6067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    SymbolicRegionKind,
6167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    AllocaRegionKind,
6267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Typed regions.
6367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_TYPED_REGIONS,
6467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FunctionTextRegionKind = BEG_TYPED_REGIONS,
6567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BlockTextRegionKind,
6667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BlockDataRegionKind,
6767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    CompoundLiteralRegionKind,
6867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StringRegionKind,
6967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ElementRegionKind,
7067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Decl Regions.
7167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_DECL_REGIONS,
7267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    VarRegionKind = BEG_DECL_REGIONS,
7367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FieldRegionKind,
7467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ObjCIvarRegionKind,
7567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ObjCObjectRegionKind,
7667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    END_DECL_REGIONS = ObjCObjectRegionKind,
7767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    END_TYPED_REGIONS = END_DECL_REGIONS
7867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  };
7967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
88a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek  ASTContext &getContext() const;
891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
91a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
92a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  virtual MemRegionManager* getMemRegionManager() const = 0;
93a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::string getString() const;
951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
96bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemSpaceRegion *getMemorySpace() const;
971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
98adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *getBaseRegion() const;
99adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
100479529e679957fbb92b56e116e3c86734429331eZhongxing Xu  const MemRegion *StripCasts() const;
1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
102ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek  bool hasStackStorage() const;
1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1041508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasParametersStorage() const;
1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1061508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsStorage() const;
1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1081508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsOrParametersStorage() const;
1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
110ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek  bool hasHeapStorage() const;
1111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
112bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  bool hasHeapOrStackStorage() const;
113b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
1148800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  virtual void dumpToStream(llvm::raw_ostream& os) const;
1157f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
1168800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dump() const;
1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Kind getKind() const { return kind; }
1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
120ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  template<typename RegionTy> const RegionTy* getAs() const;
1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
122f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu  virtual bool isBoundable() const { return false; }
123b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
1249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion*) { return true; }
1259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space";
1289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
1299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
130a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected:
13167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
13267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
133a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager *Mgr;
134a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
13567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind)
13667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemRegion(k), Mgr(mgr) {
13767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
13867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
13967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
14067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemRegionManager* getMemRegionManager() const { return Mgr; }
1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
14367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  bool isBoundable() const { return false; }
14467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
14567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
14667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
14767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
14867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
14967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_MEMSPACES && k <= END_MEMSPACES;
150a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  }
15167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
15267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
15367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion {
15467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
155a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
15667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  GlobalsSpaceRegion(MemRegionManager *mgr)
15767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, GlobalsSpaceRegionKind) {}
1589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
15967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
16067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == GlobalsSpaceRegionKind;
16167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
16267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
16367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
16467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion {
16567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
16667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
16767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion(MemRegionManager *mgr)
16867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, HeapSpaceRegionKind) {}
16967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
17067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
17167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == HeapSpaceRegionKind;
17267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
17367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
17467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1752b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion {
1762b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  friend class MemRegionManager;
1772b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion(MemRegionManager *mgr)
1782b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {}
1792b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic:
1802b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  static bool classof(const MemRegion *R) {
1812b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    return R->getKind() == UnknownSpaceRegionKind;
1822b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  }
1832b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek};
1842b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
18567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion {
18667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
18767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *SFC;
1889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
18967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected:
19067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc)
19167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, k), SFC(sfc) {
19267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
19367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
19441168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
19567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
19667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *getStackFrame() const { return SFC; }
19767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
19867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
19967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
20067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
20167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
20267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= StackLocalsSpaceRegionKind &&
20367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek           k <= StackArgumentsSpaceRegionKind;
20467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
20567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
20667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
20767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion {
20867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
20967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
21067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
21167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {}
21267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
21367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
21467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackLocalsSpaceRegionKind;
21567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
21667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
21767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
21867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion {
21967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
22067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
22167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
22267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {}
22367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
22467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
22567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackArgumentsSpaceRegionKind;
2269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
2289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
229993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
230993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
231993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
2329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
2331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const MemRegion* superRegion;
234993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
2359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
2369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
2379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
2389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
240a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager* getMemRegionManager() const;
2411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2427e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  bool isSubRegionOf(const MemRegion* R) const;
2431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
24567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() > END_MEMSPACES;
246993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
247993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
2481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
25019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Auxillary data classes for use with MemRegions.
25119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
25219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
25319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekclass ElementRegion;
2541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekclass RegionRawOffset : public std::pair<const MemRegion*, int64_t> {
25619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekprivate:
25719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  friend class ElementRegion;
25819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
25919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  RegionRawOffset(const MemRegion* reg, int64_t offset = 0)
26019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    : std::pair<const MemRegion*, int64_t>(reg, offset) {}
26119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
2621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
26319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  // FIXME: Eventually support symbolic offsets.
26419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  int64_t getByteOffset() const { return second; }
26519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  const MemRegion *getRegion() const { return first; }
26619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
26719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
26819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  void dump() const;
26919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek};
27019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
27119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
27219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses.
2731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===//
274ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
27582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
27682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
27782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
27882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
27982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
28082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
28182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
28282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* Ex;
28382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
2847ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion *superRegion)
28582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
2881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* getExpr() const { return Ex; }
2909852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
2919852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
2929852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
29382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
29482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
29582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,
2967ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                            unsigned Cnt, const MemRegion *superRegion);
2971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2988800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
2991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
30182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
30282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
3031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
3041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
305993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
306993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
307993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
308993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
310993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
311a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  virtual QualType getValueType(ASTContext &C) const = 0;
3121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
313ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  virtual QualType getLocationType(ASTContext& C) const {
3146eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can possibly optimize this later to cache this value.
315a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu    return C.getPointerType(getValueType(C));
3166eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
3171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
318a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getDesugaredValueType(ASTContext& C) const {
319a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu    QualType T = getValueType(C);
320bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall    return T.getTypePtr() ? T.getDesugaredType() : T;
32114553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
3221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
323ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  QualType getDesugaredLocationType(ASTContext& C) const {
324bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall    return getLocationType(C).getDesugaredType();
32514553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
3261b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek
327a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  bool isBoundable() const {
328a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    return !getValueType(getContext()).isNull();
32941168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek  }
3306eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
331993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
3329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS;
3349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
337ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
338eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion {
339eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected:
340eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {}
341ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
342a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext &C) const {
343ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    // Do not get the object type of a CodeTextRegion.
344ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    assert(0);
345ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    return QualType();
346ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
347eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
348eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  bool isBoundable() const { return false; }
349eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
350eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
351eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    Kind k = R->getKind();
352eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return k >= FunctionTextRegionKind && k <= BlockTextRegionKind;
353eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
354eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
355ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
356eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function.
357eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion {
358eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const FunctionDecl *FD;
359eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic:
360eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  FunctionTextRegion(const FunctionDecl* fd, const MemRegion* sreg)
361eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {}
362eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
363ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  QualType getLocationType(ASTContext &C) const {
364abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek    return C.getPointerType(FD->getType());
365ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
366eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
367abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  const FunctionDecl *getDecl() const {
368abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek    return FD;
36972e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  }
370eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
3718800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  virtual void dumpToStream(llvm::raw_ostream& os) const;
372eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
373ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
374eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
375abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD,
376abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek                            const MemRegion*);
377eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
378ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static bool classof(const MemRegion* R) {
379eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == FunctionTextRegionKind;
380eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
381eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
382eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
383eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
384eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures).
3850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
3860a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
3870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
3880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
3890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
390eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion {
39167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
39267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
393eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *BD;
39467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  AnalysisContext *AC;
395eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CanQualType locTy;
39667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
39767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockTextRegion(const BlockDecl *bd, CanQualType lTy,
39867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                  AnalysisContext *ac, const MemRegion* sreg)
39967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {}
40067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
40167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
402eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  QualType getLocationType(ASTContext &C) const {
403eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return locTy;
404eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
405eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
406eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *getDecl() const {
407eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return BD;
408eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
40967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
41067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  AnalysisContext *getAnalysisContext() const { return AC; }
411eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
412eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  virtual void dumpToStream(llvm::raw_ostream& os) const;
413eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
414eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
415eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
416eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD,
41767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            CanQualType, const AnalysisContext*,
41867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const MemRegion*);
419eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
420eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
421eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == BlockTextRegionKind;
422ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
423ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu};
4240a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
4250a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance.
4260a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
4270a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
4280a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
4290a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
4300a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
4310a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents code texts of blocks (closures).
4320a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion {
43367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
4340a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *BC;
43567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const LocationContext *LC; // Can be null */
4364240096011a187807058f887eb81df750ffa17feTed Kremenek  void *ReferencedVars;
43767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
43867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc,
4390a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                  const MemRegion *sreg)
4404240096011a187807058f887eb81df750ffa17feTed Kremenek  : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc), ReferencedVars(0) {}
4410a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
44267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
4430a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *getCodeRegion() const { return BC; }
4444240096011a187807058f887eb81df750ffa17feTed Kremenek
445d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek  const BlockDecl *getDecl() const { return BC->getDecl(); }
446d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek
44781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  class referenced_vars_iterator {
44881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const MemRegion * const *R;
44981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  public:
45081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    explicit referenced_vars_iterator(const MemRegion * const *r) : R(r) {}
45181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
45281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    operator const MemRegion * const *() const {
45381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return R;
45481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
45581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
45681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const VarRegion* operator*() const {
45781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return cast<VarRegion>(*R);
45881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
45981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
46081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator==(const referenced_vars_iterator &I) const {
46181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R == R;
46281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
46381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator!=(const referenced_vars_iterator &I) const {
46481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R != R;
46581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
46681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    referenced_vars_iterator& operator++() {
46781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      ++R;
46881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return *this;
46981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
47081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  };
47181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
4724240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_begin() const;
4734240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_end() const;
4740a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
4750a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  virtual void dumpToStream(llvm::raw_ostream& os) const;
4760a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
4770a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
4780a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
47967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *,
48067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const LocationContext *, const MemRegion *);
4810a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
4820a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  static bool classof(const MemRegion* R) {
4830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek    return R->getKind() == BlockDataRegionKind;
4840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  }
4854240096011a187807058f887eb81df750ffa17feTed Kremenekprivate:
4864240096011a187807058f887eb81df750ffa17feTed Kremenek  void LazyInitializeReferencedVars();
4870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek};
488ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
489026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
490026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  clases, SymbolicRegion represents a region that serves as an alias for
491026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  either a real region, a NULL pointer, etc.  It essentially is used to
492026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  map the concept of symbolic values into the domain of regions.  Symbolic
493026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  regions do not need to be typed.
494e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion {
495026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected:
496026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  const SymbolRef sym;
497026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
498026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic:
4991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SymbolicRegion(const SymbolRef s, const MemRegion* sreg)
500e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek    : SubRegion(sreg, SymbolicRegionKind), sym(s) {}
5011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
502026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  SymbolRef getSymbol() const {
503026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return sym;
504026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
505026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
5069852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
5079852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
508026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
509026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
510250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
511250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            SymbolRef sym,
512250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            const MemRegion* superRegion);
5131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5148800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
5151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
516026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  static bool classof(const MemRegion* R) {
517026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() == SymbolicRegionKind;
518026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
5191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
520026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
521e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
522e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion {
523e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
524e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
525e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
526e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
527250101353b711a409b075f1bc11070dddec7100bTed Kremenek  StringRegion(const StringLiteral* str, const MemRegion* sreg)
528e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    : TypedRegion(sreg, StringRegionKind), Str(str) {}
529e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
530e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
531e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
532e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
533e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
534e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
5356613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
5366613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
5371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
538a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
539ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return Str->getType();
540ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  }
541e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
5420a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu  bool isBoundable() const { return false; }
5430a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
544e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
545e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
546e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
547e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
5488800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
549cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
550e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
551e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
552e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
553e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
554e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
555329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
556329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
557329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
55877cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion {
559329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
560329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
561329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  const CompoundLiteralExpr* CL;
562329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
563329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg)
56477cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
5651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
566329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
567329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const CompoundLiteralExpr* CL,
568329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
569329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
570a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
57177cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    return C.getCanonicalType(CL->getType());
57277cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
5730a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
5749a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu  bool isBoundable() const { return !CL->isFileScope(); }
5759a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu
576329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
5771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5788800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
579329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
58011a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek  const CompoundLiteralExpr* getLiteralExpr() const { return CL; }
5811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
582329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
583329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
584329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
585329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
586178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
5879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion {
5889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
5899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Decl* D;
5909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
591993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  DeclRegion(const Decl* d, const MemRegion* sReg, Kind k)
5929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : TypedRegion(sReg, k), D(d) {}
5939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D,
5959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
5961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
597bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
598bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu  const Decl* getDecl() const { return D; }
5999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
601e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
602e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
60367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS;
604e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
6059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
6061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
6089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
609d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
610d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  // Constructors and private methods.
61167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  VarRegion(const VarDecl* vd, const MemRegion* sReg)
61267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
6139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
614250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* VD,
615d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                            const MemRegion *superRegion) {
6169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
6179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
6181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
619d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
622d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  const VarDecl *getDecl() const { return cast<VarDecl>(D); }
6231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType getValueType(ASTContext& C) const {
6256eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
6266eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    return C.getCanonicalType(getDecl()->getType());
6271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
6281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6298800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
6301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
6329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
6331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
6349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
6359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
6369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
6379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
6389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
639993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  FieldRegion(const FieldDecl* fd, const MemRegion* sReg)
6409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
6419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
6424bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
6431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6448800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
6451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6464bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  const FieldDecl* getDecl() const { return cast<FieldDecl>(D); }
6471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType getValueType(ASTContext& C) const {
6496eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
650e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu    return C.getCanonicalType(getDecl()->getType());
6511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
6524bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
6536304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl* FD,
6546304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
6559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
6569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
6571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
6599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
6609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
6619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
6621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
663a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion {
6641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
665a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  friend class MemRegionManager;
6661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
667a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg)
668a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {}
6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6706304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
6716304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const ObjCInterfaceDecl* ivd,
672a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek                            const MemRegion* superRegion) {
673a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind);
674a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
6751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
676a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic:
677a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  const ObjCInterfaceDecl* getInterface() const {
678a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return cast<ObjCInterfaceDecl>(D);
679a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
6801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
681a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
6823b3a45858c6b2a45114e91902c3bf3c4b7f5f302Daniel Dunbar    return C.getObjCInterfaceType(getInterface());
683a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
6841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
685a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  static bool classof(const MemRegion* R) {
686a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return R->getKind() == ObjCObjectRegionKind;
687a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
6881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
6891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
6911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
6931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
694993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg)
6959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
6969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
6976304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl* ivd,
6986304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
6999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
7009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
7011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
7039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); }
704a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext&) const { return getDecl()->getType(); }
7051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
706bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
7071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
7099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
7109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
7119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
712511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
71327b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion {
714511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
715511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
716f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType ElementType;
717511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  SVal Index;
718511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
719f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ElementRegion(QualType elementType, SVal Idx, const MemRegion* sReg)
720f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    : TypedRegion(sReg, ElementRegionKind),
721f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek      ElementType(elementType), Index(Idx) {
7223d8173c1c68f451c7492f92023d829c626845925Chris Lattner    assert((!isa<nonloc::ConcreteInt>(&Idx) ||
7233d8173c1c68f451c7492f92023d829c626845925Chris Lattner           cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) &&
72443b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
7250395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
7261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
727f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType,
728f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek                            SVal Idx, const MemRegion* superRegion);
729511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
730511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
731511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
7326e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu  SVal getIndex() const { return Index; }
7336e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
734a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext&) const {
735f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
736f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  }
7371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
738f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType getElementType() const {
739f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
740abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
7411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
74219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  RegionRawOffset getAsRawOffset() const;
7431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7448800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
745b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
746511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
747511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
748511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
749511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
750511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
751511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
75219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
753ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy>
754ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const {
755f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  if (const RegionTy* RT = dyn_cast<RegionTy>(this))
756f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek    return RT;
7571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
758f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  return NULL;
759ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}
760511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
7619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
7629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
7639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
7649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
7659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
766a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &C;
7679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
7689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
7691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  GlobalsSpaceRegion *globals;
7712b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
7722b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  const StackFrameContext *cachedStackLocalsFrame;
7732b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  StackLocalsSpaceRegion *cachedStackLocalsRegion;
7742b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
7752b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  const StackFrameContext *cachedStackArgumentsFrame;
7762b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  StackArgumentsSpaceRegion *cachedStackArgumentsRegion;
7772b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
77867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion *heap;
7792b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion *unknown;
780d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *code;
781dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
7829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
783a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a)
7842b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    : C(c), A(a), globals(0),
7852b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek      cachedStackLocalsFrame(0), cachedStackLocalsRegion(0),
7862b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek      cachedStackArgumentsFrame(0), cachedStackArgumentsRegion(0),
7872b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek      heap(0), unknown(0), code(0) {}
7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7894240096011a187807058f887eb81df750ffa17feTed Kremenek  ~MemRegionManager();
7901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
791a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &getContext() { return C; }
7924240096011a187807058f887eb81df750ffa17feTed Kremenek
7934240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &getAllocator() { return A; }
7941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
79567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getStackLocalsRegion - Retrieve the memory region associated with the
79667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  specified stack frame.
79767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackLocalsSpaceRegion *
79867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackLocalsRegion(const StackFrameContext *STC);
799d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
800d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  /// getStackArgumentsRegion - Retrieve the memory region associated with
80167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  function/method arguments of the specified stack frame.
80267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackArgumentsSpaceRegion *
80367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackArgumentsRegion(const StackFrameContext *STC);
8041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
8069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  all global variables.
80767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const GlobalsSpaceRegion *getGlobalsRegion();
8081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
8109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
81167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const HeapSpaceRegion *getHeapRegion();
812178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
813178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
814178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
815b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getUnknownRegion();
816c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
817b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getCodeRegion();
818ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
8197090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
82067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const AllocaRegion *getAllocaRegion(const Expr* Ex, unsigned Cnt,
82167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                      const LocationContext *LC);
8221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
823329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
824329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
825b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const CompoundLiteralRegion*
82667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr* CL,
82767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                           const LocationContext *LC);
8281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
829993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  /// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
830b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const SymbolicRegion* getSymbolicRegion(SymbolRef sym);
831e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
832b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const StringRegion* getStringRegion(const StringLiteral* Str);
833e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
8349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
835d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  ///  a specified VarDecl and LocationContext.
836b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC);
8371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
83867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
83967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  a specified VarDecl and super region.
84067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR);
84167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
842f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  /// getElementRegion - Retrieve the memory region associated with the
843f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ///  associated element type, index, and super region.
844b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ElementRegion *getElementRegion(QualType elementType, SVal Idx,
845d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                                  const MemRegion *superRegion,
846d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                                  ASTContext &Ctx);
8471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
848b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER,
849a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek                                           const MemRegion *superRegion) {
850a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getElementRegion(ER->getElementType(), ER->getIndex(),
851a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek                            superRegion, ER->getContext());
852a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
853511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
8549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
8559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
8569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
8579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
858b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegion(const FieldDecl* fd,
859b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                    const MemRegion* superRegion);
8601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
861b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR,
862b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                             const MemRegion *superRegion) {
863a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getFieldRegion(FR->getDecl(), superRegion);
864a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
8651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
866a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  /// getObjCObjectRegion - Retrieve or create the memory region associated with
867a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ///  the instance of a specified Objective-C class.
868b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID,
869b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                              const MemRegion* superRegion);
8701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
8729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
8739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
8749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
875b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl* ivd,
876b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                          const MemRegion* superRegion);
8771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
878b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD);
879b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD,
88067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            CanQualType locTy,
88167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            AnalysisContext *AC);
88267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
88367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getBlockDataRegion - Get the memory region associated with an instance
88467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  of a block.  Unlike many other MemRegions, the LocationContext*
88567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  argument is allowed to be NULL for cases where we have no known
88667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  context.
887b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc,
88867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            const LocationContext *lc = NULL);
8891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
890bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  bool isGlobalsRegion(const MemRegion* R) {
891bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    assert(R);
892bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    return R == globals;
893bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
894bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
895bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate:
896250101353b711a409b075f1bc11070dddec7100bTed Kremenek  template <typename RegionTy, typename A1>
897250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* getRegion(const A1 a1);
8981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8996304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  template <typename RegionTy, typename A1>
900eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion);
9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9027ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  template <typename RegionTy, typename A1, typename A2>
9037ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* getRegion(const A1 a1, const A2 a2);
904dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
9050a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  template <typename RegionTy, typename A1, typename A2>
9060a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2,
9070a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                         const MemRegion* superRegion);
9080a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
90967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename RegionTy, typename A1, typename A2, typename A3>
91067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3,
91167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                         const MemRegion* superRegion);
91267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
91367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG>
91467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region);
91567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
91667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG, typename ARG>
91767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region, ARG a);
918ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek};
9191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
920250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
921a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions.
922250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
923250101353b711a409b075f1bc11070dddec7100bTed Kremenek
924a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekinline ASTContext& MemRegion::getContext() const {
925a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  return getMemRegionManager()->getContext();
926a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
927eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
928be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace
9299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
930250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
931250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions.
932250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
933250101353b711a409b075f1bc11070dddec7100bTed Kremenek
934be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm {
9358800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekstatic inline raw_ostream& operator<<(raw_ostream& os,
9361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                      const clang::MemRegion* R) {
9378800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  R->dumpToStream(os);
9388800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  return os;
939be91224894e1501133e224934285ba6440bf5b59Ted Kremenek}
940be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace
9419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
943