MemRegion.h revision 824e07ac8f5c9efdddb4254de0203b9675b1ef0b
19e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//== MemRegion.h - Abstract memory regions for static analysis --*- C++ -*--==//
29e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
39e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//                     The LLVM Compiler Infrastructure
49e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
59e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// This file is distributed under the University of Illinois Open Source
69e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// License. See LICENSE.TXT for details.
79e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
89e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
99e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  This file defines MemRegion and its subclasses.  MemRegion defines a
119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  partially-typed abstraction of memory useful for path-sensitive dataflow
129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//  analyses.
139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//
149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
165a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#ifndef LLVM_CLANG_GR_MEMREGION_H
175a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#define LLVM_CLANG_GR_MEMREGION_H
189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
19478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer#include "clang/AST/ASTContext.h"
209ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck#include "clang/AST/CharUnits.h"
21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "clang/AST/Decl.h"
224c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek#include "clang/AST/ExprObjC.h"
23d47d3b0cfeb7e8564ff77f48130fe63282b6d127Chris Lattner#include "clang/Basic/LLVM.h"
249b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
259c1845dbed9817520f5a7db8bd80a560c6c6ae6bArgyrios Kyrtzidis#include "llvm/Support/ErrorHandling.h"
269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h"
279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string>
289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
295e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramernamespace llvm {
305e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass BumpPtrAllocator;
315e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer}
329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang {
341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekclass LocationContext;
3667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackFrameContext;
375a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
389ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento {
395a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemRegionManager;
415a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass MemSpaceRegion;
42c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenekclass SValBuilder;
434240096011a187807058f887eb81df750ffa17feTed Kremenekclass VarRegion;
44dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass CodeTextRegion;
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu/// Represent a region's offset within the top level base region.
47e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xuclass RegionOffset {
48e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The base region.
49e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *R;
50e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
51e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// The bit offset within the base region. It shouldn't be negative.
52e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t Offset;
53e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xupublic:
55824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  enum { Symbolic = INT64_MAX };
56824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
57e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  RegionOffset() : R(0) {}
58e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  RegionOffset(const MemRegion *r, int64_t off) : R(r), Offset(off) {}
59e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
60e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *getRegion() const { return R; }
61824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
62824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  bool hasSymbolicOffset() const { return Offset == Symbolic; }
63824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
64824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  int64_t getOffset() const {
65824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose    assert(!hasSymbolicOffset());
66824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose    return Offset;
67824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  }
68e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
69e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  bool isValid() const { return R; }
70e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu};
71e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
7219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
7319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// Base region classes.
7419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions.
779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode {
784240096011a187807058f887eb81df750ffa17feTed Kremenek  friend class MemRegionManager;
799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
8067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  enum Kind {
8167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Memory spaces.
82dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    GenericMemSpaceRegionKind,
8367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackLocalsSpaceRegionKind,
8467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StackArgumentsSpaceRegionKind,
8567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    HeapSpaceRegionKind,
862b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    UnknownSpaceRegionKind,
87dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticGlobalSpaceRegionKind,
88eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalInternalSpaceRegionKind,
89eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalSystemSpaceRegionKind,
90eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    GlobalImmutableSpaceRegionKind,
91eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    BEG_NON_STATIC_GLOBAL_MEMSPACES = GlobalInternalSpaceRegionKind,
92eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_NON_STATIC_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind,
93eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    BEG_GLOBAL_MEMSPACES = StaticGlobalSpaceRegionKind,
94eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_GLOBAL_MEMSPACES = GlobalImmutableSpaceRegionKind,
95dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    BEG_MEMSPACES = GenericMemSpaceRegionKind,
96eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    END_MEMSPACES = GlobalImmutableSpaceRegionKind,
9767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Untyped regions.
9867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    SymbolicRegionKind,
9967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    AllocaRegionKind,
1009697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    BlockDataRegionKind,
10167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Typed regions.
10267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_TYPED_REGIONS,
10367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FunctionTextRegionKind = BEG_TYPED_REGIONS,
10467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BlockTextRegionKind,
1059697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    BEG_TYPED_VALUE_REGIONS,
1069697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    CompoundLiteralRegionKind = BEG_TYPED_VALUE_REGIONS,
107de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    CXXThisRegionKind,
10867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    StringRegionKind,
1094c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    ObjCStringRegionKind,
11067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ElementRegionKind,
11167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // Decl Regions.
11267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BEG_DECL_REGIONS,
11367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    VarRegionKind = BEG_DECL_REGIONS,
11467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    FieldRegionKind,
11567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    ObjCIvarRegionKind,
1164fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    END_DECL_REGIONS = ObjCIvarRegionKind,
11702fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    CXXTempObjectRegionKind,
1184fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    CXXBaseObjectRegionKind,
119096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose    END_TYPED_VALUE_REGIONS = CXXBaseObjectRegionKind,
120096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose    END_TYPED_REGIONS = CXXBaseObjectRegionKind
12167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  };
12267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate:
1249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const Kind kind;
1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
1279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  MemRegion(Kind k) : kind(k) {}
1289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual ~MemRegion();
1299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
131a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek  ASTContext &getContext() const;
1321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0;
134a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
135a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  virtual MemRegionManager* getMemRegionManager() const = 0;
136a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
137bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemSpaceRegion *getMemorySpace() const;
1381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
139adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *getBaseRegion() const;
140adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
141479529e679957fbb92b56e116e3c86734429331eZhongxing Xu  const MemRegion *StripCasts() const;
1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1431508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek  bool hasGlobalsOrParametersStorage() const;
1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
145de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackStorage() const;
146de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
147de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackNonParametersStorage() const;
148de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
149de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  bool hasStackParametersStorage() const;
150b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
151e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  /// Compute the offset within the top level memory object.
152e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  RegionOffset getAsOffset() const;
153e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1543d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief Get a string representation of a region for debug use.
1553d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  std::string getString() const;
1563d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
1579c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
1587f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
1598800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  void dump() const;
1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
161919e8a1c6698bfa6848571d366430126bced727dJordan Rose  /// \brief Returns true if this region can be printed in a user-friendly way.
162919e8a1c6698bfa6848571d366430126bced727dJordan Rose  virtual bool canPrintPretty() const;
163919e8a1c6698bfa6848571d366430126bced727dJordan Rose
1643d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  /// \brief Print the region for use in diagnostics.
165919e8a1c6698bfa6848571d366430126bced727dJordan Rose  virtual void printPretty(raw_ostream &os) const;
1663d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
1671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Kind getKind() const { return kind; }
1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
169ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  template<typename RegionTy> const RegionTy* getAs() const;
1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
171f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu  virtual bool isBoundable() const { return false; }
172b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
1739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion*) { return true; }
1749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
176eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// MemSpaceRegion - A memory region that represents a "memory space";
1779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek///  for example, the set of global variables, the stack frame, etc.
1789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion {
179a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekprotected:
18067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
18167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
182a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager *Mgr;
183a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
18467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemSpaceRegion(MemRegionManager *mgr, Kind k = GenericMemSpaceRegionKind)
18567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemRegion(k), Mgr(mgr) {
18667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
18767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
18867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
18967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  MemRegionManager* getMemRegionManager() const { return Mgr; }
1901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
19267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  bool isBoundable() const { return false; }
19367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
19467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
19567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
19667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
19767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
19867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_MEMSPACES && k <= END_MEMSPACES;
199a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  }
20067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
20167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
20267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass GlobalsSpaceRegion : public MemSpaceRegion {
20399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
204dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekprotected:
205dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  GlobalsSpaceRegion(MemRegionManager *mgr, Kind k)
206dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : MemSpaceRegion(mgr, k) {}
207dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
208dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
209dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    Kind k = R->getKind();
210dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return k >= BEG_GLOBAL_MEMSPACES && k <= END_GLOBAL_MEMSPACES;
211dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
212dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
213eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
214914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region of the static variables within the current CodeTextRegion
215eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// scope.
216914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie///
217eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// Currently, only the static locals are placed there, so we know that these
218eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// variables do not get invalidated by calls to other functions.
219dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass StaticGlobalSpaceRegion : public GlobalsSpaceRegion {
22067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
221a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
222dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *CR;
223dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
224dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  StaticGlobalSpaceRegion(MemRegionManager *mgr, const CodeTextRegion *cr)
225dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    : GlobalsSpaceRegion(mgr, StaticGlobalSpaceRegionKind), CR(cr) {}
226dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
227dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekpublic:
228dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
229dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2309c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
231fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
232dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  const CodeTextRegion *getCodeRegion() const { return CR; }
233dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
234dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  static bool classof(const MemRegion *R) {
235dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R->getKind() == StaticGlobalSpaceRegionKind;
236dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  }
237dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek};
238eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
239914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region for all the non-static global variables.
240eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks///
241eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// This class is further split into subclasses for efficient implementation of
242eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// invalidating a set of related global values as is done in
243eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// RegionStoreManager::invalidateRegions (instead of finding all the dependent
244eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// globals, we invalidate the whole parent region).
245dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekclass NonStaticGlobalSpaceRegion : public GlobalsSpaceRegion {
246dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  friend class MemRegionManager;
247dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
248eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksprotected:
249eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  NonStaticGlobalSpaceRegion(MemRegionManager *mgr, Kind k)
250eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : GlobalsSpaceRegion(mgr, k) {}
251dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
253fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
25467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
255eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    Kind k = R->getKind();
256eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return k >= BEG_NON_STATIC_GLOBAL_MEMSPACES &&
257eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks           k <= END_NON_STATIC_GLOBAL_MEMSPACES;
25867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
25967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
260eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
261914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are defined in system/external
262eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// headers and are considered modifiable by system calls (ex: errno).
263eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalSystemSpaceRegion : public NonStaticGlobalSpaceRegion {
264eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
265eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
266eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalSystemSpaceRegion(MemRegionManager *mgr)
267eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalSystemSpaceRegionKind) {}
268eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
269eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
270eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
271eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
272eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
273eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
274eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalSystemSpaceRegionKind;
275eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
276eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
277eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
278914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which are considered not to be modified
279eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// or point to data which could be modified as a result of a function call
280eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// (system or internal). Ex: Const global scalars would be modeled as part of
281eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// this region. This region also includes most system globals since they have
282eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// low chance of being modified.
283eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalImmutableSpaceRegion : public NonStaticGlobalSpaceRegion {
284eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
285eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
286eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalImmutableSpaceRegion(MemRegionManager *mgr)
287eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalImmutableSpaceRegionKind) {}
288eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
289eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
290eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
291eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
292eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
293eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
294eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalImmutableSpaceRegionKind;
295eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
296eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
297eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
298914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie/// \brief The region containing globals which can be modified by calls to
299eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// "internally" defined functions - (for now just) functions other then system
300eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks/// calls.
301eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksclass GlobalInternalSpaceRegion : public NonStaticGlobalSpaceRegion {
302eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  friend class MemRegionManager;
303eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
304eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalInternalSpaceRegion(MemRegionManager *mgr)
305eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : NonStaticGlobalSpaceRegion(mgr, GlobalInternalSpaceRegionKind) {}
306eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
307eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakspublic:
308eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
309eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  void dumpToStream(raw_ostream &os) const;
310eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
311eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  static bool classof(const MemRegion *R) {
312eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return R->getKind() == GlobalInternalSpaceRegionKind;
313eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
314eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks};
315eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
31667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass HeapSpaceRegion : public MemSpaceRegion {
31799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
31867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
31967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
32067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion(MemRegionManager *mgr)
32167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, HeapSpaceRegionKind) {}
32267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
32336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
32436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
32536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
32667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
32767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == HeapSpaceRegionKind;
32867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
32967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
33067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
3312b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekclass UnknownSpaceRegion : public MemSpaceRegion {
33299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
3332b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  friend class MemRegionManager;
3342b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion(MemRegionManager *mgr)
3352b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {}
3362b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenekpublic:
33736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
33836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
33936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
3402b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  static bool classof(const MemRegion *R) {
3412b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    return R->getKind() == UnknownSpaceRegionKind;
3422b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  }
3432b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek};
3442b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
34567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackSpaceRegion : public MemSpaceRegion {
34667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
34767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *SFC;
3489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
34967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprotected:
35067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackSpaceRegion(MemRegionManager *mgr, Kind k, const StackFrameContext *sfc)
35167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : MemSpaceRegion(mgr, k), SFC(sfc) {
35267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(classof(this));
35367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
35441168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
35567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
35667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *getStackFrame() const { return SFC; }
35767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
35867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
35967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
36067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
36167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Kind k = R->getKind();
36267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= StackLocalsSpaceRegionKind &&
36367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek           k <= StackArgumentsSpaceRegionKind;
36467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
36567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
36667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
36767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackLocalsSpaceRegion : public StackSpaceRegion {
36899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
36967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
37067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
37167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {}
37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
37336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
37436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
37536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
37667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
37767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackLocalsSpaceRegionKind;
37867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
37967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek};
38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
38167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekclass StackArgumentsSpaceRegion : public StackSpaceRegion {
38267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekprivate:
38399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
38467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
38567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
38667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {}
38767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
38836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
38936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  void dumpToStream(raw_ostream &os) const;
39036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
39167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static bool classof(const MemRegion *R) {
39267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() == StackArgumentsSpaceRegionKind;
3939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
3949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
3959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3967caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
397993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// SubRegion - A region that subsets another larger region.  Most regions
398993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek///  are subclasses of SubRegion.
399993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass SubRegion : public MemRegion {
40099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikieprivate:
40199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
4029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
4031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const MemRegion* superRegion;
404993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
4059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
4069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  const MemRegion* getSuperRegion() const {
4079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return superRegion;
4089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  /// getExtent - Returns the size of the region in bytes.
411c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  virtual DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const {
41232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    return UnknownVal();
41332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  }
41432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
415a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager* getMemRegionManager() const;
4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4177e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  bool isSubRegionOf(const MemRegion* R) const;
4181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
42067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return R->getKind() > END_MEMSPACES;
421993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  }
422993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek};
4231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek//===----------------------------------------------------------------------===//
42519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// MemRegion subclasses.
4261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//===----------------------------------------------------------------------===//
427ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
42882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek/// AllocaRegion - A region that represents an untyped blob of bytes created
42982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek///  by a call to 'alloca'.
43082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass AllocaRegion : public SubRegion {
43182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  friend class MemRegionManager;
43282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekprotected:
43382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
43482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                // memory allocated by alloca at the same call site.
4359c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Expr *Ex;
43682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
4379c378f705405d37f49795d5e915989de774fe11fTed Kremenek  AllocaRegion(const Expr *ex, unsigned cnt, const MemRegion *superRegion)
43882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
4391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekpublic:
4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4429c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Expr *getExpr() const { return Ex; }
4439852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
4449852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
4459852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
446c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
44732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
44882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
44982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
4509c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr *Ex,
4517ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                            unsigned Cnt, const MemRegion *superRegion);
4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4539c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
4541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  static bool classof(const MemRegion* R) {
45682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek    return R->getKind() == AllocaRegionKind;
45782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  }
4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
4591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
460993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// TypedRegion - An abstract class representing regions that are typed.
461993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekclass TypedRegion : public SubRegion {
46299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
46399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
464993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekprotected:
465993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
4661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
467993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekpublic:
4689697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  virtual QualType getLocationType() const = 0;
4699697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4709697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  QualType getDesugaredLocationType(ASTContext &Context) const {
4719697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return getLocationType().getDesugaredType(Context);
4729697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
4739697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4749697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  bool isBoundable() const { return true; }
4759697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4769697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  static bool classof(const MemRegion* R) {
4779697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    unsigned k = R->getKind();
4789697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return k >= BEG_TYPED_REGIONS && k <= END_TYPED_REGIONS;
4799697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  }
4809697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek};
4819697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4829697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek/// TypedValueRegion - An abstract class representing regions having a typed value.
4839697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass TypedValueRegion : public TypedRegion {
48499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
48599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
4869697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekprotected:
4879697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {}
4889697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek
4899697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekpublic:
490018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getValueType() const = 0;
4911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
492018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  virtual QualType getLocationType() const {
4936eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can possibly optimize this later to cache this value.
494a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    QualType T = getValueType();
495a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    ASTContext &ctx = getContext();
496a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    if (T->getAs<ObjCObjectType>())
497a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek      return ctx.getObjCObjectPointerType(T);
498a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek    return ctx.getPointerType(getValueType());
4996eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  }
5001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50149f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall  QualType getDesugaredValueType(ASTContext &Context) const {
502018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    QualType T = getValueType();
5031ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor    return T.getTypePtrOrNull() ? T.getDesugaredType(Context) : T;
50414553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  }
5051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
506e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
507e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
508993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  static bool classof(const MemRegion* R) {
5099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    unsigned k = R->getKind();
5109697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    return k >= BEG_TYPED_VALUE_REGIONS && k <= END_TYPED_VALUE_REGIONS;
5119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
5129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
5139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
514ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
515eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass CodeTextRegion : public TypedRegion {
51699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
51799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
518eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekprotected:
519eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {}
520ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xupublic:
521eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  bool isBoundable() const { return false; }
522eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
523eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
524eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    Kind k = R->getKind();
525eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return k >= FunctionTextRegionKind && k <= BlockTextRegionKind;
526eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
527eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
528ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
529eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// FunctionTextRegion - A region that represents code texts of function.
530eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass FunctionTextRegion : public CodeTextRegion {
531eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const FunctionDecl *FD;
532eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekpublic:
5339c378f705405d37f49795d5e915989de774fe11fTed Kremenek  FunctionTextRegion(const FunctionDecl *fd, const MemRegion* sreg)
534eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    : CodeTextRegion(sreg, FunctionTextRegionKind), FD(fd) {}
535eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
536018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getLocationType() const {
537018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getContext().getPointerType(FD->getType());
538ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
539eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
540abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  const FunctionDecl *getDecl() const {
541abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek    return FD;
54272e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek  }
543eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
5449c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
545eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
546ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
547eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
548abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FunctionDecl *FD,
549abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek                            const MemRegion*);
550eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
551ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  static bool classof(const MemRegion* R) {
552eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == FunctionTextRegionKind;
553eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
554eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek};
555eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
556eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
557eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek/// BlockTextRegion - A region that represents code texts of blocks (closures).
5580a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
5590a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
5600a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
5610a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
5620a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
563eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekclass BlockTextRegion : public CodeTextRegion {
56467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
56567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
566eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *BD;
5671d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *AC;
568eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  CanQualType locTy;
56967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
57067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockTextRegion(const BlockDecl *bd, CanQualType lTy,
5711d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                  AnalysisDeclContext *ac, const MemRegion* sreg)
57267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : CodeTextRegion(sreg, BlockTextRegionKind), BD(bd), AC(ac), locTy(lTy) {}
57367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
57467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekpublic:
575018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getLocationType() const {
576eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return locTy;
577eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
578eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
579eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  const BlockDecl *getDecl() const {
580eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return BD;
581eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  }
58267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
5831d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *getAnalysisDeclContext() const { return AC; }
584eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
5859c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
586eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
587eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
588eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
589eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const BlockDecl *BD,
5901d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                            CanQualType, const AnalysisDeclContext*,
59167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const MemRegion*);
592eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
593eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  static bool classof(const MemRegion* R) {
594eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    return R->getKind() == BlockTextRegionKind;
595ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  }
596ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu};
5970a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
5980a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek/// BlockDataRegion - A region that represents a block instance.
5990a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  Blocks are represented with two kinds of regions.  BlockTextRegions
6000a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  represent the "code", while BlockDataRegions represent instances of blocks,
6010a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  which correspond to "code+data".  The distinction is important, because
6020a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  like a closure a block captures the values of externally referenced
6030a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek///  variables.
6040a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekclass BlockDataRegion : public SubRegion {
60567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  friend class MemRegionManager;
6060a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *BC;
60767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const LocationContext *LC; // Can be null */
6084240096011a187807058f887eb81df750ffa17feTed Kremenek  void *ReferencedVars;
60985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  void *OriginalVars;
61067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
61167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockDataRegion(const BlockTextRegion *bc, const LocationContext *lc,
6120a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                  const MemRegion *sreg)
61385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  : SubRegion(sreg, BlockDataRegionKind), BC(bc), LC(lc),
61485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    ReferencedVars(0), OriginalVars(0) {}
6150a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
61685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenekpublic:
6170a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  const BlockTextRegion *getCodeRegion() const { return BC; }
6184240096011a187807058f887eb81df750ffa17feTed Kremenek
619d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek  const BlockDecl *getDecl() const { return BC->getDecl(); }
620d02e83a548359df978f40cc1a52ffd78b7ef371bTed Kremenek
62181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  class referenced_vars_iterator {
62281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const MemRegion * const *R;
62385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion * const *OriginalR;
62481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  public:
62585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    explicit referenced_vars_iterator(const MemRegion * const *r,
62685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                      const MemRegion * const *originalR)
62785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      : R(r), OriginalR(originalR) {}
62881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
62981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    operator const MemRegion * const *() const {
63081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return R;
63181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
63285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
63385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion *getCapturedRegion() const {
63485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      return *R;
63585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    }
63685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const MemRegion *getOriginalRegion() const {
63785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      return *OriginalR;
63885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    }
63985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
64081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    const VarRegion* operator*() const {
64181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return cast<VarRegion>(*R);
64281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
64381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
64481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator==(const referenced_vars_iterator &I) const {
64581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R == R;
64681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
64781cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    bool operator!=(const referenced_vars_iterator &I) const {
64881cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return I.R != R;
64981cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
6509c378f705405d37f49795d5e915989de774fe11fTed Kremenek    referenced_vars_iterator &operator++() {
65181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      ++R;
65285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      ++OriginalR;
65381cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek      return *this;
65481cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek    }
65581cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  };
65681cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek
6574240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_begin() const;
6584240096011a187807058f887eb81df750ffa17feTed Kremenek  referenced_vars_iterator referenced_vars_end() const;
6590a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6609c378f705405d37f49795d5e915989de774fe11fTed Kremenek  virtual void dumpToStream(raw_ostream &os) const;
6610a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6620a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
6630a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
66467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID&, const BlockTextRegion *,
66567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                            const LocationContext *, const MemRegion *);
6660a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
6670a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  static bool classof(const MemRegion* R) {
6680a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek    return R->getKind() == BlockDataRegionKind;
6690a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  }
6704240096011a187807058f887eb81df750ffa17feTed Kremenekprivate:
6714240096011a187807058f887eb81df750ffa17feTed Kremenek  void LazyInitializeReferencedVars();
6720a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek};
673ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
674026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
675026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  clases, SymbolicRegion represents a region that serves as an alias for
676026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  either a real region, a NULL pointer, etc.  It essentially is used to
677026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  map the concept of symbolic values into the domain of regions.  Symbolic
678026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu///  regions do not need to be typed.
679e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass SymbolicRegion : public SubRegion {
680026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuprotected:
681026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  const SymbolRef sym;
682026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
683026c66395b88a09437319139a43b090093f7e1ddZhongxing Xupublic:
6841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SymbolicRegion(const SymbolRef s, const MemRegion* sreg)
685e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek    : SubRegion(sreg, SymbolicRegionKind), sym(s) {}
6861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
687026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  SymbolRef getSymbol() const {
688026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return sym;
689026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
690026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
6919852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu  bool isBoundable() const { return true; }
6929852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu
693c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
69432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
695026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
696026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
697250101353b711a409b075f1bc11070dddec7100bTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
698250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            SymbolRef sym,
699250101353b711a409b075f1bc11070dddec7100bTed Kremenek                            const MemRegion* superRegion);
7001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7019c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
7021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
703026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  static bool classof(const MemRegion* R) {
704026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu    return R->getKind() == SymbolicRegionKind;
705026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu  }
7061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
707026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
708e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu/// StringRegion - Region associated with a StringLiteral.
7099697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass StringRegion : public TypedValueRegion {
710e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  friend class MemRegionManager;
711e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  const StringLiteral* Str;
712e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xuprotected:
713e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
714250101353b711a409b075f1bc11070dddec7100bTed Kremenek  StringRegion(const StringLiteral* str, const MemRegion* sreg)
7159697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sreg, StringRegionKind), Str(str) {}
716e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
717e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
718e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const StringLiteral* Str,
719e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                            const MemRegion* superRegion);
720e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
721e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xupublic:
7226613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu
7236613d08a19aa6ce9b6330487f3bfac841d4b8a4dZhongxing Xu  const StringLiteral* getStringLiteral() const { return Str; }
7241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
725018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
726ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu    return Str->getType();
727ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  }
728e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
729c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
73032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
7310a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu  bool isBoundable() const { return false; }
7320a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
733e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const {
734e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    ProfileRegion(ID, Str, superRegion);
735e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
736e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
7379c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
738cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
739e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
740e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    return R->getKind() == StringRegionKind;
741e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
742e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu};
7434c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7444c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek/// The region associated with an ObjCStringLiteral.
7454c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekclass ObjCStringRegion : public TypedValueRegion {
7464c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  friend class MemRegionManager;
7474c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringLiteral* Str;
7484c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekprotected:
7494c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7504c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ObjCStringRegion(const ObjCStringLiteral* str, const MemRegion* sreg)
7514c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  : TypedValueRegion(sreg, ObjCStringRegionKind), Str(str) {}
7524c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7534c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
7544c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                            const ObjCStringLiteral* Str,
7554c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                            const MemRegion* superRegion);
7564c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7574c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekpublic:
7584c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7594c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringLiteral* getObjCStringLiteral() const { return Str; }
7604c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7614c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  QualType getValueType() const {
7624c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    return Str->getType();
7634c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7644c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7654c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  bool isBoundable() const { return false; }
7664c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7674c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const {
7684c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    ProfileRegion(ID, Str, superRegion);
7694c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7704c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7714c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  void dumpToStream(raw_ostream &os) const;
7724c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7734c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  static bool classof(const MemRegion* R) {
7744c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek    return R->getKind() == ObjCStringRegionKind;
7754c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  }
7764c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek};
777e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
778329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek/// CompoundLiteralRegion - A memory region representing a compound literal.
779329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   Compound literals are essentially temporaries that are stack allocated
780329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek///   or in the global constant pool.
7819697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CompoundLiteralRegion : public TypedValueRegion {
782329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekprivate:
783329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  friend class MemRegionManager;
7849c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const CompoundLiteralExpr *CL;
785329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
7869c378f705405d37f49795d5e915989de774fe11fTed Kremenek  CompoundLiteralRegion(const CompoundLiteralExpr *cl, const MemRegion* sReg)
7879697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CompoundLiteralRegionKind), CL(cl) {}
7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
789329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID,
7909c378f705405d37f49795d5e915989de774fe11fTed Kremenek                            const CompoundLiteralExpr *CL,
791329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                            const MemRegion* superRegion);
792329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekpublic:
793018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
794018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return CL->getType();
79577cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu  }
7960a51f1c6cec6032bcf64ce205bc4edfdc3cb3a2fZhongxing Xu
7979a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu  bool isBoundable() const { return !CL->isFileScope(); }
7989a08fee80a34938b8c11c7166e009a89ced4c2b4Zhongxing Xu
799329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
8001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8019c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
802329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
8039c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const CompoundLiteralExpr *getLiteralExpr() const { return CL; }
8041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
805329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  static bool classof(const MemRegion* R) {
806329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek    return R->getKind() == CompoundLiteralRegionKind;
807329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  }
808329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek};
809178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
8109697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass DeclRegion : public TypedValueRegion {
8119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected:
8129c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Decl *D;
8139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8149c378f705405d37f49795d5e915989de774fe11fTed Kremenek  DeclRegion(const Decl *d, const MemRegion* sReg, Kind k)
8159697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, k), D(d) {}
8169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8179c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D,
8189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                      const MemRegion* superRegion, Kind k);
8191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
820bfb6582ef46dfb33672d9621f879fc262339d704Zhongxing Xupublic:
8219c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Decl *getDecl() const { return D; }
8229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
8231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
824e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  static bool classof(const MemRegion* R) {
825e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu    unsigned k = R->getKind();
82667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    return k >= BEG_DECL_REGIONS && k <= END_DECL_REGIONS;
827e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  }
8289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
8291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion {
8319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
832d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
833d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  // Constructors and private methods.
8349c378f705405d37f49795d5e915989de774fe11fTed Kremenek  VarRegion(const VarDecl *vd, const MemRegion* sReg)
83567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    : DeclRegion(vd, sReg, VarRegionKind) {}
8369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8379c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const VarDecl *VD,
838d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek                            const MemRegion *superRegion) {
8399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind);
8409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
8411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
842d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  void Profile(llvm::FoldingSetNodeID& ID) const;
8431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
845d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  const VarDecl *getDecl() const { return cast<VarDecl>(D); }
8461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8475348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  const StackFrameContext *getStackFrame() const;
8485348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
849018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
8506eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
851018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
8521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8549c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
8551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
8579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == VarRegionKind;
8581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8593d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
860919e8a1c6698bfa6848571d366430126bced727dJordan Rose  bool canPrintPretty() const;
861919e8a1c6698bfa6848571d366430126bced727dJordan Rose  void printPretty(raw_ostream &os) const;
8629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
863de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
864de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek/// CXXThisRegion - Represents the region for the implicit 'this' parameter
865de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  in a call to a C++ method.  This region doesn't represent the object
866de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek///  referred to by 'this', but rather 'this' itself.
8679697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXThisRegion : public TypedValueRegion {
868de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  friend class MemRegionManager;
869de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  CXXThisRegion(const PointerType *thisPointerTy,
870de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                const MemRegion *sReg)
8719697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXThisRegionKind), ThisPointerTy(thisPointerTy) {}
872de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
873de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
874de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const PointerType *PT,
875de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                            const MemRegion *sReg);
876de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
877de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  void Profile(llvm::FoldingSetNodeID &ID) const;
878de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
879de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekpublic:
880018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
881de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return QualType(ThisPointerTy, 0);
882de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
8837caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
8849c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
885de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
886de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  static bool classof(const MemRegion* R) {
887de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return R->getKind() == CXXThisRegionKind;
888de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
889de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
890de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekprivate:
891de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const PointerType *ThisPointerTy;
892de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek};
8939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion {
8959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
8969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
8979c378f705405d37f49795d5e915989de774fe11fTed Kremenek  FieldRegion(const FieldDecl *fd, const MemRegion* sReg)
8989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    : DeclRegion(fd, sReg, FieldRegionKind) {}
8999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9004bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenekpublic:
9019c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const FieldDecl *getDecl() const { return cast<FieldDecl>(D); }
9021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
903018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
9046eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek    // FIXME: We can cache this if needed.
905018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu    return getDecl()->getType();
9061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
9074bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
908c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal getExtent(SValBuilder &svalBuilder) const;
90932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
9109c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const FieldDecl *FD,
9116304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek                            const MemRegion* superRegion) {
9129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind);
9139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
9169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == FieldRegionKind;
9179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9183d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
9193d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  void dumpToStream(raw_ostream &os) const;
920919e8a1c6698bfa6848571d366430126bced727dJordan Rose
921919e8a1c6698bfa6848571d366430126bced727dJordan Rose  bool canPrintPretty() const;
922919e8a1c6698bfa6848571d366430126bced727dJordan Rose  void printPretty(raw_ostream &os) const;
9239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
9241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion {
9261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  friend class MemRegionManager;
9281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
929c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg);
9309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
9319c378f705405d37f49795d5e915989de774fe11fTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const ObjCIvarDecl *ivd,
932c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer                            const MemRegion* superRegion);
9331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
935c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  const ObjCIvarDecl *getDecl() const;
936c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  QualType getValueType() const;
9371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9389c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
9391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static bool classof(const MemRegion* R) {
9419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return R->getKind() == ObjCIvarRegionKind;
9429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek};
9447caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
945fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// Auxiliary data classes for use with MemRegions.
9467caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu//===----------------------------------------------------------------------===//
9477caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9487caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass ElementRegion;
9497caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9507caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuclass RegionRawOffset {
9517caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuprivate:
9527caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  friend class ElementRegion;
9537caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9547caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *Region;
9559ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits Offset;
9567caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9579ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  RegionRawOffset(const MemRegion* reg, CharUnits offset = CharUnits::Zero())
9587caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu    : Region(reg), Offset(offset) {}
9597caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9607caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xupublic:
9617caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  // FIXME: Eventually support symbolic offsets.
9629ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  CharUnits getOffset() const { return Offset; }
9637caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  const MemRegion *getRegion() const { return Region; }
9647caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9659c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
9667caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  void dump() const;
9677caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu};
968511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
9691437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks/// \brief ElementRegin is used to represent both array elements and casts.
9709697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass ElementRegion : public TypedValueRegion {
971511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  friend class MemRegionManager;
972511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
973f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType ElementType;
97402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc Index;
975511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
97602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  ElementRegion(QualType elementType, NonLoc Idx, const MemRegion* sReg)
9779697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, ElementRegionKind),
978f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek      ElementType(elementType), Index(Idx) {
9793d8173c1c68f451c7492f92023d829c626845925Chris Lattner    assert((!isa<nonloc::ConcreteInt>(&Idx) ||
9803d8173c1c68f451c7492f92023d829c626845925Chris Lattner           cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) &&
98143b28d07019bc78447ecbbb721526de4ffd83f20Chris Lattner           "The index must be signed");
9820395b5d4987fe5baa818015e9d294c128619e4ecZhongxing Xu  }
9831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
984f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType elementType,
985f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek                            SVal Idx, const MemRegion* superRegion);
986511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
987511191ce8920160525611be2be754c32a0724c3eZhongxing Xupublic:
988511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
98902282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  NonLoc getIndex() const { return Index; }
9906e78e1b22f3b16bb2ef76950b9b75f060bdba7bfZhongxing Xu
991018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
992f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
993f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  }
9941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
995f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  QualType getElementType() const {
996f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek    return ElementType;
997abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek  }
9987caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  /// Compute the offset within the array. The array might also be a subobject.
9997caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu  RegionRawOffset getAsArrayOffset() const;
10001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10019c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
1002b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
1003511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  void Profile(llvm::FoldingSetNodeID& ID) const;
1004511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
1005511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  static bool classof(const MemRegion* R) {
1006511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    return R->getKind() == ElementRegionKind;
1007511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
1008511191ce8920160525611be2be754c32a0724c3eZhongxing Xu};
100919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
1010bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu// C++ temporary object associated with an expression.
10119697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXTempObjectRegion : public TypedValueRegion {
1012bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  friend class MemRegionManager;
1013bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1014bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  Expr const *Ex;
1015bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
101602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  CXXTempObjectRegion(Expr const *E, MemRegion const *sReg)
10179697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXTempObjectRegionKind), Ex(E) {}
1018bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1019bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
1020bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu                            Expr const *E, const MemRegion *sReg);
1021bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1022bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xupublic:
1023782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin  const Expr *getExpr() const { return Ex; }
1024782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin
1025018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu  QualType getValueType() const {
1026bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu    return Ex->getType();
1027bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
1028bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
10299c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
1030e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu
1031bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
1032bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
1033bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  static bool classof(const MemRegion* R) {
103402fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    return R->getKind() == CXXTempObjectRegionKind;
1035bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
1036bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu};
1037bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
10384fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// CXXBaseObjectRegion represents a base object within a C++ object. It is
10394fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu// identified by the base class declaration and the region of its parent object.
10409697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekclass CXXBaseObjectRegion : public TypedValueRegion {
10414fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  friend class MemRegionManager;
10424fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10434fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  const CXXRecordDecl *decl;
10444fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10454fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  CXXBaseObjectRegion(const CXXRecordDecl *d, const MemRegion *sReg)
10469697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek    : TypedValueRegion(sReg, CXXBaseObjectRegionKind), decl(d) {}
10474fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10484fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  static void ProfileRegion(llvm::FoldingSetNodeID &ID,
10494fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                            const CXXRecordDecl *decl, const MemRegion *sReg);
10504fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10514fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic:
1052d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  const CXXRecordDecl *getDecl() const { return decl; }
1053d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
10544fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  QualType getValueType() const;
10554fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10569c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void dumpToStream(raw_ostream &os) const;
10574fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10584fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  void Profile(llvm::FoldingSetNodeID &ID) const;
10594fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
10604fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  static bool classof(const MemRegion *region) {
10614fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu    return region->getKind() == CXXBaseObjectRegionKind;
10624fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  }
10634fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu};
10644fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1065ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenektemplate<typename RegionTy>
1066ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenekconst RegionTy* MemRegion::getAs() const {
1067f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  if (const RegionTy* RT = dyn_cast<RegionTy>(this))
1068f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek    return RT;
10691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1070f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek  return NULL;
1071ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek}
1072511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
10739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
10749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions.
10759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
10769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
10779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager {
1078a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &C;
10799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::BumpPtrAllocator& A;
10809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::FoldingSet<MemRegion> Regions;
10811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1082eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalInternalSpaceRegion *InternalGlobals;
1083eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalSystemSpaceRegion *SystemGlobals;
1084eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  GlobalImmutableSpaceRegion *ImmutableGlobals;
1085eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
10862b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
1087c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *>
1088c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackLocalsSpaceRegions;
1089c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *>
1090c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    StackArgumentsSpaceRegions;
1091dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  llvm::DenseMap<const CodeTextRegion *, StaticGlobalSpaceRegion *>
1092dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    StaticsGlobalSpaceRegions;
10932b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
109467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  HeapSpaceRegion *heap;
10952b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  UnknownSpaceRegion *unknown;
1096d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  MemSpaceRegion *code;
1097dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
10989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic:
1099a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a)
1100eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    : C(c), A(a), InternalGlobals(0), SystemGlobals(0), ImmutableGlobals(0),
1101eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      heap(0), unknown(0), code(0) {}
11021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11034240096011a187807058f887eb81df750ffa17feTed Kremenek  ~MemRegionManager();
11041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1105a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  ASTContext &getContext() { return C; }
11064240096011a187807058f887eb81df750ffa17feTed Kremenek
11074240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &getAllocator() { return A; }
11081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
110967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getStackLocalsRegion - Retrieve the memory region associated with the
111067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  specified stack frame.
111167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackLocalsSpaceRegion *
111267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackLocalsRegion(const StackFrameContext *STC);
1113d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
1114d05552a21377f493c882298c59e8829040b01d34Ted Kremenek  /// getStackArgumentsRegion - Retrieve the memory region associated with
111567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  function/method arguments of the specified stack frame.
111667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackArgumentsSpaceRegion *
111767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  getStackArgumentsRegion(const StackFrameContext *STC);
11181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getGlobalsRegion - Retrieve the memory region associated with
1120dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ///  global variables.
1121eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  const GlobalsSpaceRegion *getGlobalsRegion(
1122eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      MemRegion::Kind K = MemRegion::GlobalInternalSpaceRegionKind,
1123eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      const CodeTextRegion *R = 0);
11241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getHeapRegion - Retrieve the memory region associated with the
11269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  generic "heap".
112767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const HeapSpaceRegion *getHeapRegion();
1128178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
1129178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// getUnknownRegion - Retrieve the memory region associated with unknown
1130178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  /// memory space.
1131b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getUnknownRegion();
1132c540b261ac553b91840146eaa3fee3f11b1013a7Zhongxing Xu
1133b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const MemSpaceRegion *getCodeRegion();
1134ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
11357090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  /// getAllocaRegion - Retrieve a region associated with a call to alloca().
11369c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const AllocaRegion *getAllocaRegion(const Expr *Ex, unsigned Cnt,
113767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                      const LocationContext *LC);
11381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1139329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  /// getCompoundLiteralRegion - Retrieve the region associated with a
1140329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ///  given CompoundLiteral.
1141b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const CompoundLiteralRegion*
11429c378f705405d37f49795d5e915989de774fe11fTed Kremenek  getCompoundLiteralRegion(const CompoundLiteralExpr *CL,
114367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                           const LocationContext *LC);
1144de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
1145fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  /// getCXXThisRegion - Retrieve the [artificial] region associated with the
1146de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ///  parameter 'this'.
1147de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const CXXThisRegion *getCXXThisRegion(QualType thisPointerTy,
1148de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                        const LocationContext *LC);
11491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1150e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  /// \brief Retrieve or create a "symbolic" memory region.
1151e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  const SymbolicRegion* getSymbolicRegion(SymbolRef Sym);
1152e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks
1153e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  /// \brief Return a unique symbolic region belonging to heap memory space.
1154e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  const SymbolicRegion *getSymbolicHeapRegion(SymbolRef sym);
1155e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
11564c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const StringRegion *getStringRegion(const StringLiteral* Str);
11574c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
11584c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  const ObjCStringRegion *getObjCStringRegion(const ObjCStringLiteral *Str);
1159e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
11609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
1161d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek  ///  a specified VarDecl and LocationContext.
1162b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const LocationContext *LC);
11631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
116467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getVarRegion - Retrieve or create the memory region associated with
116567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  a specified VarDecl and super region.
116667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const VarRegion* getVarRegion(const VarDecl *D, const MemRegion *superR);
116767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
1168f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  /// getElementRegion - Retrieve the memory region associated with the
1169f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ///  associated element type, index, and super region.
117002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek  const ElementRegion *getElementRegion(QualType elementType, NonLoc Idx,
1171856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        const MemRegion *superRegion,
1172856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                        ASTContext &Ctx);
11731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1174b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const ElementRegion *getElementRegionWithSuper(const ElementRegion *ER,
1175856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                                                 const MemRegion *superRegion) {
1176a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getElementRegion(ER->getElementType(), ER->getIndex(),
1177a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek                            superRegion, ER->getContext());
1178a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
1179511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
11809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getFieldRegion - Retrieve or create the memory region associated with
11819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a specified FieldDecl.  'superRegion' corresponds to the containing
11829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  memory region (which typically represents the memory representing
11839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///  a structure or class).
11849c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const FieldRegion *getFieldRegion(const FieldDecl *fd,
1185b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                    const MemRegion* superRegion);
11861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1187b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FieldRegion *getFieldRegionWithSuper(const FieldRegion *FR,
1188b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                             const MemRegion *superRegion) {
1189a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    return getFieldRegion(FR->getDecl(), superRegion);
1190a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  }
11911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  /// getObjCIvarRegion - Retrieve or create the memory region associated with
11939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   a specified Objective-c instance variable.  'superRegion' corresponds
11949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   to the containing region (which typically represents the Objective-C
11959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ///   object).
11969c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const ObjCIvarRegion *getObjCIvarRegion(const ObjCIvarDecl *ivd,
1197b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                          const MemRegion* superRegion);
11981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
119902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  const CXXTempObjectRegion *getCXXTempObjectRegion(Expr const *Ex,
120002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                                    LocationContext const *LC);
1201bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
12024fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  const CXXBaseObjectRegion *getCXXBaseObjectRegion(const CXXRecordDecl *decl,
12034fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                                                  const MemRegion *superRegion);
12044fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1205d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// Create a CXXBaseObjectRegion with the same CXXRecordDecl but a different
1206d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  /// super region.
1207d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  const CXXBaseObjectRegion *
1208d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  getCXXBaseObjectRegionWithSuper(const CXXBaseObjectRegion *baseReg,
1209d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu                                  const MemRegion *superRegion) {
1210d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu    return getCXXBaseObjectRegion(baseReg->getDecl(), superRegion);
1211d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu  }
1212d074441e027471a914cbb909a7aad1d43224950fZhongxing Xu
1213b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const FunctionTextRegion *getFunctionTextRegion(const FunctionDecl *FD);
1214b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockTextRegion *getBlockTextRegion(const BlockDecl *BD,
121567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            CanQualType locTy,
12161d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                            AnalysisDeclContext *AC);
121767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
121867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  /// getBlockDataRegion - Get the memory region associated with an instance
121967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  of a block.  Unlike many other MemRegions, the LocationContext*
122067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  argument is allowed to be NULL for cases where we have no known
122167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ///  context.
1222b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek  const BlockDataRegion *getBlockDataRegion(const BlockTextRegion *bc,
122367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                            const LocationContext *lc = NULL);
12241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1225bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenekprivate:
1226250101353b711a409b075f1bc11070dddec7100bTed Kremenek  template <typename RegionTy, typename A1>
1227250101353b711a409b075f1bc11070dddec7100bTed Kremenek  RegionTy* getRegion(const A1 a1);
12281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12296304b08daee27b25ae2e2bdb8bffd67dfad74b3cTed Kremenek  template <typename RegionTy, typename A1>
1230eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const MemRegion* superRegion);
12311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12327ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  template <typename RegionTy, typename A1, typename A2>
12337ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  RegionTy* getRegion(const A1 a1, const A2 a2);
1234dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
12350a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  template <typename RegionTy, typename A1, typename A2>
12360a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2,
12370a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                         const MemRegion* superRegion);
12380a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
123967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename RegionTy, typename A1, typename A2, typename A3>
124067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy* getSubRegion(const A1 a1, const A2 a2, const A3 a3,
124167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                         const MemRegion* superRegion);
124267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
124367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG>
124467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region);
124567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
124667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  template <typename REG, typename ARG>
124767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const REG* LazyAllocate(REG*& region, ARG a);
1248ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek};
12491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1250250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1251a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek// Out-of-line member definitions.
1252250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1253250101353b711a409b075f1bc11070dddec7100bTed Kremenek
12549c378f705405d37f49795d5e915989de774fe11fTed Kremenekinline ASTContext &MemRegion::getContext() const {
1255a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  return getMemRegionManager()->getContext();
1256a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
1257eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
12585a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace
12595a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
1260be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end clang namespace
12619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1262250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1263250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Pretty-printing regions.
1264250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1265250101353b711a409b075f1bc11070dddec7100bTed Kremenek
1266be91224894e1501133e224934285ba6440bf5b59Ted Kremeneknamespace llvm {
12679c378f705405d37f49795d5e915989de774fe11fTed Kremenekstatic inline raw_ostream &operator<<(raw_ostream &os,
12689ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek                                      const clang::ento::MemRegion* R) {
12698800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  R->dumpToStream(os);
12708800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  return os;
1271be91224894e1501133e224934285ba6440bf5b59Ted Kremenek}
1272be91224894e1501133e224934285ba6440bf5b59Ted Kremenek} // end llvm namespace
12739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
12749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif
1275