19e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//== MemRegion.cpp - 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
169b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h"
172fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/Attr.h"
18199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck#include "clang/AST/CharUnits.h"
19c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer#include "clang/AST/DeclObjC.h"
207caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu#include "clang/AST/RecordLayout.h"
2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Analysis/AnalysisContext.h"
2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Analysis/Support/BumpVector.h"
23eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks#include "clang/Basic/SourceManager.h"
2455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h"
251309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include "llvm/Support/raw_ostream.h"
269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekusing namespace clang;
289ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenekusing namespace ento;
299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
30250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
31bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek// MemRegion Construction.
32bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek//===----------------------------------------------------------------------===//
33bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
34bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate<typename RegionTy> struct MemRegionManagerTrait;
35bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
36bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1>
37bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getRegion(const A1 a1) {
38dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
39bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion =
40bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1);
41dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
42bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  llvm::FoldingSetNodeID ID;
43bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy::ProfileRegion(ID, a1, superRegion);
449c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
45bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
46bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                                                   InsertPos));
47dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
48bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  if (!R) {
49bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
50bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    new (R) RegionTy(a1, superRegion);
51bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    Regions.InsertNode(R, InsertPos);
52bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
53dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
54bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  return R;
55bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek}
56bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
57bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1>
58bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1,
59bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                         const MemRegion *superRegion) {
60bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  llvm::FoldingSetNodeID ID;
61bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy::ProfileRegion(ID, a1, superRegion);
629c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
63bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
64bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                                                   InsertPos));
65dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
66bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  if (!R) {
67bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
68bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    new (R) RegionTy(a1, superRegion);
69bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    Regions.InsertNode(R, InsertPos);
70bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
71dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
72bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  return R;
73bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek}
74bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
75bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1, typename A2>
76bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getRegion(const A1 a1, const A2 a2) {
77dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
78bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion =
79bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1, a2);
80dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
81bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  llvm::FoldingSetNodeID ID;
82bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy::ProfileRegion(ID, a1, a2, superRegion);
839c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
84bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
85bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                                                   InsertPos));
86dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
87bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  if (!R) {
88bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
89bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    new (R) RegionTy(a1, a2, superRegion);
90bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    Regions.InsertNode(R, InsertPos);
91bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
92dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
93bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  return R;
94bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek}
95bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
96bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1, typename A2>
97bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2,
98bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                         const MemRegion *superRegion) {
99dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
100bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  llvm::FoldingSetNodeID ID;
101bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy::ProfileRegion(ID, a1, a2, superRegion);
1029c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
103bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
104bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                                                   InsertPos));
105dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
106bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  if (!R) {
107bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
108bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    new (R) RegionTy(a1, a2, superRegion);
109bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    Regions.InsertNode(R, InsertPos);
110bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
111dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
112bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  return R;
113bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek}
114bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
11567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename RegionTy, typename A1, typename A2, typename A3>
11667d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2, const A3 a3,
11767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                         const MemRegion *superRegion) {
118dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
11967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  llvm::FoldingSetNodeID ID;
12067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy::ProfileRegion(ID, a1, a2, a3, superRegion);
1219c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
12267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
12367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                                                   InsertPos));
124dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
12567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  if (!R) {
12667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
12767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    new (R) RegionTy(a1, a2, a3, superRegion);
12867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Regions.InsertNode(R, InsertPos);
129bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
130dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
13167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return R;
13267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
133bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
134bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek//===----------------------------------------------------------------------===//
1354240096011a187807058f887eb81df750ffa17feTed Kremenek// Object destruction.
136250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed KremenekMemRegion::~MemRegion() {}
1399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1404240096011a187807058f887eb81df750ffa17feTed KremenekMemRegionManager::~MemRegionManager() {
1414240096011a187807058f887eb81df750ffa17feTed Kremenek  // All regions and their data are BumpPtrAllocated.  No need to call
1424240096011a187807058f887eb81df750ffa17feTed Kremenek  // their destructors.
1434240096011a187807058f887eb81df750ffa17feTed Kremenek}
1444240096011a187807058f887eb81df750ffa17feTed Kremenek
1454240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
1464240096011a187807058f887eb81df750ffa17feTed Kremenek// Basic methods.
1474240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
1484240096011a187807058f887eb81df750ffa17feTed Kremenek
1497e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xubool SubRegion::isSubRegionOf(const MemRegion* R) const {
1507e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  const MemRegion* r = getSuperRegion();
1517e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  while (r != 0) {
1527e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu    if (r == R)
1537e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu      return true;
1547e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu    if (const SubRegion* sr = dyn_cast<SubRegion>(r))
1557e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu      r = sr->getSuperRegion();
1567e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu    else
1577e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu      break;
1587e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  }
1597e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  return false;
1607e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu}
1617e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu
162a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted KremenekMemRegionManager* SubRegion::getMemRegionManager() const {
163a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  const SubRegion* r = this;
164a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  do {
165a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    const MemRegion *superRegion = r->getSuperRegion();
166a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    if (const SubRegion *sr = dyn_cast<SubRegion>(superRegion)) {
167a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek      r = sr;
168a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek      continue;
169a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    }
170a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    return superRegion->getMemRegionManager();
171a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  } while (1);
172a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
173a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
1745348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenekconst StackFrameContext *VarRegion::getStackFrame() const {
1755348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  const StackSpaceRegion *SSR = dyn_cast<StackSpaceRegion>(getMemorySpace());
1765348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  return SSR ? SSR->getStackFrame() : NULL;
1775348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek}
1785348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
1795348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek//===----------------------------------------------------------------------===//
18032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose// Region extents.
18132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose//===----------------------------------------------------------------------===//
18232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
183e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan RoseDefinedOrUnknownSVal TypedValueRegion::getExtent(SValBuilder &svalBuilder) const {
1849c378f705405d37f49795d5e915989de774fe11fTed Kremenek  ASTContext &Ctx = svalBuilder.getContext();
18549f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall  QualType T = getDesugaredValueType(Ctx);
18632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
18752e04c537633377fb14cfa4fa3c95e3e510fc942Jordy Rose  if (isa<VariableArrayType>(T))
188c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek    return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this));
1891acb394679b6e644044a0f6c358229759009b1a6Jordan Rose  if (T->isIncompleteType())
19032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    return UnknownVal();
19132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
19299c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  CharUnits size = Ctx.getTypeSizeInChars(T);
19399c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  QualType sizeTy = svalBuilder.getArrayIndexType();
19499c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  return svalBuilder.makeIntVal(size.getQuantity(), sizeTy);
19532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
19632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
197c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal FieldRegion::getExtent(SValBuilder &svalBuilder) const {
198d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose  // Force callers to deal with bitfields explicitly.
199d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose  if (getDecl()->isBitField())
200d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose    return UnknownVal();
201d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose
202c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal Extent = DeclRegion::getExtent(svalBuilder);
20332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
20432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  // A zero-length array at the end of a struct often stands for dynamically-
20532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  // allocated extra memory.
20632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  if (Extent.isZeroConstant()) {
20749f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall    QualType T = getDesugaredValueType(svalBuilder.getContext());
20832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
20932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    if (isa<ConstantArrayType>(T))
21032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose      return UnknownVal();
21132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  }
21232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
21332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  return Extent;
21432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
21532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
216c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal AllocaRegion::getExtent(SValBuilder &svalBuilder) const {
217c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this));
21832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
21932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
220c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal SymbolicRegion::getExtent(SValBuilder &svalBuilder) const {
221c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this));
22232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
22332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
224c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal StringRegion::getExtent(SValBuilder &svalBuilder) const {
22599c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  return svalBuilder.makeIntVal(getStringLiteral()->getByteLength()+1,
22699c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek                                svalBuilder.getArrayIndexType());
22732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
22832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
229c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin KramerObjCIvarRegion::ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg)
230c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
231c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
232c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramerconst ObjCIvarDecl *ObjCIvarRegion::getDecl() const {
233c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  return cast<ObjCIvarDecl>(D);
234c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer}
235c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
236c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin KramerQualType ObjCIvarRegion::getValueType() const {
237c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  return getDecl()->getType();
238c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer}
239c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
2404fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing XuQualType CXXBaseObjectRegion::getValueType() const {
2414411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  return QualType(getDecl()->getTypeForDecl(), 0);
2424fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
2434fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
24432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose//===----------------------------------------------------------------------===//
2455348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek// FoldingSet profiling.
2465348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek//===----------------------------------------------------------------------===//
2475348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
2489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekvoid MemSpaceRegion::Profile(llvm::FoldingSetNodeID& ID) const {
2499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddInteger((unsigned)getKind());
2509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
2519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
25267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekvoid StackSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const {
25367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ID.AddInteger((unsigned)getKind());
25467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ID.AddPointer(getStackFrame());
25567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
25667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
257dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekvoid StaticGlobalSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const {
258dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ID.AddInteger((unsigned)getKind());
259dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ID.AddPointer(getCodeRegion());
260dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}
261dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid StringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                 const StringLiteral* Str,
264e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                                 const MemRegion* superRegion) {
265e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  ID.AddInteger((unsigned) StringRegionKind);
266e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  ID.AddPointer(Str);
267e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  ID.AddPointer(superRegion);
268e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}
269e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
2704c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekvoid ObjCStringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2714c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                                     const ObjCStringLiteral* Str,
2724c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                                     const MemRegion* superRegion) {
2734c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ID.AddInteger((unsigned) ObjCStringRegionKind);
2744c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ID.AddPointer(Str);
2754c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ID.AddPointer(superRegion);
2764c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}
2774c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
2787090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekvoid AllocaRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2799c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                 const Expr *Ex, unsigned cnt,
280dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks                                 const MemRegion *superRegion) {
2817090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  ID.AddInteger((unsigned) AllocaRegionKind);
2827090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  ID.AddPointer(Ex);
2837090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  ID.AddInteger(cnt);
284dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks  ID.AddPointer(superRegion);
2857090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
2867090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
2877090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekvoid AllocaRegion::Profile(llvm::FoldingSetNodeID& ID) const {
2887ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  ProfileRegion(ID, Ex, Cnt, superRegion);
2897090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
2907090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
291329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekvoid CompoundLiteralRegion::Profile(llvm::FoldingSetNodeID& ID) const {
292329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion::ProfileRegion(ID, CL, superRegion);
293329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
294329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
295329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekvoid CompoundLiteralRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2969c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                          const CompoundLiteralExpr *CL,
297329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                                          const MemRegion* superRegion) {
298329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ID.AddInteger((unsigned) CompoundLiteralRegionKind);
299329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ID.AddPointer(CL);
300329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ID.AddPointer(superRegion);
301329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
302329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
303de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekvoid CXXThisRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
304de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                  const PointerType *PT,
305de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                  const MemRegion *sRegion) {
306de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ID.AddInteger((unsigned) CXXThisRegionKind);
307de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ID.AddPointer(PT);
308de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ID.AddPointer(sRegion);
309de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
310de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
311de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekvoid CXXThisRegion::Profile(llvm::FoldingSetNodeID &ID) const {
312de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  CXXThisRegion::ProfileRegion(ID, ThisPointerTy, superRegion);
313de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
314dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
315c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramervoid ObjCIvarRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
316c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer                                   const ObjCIvarDecl *ivd,
317c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer                                   const MemRegion* superRegion) {
318c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
319c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer}
320c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
3219c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid DeclRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D,
3229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                               const MemRegion* superRegion, Kind k) {
3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddInteger((unsigned) k);
3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddPointer(D);
3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddPointer(superRegion);
3269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
3279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekvoid DeclRegion::Profile(llvm::FoldingSetNodeID& ID) const {
3299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  DeclRegion::ProfileRegion(ID, D, superRegion, getKind());
3309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
3319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
332d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekvoid VarRegion::Profile(llvm::FoldingSetNodeID &ID) const {
33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  VarRegion::ProfileRegion(ID, getDecl(), superRegion);
334d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek}
335d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
336250101353b711a409b075f1bc11070dddec7100bTed Kremenekvoid SymbolicRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym,
337250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                   const MemRegion *sreg) {
338993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ID.AddInteger((unsigned) MemRegion::SymbolicRegionKind);
3396d0e2d2f3c1b6531f303aac7e48aa1eb05900f2aTed Kremenek  ID.Add(sym);
340250101353b711a409b075f1bc11070dddec7100bTed Kremenek  ID.AddPointer(sreg);
341993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
342993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
343993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekvoid SymbolicRegion::Profile(llvm::FoldingSetNodeID& ID) const {
344250101353b711a409b075f1bc11070dddec7100bTed Kremenek  SymbolicRegion::ProfileRegion(ID, sym, getSuperRegion());
345993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
346993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
347f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenekvoid ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                  QualType ElementType, SVal Idx,
349511191ce8920160525611be2be754c32a0724c3eZhongxing Xu                                  const MemRegion* superRegion) {
350511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ID.AddInteger(MemRegion::ElementRegionKind);
351f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ID.Add(ElementType);
352511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ID.AddPointer(superRegion);
353511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  Idx.Profile(ID);
354511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}
355511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
356511191ce8920160525611be2be754c32a0724c3eZhongxing Xuvoid ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const {
357f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ElementRegion::ProfileRegion(ID, ElementType, Index, superRegion);
358511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}
35927b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu
360eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid FunctionTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
3615fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks                                       const NamedDecl *FD,
362eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek                                       const MemRegion*) {
363eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  ID.AddInteger(MemRegion::FunctionTextRegionKind);
364abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  ID.AddPointer(FD);
365ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
366ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
367eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid FunctionTextRegion::Profile(llvm::FoldingSetNodeID& ID) const {
368eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  FunctionTextRegion::ProfileRegion(ID, FD, superRegion);
369eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
370eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
371eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid BlockTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                    const BlockDecl *BD, CanQualType,
3731d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                    const AnalysisDeclContext *AC,
37467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                    const MemRegion*) {
375eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  ID.AddInteger(MemRegion::BlockTextRegionKind);
376eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  ID.AddPointer(BD);
377eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
378eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
379eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid BlockTextRegion::Profile(llvm::FoldingSetNodeID& ID) const {
38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockTextRegion::ProfileRegion(ID, BD, locTy, AC, superRegion);
381ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
382ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
3830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekvoid BlockDataRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
3840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                                    const BlockTextRegion *BC,
3850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                                    const LocationContext *LC,
38667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                    const MemRegion *sReg) {
3870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  ID.AddInteger(MemRegion::BlockDataRegionKind);
3880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  ID.AddPointer(BC);
3890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  ID.AddPointer(LC);
39067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ID.AddPointer(sReg);
3910a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
3920a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
3930a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekvoid BlockDataRegion::Profile(llvm::FoldingSetNodeID& ID) const {
39467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockDataRegion::ProfileRegion(ID, BC, LC, getSuperRegion());
3950a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
3960a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
39702fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuvoid CXXTempObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
39802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                        Expr const *Ex,
39902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                        const MemRegion *sReg) {
400bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  ID.AddPointer(Ex);
401bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  ID.AddPointer(sReg);
402bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}
403bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
40402fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuvoid CXXTempObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const {
405bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  ProfileRegion(ID, Ex, getSuperRegion());
406bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}
407bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
4084fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid CXXBaseObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
4094411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                        const CXXRecordDecl *RD,
4104411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                        bool IsVirtual,
4114411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                        const MemRegion *SReg) {
4124411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  ID.AddPointer(RD);
4134411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  ID.AddBoolean(IsVirtual);
4144411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  ID.AddPointer(SReg);
4154fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
4164fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
4174fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid CXXBaseObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const {
4184411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  ProfileRegion(ID, getDecl(), isVirtual(), superRegion);
4194fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
4204fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
421026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu//===----------------------------------------------------------------------===//
42299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// Region anchors.
42399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
42499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
42599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid GlobalsSpaceRegion::anchor() { }
42699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid HeapSpaceRegion::anchor() { }
42799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UnknownSpaceRegion::anchor() { }
42899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StackLocalsSpaceRegion::anchor() { }
42999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StackArgumentsSpaceRegion::anchor() { }
43099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TypedRegion::anchor() { }
43199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TypedValueRegion::anchor() { }
43299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CodeTextRegion::anchor() { }
43399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid SubRegion::anchor() { }
43499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
43599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
4369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// Region pretty-printing.
4379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
4389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4398800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekvoid MemRegion::dump() const {
4408800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  dumpToStream(llvm::errs());
4417f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek}
4427f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
4439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekstd::string MemRegion::getString() const {
4449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::string s;
4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::raw_string_ostream os(s);
4468800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  dumpToStream(os);
4479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  return os.str();
4489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
4499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4509c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid MemRegion::dumpToStream(raw_ostream &os) const {
4519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  os << "<Unknown Region>";
4529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
4539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4549c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid AllocaRegion::dumpToStream(raw_ostream &os) const {
45531ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky  os << "alloca{" << (const void*) Ex << ',' << Cnt << '}';
4567090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
4577090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
4589c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid FunctionTextRegion::dumpToStream(raw_ostream &os) const {
459abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  os << "code{" << getDecl()->getDeclName().getAsString() << '}';
46072e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek}
46172e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek
4629c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid BlockTextRegion::dumpToStream(raw_ostream &os) const {
46331ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky  os << "block_code{" << (const void*) this << '}';
464eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
465eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
4669c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid BlockDataRegion::dumpToStream(raw_ostream &os) const {
4670a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  os << "block_data{" << BC << '}';
4680a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
4690a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
4709c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid CompoundLiteralRegion::dumpToStream(raw_ostream &os) const {
4715639a3ec15bdbf0b93376bbbae3adaf724f092a7Ted Kremenek  // FIXME: More elaborate pretty-printing.
47231ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky  os << "{ " << (const void*) CL <<  " }";
4739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
4749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4755f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXTempObjectRegion::dumpToStream(raw_ostream &os) const {
476782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin  os << "temp_object{" << getValueType().getAsString() << ','
47731ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky     << (const void*) Ex << '}';
478e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu}
479e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu
4805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXBaseObjectRegion::dumpToStream(raw_ostream &os) const {
4814411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  os << "base{" << superRegion << ',' << getDecl()->getName() << '}';
4824fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
4834fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
4845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXThisRegion::dumpToStream(raw_ostream &os) const {
485de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  os << "this";
486de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
487de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
4889c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid ElementRegion::dumpToStream(raw_ostream &os) const {
48919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  os << "element{" << superRegion << ','
49019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek     << Index << ',' << getElementType().getAsString() << '}';
491993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
492993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
4939c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid FieldRegion::dumpToStream(raw_ostream &os) const {
494b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  os << superRegion << "->" << *getDecl();
4954bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek}
4964bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
4979c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid ObjCIvarRegion::dumpToStream(raw_ostream &os) const {
498b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  os << "ivar{" << superRegion << ',' << *getDecl() << '}';
499bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek}
500bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek
5019c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid StringRegion::dumpToStream(raw_ostream &os) const {
5024e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  Str->printPretty(os, 0, PrintingPolicy(getContext().getLangOpts()));
503b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu}
504b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
5054c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekvoid ObjCStringRegion::dumpToStream(raw_ostream &os) const {
5064e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  Str->printPretty(os, 0, PrintingPolicy(getContext().getLangOpts()));
5074c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}
5084c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
5099c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid SymbolicRegion::dumpToStream(raw_ostream &os) const {
510aef5d2205a4425a4d3e1b0e28d46ed80763651dfTed Kremenek  os << "SymRegion{" << sym << '}';
511329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
512329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
5139c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid VarRegion::dumpToStream(raw_ostream &os) const {
514b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  os << *cast<VarDecl>(D);
515cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu}
516cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
51719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekvoid RegionRawOffset::dump() const {
51819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  dumpToStream(llvm::errs());
51919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
52019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
5219c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid RegionRawOffset::dumpToStream(raw_ostream &os) const {
5229ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  os << "raw_offset{" << getRegion() << ',' << getOffset().getQuantity() << '}';
52319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
52419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
5255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid StaticGlobalSpaceRegion::dumpToStream(raw_ostream &os) const {
526fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek  os << "StaticGlobalsMemSpace{" << CR << '}';
527fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek}
528fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
529eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalInternalSpaceRegion::dumpToStream(raw_ostream &os) const {
530eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  os << "GlobalInternalSpaceRegion";
531eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}
532eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
533eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalSystemSpaceRegion::dumpToStream(raw_ostream &os) const {
534eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  os << "GlobalSystemSpaceRegion";
535eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}
536eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
537eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalImmutableSpaceRegion::dumpToStream(raw_ostream &os) const {
538eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  os << "GlobalImmutableSpaceRegion";
539eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}
540eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
54136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid HeapSpaceRegion::dumpToStream(raw_ostream &os) const {
54236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  os << "HeapSpaceRegion";
54336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose}
54436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
54536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid UnknownSpaceRegion::dumpToStream(raw_ostream &os) const {
54636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  os << "UnknownSpaceRegion";
54736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose}
54836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
54936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid StackArgumentsSpaceRegion::dumpToStream(raw_ostream &os) const {
55036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  os << "StackArgumentsSpaceRegion";
55136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose}
55236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
55336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid StackLocalsSpaceRegion::dumpToStream(raw_ostream &os) const {
55436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  os << "StackLocalsSpaceRegion";
55536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose}
55636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
557919e8a1c6698bfa6848571d366430126bced727dJordan Rosebool MemRegion::canPrintPretty() const {
558716859df842e5a56e816d820d8326ead152dd9e4Anna Zaks  return canPrintPrettyAsExpr();
559919e8a1c6698bfa6848571d366430126bced727dJordan Rose}
560919e8a1c6698bfa6848571d366430126bced727dJordan Rose
56179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksbool MemRegion::canPrintPrettyAsExpr() const {
562716859df842e5a56e816d820d8326ead152dd9e4Anna Zaks  return false;
56379d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks}
56479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks
565919e8a1c6698bfa6848571d366430126bced727dJordan Rosevoid MemRegion::printPretty(raw_ostream &os) const {
5669e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  assert(canPrintPretty() && "This region cannot be printed pretty.");
5679e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  os << "'";
56879d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  printPrettyAsExpr(os);
5699e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  os << "'";
5709e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  return;
5719e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks}
5729e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks
57379d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksvoid MemRegion::printPrettyAsExpr(raw_ostream &os) const {
57479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  llvm_unreachable("This region cannot be printed pretty.");
5753d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  return;
5763d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks}
5773d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
578716859df842e5a56e816d820d8326ead152dd9e4Anna Zaksbool VarRegion::canPrintPrettyAsExpr() const {
579919e8a1c6698bfa6848571d366430126bced727dJordan Rose  return true;
580919e8a1c6698bfa6848571d366430126bced727dJordan Rose}
581919e8a1c6698bfa6848571d366430126bced727dJordan Rose
58279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksvoid VarRegion::printPrettyAsExpr(raw_ostream &os) const {
5833d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  os << getDecl()->getName();
5843d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks}
5853d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
586716859df842e5a56e816d820d8326ead152dd9e4Anna Zaksbool ObjCIvarRegion::canPrintPrettyAsExpr() const {
58743b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek  return true;
58843b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek}
58943b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek
59079d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksvoid ObjCIvarRegion::printPrettyAsExpr(raw_ostream &os) const {
59143b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek  os << getDecl()->getName();
59243b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek}
59343b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek
594919e8a1c6698bfa6848571d366430126bced727dJordan Rosebool FieldRegion::canPrintPretty() const {
5959e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  return true;
5969e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks}
5979e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks
59879d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksbool FieldRegion::canPrintPrettyAsExpr() const {
59979d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  return superRegion->canPrintPrettyAsExpr();
60079d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks}
60179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks
60279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksvoid FieldRegion::printPrettyAsExpr(raw_ostream &os) const {
60379d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  assert(canPrintPrettyAsExpr());
60479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  superRegion->printPrettyAsExpr(os);
60579d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  os << "." << getDecl()->getName();
606919e8a1c6698bfa6848571d366430126bced727dJordan Rose}
607919e8a1c6698bfa6848571d366430126bced727dJordan Rose
608919e8a1c6698bfa6848571d366430126bced727dJordan Rosevoid FieldRegion::printPretty(raw_ostream &os) const {
60979d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  if (canPrintPrettyAsExpr()) {
6109e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks    os << "\'";
61179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks    printPrettyAsExpr(os);
6129e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks    os << "'";
6139e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  } else {
61479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks    os << "field " << "\'" << getDecl()->getName() << "'";
6159e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  }
6169e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  return;
6173d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks}
6183d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
61907d8470effc0b0364801adddb6ff92bd22334402Anna Zaksbool CXXBaseObjectRegion::canPrintPrettyAsExpr() const {
62079d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  return superRegion->canPrintPrettyAsExpr();
62179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks}
62279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks
62307d8470effc0b0364801adddb6ff92bd22334402Anna Zaksvoid CXXBaseObjectRegion::printPrettyAsExpr(raw_ostream &os) const {
62407d8470effc0b0364801adddb6ff92bd22334402Anna Zaks  superRegion->printPrettyAsExpr(os);
62507d8470effc0b0364801adddb6ff92bd22334402Anna Zaks}
62607d8470effc0b0364801adddb6ff92bd22334402Anna Zaks
6279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
6289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager methods.
6299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
63019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
63167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG>
63267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region) {
6331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!region) {
63467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    region = (REG*) A.Allocate<REG>();
63567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    new (region) REG(this);
6369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
637a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
6389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  return region;
6399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
6409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
64167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG, typename ARG>
64267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region, ARG a) {
64367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  if (!region) {
64467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    region = (REG*) A.Allocate<REG>();
64567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    new (region) REG(this, a);
64667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
647dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
64867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return region;
64967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
65067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
65167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackLocalsSpaceRegion*
6522b87ae45e129b941d0a4d221c9d4842385a119bdTed KremenekMemRegionManager::getStackLocalsRegion(const StackFrameContext *STC) {
6532b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  assert(STC);
654c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  StackLocalsSpaceRegion *&R = StackLocalsSpaceRegions[STC];
655c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
656c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  if (R)
657c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    return R;
658c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
659c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  R = A.Allocate<StackLocalsSpaceRegion>();
660c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  new (R) StackLocalsSpaceRegion(this, STC);
661c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  return R;
6629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
6639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
66467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackArgumentsSpaceRegion *
66567d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getStackArgumentsRegion(const StackFrameContext *STC) {
6662b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  assert(STC);
667c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  StackArgumentsSpaceRegion *&R = StackArgumentsSpaceRegions[STC];
668c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
669c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  if (R)
670c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    return R;
671c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
672c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  R = A.Allocate<StackArgumentsSpaceRegion>();
673c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  new (R) StackArgumentsSpaceRegion(this, STC);
674c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  return R;
675d05552a21377f493c882298c59e8829040b01d34Ted Kremenek}
676d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
677dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst GlobalsSpaceRegion
678eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks*MemRegionManager::getGlobalsRegion(MemRegion::Kind K,
679eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks                                    const CodeTextRegion *CR) {
680eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  if (!CR) {
681eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    if (K == MemRegion::GlobalSystemSpaceRegionKind)
682eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      return LazyAllocate(SystemGlobals);
683eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    if (K == MemRegion::GlobalImmutableSpaceRegionKind)
684eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      return LazyAllocate(ImmutableGlobals);
685eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    assert(K == MemRegion::GlobalInternalSpaceRegionKind);
686eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return LazyAllocate(InternalGlobals);
687eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
688dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
689eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  assert(K == MemRegion::StaticGlobalSpaceRegionKind);
690dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  StaticGlobalSpaceRegion *&R = StaticsGlobalSpaceRegions[CR];
691dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  if (R)
692dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R;
693dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
694dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  R = A.Allocate<StaticGlobalSpaceRegion>();
695dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  new (R) StaticGlobalSpaceRegion(this, CR);
696dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  return R;
6979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
6989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
69967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst HeapSpaceRegion *MemRegionManager::getHeapRegion() {
7009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  return LazyAllocate(heap);
7019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
7029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
703b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getUnknownRegion() {
704178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  return LazyAllocate(unknown);
705178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu}
706178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
707b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getCodeRegion() {
708ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  return LazyAllocate(code);
709ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
710ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
711250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
712250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Constructing regions.
713250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
714dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst StringRegion* MemRegionManager::getStringRegion(const StringLiteral* Str){
71567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<StringRegion>(Str, getGlobalsRegion());
716e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}
717e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
7184c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekconst ObjCStringRegion *
7194c62b557e269a27515dfca1f754ae936c8fdb824Ted KremenekMemRegionManager::getObjCStringRegion(const ObjCStringLiteral* Str){
7204c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  return getSubRegion<ObjCStringRegion>(Str, getGlobalsRegion());
7214c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}
7224c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7237fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// Look through a chain of LocationContexts to either find the
7247fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// StackFrameContext that matches a DeclContext, or find a VarRegion
7257fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// for a variable captured by a block.
7267fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenekstatic llvm::PointerUnion<const StackFrameContext *, const VarRegion *>
7277fa9b4f258636d89342eda28f21a986c8ac353b1Ted KremenekgetStackOrCaptureRegionForDeclContext(const LocationContext *LC,
7287fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek                                      const DeclContext *DC,
7297fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek                                      const VarDecl *VD) {
7307fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek  while (LC) {
7317fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    if (const StackFrameContext *SFC = dyn_cast<StackFrameContext>(LC)) {
7327fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      if (cast<DeclContext>(SFC->getDecl()) == DC)
7337fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        return SFC;
7347fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    }
7357fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    if (const BlockInvocationContext *BC =
7367fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        dyn_cast<BlockInvocationContext>(LC)) {
7377fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      const BlockDataRegion *BR =
7387fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        static_cast<const BlockDataRegion*>(BC->getContextData());
7397fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      // FIXME: This can be made more efficient.
7407fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      for (BlockDataRegion::referenced_vars_iterator
7417fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek           I = BR->referenced_vars_begin(),
7427fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek           E = BR->referenced_vars_end(); I != E; ++I) {
7437fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        if (const VarRegion *VR = dyn_cast<VarRegion>(I.getOriginalRegion()))
7447fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek          if (VR->getDecl() == VD)
7457fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek            return cast<VarRegion>(I.getCapturedRegion());
7467fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      }
7477fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    }
7487fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
7497fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    LC = LC->getParent();
7507fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek  }
7517fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek  return (const StackFrameContext*)0;
7527fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek}
7537fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
754b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst VarRegion* MemRegionManager::getVarRegion(const VarDecl *D,
755b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                                const LocationContext *LC) {
75667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemRegion *sReg = 0;
7571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
758eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  if (D->hasGlobalStorage() && !D->isStaticLocal()) {
759eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
760eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    // First handle the globals defined in system headers.
761eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    if (C.getSourceManager().isInSystemHeader(D->getLocation())) {
762eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // Whitelist the system globals which often DO GET modified, assume the
763eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // rest are immutable.
764eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      if (D->getName().find("errno") != StringRef::npos)
765eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion(MemRegion::GlobalSystemSpaceRegionKind);
766eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      else
767eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind);
768eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
769eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    // Treat other globals as GlobalInternal unless they are constants.
770eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    } else {
771eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      QualType GQT = D->getType();
772eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      const Type *GT = GQT.getTypePtrOrNull();
773eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // TODO: We could walk the complex types here and see if everything is
774eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // constified.
775eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      if (GT && GQT.isConstQualified() && GT->isArithmeticType())
776eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind);
777eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      else
778eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion();
779eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    }
780eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
781eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  // Finally handle static locals.
782eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  } else {
78367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // FIXME: Once we implement scope handling, we will need to properly lookup
78467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // 'D' to the proper LocationContext.
7852b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    const DeclContext *DC = D->getDeclContext();
7867fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    llvm::PointerUnion<const StackFrameContext *, const VarRegion *> V =
7877fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      getStackOrCaptureRegionForDeclContext(LC, DC, D);
7887fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
7897fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    if (V.is<const VarRegion*>())
7907fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      return V.get<const VarRegion*>();
7917fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
7927fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    const StackFrameContext *STC = V.get<const StackFrameContext*>();
7932b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
7942b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    if (!STC)
7952b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek      sReg = getUnknownRegion();
7962b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    else {
797dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      if (D->hasLocalStorage()) {
798dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        sReg = isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D)
799dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek               ? static_cast<const MemRegion*>(getStackArgumentsRegion(STC))
800dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek               : static_cast<const MemRegion*>(getStackLocalsRegion(STC));
801dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      }
802dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      else {
803dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        assert(D->isStaticLocal());
8045fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks        const Decl *STCD = STC->getDecl();
8055fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks        if (isa<FunctionDecl>(STCD) || isa<ObjCMethodDecl>(STCD))
806eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks          sReg = getGlobalsRegion(MemRegion::StaticGlobalSpaceRegionKind,
8075fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks                                  getFunctionTextRegion(cast<NamedDecl>(STCD)));
8085fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks        else if (const BlockDecl *BD = dyn_cast<BlockDecl>(STCD)) {
809eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose          // FIXME: The fallback type here is totally bogus -- though it should
810eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose          // never be queried, it will prevent uniquing with the real
811eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose          // BlockTextRegion. Ideally we'd fix the AST so that we always had a
812eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose          // signature.
813eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose          QualType T;
814eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose          if (const TypeSourceInfo *TSI = BD->getSignatureAsWritten())
815eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose            T = TSI->getType();
816eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose          else
817eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose            T = getContext().getFunctionNoProtoType(getContext().VoidTy);
818eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose
819dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          const BlockTextRegion *BTR =
820eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose            getBlockTextRegion(BD, C.getCanonicalType(T),
821eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose                               STC->getAnalysisDeclContext());
822eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks          sReg = getGlobalsRegion(MemRegion::StaticGlobalSpaceRegionKind,
823eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks                                  BTR);
824dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        }
825dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        else {
826dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          sReg = getGlobalsRegion();
827dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        }
828dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      }
8292b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    }
83067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
831dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
83267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<VarRegion>(D, sReg);
83367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
8341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
83567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst VarRegion *MemRegionManager::getVarRegion(const VarDecl *D,
83667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                                const MemRegion *superR) {
83767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<VarRegion>(D, superR);
8389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
8399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
840b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockDataRegion *
841b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted KremenekMemRegionManager::getBlockDataRegion(const BlockTextRegion *BC,
842b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                     const LocationContext *LC) {
84367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemRegion *sReg = 0;
84499c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek  const BlockDecl *BD = BC->getDecl();
84599c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek  if (!BD->hasCaptures()) {
84699c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    // This handles 'static' blocks.
84799c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind);
84867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
84967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  else {
85099c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    if (LC) {
85199c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // FIXME: Once we implement scope handling, we want the parent region
85299c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // to be the scope.
85399c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      const StackFrameContext *STC = LC->getCurrentStackFrame();
85499c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      assert(STC);
85599c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      sReg = getStackLocalsRegion(STC);
85699c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    }
85799c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    else {
85899c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // We allow 'LC' to be NULL for cases where want BlockDataRegions
85999c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // without context-sensitivity.
86099c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      sReg = getUnknownRegion();
86199c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    }
86267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
86367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
86467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<BlockDataRegion>(BC, LC, sReg);
8650a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
8660a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
86776b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labathconst CXXTempObjectRegion *
86876b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel LabathMemRegionManager::getCXXStaticTempObjectRegion(const Expr *Ex) {
86976b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath  return getSubRegion<CXXTempObjectRegion>(
87076b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath      Ex, getGlobalsRegion(MemRegion::GlobalInternalSpaceRegionKind, NULL));
87176b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath}
87276b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath
873b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst CompoundLiteralRegion*
8749c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getCompoundLiteralRegion(const CompoundLiteralExpr *CL,
87567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                           const LocationContext *LC) {
876dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
87767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemRegion *sReg = 0;
878dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
87967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  if (CL->isFileScope())
88067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    sReg = getGlobalsRegion();
88167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  else {
88267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    const StackFrameContext *STC = LC->getCurrentStackFrame();
88367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(STC);
88467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    sReg = getStackLocalsRegion(STC);
88567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
886dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
88767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<CompoundLiteralRegion>(CL, sReg);
888329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
889329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
890b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ElementRegion*
89102282acd7a42d06a3178e3102d34a585bd82dd9fTed KremenekMemRegionManager::getElementRegion(QualType elementType, NonLoc Idx,
892465373946b5ae84f7c3d890cc25cb23fd88dd650Ted Kremenek                                   const MemRegion* superRegion,
8939c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                   ASTContext &Ctx){
894143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu
89532f901092daa4a53c7e012408c1f59d73ba29ff5Ted Kremenek  QualType T = Ctx.getCanonicalType(elementType).getUnqualifiedType();
896abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek
897511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  llvm::FoldingSetNodeID ID;
898143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu  ElementRegion::ProfileRegion(ID, T, Idx, superRegion);
899511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
9009c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
901511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
902511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ElementRegion* R = cast_or_null<ElementRegion>(data);
903511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
904511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  if (!R) {
905511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    R = (ElementRegion*) A.Allocate<ElementRegion>();
906143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu    new (R) ElementRegion(T, Idx, superRegion);
907511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    Regions.InsertNode(R, InsertPos);
908511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
909511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
910511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  return R;
911511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}
912511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
913b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst FunctionTextRegion *
9145fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna ZaksMemRegionManager::getFunctionTextRegion(const NamedDecl *FD) {
91567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<FunctionTextRegion>(FD, getCodeRegion());
916ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
917ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
918b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockTextRegion *
91967d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getBlockTextRegion(const BlockDecl *BD, CanQualType locTy,
9201d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                     AnalysisDeclContext *AC) {
92167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<BlockTextRegion>(BD, locTy, AC, getCodeRegion());
922eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
923eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
924eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
925993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
926b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst SymbolicRegion *MemRegionManager::getSymbolicRegion(SymbolRef sym) {
92767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<SymbolicRegion>(sym, getUnknownRegion());
928993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
929993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
930e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaksconst SymbolicRegion *MemRegionManager::getSymbolicHeapRegion(SymbolRef Sym) {
931e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  return getSubRegion<SymbolicRegion>(Sym, getHeapRegion());
932e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks}
933e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks
934de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst FieldRegion*
9359c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getFieldRegion(const FieldDecl *d,
936b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                 const MemRegion* superRegion){
937eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  return getSubRegion<FieldRegion>(d, superRegion);
9389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
9399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
940b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ObjCIvarRegion*
9419c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getObjCIvarRegion(const ObjCIvarDecl *d,
942993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek                                    const MemRegion* superRegion) {
943eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  return getSubRegion<ObjCIvarRegion>(d, superRegion);
944a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek}
945a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
94602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuconst CXXTempObjectRegion*
94702fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing XuMemRegionManager::getCXXTempObjectRegion(Expr const *E,
94802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                         LocationContext const *LC) {
949bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  const StackFrameContext *SFC = LC->getCurrentStackFrame();
950bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  assert(SFC);
95102fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  return getSubRegion<CXXTempObjectRegion>(E, getStackLocalsRegion(SFC));
952bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}
953bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
9544411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose/// Checks whether \p BaseClass is a valid virtual or direct non-virtual base
9554411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose/// class of the type of \p Super.
9564411b423e91da0a2c879b70c0222aeba35f72044Jordan Rosestatic bool isValidBaseClass(const CXXRecordDecl *BaseClass,
9574411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                             const TypedValueRegion *Super,
9584411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                             bool IsVirtual) {
959ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose  BaseClass = BaseClass->getCanonicalDecl();
960ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose
9614411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  const CXXRecordDecl *Class = Super->getValueType()->getAsCXXRecordDecl();
9624411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  if (!Class)
9634411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    return true;
9644411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose
9654411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  if (IsVirtual)
9664411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    return Class->isVirtuallyDerivedFrom(BaseClass);
9674411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose
9684411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  for (CXXRecordDecl::base_class_const_iterator I = Class->bases_begin(),
9694411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                                E = Class->bases_end();
9704411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose       I != E; ++I) {
9714411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    if (I->getType()->getAsCXXRecordDecl()->getCanonicalDecl() == BaseClass)
9724411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      return true;
9734411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  }
974b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
9754411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  return false;
9764411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose}
9774411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose
9784411b423e91da0a2c879b70c0222aeba35f72044Jordan Roseconst CXXBaseObjectRegion *
9794411b423e91da0a2c879b70c0222aeba35f72044Jordan RoseMemRegionManager::getCXXBaseObjectRegion(const CXXRecordDecl *RD,
9804411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                         const MemRegion *Super,
9814411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                         bool IsVirtual) {
9826d35b412fc0289681f320acc389f7a83066ec9e2NAKAMURA Takumi  if (isa<TypedValueRegion>(Super)) {
9836d35b412fc0289681f320acc389f7a83066ec9e2NAKAMURA Takumi    assert(isValidBaseClass(RD, dyn_cast<TypedValueRegion>(Super), IsVirtual));
984b6d0f4c8dd162b019681b60d06f7ad33500f4146Aaron Ballman    (void)&isValidBaseClass;
9854411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose
9864411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    if (IsVirtual) {
9874411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      // Virtual base regions should not be layered, since the layout rules
9884411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      // are different.
9894411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      while (const CXXBaseObjectRegion *Base =
9904411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose               dyn_cast<CXXBaseObjectRegion>(Super)) {
9914411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose        Super = Base->getSuperRegion();
992b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose      }
9934411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      assert(Super && !isa<MemSpaceRegion>(Super));
994b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    }
995b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  }
996b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
9974411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  return getSubRegion<CXXBaseObjectRegion>(RD, IsVirtual, Super);
9984fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
9994fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1000de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst CXXThisRegion*
1001de0d26310191215a6d1d189dc419f87af18ce6beTed KremenekMemRegionManager::getCXXThisRegion(QualType thisPointerTy,
1002de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                   const LocationContext *LC) {
1003de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const StackFrameContext *STC = LC->getCurrentStackFrame();
1004de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  assert(STC);
1005de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const PointerType *PT = thisPointerTy->getAs<PointerType>();
1006de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  assert(PT);
1007de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return getSubRegion<CXXThisRegion>(PT, getStackArgumentsRegion(STC));
1008de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
1009de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
1010b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst AllocaRegion*
10119c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getAllocaRegion(const Expr *E, unsigned cnt,
101267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                  const LocationContext *LC) {
101367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *STC = LC->getCurrentStackFrame();
101467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  assert(STC);
101567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<AllocaRegion>(E, cnt, getStackLocalsRegion(STC));
10167090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
10177090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
1018bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekconst MemSpaceRegion *MemRegion::getMemorySpace() const {
1019bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemRegion *R = this;
1020bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const SubRegion* SR = dyn_cast<SubRegion>(this);
10211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1022993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  while (SR) {
1023bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek    R = SR->getSuperRegion();
1024bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek    SR = dyn_cast<SubRegion>(R);
10259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
10261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1027bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  return dyn_cast<MemSpaceRegion>(R);
10289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
10291670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
1030bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekbool MemRegion::hasStackStorage() const {
103167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackSpaceRegion>(getMemorySpace());
1032bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek}
1033dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu
1034de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackNonParametersStorage() const {
1035de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return isa<StackLocalsSpaceRegion>(getMemorySpace());
10361508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek}
10371508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek
1038de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackParametersStorage() const {
103967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackArgumentsSpaceRegion>(getMemorySpace());
1040dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek}
1041dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek
10421508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenekbool MemRegion::hasGlobalsOrParametersStorage() const {
104367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemSpaceRegion *MS = getMemorySpace();
104467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackArgumentsSpaceRegion>(MS) ||
104567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek         isa<GlobalsSpaceRegion>(MS);
10461508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek}
10471670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
1048adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// getBaseRegion strips away all elements and fields, and get the base region
1049adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// of them.
1050adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xuconst MemRegion *MemRegion::getBaseRegion() const {
1051adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *R = this;
1052adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  while (true) {
105368b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek    switch (R->getKind()) {
105468b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::ElementRegionKind:
105568b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::FieldRegionKind:
105668b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::ObjCIvarRegionKind:
1057e17da65c5773e0285b22e33d1431b13fbcd8942cZhongxing Xu      case MemRegion::CXXBaseObjectRegionKind:
105868b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        R = cast<SubRegion>(R)->getSuperRegion();
105968b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        continue;
106068b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      default:
106168b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        break;
1062adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu    }
1063adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu    break;
1064adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  }
1065adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  return R;
1066adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu}
1067adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
10685f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaksbool MemRegion::isSubRegionOf(const MemRegion *R) const {
1069522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks  return false;
1070522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks}
1071522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks
10721670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===//
10731670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek// View handling.
10741670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===//
10751670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
1076b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Roseconst MemRegion *MemRegion::StripCasts(bool StripBaseCasts) const {
10770e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  const MemRegion *R = this;
10780e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  while (true) {
1079c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    switch (R->getKind()) {
1080c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    case ElementRegionKind: {
1081c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      const ElementRegion *ER = cast<ElementRegion>(R);
1082c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      if (!ER->getIndex().isZeroConstant())
1083c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose        return R;
1084c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      R = ER->getSuperRegion();
1085c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      break;
1086c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    }
1087c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    case CXXBaseObjectRegionKind:
1088b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose      if (!StripBaseCasts)
1089b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose        return R;
1090c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      R = cast<CXXBaseObjectRegion>(R)->getSuperRegion();
1091c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      break;
1092c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    default:
1093c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      return R;
10940e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek    }
10950e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  }
10960e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek}
109719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
10988ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaksconst SymbolicRegion *MemRegion::getSymbolicBase() const {
10998ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks  const SubRegion *SubR = dyn_cast<SubRegion>(this);
11008ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks
11018ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks  while (SubR) {
11028ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks    if (const SymbolicRegion *SymR = dyn_cast<SymbolicRegion>(SubR))
11038ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks      return SymR;
11048ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks    SubR = dyn_cast<SubRegion>(SubR->getSuperRegion());
11058ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks  }
11068ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks  return 0;
11078ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks}
11088ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks
110919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// FIXME: Merge with the implementation of the same method in Store.cpp
111019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekstatic bool IsCompleteType(ASTContext &Ctx, QualType Ty) {
111119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  if (const RecordType *RT = Ty->getAs<RecordType>()) {
111219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    const RecordDecl *D = RT->getDecl();
1113952b017601f9c82b51119c3a1600f1312a833db9Douglas Gregor    if (!D->getDefinition())
111419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      return false;
111519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  }
111619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
111719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  return true;
111819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
111919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
11207caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing XuRegionRawOffset ElementRegion::getAsArrayOffset() const {
1121199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits offset = CharUnits::Zero();
112219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  const ElementRegion *ER = this;
112319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  const MemRegion *superR = NULL;
112419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  ASTContext &C = getContext();
11251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
112619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  // FIXME: Handle multi-dimensional arrays.
112719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
112819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  while (ER) {
112919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    superR = ER->getSuperRegion();
11301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
113119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    // FIXME: generalize to symbolic offsets.
113219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    SVal index = ER->getIndex();
1133dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie    if (Optional<nonloc::ConcreteInt> CI = index.getAs<nonloc::ConcreteInt>()) {
113419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      // Update the offset.
113519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      int64_t i = CI->getValue().getSExtValue();
11361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
113719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      if (i != 0) {
113819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        QualType elemType = ER->getElementType();
11391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
114019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        // If we are pointing to an incomplete type, go no further.
114119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        if (!IsCompleteType(C, elemType)) {
114219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek          superR = ER;
114319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek          break;
114419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        }
11451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1146199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck        CharUnits size = C.getTypeSizeInChars(elemType);
114719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        offset += (i * size);
114819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      }
114919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
115019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      // Go to the next ElementRegion (if any).
115119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      ER = dyn_cast<ElementRegion>(superR);
115219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      continue;
115319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    }
11541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
115519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    return NULL;
115619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  }
11571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
115819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  assert(superR && "super region cannot be NULL");
11599ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  return RegionRawOffset(superR, offset);
116019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
116119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
11626dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose
11636dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose/// Returns true if \p Base is an immediate base class of \p Child
11646dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rosestatic bool isImmediateBase(const CXXRecordDecl *Child,
11656dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose                            const CXXRecordDecl *Base) {
11666dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  // Note that we do NOT canonicalize the base class here, because
11676dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  // ASTRecordLayout doesn't either. If that leads us down the wrong path,
11686dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  // so be it; at least we won't crash.
11696dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  for (CXXRecordDecl::base_class_const_iterator I = Child->bases_begin(),
11706dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose                                                E = Child->bases_end();
11716dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose       I != E; ++I) {
11726dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose    if (I->getType()->getAsCXXRecordDecl() == Base)
11736dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose      return true;
11746dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  }
11756dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose
11766dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  return false;
11776dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose}
11786dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose
1179e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing XuRegionOffset MemRegion::getAsOffset() const {
1180e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *R = this;
1181824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  const MemRegion *SymbolicOffsetBase = 0;
1182e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t Offset = 0;
1183e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1184e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  while (1) {
1185e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    switch (R->getKind()) {
11869d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case GenericMemSpaceRegionKind:
11879d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case StackLocalsSpaceRegionKind:
11889d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case StackArgumentsSpaceRegionKind:
11899d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case HeapSpaceRegionKind:
11909d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case UnknownSpaceRegionKind:
11919d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case StaticGlobalSpaceRegionKind:
11929d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case GlobalInternalSpaceRegionKind:
11939d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case GlobalSystemSpaceRegionKind:
11949d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case GlobalImmutableSpaceRegionKind:
11959d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      // Stores can bind directly to a region space to set a default value.
11969d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      assert(Offset == 0 && !SymbolicOffsetBase);
11979d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      goto Finish;
11989d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose
11999d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case FunctionTextRegionKind:
12009d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case BlockTextRegionKind:
12019d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case BlockDataRegionKind:
12029d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      // These will never have bindings, but may end up having values requested
12039d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      // if the user does some strange casting.
12049d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      if (Offset != 0)
12059d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose        SymbolicOffsetBase = R;
12069d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      goto Finish;
1207824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1208e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case SymbolicRegionKind:
1209e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case AllocaRegionKind:
1210e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case CompoundLiteralRegionKind:
1211e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case CXXThisRegionKind:
1212e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case StringRegionKind:
12139d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case ObjCStringRegionKind:
1214e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case VarRegionKind:
121502fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    case CXXTempObjectRegionKind:
12169d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      // Usual base regions.
1217e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      goto Finish;
1218824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
12191e934431adba0f459668a59c6059b9596fd627b4Jordan Rose    case ObjCIvarRegionKind:
12201e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // This is a little strange, but it's a compromise between
12211e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // ObjCIvarRegions having unknown compile-time offsets (when using the
12221e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // non-fragile runtime) and yet still being distinct, non-overlapping
12231e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // regions. Thus we treat them as "like" base regions for the purposes
12241e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // of computing offsets.
12251e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      goto Finish;
12261e934431adba0f459668a59c6059b9596fd627b4Jordan Rose
1227e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose    case CXXBaseObjectRegionKind: {
1228e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      const CXXBaseObjectRegion *BOR = cast<CXXBaseObjectRegion>(R);
1229e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      R = BOR->getSuperRegion();
1230e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
1231e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      QualType Ty;
12326dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose      bool RootIsSymbolic = false;
1233e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      if (const TypedValueRegion *TVR = dyn_cast<TypedValueRegion>(R)) {
1234e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        Ty = TVR->getDesugaredValueType(getContext());
1235e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      } else if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(R)) {
1236e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // If our base region is symbolic, we don't know what type it really is.
1237e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // Pretend the type of the symbol is the true dynamic type.
1238e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // (This will at least be self-consistent for the life of the symbol.)
1239732cdf383f9030ff2b9fb28dfbdae2285ded80c6Ted Kremenek        Ty = SR->getSymbol()->getType()->getPointeeType();
12406dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        RootIsSymbolic = true;
1241e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      }
1242e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
1243e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      const CXXRecordDecl *Child = Ty->getAsCXXRecordDecl();
12449f6441ad92c30028032eb3df6f4a7f2ebe393a68Jordan Rose      if (!Child) {
1245e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // We cannot compute the offset of the base class.
1246824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        SymbolicOffsetBase = R;
1247e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      }
1248824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
12496dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose      if (RootIsSymbolic) {
12506dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        // Base layers on symbolic regions may not be type-correct.
12516dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        // Double-check the inheritance here, and revert to a symbolic offset
12526dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        // if it's invalid (e.g. due to a reinterpret_cast).
12536dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        if (BOR->isVirtual()) {
12546dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose          if (!Child->isVirtuallyDerivedFrom(BOR->getDecl()))
12556dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose            SymbolicOffsetBase = R;
12566dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        } else {
12576dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose          if (!isImmediateBase(Child, BOR->getDecl()))
12586dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose            SymbolicOffsetBase = R;
12596dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        }
12606dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose      }
12616dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose
1262824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      // Don't bother calculating precise offsets if we already have a
1263824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      // symbolic offset somewhere in the chain.
1264824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      if (SymbolicOffsetBase)
1265824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        continue;
1266824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1267e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      CharUnits BaseOffset;
12684411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      const ASTRecordLayout &Layout = getContext().getASTRecordLayout(Child);
12694411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      if (BOR->isVirtual())
12704411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose        BaseOffset = Layout.getVBaseClassOffset(BOR->getDecl());
1271e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      else
12724411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose        BaseOffset = Layout.getBaseClassOffset(BOR->getDecl());
1273e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
1274e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      // The base offset is in chars, not in bits.
1275e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      Offset += BaseOffset.getQuantity() * getContext().getCharWidth();
1276e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      break;
1277e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose    }
1278e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case ElementRegionKind: {
1279e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const ElementRegion *ER = cast<ElementRegion>(R);
1280824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      R = ER->getSuperRegion();
1281e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1282824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      QualType EleTy = ER->getValueType();
1283824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      if (!IsCompleteType(getContext(), EleTy)) {
1284824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        // We cannot compute the offset of the base class.
1285824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        SymbolicOffsetBase = R;
1286824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        continue;
1287824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      }
1288e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1289e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      SVal Index = ER->getIndex();
1290dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie      if (Optional<nonloc::ConcreteInt> CI =
12915251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie              Index.getAs<nonloc::ConcreteInt>()) {
1292824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        // Don't bother calculating precise offsets if we already have a
1293824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        // symbolic offset somewhere in the chain.
1294824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        if (SymbolicOffsetBase)
1295824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose          continue;
1296824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1297e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        int64_t i = CI->getValue().getSExtValue();
1298e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // This type size is in bits.
1299e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        Offset += i * getContext().getTypeSize(EleTy);
1300e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      } else {
1301e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        // We cannot compute offset for non-concrete index.
1302824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        SymbolicOffsetBase = R;
1303e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      }
13047caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu      break;
1305e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
1306e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case FieldRegionKind: {
1307e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const FieldRegion *FR = cast<FieldRegion>(R);
1308824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      R = FR->getSuperRegion();
1309824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1310e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const RecordDecl *RD = FR->getDecl()->getParent();
1311786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose      if (RD->isUnion() || !RD->isCompleteDefinition()) {
1312e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        // We cannot compute offset for incomplete type.
1313786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose        // For unions, we could treat everything as offset 0, but we'd rather
1314786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose        // treat each field as a symbolic offset so they aren't stored on top
1315786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose        // of each other, since we depend on things in typed regions actually
1316786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose        // matching their types.
1317824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        SymbolicOffsetBase = R;
1318824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      }
1319824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1320824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      // Don't bother calculating precise offsets if we already have a
1321824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      // symbolic offset somewhere in the chain.
1322824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      if (SymbolicOffsetBase)
1323824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        continue;
1324824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1325e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      // Get the field number.
1326e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      unsigned idx = 0;
1327e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      for (RecordDecl::field_iterator FI = RD->field_begin(),
1328e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu             FE = RD->field_end(); FI != FE; ++FI, ++idx)
1329581deb3da481053c4993c7600f97acf7768caac5David Blaikie        if (FR->getDecl() == *FI)
1330e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu          break;
13317caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
1332e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
1333e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      // This is offset in bits.
1334e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      Offset += Layout.getFieldOffset(idx);
1335e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      break;
1336e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
1337e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
1338e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  }
13397caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
1340e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu Finish:
1341824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  if (SymbolicOffsetBase)
1342824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose    return RegionOffset(SymbolicOffsetBase, RegionOffset::Symbolic);
1343e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  return RegionOffset(R, Offset);
13447caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu}
13457caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
13464240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
13474240096011a187807058f887eb81df750ffa17feTed Kremenek// BlockDataRegion
13484240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
13494240096011a187807058f887eb81df750ffa17feTed Kremenek
135024570c4c258545f8310e4bc96503a5668982cf67Ted Kremenekstd::pair<const VarRegion *, const VarRegion *>
135124570c4c258545f8310e4bc96503a5668982cf67Ted KremenekBlockDataRegion::getCaptureRegions(const VarDecl *VD) {
135224570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  MemRegionManager &MemMgr = *getMemRegionManager();
135324570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  const VarRegion *VR = 0;
135424570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  const VarRegion *OriginalVR = 0;
135524570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek
135624570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  if (!VD->getAttr<BlocksAttr>() && VD->hasLocalStorage()) {
135724570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    VR = MemMgr.getVarRegion(VD, this);
135824570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    OriginalVR = MemMgr.getVarRegion(VD, LC);
135924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  }
136024570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  else {
136124570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    if (LC) {
136224570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek      VR = MemMgr.getVarRegion(VD, LC);
136324570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek      OriginalVR = VR;
136424570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    }
136524570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    else {
136624570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek      VR = MemMgr.getVarRegion(VD, MemMgr.getUnknownRegion());
136724570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek      OriginalVR = MemMgr.getVarRegion(VD, LC);
136824570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    }
136924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  }
137024570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  return std::make_pair(VR, OriginalVR);
137124570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek}
137224570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek
13734240096011a187807058f887eb81df750ffa17feTed Kremenekvoid BlockDataRegion::LazyInitializeReferencedVars() {
13744240096011a187807058f887eb81df750ffa17feTed Kremenek  if (ReferencedVars)
13754240096011a187807058f887eb81df750ffa17feTed Kremenek    return;
13764240096011a187807058f887eb81df750ffa17feTed Kremenek
13771d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *AC = getCodeRegion()->getAnalysisDeclContext();
13781d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext::referenced_decls_iterator I, E;
13794240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::tie(I, E) = AC->getReferencedBlockVars(BC->getDecl());
1380dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
13814240096011a187807058f887eb81df750ffa17feTed Kremenek  if (I == E) {
13824240096011a187807058f887eb81df750ffa17feTed Kremenek    ReferencedVars = (void*) 0x1;
13834240096011a187807058f887eb81df750ffa17feTed Kremenek    return;
13844240096011a187807058f887eb81df750ffa17feTed Kremenek  }
1385dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
13864240096011a187807058f887eb81df750ffa17feTed Kremenek  MemRegionManager &MemMgr = *getMemRegionManager();
13874240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &A = MemMgr.getAllocator();
13884240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVectorContext BC(A);
1389dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
13904240096011a187807058f887eb81df750ffa17feTed Kremenek  typedef BumpVector<const MemRegion*> VarVec;
13914240096011a187807058f887eb81df750ffa17feTed Kremenek  VarVec *BV = (VarVec*) A.Allocate<VarVec>();
139202b1df62ff6fa9526619ee0db78e2af4186e490dTed Kremenek  new (BV) VarVec(BC, E - I);
139385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  VarVec *BVOriginal = (VarVec*) A.Allocate<VarVec>();
139485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  new (BVOriginal) VarVec(BC, E - I);
1395dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
139667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  for ( ; I != E; ++I) {
139767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    const VarRegion *VR = 0;
139885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const VarRegion *OriginalVR = 0;
139924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    llvm::tie(VR, OriginalVR) = getCaptureRegions(*I);
140067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(VR);
140185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    assert(OriginalVR);
140267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BV->push_back(VR, BC);
140385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    BVOriginal->push_back(OriginalVR, BC);
140467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
1405dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
14064240096011a187807058f887eb81df750ffa17feTed Kremenek  ReferencedVars = BV;
140785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  OriginalVars = BVOriginal;
14084240096011a187807058f887eb81df750ffa17feTed Kremenek}
14094240096011a187807058f887eb81df750ffa17feTed Kremenek
14104240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator
14114240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_begin() const {
14124240096011a187807058f887eb81df750ffa17feTed Kremenek  const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars();
14134240096011a187807058f887eb81df750ffa17feTed Kremenek
14144240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVector<const MemRegion*> *Vec =
14154240096011a187807058f887eb81df750ffa17feTed Kremenek    static_cast<BumpVector<const MemRegion*>*>(ReferencedVars);
1416dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
141785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  if (Vec == (void*) 0x1)
141885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    return BlockDataRegion::referenced_vars_iterator(0, 0);
141985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
142085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  BumpVector<const MemRegion*> *VecOriginal =
142185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    static_cast<BumpVector<const MemRegion*>*>(OriginalVars);
142285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
142385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  return BlockDataRegion::referenced_vars_iterator(Vec->begin(),
142485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                                   VecOriginal->begin());
14254240096011a187807058f887eb81df750ffa17feTed Kremenek}
14264240096011a187807058f887eb81df750ffa17feTed Kremenek
14274240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator
14284240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_end() const {
14294240096011a187807058f887eb81df750ffa17feTed Kremenek  const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars();
14304240096011a187807058f887eb81df750ffa17feTed Kremenek
14314240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVector<const MemRegion*> *Vec =
14324240096011a187807058f887eb81df750ffa17feTed Kremenek    static_cast<BumpVector<const MemRegion*>*>(ReferencedVars);
1433dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
143485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  if (Vec == (void*) 0x1)
143585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    return BlockDataRegion::referenced_vars_iterator(0, 0);
143685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
143785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  BumpVector<const MemRegion*> *VecOriginal =
143885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    static_cast<BumpVector<const MemRegion*>*>(OriginalVars);
143985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
144085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  return BlockDataRegion::referenced_vars_iterator(Vec->end(),
144185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                                   VecOriginal->end());
14424240096011a187807058f887eb81df750ffa17feTed Kremenek}
14435846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek
14445846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenekconst VarRegion *BlockDataRegion::getOriginalRegion(const VarRegion *R) const {
14455846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  for (referenced_vars_iterator I = referenced_vars_begin(),
14465846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek                                E = referenced_vars_end();
14475846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek       I != E; ++I) {
14485846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek    if (I.getCapturedRegion() == R)
14495846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek      return I.getOriginalRegion();
14505846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  }
14515846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  return 0;
14525846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek}
1453