MemRegion.h revision 67d1287035767f4f6c8ca0c2bb755990012a44ca
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,
5667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    GlobalsSpaceRegionKind,
5767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    END_MEMSPACES = GlobalsSpaceRegionKind,
5867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Untyped regions.
5967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    SymbolicRegionKind,
6067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    AllocaRegionKind,
6167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Typed regions.
6267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_TYPED_REGIONS,
6367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FunctionTextRegionKind = BEG_TYPED_REGIONS,
6467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BlockTextRegionKind,
6567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BlockDataRegionKind,
6667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    CompoundLiteralRegionKind,
6767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StringRegionKind,
6867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ElementRegionKind,
6967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Decl Regions.
7067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_DECL_REGIONS,
7167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    VarRegionKind = BEG_DECL_REGIONS,
7267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FieldRegionKind,
7367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ObjCIvarRegionKind,
7467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ObjCObjectRegionKind,
7567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    END_DECL_REGIONS = ObjCObjectRegionKind,
7667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    END_TYPED_REGIONS = END_DECL_REGIONS
7767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  };
7867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
87a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek  ASTContext &getContext() const;
881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
90a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
91a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  virtual MemRegionManager* getMemRegionManager() const = 0;
92a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::string getString() const;
941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
95bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemSpaceRegion *getMemorySpace() const;
961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
97adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *getBaseRegion() const;
98adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
99479529e679957fbb92b56e116e3c86734429331eZhongxing Xu  const MemRegion *StripCasts() const;
1001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
101ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek  bool hasStackStorage() const;
1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1031508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasParametersStorage() const;
1041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1051508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsStorage() const;
1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1071508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsOrParametersStorage() const;
1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
109ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek  bool hasHeapStorage() const;
1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
111bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  bool hasHeapOrStackStorage() const;
112b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
1138800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  virtual void dumpToStream(llvm::raw_ostream& os) const;
1147f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
1158800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dump() const;
1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Kind getKind() const { return kind; }
1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
119ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  template<typename RegionTy> const RegionTy* getAs() const;
1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
121f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu  virtual bool isBoundable() const { return false; }
122b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
1239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion*) { return true; }
1249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space";
1279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
1289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
129a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected:
13067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
13167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
132a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager *Mgr;
133a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
13467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind)
13567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemRegion(k), Mgr(mgr) {
13667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
13767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
13867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
13967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemRegionManager* getMemRegionManager() const { return Mgr; }
1401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
14267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  bool isBoundable() const { return false; }
14367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
14467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
14567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
14667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
14767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
14867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_MEMSPACES && k <= END_MEMSPACES;
149a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  }
15067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
15167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
15267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion {
15367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
154a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
15567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  GlobalsSpaceRegion(MemRegionManager *mgr)
15667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, GlobalsSpaceRegionKind) {}
1579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
15867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
15967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == GlobalsSpaceRegionKind;
16067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
16167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
16267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
16367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion {
16467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
16567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
16667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion(MemRegionManager *mgr)
16767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, HeapSpaceRegionKind) {}
16867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
16967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
17067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == HeapSpaceRegionKind;
17167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
17267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
17367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
17467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion {
17567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
17667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *SFC;
1779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
17867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected:
17967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc)
18067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, k), SFC(sfc) {
18167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
18267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
18341168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
18467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
18567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *getStackFrame() const { return SFC; }
18667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
18767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
18867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
18967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
19067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
19167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= StackLocalsSpaceRegionKind &&
19267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek           k <= StackArgumentsSpaceRegionKind;
19367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
19467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
19567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
19667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion {
19767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
19867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
19967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
20067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {}
20167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
20267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
20367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackLocalsSpaceRegionKind;
20467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
20567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
20667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
20767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion {
20867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
20967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
21067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
21167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {}
21267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
21367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
21467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackArgumentsSpaceRegionKind;
2159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
2179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
218993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
219993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
220993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
2219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
2221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const MemRegion* superRegion;
223993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
2249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
2259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
2269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
2279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
2281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
229a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager* getMemRegionManager() const;
2301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2317e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  bool isSubRegionOf(const MemRegion* R) const;
2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
23467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() > END_MEMSPACES;
235993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
236993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
2371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
23919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Auxillary data classes for use with MemRegions.
24019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
24119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
24219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekclass ElementRegion;
2431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekclass RegionRawOffset : public std::pair<const MemRegion*, int64_t> {
24519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekprivate:
24619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  friend class ElementRegion;
24719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
24819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  RegionRawOffset(const MemRegion* reg, int64_t offset = 0)
24919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    : std::pair<const MemRegion*, int64_t>(reg, offset) {}
25019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
2511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
25219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  // FIXME: Eventually support symbolic offsets.
25319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  int64_t getByteOffset() const { return second; }
25419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  const MemRegion *getRegion() const { return first; }
25519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
25619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
25719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  void dump() const;
25819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek};
25919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
26019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
26119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses.
2621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===//
263ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
26482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
26582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
26682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
26782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
26882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
26982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
27082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
27182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* Ex;
27282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
2737ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion *superRegion)
27482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
2751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
2771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const Expr* getExpr() const { return Ex; }
2799852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
2809852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
2819852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
28282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
28382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
28482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,
2857ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                            unsigned Cnt, const MemRegion *superRegion);
2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2878800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
2881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
29082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
29182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
2921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
294993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
295993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
296993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
297993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
2981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
299993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
300a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  virtual QualType getValueType(ASTContext &C) const = 0;
3011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
302ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  virtual QualType getLocationType(ASTContext& C) const {
3036eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can possibly optimize this later to cache this value.
304a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu    return C.getPointerType(getValueType(C));
3056eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
3061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
307a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getDesugaredValueType(ASTContext& C) const {
308a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu    QualType T = getValueType(C);
309bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall    return T.getTypePtr() ? T.getDesugaredType() : T;
31014553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
3111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
312ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  QualType getDesugaredLocationType(ASTContext& C) const {
313bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall    return getLocationType(C).getDesugaredType();
31414553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
3151b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek
316a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  bool isBoundable() const {
317a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    return !getValueType(getContext()).isNull();
31841168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek  }
3196eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
320993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
3219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
32267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS;
3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
326ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
327eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion {
328eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected:
329eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {}
330ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
331a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext &C) const {
332ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    // Do not get the object type of a CodeTextRegion.
333ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    assert(0);
334ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    return QualType();
335ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
336eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
337eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  bool isBoundable() const { return false; }
338eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
339eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
340eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    Kind k = R->getKind();
341eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return k >= FunctionTextRegionKind && k <= BlockTextRegionKind;
342eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
343eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
344ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
345eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function.
346eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion {
347eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const FunctionDecl *FD;
348eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic:
349eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  FunctionTextRegion(const FunctionDecl* fd, const MemRegion* sreg)
350eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {}
351eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
352ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  QualType getLocationType(ASTContext &C) const {
353abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek    return C.getPointerType(FD->getType());
354ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
355eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
356abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  const FunctionDecl *getDecl() const {
357abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek    return FD;
35872e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  }
359eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
3608800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  virtual void dumpToStream(llvm::raw_ostream& os) const;
361eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
362ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
363eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
364abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD,
365abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek                            const MemRegion*);
366eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
367ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static bool classof(const MemRegion* R) {
368eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == FunctionTextRegionKind;
369eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
370eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
371eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
372eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
373eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures).
3740a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
3750a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
3760a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
3770a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
3780a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
379eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion {
38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
38167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
382eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *BD;
38367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  AnalysisContext *AC;
384eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CanQualType locTy;
38567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
38667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockTextRegion(const BlockDecl *bd, CanQualType lTy,
38767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                  AnalysisContext *ac, const MemRegion* sreg)
38867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {}
38967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
39067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
391eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  QualType getLocationType(ASTContext &C) const {
392eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return locTy;
393eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
394eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
395eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *getDecl() const {
396eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return BD;
397eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
39867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
39967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  AnalysisContext *getAnalysisContext() const { return AC; }
400eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
401eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  virtual void dumpToStream(llvm::raw_ostream& os) const;
402eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
403eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
404eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
405eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD,
40667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            CanQualType, const AnalysisContext*,
40767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const MemRegion*);
408eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
409eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
410eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == BlockTextRegionKind;
411ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
412ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu};
4130a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
4140a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance.
4150a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
4160a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
4170a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
4180a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
4190a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
4200a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents code texts of blocks (closures).
4210a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion {
42267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
4230a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *BC;
42467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const LocationContext *LC; // Can be null */
4254240096011a187807058f887eb81df750ffa17feTed Kremenek  void *ReferencedVars;
42667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
42767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc,
4280a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                  const MemRegion *sreg)
4294240096011a187807058f887eb81df750ffa17feTed Kremenek  : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc), ReferencedVars(0) {}
4300a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
43167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
4320a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *getCodeRegion() const { return BC; }
4334240096011a187807058f887eb81df750ffa17feTed Kremenek
434d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek  const BlockDecl *getDecl() const { return BC->getDecl(); }
435d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek
43681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  class referenced_vars_iterator {
43781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const MemRegion * const *R;
43881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  public:
43981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    explicit referenced_vars_iterator(const MemRegion * const *r) : R(r) {}
44081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
44181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    operator const MemRegion * const *() const {
44281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return R;
44381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
44481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
44581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const VarRegion* operator*() const {
44681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return cast<VarRegion>(*R);
44781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
44881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
44981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator==(const referenced_vars_iterator &I) const {
45081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R == R;
45181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
45281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator!=(const referenced_vars_iterator &I) const {
45381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R != R;
45481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
45581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    referenced_vars_iterator& operator++() {
45681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      ++R;
45781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return *this;
45881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
45981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  };
46081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
4614240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_begin() const;
4624240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_end() const;
4630a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
4640a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  virtual void dumpToStream(llvm::raw_ostream& os) const;
4650a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
4660a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
4670a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
46867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *,
46967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const LocationContext *, const MemRegion *);
4700a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
4710a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  static bool classof(const MemRegion* R) {
4720a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek    return R->getKind() == BlockDataRegionKind;
4730a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  }
4744240096011a187807058f887eb81df750ffa17feTed Kremenekprivate:
4754240096011a187807058f887eb81df750ffa17feTed Kremenek  void LazyInitializeReferencedVars();
4760a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek};
477ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
478026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
479026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  clases, SymbolicRegion represents a region that serves as an alias for
480026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  either a real region, a NULL pointer, etc.  It essentially is used to
481026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  map the concept of symbolic values into the domain of regions.  Symbolic
482026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  regions do not need to be typed.
483e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion {
484026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected:
485026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  const SymbolRef sym;
486026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
487026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic:
4881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SymbolicRegion(const SymbolRef s, const MemRegion* sreg)
489e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek    : SubRegion(sreg, SymbolicRegionKind), sym(s) {}
4901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
491026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  SymbolRef getSymbol() const {
492026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return sym;
493026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
494026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
4959852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
4969852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
497026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
498026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
499250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
500250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            SymbolRef sym,
501250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            const MemRegion* superRegion);
5021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5038800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
5041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
505026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  static bool classof(const MemRegion* R) {
506026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() == SymbolicRegionKind;
507026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
5081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
509026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
510e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
511e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuclass StringRegion : public TypedRegion {
512e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
513e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
514e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
515e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
516250101353b711a409b075f1bc11070dddec7100bTed Kremenek  StringRegion(const StringLiteral* str, const MemRegion* sreg)
517e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    : TypedRegion(sreg, StringRegionKind), Str(str) {}
518e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
519e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
520e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
521e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
522e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
523e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
5246613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
5256613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
5261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
527a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
528ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return Str->getType();
529ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  }
530e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
5310a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu  bool isBoundable() const { return false; }
5320a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
533e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
534e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
535e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
536e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
5378800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
538cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
539e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
540e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
541e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
542e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
543e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
544329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
545329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
546329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
54777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xuclass CompoundLiteralRegion : public TypedRegion {
548329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
549329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
550329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  const CompoundLiteralExpr* CL;
551329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
552329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg)
55377cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
5541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
555329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
556329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const CompoundLiteralExpr* CL,
557329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
558329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
559a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
56077cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu    return C.getCanonicalType(CL->getType());
56177cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
5620a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
5639a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu  bool isBoundable() const { return !CL->isFileScope(); }
5649a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu
565329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
5661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5678800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
568329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
56911a83dc7a9a5738cc0bc76180b508eae896eefa9Ted Kremenek  const CompoundLiteralExpr* getLiteralExpr() const { return CL; }
5701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
571329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
572329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
573329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
574329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
575178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
5769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion {
5779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
5789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Decl* D;
5799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
580993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  DeclRegion(const Decl* d, const MemRegion* sReg, Kind k)
5819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : TypedRegion(sReg, k), D(d) {}
5829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
5839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D,
5849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
5851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
586bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
587bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xu  const Decl* getDecl() const { return D; }
5889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
5891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
590e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
591e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
59267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS;
593e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
5949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
5951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
5979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
598d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
599d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  // Constructors and private methods.
60067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  VarRegion(const VarDecl* vd, const MemRegion* sReg)
60167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
6029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
603250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl* VD,
604d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                            const MemRegion *superRegion) {
6059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
6069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
6071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
608d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
611d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  const VarDecl *getDecl() const { return cast<VarDecl>(D); }
6121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType getValueType(ASTContext& C) const {
6146eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
6156eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    return C.getCanonicalType(getDecl()->getType());
6161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
6171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6188800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
6191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
6219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
6221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
6239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
6249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
6259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
6269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
6279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
628993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  FieldRegion(const FieldDecl* fd, const MemRegion* sReg)
6299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
6309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
6314bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
6321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6338800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
6341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6354bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek  const FieldDecl* getDecl() const { return cast<FieldDecl>(D); }
6361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType getValueType(ASTContext& C) const {
6386eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
639e70559fd25bfd1970a82086c5f99cf9ef181b1aeZhongxing Xu    return C.getCanonicalType(getDecl()->getType());
6401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
6414bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
6426304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl* FD,
6436304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
6449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
6459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
6461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
6489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
6499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
6509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
6511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
652a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekclass ObjCObjectRegion : public DeclRegion {
6531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
654a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  friend class MemRegionManager;
6551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
656a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg)
657a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {}
6581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6596304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
6606304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const ObjCInterfaceDecl* ivd,
661a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek                            const MemRegion* superRegion) {
662a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind);
663a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
6641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
665a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenekpublic:
666a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  const ObjCInterfaceDecl* getInterface() const {
667a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return cast<ObjCInterfaceDecl>(D);
668a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
670a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext& C) const {
6713b3a45858c6b2a45114e91902c3bf3c4b7f5f302Daniel Dunbar    return C.getObjCInterfaceType(getInterface());
672a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
6731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
674a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  static bool classof(const MemRegion* R) {
675a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek    return R->getKind() == ObjCObjectRegionKind;
676a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  }
6771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
6781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
6801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
6821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
683993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg)
6849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
6859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
6866304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl* ivd,
6876304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
6889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
6899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
6901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
6929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); }
693a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext&) const { return getDecl()->getType(); }
6941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
695bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
6961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
6989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
6999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
7009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
701511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
70227b57063d83b00474d7563fb5d608544e2364862Zhongxing Xuclass ElementRegion : public TypedRegion {
703511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
704511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
705f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType ElementType;
706511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  SVal Index;
707511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
708f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ElementRegion(QualType elementType, SVal Idx, const MemRegion* sReg)
709f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    : TypedRegion(sReg, ElementRegionKind),
710f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek      ElementType(elementType), Index(Idx) {
7113d8173c1c68f451c7492f92023d829c626845925Chris Lattner    assert((!isa<nonloc::ConcreteInt>(&Idx) ||
7123d8173c1c68f451c7492f92023d829c626845925Chris Lattner           cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) &&
71343b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
7140395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
7151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
716f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType,
717f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek                            SVal Idx, const MemRegion* superRegion);
718511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
719511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
720511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
7216e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu  SVal getIndex() const { return Index; }
7226e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
723a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  QualType getValueType(ASTContext&) const {
724f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
725f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  }
7261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
727f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType getElementType() const {
728f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
729abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
7301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  RegionRawOffset getAsRawOffset() const;
7321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7338800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dumpToStream(llvm::raw_ostream& os) const;
734b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
735511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
736511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
737511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
738511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
739511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
740511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
74119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
742ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy>
743ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const {
744f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  if (const RegionTy* RT = dyn_cast<RegionTy>(this))
745f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek    return RT;
7461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
747f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  return NULL;
748ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}
749511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
7509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
7519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
7529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
7539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
7549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
755a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &C;
7569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
7579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
7581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  GlobalsSpaceRegion *globals;
76067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackLocalsSpaceRegion *stackLocals;
76167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackArgumentsSpaceRegion *stackArguments;
76267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion *heap;
763d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *unknown;
764d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *code;
765dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
7669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
767a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a)
76867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : C(c), A(a), globals(0), stackLocals(0), stackArguments(0), heap(0),
769d05552a21377f493c882298c59e8829040b01d34Ted Kremenek      unknown(0), code(0) {}
7701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7714240096011a187807058f887eb81df750ffa17feTed Kremenek  ~MemRegionManager();
7721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
773a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &getContext() { return C; }
7744240096011a187807058f887eb81df750ffa17feTed Kremenek
7754240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &getAllocator() { return A; }
7761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getStackLocalsRegion - Retrieve the memory region associated with the
77867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  specified stack frame.
77967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackLocalsSpaceRegion *
78067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackLocalsRegion(const StackFrameContext *STC);
781d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
782d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  /// getStackArgumentsRegion - Retrieve the memory region associated with
78367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  function/method arguments of the specified stack frame.
78467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackArgumentsSpaceRegion *
78567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackArgumentsRegion(const StackFrameContext *STC);
7861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
7889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  all global variables.
78967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const GlobalsSpaceRegion *getGlobalsRegion();
7901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
7929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
79367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const HeapSpaceRegion *getHeapRegion();
794178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
795178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
796178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
797b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getUnknownRegion();
798c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
799b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getCodeRegion();
800ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
8017090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
80267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const AllocaRegion *getAllocaRegion(const Expr* Ex, unsigned Cnt,
80367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                      const LocationContext *LC);
8041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
805329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
806329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
807b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const CompoundLiteralRegion*
80867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr* CL,
80967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                           const LocationContext *LC);
8101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
811993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  /// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
812b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const SymbolicRegion* getSymbolicRegion(SymbolRef sym);
813e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
814b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const StringRegion* getStringRegion(const StringLiteral* Str);
815e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
8169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
817d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  ///  a specified VarDecl and LocationContext.
818b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC);
8191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
82067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
82167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  a specified VarDecl and super region.
82267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR);
82367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
824f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  /// getElementRegion - Retrieve the memory region associated with the
825f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ///  associated element type, index, and super region.
826b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ElementRegion *getElementRegion(QualType elementType, SVal Idx,
827d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                                  const MemRegion *superRegion,
828d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                                  ASTContext &Ctx);
8291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
830b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER,
831a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek                                           const MemRegion *superRegion) {
832a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getElementRegion(ER->getElementType(), ER->getIndex(),
833a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek                            superRegion, ER->getContext());
834a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
835511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
8369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
8379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
8389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
8399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
840b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegion(const FieldDecl* fd,
841b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                    const MemRegion* superRegion);
8421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
843b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR,
844b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                             const MemRegion *superRegion) {
845a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getFieldRegion(FR->getDecl(), superRegion);
846a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
8471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
848a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  /// getObjCObjectRegion - Retrieve or create the memory region associated with
849a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek  ///  the instance of a specified Objective-C class.
850b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID,
851b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                              const MemRegion* superRegion);
8521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
8549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
8559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
8569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
857b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl* ivd,
858b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                          const MemRegion* superRegion);
8591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
860b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD);
861b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD,
86267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            CanQualType locTy,
86367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            AnalysisContext *AC);
86467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
86567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getBlockDataRegion - Get the memory region associated with an instance
86667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  of a block.  Unlike many other MemRegions, the LocationContext*
86767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  argument is allowed to be NULL for cases where we have no known
86867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  context.
869b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc,
87067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            const LocationContext *lc = NULL);
8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
872bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  bool isGlobalsRegion(const MemRegion* R) {
873bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    assert(R);
874bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    return R == globals;
875bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
876bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
877bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate:
878250101353b711a409b075f1bc11070dddec7100bTed Kremenek  template <typename RegionTy, typename A1>
879250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* getRegion(const A1 a1);
8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8816304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  template <typename RegionTy, typename A1>
882eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion);
8831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8847ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  template <typename RegionTy, typename A1, typename A2>
8857ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* getRegion(const A1 a1, const A2 a2);
886dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
8870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  template <typename RegionTy, typename A1, typename A2>
8880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2,
8890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                         const MemRegion* superRegion);
8900a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
89167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename RegionTy, typename A1, typename A2, typename A3>
89267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3,
89367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                         const MemRegion* superRegion);
89467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
89567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG>
89667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region);
89767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
89867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG, typename ARG>
89967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region, ARG a);
900ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek};
9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
902250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
903a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions.
904250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
905250101353b711a409b075f1bc11070dddec7100bTed Kremenek
906a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekinline ASTContext& MemRegion::getContext() const {
907a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  return getMemRegionManager()->getContext();
908a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
909eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
910be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace
9119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
912250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
913250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions.
914250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
915250101353b711a409b075f1bc11070dddec7100bTed Kremenek
916be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm {
9178800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekstatic inline raw_ostream& operator<<(raw_ostream& os,
9181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                      const clang::MemRegion* R) {
9198800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  R->dumpToStream(os);
9208800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  return os;
921be91224894e1501133e224934285ba6440bf5b59Ted Kremenek}
922be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace
9239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
925