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));
18952e04c537633377fb14cfa4fa3c95e3e510fc942Jordy Rose  if (isa<IncompleteArrayType>(T))
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 {
558919e8a1c6698bfa6848571d366430126bced727dJordan Rose  return false;
559919e8a1c6698bfa6848571d366430126bced727dJordan Rose}
560919e8a1c6698bfa6848571d366430126bced727dJordan Rose
561919e8a1c6698bfa6848571d366430126bced727dJordan Rosevoid MemRegion::printPretty(raw_ostream &os) const {
5623d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  return;
5633d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks}
5643d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
565919e8a1c6698bfa6848571d366430126bced727dJordan Rosebool VarRegion::canPrintPretty() const {
566919e8a1c6698bfa6848571d366430126bced727dJordan Rose  return true;
567919e8a1c6698bfa6848571d366430126bced727dJordan Rose}
568919e8a1c6698bfa6848571d366430126bced727dJordan Rose
569919e8a1c6698bfa6848571d366430126bced727dJordan Rosevoid VarRegion::printPretty(raw_ostream &os) const {
5703d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  os << getDecl()->getName();
5713d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks}
5723d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
57343b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenekbool ObjCIvarRegion::canPrintPretty() const {
57443b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek  return true;
57543b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek}
57643b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek
57743b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenekvoid ObjCIvarRegion::printPretty(raw_ostream &os) const {
57843b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek  os << getDecl()->getName();
57943b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek}
58043b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek
581919e8a1c6698bfa6848571d366430126bced727dJordan Rosebool FieldRegion::canPrintPretty() const {
582919e8a1c6698bfa6848571d366430126bced727dJordan Rose  return superRegion->canPrintPretty();
583919e8a1c6698bfa6848571d366430126bced727dJordan Rose}
584919e8a1c6698bfa6848571d366430126bced727dJordan Rose
585919e8a1c6698bfa6848571d366430126bced727dJordan Rosevoid FieldRegion::printPretty(raw_ostream &os) const {
586919e8a1c6698bfa6848571d366430126bced727dJordan Rose  superRegion->printPretty(os);
587919e8a1c6698bfa6848571d366430126bced727dJordan Rose  os << "." << getDecl()->getName();
5883d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks}
5893d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
5909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
5919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager methods.
5929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
59319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
59467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG>
59567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region) {
5961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!region) {
59767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    region = (REG*) A.Allocate<REG>();
59867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    new (region) REG(this);
5999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
600a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
6019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  return region;
6029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
6039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
60467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG, typename ARG>
60567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region, ARG a) {
60667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  if (!region) {
60767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    region = (REG*) A.Allocate<REG>();
60867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    new (region) REG(this, a);
60967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
610dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
61167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return region;
61267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
61367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
61467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackLocalsSpaceRegion*
6152b87ae45e129b941d0a4d221c9d4842385a119bdTed KremenekMemRegionManager::getStackLocalsRegion(const StackFrameContext *STC) {
6162b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  assert(STC);
617c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  StackLocalsSpaceRegion *&R = StackLocalsSpaceRegions[STC];
618c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
619c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  if (R)
620c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    return R;
621c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
622c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  R = A.Allocate<StackLocalsSpaceRegion>();
623c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  new (R) StackLocalsSpaceRegion(this, STC);
624c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  return R;
6259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
6269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
62767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackArgumentsSpaceRegion *
62867d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getStackArgumentsRegion(const StackFrameContext *STC) {
6292b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  assert(STC);
630c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  StackArgumentsSpaceRegion *&R = StackArgumentsSpaceRegions[STC];
631c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
632c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  if (R)
633c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    return R;
634c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
635c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  R = A.Allocate<StackArgumentsSpaceRegion>();
636c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  new (R) StackArgumentsSpaceRegion(this, STC);
637c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  return R;
638d05552a21377f493c882298c59e8829040b01d34Ted Kremenek}
639d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
640dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst GlobalsSpaceRegion
641eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks*MemRegionManager::getGlobalsRegion(MemRegion::Kind K,
642eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks                                    const CodeTextRegion *CR) {
643eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  if (!CR) {
644eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    if (K == MemRegion::GlobalSystemSpaceRegionKind)
645eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      return LazyAllocate(SystemGlobals);
646eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    if (K == MemRegion::GlobalImmutableSpaceRegionKind)
647eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      return LazyAllocate(ImmutableGlobals);
648eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    assert(K == MemRegion::GlobalInternalSpaceRegionKind);
649eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return LazyAllocate(InternalGlobals);
650eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
651dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
652eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  assert(K == MemRegion::StaticGlobalSpaceRegionKind);
653dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  StaticGlobalSpaceRegion *&R = StaticsGlobalSpaceRegions[CR];
654dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  if (R)
655dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R;
656dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
657dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  R = A.Allocate<StaticGlobalSpaceRegion>();
658dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  new (R) StaticGlobalSpaceRegion(this, CR);
659dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  return R;
6609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
6619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
66267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst HeapSpaceRegion *MemRegionManager::getHeapRegion() {
6639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  return LazyAllocate(heap);
6649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
6659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
666b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getUnknownRegion() {
667178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  return LazyAllocate(unknown);
668178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu}
669178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
670b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getCodeRegion() {
671ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  return LazyAllocate(code);
672ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
673ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
674250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
675250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Constructing regions.
676250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
677dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst StringRegion* MemRegionManager::getStringRegion(const StringLiteral* Str){
67867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<StringRegion>(Str, getGlobalsRegion());
679e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}
680e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
6814c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekconst ObjCStringRegion *
6824c62b557e269a27515dfca1f754ae936c8fdb824Ted KremenekMemRegionManager::getObjCStringRegion(const ObjCStringLiteral* Str){
6834c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  return getSubRegion<ObjCStringRegion>(Str, getGlobalsRegion());
6844c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}
6854c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
6867fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// Look through a chain of LocationContexts to either find the
6877fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// StackFrameContext that matches a DeclContext, or find a VarRegion
6887fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// for a variable captured by a block.
6897fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenekstatic llvm::PointerUnion<const StackFrameContext *, const VarRegion *>
6907fa9b4f258636d89342eda28f21a986c8ac353b1Ted KremenekgetStackOrCaptureRegionForDeclContext(const LocationContext *LC,
6917fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek                                      const DeclContext *DC,
6927fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek                                      const VarDecl *VD) {
6937fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek  while (LC) {
6947fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    if (const StackFrameContext *SFC = dyn_cast<StackFrameContext>(LC)) {
6957fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      if (cast<DeclContext>(SFC->getDecl()) == DC)
6967fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        return SFC;
6977fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    }
6987fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    if (const BlockInvocationContext *BC =
6997fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        dyn_cast<BlockInvocationContext>(LC)) {
7007fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      const BlockDataRegion *BR =
7017fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        static_cast<const BlockDataRegion*>(BC->getContextData());
7027fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      // FIXME: This can be made more efficient.
7037fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      for (BlockDataRegion::referenced_vars_iterator
7047fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek           I = BR->referenced_vars_begin(),
7057fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek           E = BR->referenced_vars_end(); I != E; ++I) {
7067fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        if (const VarRegion *VR = dyn_cast<VarRegion>(I.getOriginalRegion()))
7077fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek          if (VR->getDecl() == VD)
7087fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek            return cast<VarRegion>(I.getCapturedRegion());
7097fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      }
7107fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    }
7117fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
7127fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    LC = LC->getParent();
7137fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek  }
7147fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek  return (const StackFrameContext*)0;
7157fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek}
7167fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
717b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst VarRegion* MemRegionManager::getVarRegion(const VarDecl *D,
718b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                                const LocationContext *LC) {
71967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemRegion *sReg = 0;
7201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
721eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  if (D->hasGlobalStorage() && !D->isStaticLocal()) {
722eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
723eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    // First handle the globals defined in system headers.
724eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    if (C.getSourceManager().isInSystemHeader(D->getLocation())) {
725eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // Whitelist the system globals which often DO GET modified, assume the
726eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // rest are immutable.
727eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      if (D->getName().find("errno") != StringRef::npos)
728eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion(MemRegion::GlobalSystemSpaceRegionKind);
729eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      else
730eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind);
731eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
732eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    // Treat other globals as GlobalInternal unless they are constants.
733eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    } else {
734eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      QualType GQT = D->getType();
735eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      const Type *GT = GQT.getTypePtrOrNull();
736eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // TODO: We could walk the complex types here and see if everything is
737eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // constified.
738eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      if (GT && GQT.isConstQualified() && GT->isArithmeticType())
739eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind);
740eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      else
741eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion();
742eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    }
743eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
744eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  // Finally handle static locals.
745eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  } else {
74667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // FIXME: Once we implement scope handling, we will need to properly lookup
74767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // 'D' to the proper LocationContext.
7482b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    const DeclContext *DC = D->getDeclContext();
7497fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    llvm::PointerUnion<const StackFrameContext *, const VarRegion *> V =
7507fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      getStackOrCaptureRegionForDeclContext(LC, DC, D);
7517fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
7527fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    if (V.is<const VarRegion*>())
7537fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      return V.get<const VarRegion*>();
7547fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
7557fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    const StackFrameContext *STC = V.get<const StackFrameContext*>();
7562b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
7572b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    if (!STC)
7582b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek      sReg = getUnknownRegion();
7592b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    else {
760dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      if (D->hasLocalStorage()) {
761dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        sReg = isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D)
762dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek               ? static_cast<const MemRegion*>(getStackArgumentsRegion(STC))
763dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek               : static_cast<const MemRegion*>(getStackLocalsRegion(STC));
764dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      }
765dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      else {
766dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        assert(D->isStaticLocal());
7675fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks        const Decl *STCD = STC->getDecl();
7685fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks        if (isa<FunctionDecl>(STCD) || isa<ObjCMethodDecl>(STCD))
769eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks          sReg = getGlobalsRegion(MemRegion::StaticGlobalSpaceRegionKind,
7705fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks                                  getFunctionTextRegion(cast<NamedDecl>(STCD)));
7715fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks        else if (const BlockDecl *BD = dyn_cast<BlockDecl>(STCD)) {
772dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          const BlockTextRegion *BTR =
773dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek            getBlockTextRegion(BD,
774dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek                     C.getCanonicalType(BD->getSignatureAsWritten()->getType()),
7751d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                     STC->getAnalysisDeclContext());
776eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks          sReg = getGlobalsRegion(MemRegion::StaticGlobalSpaceRegionKind,
777eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks                                  BTR);
778dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        }
779dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        else {
780dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          sReg = getGlobalsRegion();
781dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        }
782dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      }
7832b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    }
78467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
785dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
78667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<VarRegion>(D, sReg);
78767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst VarRegion *MemRegionManager::getVarRegion(const VarDecl *D,
79067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                                const MemRegion *superR) {
79167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<VarRegion>(D, superR);
7929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
7939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
794b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockDataRegion *
795b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted KremenekMemRegionManager::getBlockDataRegion(const BlockTextRegion *BC,
796b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                     const LocationContext *LC) {
79767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemRegion *sReg = 0;
79899c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek  const BlockDecl *BD = BC->getDecl();
79999c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek  if (!BD->hasCaptures()) {
80099c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    // This handles 'static' blocks.
80199c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind);
80267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
80367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  else {
80499c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    if (LC) {
80599c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // FIXME: Once we implement scope handling, we want the parent region
80699c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // to be the scope.
80799c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      const StackFrameContext *STC = LC->getCurrentStackFrame();
80899c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      assert(STC);
80999c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      sReg = getStackLocalsRegion(STC);
81099c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    }
81199c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    else {
81299c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // We allow 'LC' to be NULL for cases where want BlockDataRegions
81399c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // without context-sensitivity.
81499c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      sReg = getUnknownRegion();
81599c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    }
81667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
81767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
81867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<BlockDataRegion>(BC, LC, sReg);
8190a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
8200a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
821b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst CompoundLiteralRegion*
8229c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getCompoundLiteralRegion(const CompoundLiteralExpr *CL,
82367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                           const LocationContext *LC) {
824dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
82567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemRegion *sReg = 0;
826dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
82767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  if (CL->isFileScope())
82867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    sReg = getGlobalsRegion();
82967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  else {
83067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    const StackFrameContext *STC = LC->getCurrentStackFrame();
83167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(STC);
83267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    sReg = getStackLocalsRegion(STC);
83367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
834dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
83567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<CompoundLiteralRegion>(CL, sReg);
836329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
837329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
838b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ElementRegion*
83902282acd7a42d06a3178e3102d34a585bd82dd9fTed KremenekMemRegionManager::getElementRegion(QualType elementType, NonLoc Idx,
840465373946b5ae84f7c3d890cc25cb23fd88dd650Ted Kremenek                                   const MemRegion* superRegion,
8419c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                   ASTContext &Ctx){
842143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu
84332f901092daa4a53c7e012408c1f59d73ba29ff5Ted Kremenek  QualType T = Ctx.getCanonicalType(elementType).getUnqualifiedType();
844abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek
845511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  llvm::FoldingSetNodeID ID;
846143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu  ElementRegion::ProfileRegion(ID, T, Idx, superRegion);
847511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
8489c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
849511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
850511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ElementRegion* R = cast_or_null<ElementRegion>(data);
851511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
852511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  if (!R) {
853511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    R = (ElementRegion*) A.Allocate<ElementRegion>();
854143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu    new (R) ElementRegion(T, Idx, superRegion);
855511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    Regions.InsertNode(R, InsertPos);
856511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
857511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
858511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  return R;
859511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}
860511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
861b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst FunctionTextRegion *
8625fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna ZaksMemRegionManager::getFunctionTextRegion(const NamedDecl *FD) {
86367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<FunctionTextRegion>(FD, getCodeRegion());
864ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
865ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
866b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockTextRegion *
86767d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getBlockTextRegion(const BlockDecl *BD, CanQualType locTy,
8681d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                     AnalysisDeclContext *AC) {
86967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<BlockTextRegion>(BD, locTy, AC, getCodeRegion());
870eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
871eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
872eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
873993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
874b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst SymbolicRegion *MemRegionManager::getSymbolicRegion(SymbolRef sym) {
87567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<SymbolicRegion>(sym, getUnknownRegion());
876993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
877993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
878e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaksconst SymbolicRegion *MemRegionManager::getSymbolicHeapRegion(SymbolRef Sym) {
879e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  return getSubRegion<SymbolicRegion>(Sym, getHeapRegion());
880e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks}
881e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks
882de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst FieldRegion*
8839c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getFieldRegion(const FieldDecl *d,
884b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                 const MemRegion* superRegion){
885eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  return getSubRegion<FieldRegion>(d, superRegion);
8869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
8879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
888b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ObjCIvarRegion*
8899c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getObjCIvarRegion(const ObjCIvarDecl *d,
890993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek                                    const MemRegion* superRegion) {
891eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  return getSubRegion<ObjCIvarRegion>(d, superRegion);
892a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek}
893a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
89402fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuconst CXXTempObjectRegion*
89502fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing XuMemRegionManager::getCXXTempObjectRegion(Expr const *E,
89602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                         LocationContext const *LC) {
897bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  const StackFrameContext *SFC = LC->getCurrentStackFrame();
898bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  assert(SFC);
89902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  return getSubRegion<CXXTempObjectRegion>(E, getStackLocalsRegion(SFC));
900bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}
901bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
9024411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose/// Checks whether \p BaseClass is a valid virtual or direct non-virtual base
9034411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose/// class of the type of \p Super.
9044411b423e91da0a2c879b70c0222aeba35f72044Jordan Rosestatic bool isValidBaseClass(const CXXRecordDecl *BaseClass,
9054411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                             const TypedValueRegion *Super,
9064411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                             bool IsVirtual) {
907ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose  BaseClass = BaseClass->getCanonicalDecl();
908ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose
9094411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  const CXXRecordDecl *Class = Super->getValueType()->getAsCXXRecordDecl();
9104411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  if (!Class)
9114411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    return true;
9124411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose
9134411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  if (IsVirtual)
9144411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    return Class->isVirtuallyDerivedFrom(BaseClass);
9154411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose
9164411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  for (CXXRecordDecl::base_class_const_iterator I = Class->bases_begin(),
9174411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                                E = Class->bases_end();
9184411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose       I != E; ++I) {
9194411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    if (I->getType()->getAsCXXRecordDecl()->getCanonicalDecl() == BaseClass)
9204411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      return true;
9214411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  }
922b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
9234411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  return false;
9244411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose}
9254411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose
9264411b423e91da0a2c879b70c0222aeba35f72044Jordan Roseconst CXXBaseObjectRegion *
9274411b423e91da0a2c879b70c0222aeba35f72044Jordan RoseMemRegionManager::getCXXBaseObjectRegion(const CXXRecordDecl *RD,
9284411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                         const MemRegion *Super,
9294411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                         bool IsVirtual) {
9306d35b412fc0289681f320acc389f7a83066ec9e2NAKAMURA Takumi  if (isa<TypedValueRegion>(Super)) {
9316d35b412fc0289681f320acc389f7a83066ec9e2NAKAMURA Takumi    assert(isValidBaseClass(RD, dyn_cast<TypedValueRegion>(Super), IsVirtual));
9326d35b412fc0289681f320acc389f7a83066ec9e2NAKAMURA Takumi    (void)isValidBaseClass;
9334411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose
9344411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    if (IsVirtual) {
9354411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      // Virtual base regions should not be layered, since the layout rules
9364411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      // are different.
9374411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      while (const CXXBaseObjectRegion *Base =
9384411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose               dyn_cast<CXXBaseObjectRegion>(Super)) {
9394411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose        Super = Base->getSuperRegion();
940b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose      }
9414411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      assert(Super && !isa<MemSpaceRegion>(Super));
942b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    }
943b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  }
944b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
9454411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  return getSubRegion<CXXBaseObjectRegion>(RD, IsVirtual, Super);
9464fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
9474fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
948de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst CXXThisRegion*
949de0d26310191215a6d1d189dc419f87af18ce6beTed KremenekMemRegionManager::getCXXThisRegion(QualType thisPointerTy,
950de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                   const LocationContext *LC) {
951de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const StackFrameContext *STC = LC->getCurrentStackFrame();
952de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  assert(STC);
953de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const PointerType *PT = thisPointerTy->getAs<PointerType>();
954de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  assert(PT);
955de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return getSubRegion<CXXThisRegion>(PT, getStackArgumentsRegion(STC));
956de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
957de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
958b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst AllocaRegion*
9599c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getAllocaRegion(const Expr *E, unsigned cnt,
96067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                  const LocationContext *LC) {
96167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *STC = LC->getCurrentStackFrame();
96267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  assert(STC);
96367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<AllocaRegion>(E, cnt, getStackLocalsRegion(STC));
9647090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
9657090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
966bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekconst MemSpaceRegion *MemRegion::getMemorySpace() const {
967bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemRegion *R = this;
968bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const SubRegion* SR = dyn_cast<SubRegion>(this);
9691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
970993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  while (SR) {
971bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek    R = SR->getSuperRegion();
972bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek    SR = dyn_cast<SubRegion>(R);
9739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
975bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  return dyn_cast<MemSpaceRegion>(R);
9769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
9771670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
978bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekbool MemRegion::hasStackStorage() const {
97967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackSpaceRegion>(getMemorySpace());
980bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek}
981dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu
982de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackNonParametersStorage() const {
983de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return isa<StackLocalsSpaceRegion>(getMemorySpace());
9841508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek}
9851508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek
986de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackParametersStorage() const {
98767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackArgumentsSpaceRegion>(getMemorySpace());
988dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek}
989dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek
9901508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenekbool MemRegion::hasGlobalsOrParametersStorage() const {
99167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemSpaceRegion *MS = getMemorySpace();
99267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackArgumentsSpaceRegion>(MS) ||
99367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek         isa<GlobalsSpaceRegion>(MS);
9941508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek}
9951670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
996adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// getBaseRegion strips away all elements and fields, and get the base region
997adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// of them.
998adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xuconst MemRegion *MemRegion::getBaseRegion() const {
999adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *R = this;
1000adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  while (true) {
100168b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek    switch (R->getKind()) {
100268b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::ElementRegionKind:
100368b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::FieldRegionKind:
100468b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::ObjCIvarRegionKind:
1005e17da65c5773e0285b22e33d1431b13fbcd8942cZhongxing Xu      case MemRegion::CXXBaseObjectRegionKind:
100668b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        R = cast<SubRegion>(R)->getSuperRegion();
100768b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        continue;
100868b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      default:
100968b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        break;
1010adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu    }
1011adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu    break;
1012adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  }
1013adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  return R;
1014adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu}
1015adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
10165f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaksbool MemRegion::isSubRegionOf(const MemRegion *R) const {
1017522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks  return false;
1018522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks}
1019522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks
10201670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===//
10211670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek// View handling.
10221670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===//
10231670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
1024b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Roseconst MemRegion *MemRegion::StripCasts(bool StripBaseCasts) const {
10250e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  const MemRegion *R = this;
10260e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  while (true) {
1027c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    switch (R->getKind()) {
1028c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    case ElementRegionKind: {
1029c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      const ElementRegion *ER = cast<ElementRegion>(R);
1030c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      if (!ER->getIndex().isZeroConstant())
1031c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose        return R;
1032c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      R = ER->getSuperRegion();
1033c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      break;
1034c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    }
1035c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    case CXXBaseObjectRegionKind:
1036b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose      if (!StripBaseCasts)
1037b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose        return R;
1038c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      R = cast<CXXBaseObjectRegion>(R)->getSuperRegion();
1039c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      break;
1040c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    default:
1041c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      return R;
10420e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek    }
10430e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  }
10440e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek}
104519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
104619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// FIXME: Merge with the implementation of the same method in Store.cpp
104719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekstatic bool IsCompleteType(ASTContext &Ctx, QualType Ty) {
104819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  if (const RecordType *RT = Ty->getAs<RecordType>()) {
104919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    const RecordDecl *D = RT->getDecl();
1050952b017601f9c82b51119c3a1600f1312a833db9Douglas Gregor    if (!D->getDefinition())
105119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      return false;
105219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  }
105319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
105419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  return true;
105519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
105619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
10577caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing XuRegionRawOffset ElementRegion::getAsArrayOffset() const {
1058199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits offset = CharUnits::Zero();
105919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  const ElementRegion *ER = this;
106019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  const MemRegion *superR = NULL;
106119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  ASTContext &C = getContext();
10621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
106319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  // FIXME: Handle multi-dimensional arrays.
106419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
106519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  while (ER) {
106619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    superR = ER->getSuperRegion();
10671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
106819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    // FIXME: generalize to symbolic offsets.
106919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    SVal index = ER->getIndex();
1070dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie    if (Optional<nonloc::ConcreteInt> CI = index.getAs<nonloc::ConcreteInt>()) {
107119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      // Update the offset.
107219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      int64_t i = CI->getValue().getSExtValue();
10731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
107419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      if (i != 0) {
107519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        QualType elemType = ER->getElementType();
10761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
107719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        // If we are pointing to an incomplete type, go no further.
107819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        if (!IsCompleteType(C, elemType)) {
107919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek          superR = ER;
108019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek          break;
108119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        }
10821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1083199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck        CharUnits size = C.getTypeSizeInChars(elemType);
108419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        offset += (i * size);
108519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      }
108619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
108719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      // Go to the next ElementRegion (if any).
108819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      ER = dyn_cast<ElementRegion>(superR);
108919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      continue;
109019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    }
10911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
109219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    return NULL;
109319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  }
10941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
109519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  assert(superR && "super region cannot be NULL");
10969ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  return RegionRawOffset(superR, offset);
109719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
109819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
10996dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose
11006dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose/// Returns true if \p Base is an immediate base class of \p Child
11016dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rosestatic bool isImmediateBase(const CXXRecordDecl *Child,
11026dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose                            const CXXRecordDecl *Base) {
11036dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  // Note that we do NOT canonicalize the base class here, because
11046dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  // ASTRecordLayout doesn't either. If that leads us down the wrong path,
11056dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  // so be it; at least we won't crash.
11066dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  for (CXXRecordDecl::base_class_const_iterator I = Child->bases_begin(),
11076dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose                                                E = Child->bases_end();
11086dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose       I != E; ++I) {
11096dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose    if (I->getType()->getAsCXXRecordDecl() == Base)
11106dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose      return true;
11116dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  }
11126dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose
11136dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  return false;
11146dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose}
11156dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose
1116e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing XuRegionOffset MemRegion::getAsOffset() const {
1117e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *R = this;
1118824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  const MemRegion *SymbolicOffsetBase = 0;
1119e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t Offset = 0;
1120e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1121e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  while (1) {
1122e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    switch (R->getKind()) {
11239d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case GenericMemSpaceRegionKind:
11249d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case StackLocalsSpaceRegionKind:
11259d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case StackArgumentsSpaceRegionKind:
11269d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case HeapSpaceRegionKind:
11279d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case UnknownSpaceRegionKind:
11289d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case StaticGlobalSpaceRegionKind:
11299d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case GlobalInternalSpaceRegionKind:
11309d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case GlobalSystemSpaceRegionKind:
11319d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case GlobalImmutableSpaceRegionKind:
11329d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      // Stores can bind directly to a region space to set a default value.
11339d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      assert(Offset == 0 && !SymbolicOffsetBase);
11349d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      goto Finish;
11359d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose
11369d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case FunctionTextRegionKind:
11379d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case BlockTextRegionKind:
11389d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case BlockDataRegionKind:
11399d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      // These will never have bindings, but may end up having values requested
11409d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      // if the user does some strange casting.
11419d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      if (Offset != 0)
11429d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose        SymbolicOffsetBase = R;
11439d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      goto Finish;
1144824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1145e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case SymbolicRegionKind:
1146e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case AllocaRegionKind:
1147e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case CompoundLiteralRegionKind:
1148e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case CXXThisRegionKind:
1149e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case StringRegionKind:
11509d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case ObjCStringRegionKind:
1151e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case VarRegionKind:
115202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    case CXXTempObjectRegionKind:
11539d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      // Usual base regions.
1154e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      goto Finish;
1155824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
11561e934431adba0f459668a59c6059b9596fd627b4Jordan Rose    case ObjCIvarRegionKind:
11571e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // This is a little strange, but it's a compromise between
11581e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // ObjCIvarRegions having unknown compile-time offsets (when using the
11591e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // non-fragile runtime) and yet still being distinct, non-overlapping
11601e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // regions. Thus we treat them as "like" base regions for the purposes
11611e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // of computing offsets.
11621e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      goto Finish;
11631e934431adba0f459668a59c6059b9596fd627b4Jordan Rose
1164e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose    case CXXBaseObjectRegionKind: {
1165e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      const CXXBaseObjectRegion *BOR = cast<CXXBaseObjectRegion>(R);
1166e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      R = BOR->getSuperRegion();
1167e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
1168e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      QualType Ty;
11696dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose      bool RootIsSymbolic = false;
1170e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      if (const TypedValueRegion *TVR = dyn_cast<TypedValueRegion>(R)) {
1171e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        Ty = TVR->getDesugaredValueType(getContext());
1172e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      } else if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(R)) {
1173e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // If our base region is symbolic, we don't know what type it really is.
1174e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // Pretend the type of the symbol is the true dynamic type.
1175e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // (This will at least be self-consistent for the life of the symbol.)
1176732cdf383f9030ff2b9fb28dfbdae2285ded80c6Ted Kremenek        Ty = SR->getSymbol()->getType()->getPointeeType();
11776dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        RootIsSymbolic = true;
1178e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      }
1179e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
1180e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      const CXXRecordDecl *Child = Ty->getAsCXXRecordDecl();
11819f6441ad92c30028032eb3df6f4a7f2ebe393a68Jordan Rose      if (!Child) {
1182e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // We cannot compute the offset of the base class.
1183824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        SymbolicOffsetBase = R;
1184e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      }
1185824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
11866dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose      if (RootIsSymbolic) {
11876dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        // Base layers on symbolic regions may not be type-correct.
11886dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        // Double-check the inheritance here, and revert to a symbolic offset
11896dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        // if it's invalid (e.g. due to a reinterpret_cast).
11906dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        if (BOR->isVirtual()) {
11916dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose          if (!Child->isVirtuallyDerivedFrom(BOR->getDecl()))
11926dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose            SymbolicOffsetBase = R;
11936dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        } else {
11946dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose          if (!isImmediateBase(Child, BOR->getDecl()))
11956dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose            SymbolicOffsetBase = R;
11966dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        }
11976dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose      }
11986dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose
1199824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      // Don't bother calculating precise offsets if we already have a
1200824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      // symbolic offset somewhere in the chain.
1201824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      if (SymbolicOffsetBase)
1202824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        continue;
1203824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1204e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      CharUnits BaseOffset;
12054411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      const ASTRecordLayout &Layout = getContext().getASTRecordLayout(Child);
12064411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      if (BOR->isVirtual())
12074411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose        BaseOffset = Layout.getVBaseClassOffset(BOR->getDecl());
1208e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      else
12094411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose        BaseOffset = Layout.getBaseClassOffset(BOR->getDecl());
1210e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
1211e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      // The base offset is in chars, not in bits.
1212e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      Offset += BaseOffset.getQuantity() * getContext().getCharWidth();
1213e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      break;
1214e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose    }
1215e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case ElementRegionKind: {
1216e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const ElementRegion *ER = cast<ElementRegion>(R);
1217824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      R = ER->getSuperRegion();
1218e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1219824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      QualType EleTy = ER->getValueType();
1220824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      if (!IsCompleteType(getContext(), EleTy)) {
1221824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        // We cannot compute the offset of the base class.
1222824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        SymbolicOffsetBase = R;
1223824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        continue;
1224824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      }
1225e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1226e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      SVal Index = ER->getIndex();
1227dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie      if (Optional<nonloc::ConcreteInt> CI =
12285251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie              Index.getAs<nonloc::ConcreteInt>()) {
1229824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        // Don't bother calculating precise offsets if we already have a
1230824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        // symbolic offset somewhere in the chain.
1231824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        if (SymbolicOffsetBase)
1232824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose          continue;
1233824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1234e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        int64_t i = CI->getValue().getSExtValue();
1235e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // This type size is in bits.
1236e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        Offset += i * getContext().getTypeSize(EleTy);
1237e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      } else {
1238e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        // We cannot compute offset for non-concrete index.
1239824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        SymbolicOffsetBase = R;
1240e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      }
12417caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu      break;
1242e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
1243e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case FieldRegionKind: {
1244e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const FieldRegion *FR = cast<FieldRegion>(R);
1245824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      R = FR->getSuperRegion();
1246824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1247e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const RecordDecl *RD = FR->getDecl()->getParent();
1248786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose      if (RD->isUnion() || !RD->isCompleteDefinition()) {
1249e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        // We cannot compute offset for incomplete type.
1250786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose        // For unions, we could treat everything as offset 0, but we'd rather
1251786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose        // treat each field as a symbolic offset so they aren't stored on top
1252786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose        // of each other, since we depend on things in typed regions actually
1253786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose        // matching their types.
1254824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        SymbolicOffsetBase = R;
1255824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      }
1256824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1257824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      // Don't bother calculating precise offsets if we already have a
1258824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      // symbolic offset somewhere in the chain.
1259824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      if (SymbolicOffsetBase)
1260824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        continue;
1261824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1262e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      // Get the field number.
1263e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      unsigned idx = 0;
1264e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      for (RecordDecl::field_iterator FI = RD->field_begin(),
1265e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu             FE = RD->field_end(); FI != FE; ++FI, ++idx)
1266581deb3da481053c4993c7600f97acf7768caac5David Blaikie        if (FR->getDecl() == *FI)
1267e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu          break;
12687caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
1269e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
1270e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      // This is offset in bits.
1271e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      Offset += Layout.getFieldOffset(idx);
1272e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      break;
1273e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
1274e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
1275e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  }
12767caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
1277e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu Finish:
1278824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  if (SymbolicOffsetBase)
1279824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose    return RegionOffset(SymbolicOffsetBase, RegionOffset::Symbolic);
1280e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  return RegionOffset(R, Offset);
12817caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu}
12827caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
12834240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
12844240096011a187807058f887eb81df750ffa17feTed Kremenek// BlockDataRegion
12854240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
12864240096011a187807058f887eb81df750ffa17feTed Kremenek
128724570c4c258545f8310e4bc96503a5668982cf67Ted Kremenekstd::pair<const VarRegion *, const VarRegion *>
128824570c4c258545f8310e4bc96503a5668982cf67Ted KremenekBlockDataRegion::getCaptureRegions(const VarDecl *VD) {
128924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  MemRegionManager &MemMgr = *getMemRegionManager();
129024570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  const VarRegion *VR = 0;
129124570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  const VarRegion *OriginalVR = 0;
129224570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek
129324570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  if (!VD->getAttr<BlocksAttr>() && VD->hasLocalStorage()) {
129424570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    VR = MemMgr.getVarRegion(VD, this);
129524570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    OriginalVR = MemMgr.getVarRegion(VD, LC);
129624570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  }
129724570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  else {
129824570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    if (LC) {
129924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek      VR = MemMgr.getVarRegion(VD, LC);
130024570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek      OriginalVR = VR;
130124570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    }
130224570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    else {
130324570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek      VR = MemMgr.getVarRegion(VD, MemMgr.getUnknownRegion());
130424570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek      OriginalVR = MemMgr.getVarRegion(VD, LC);
130524570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    }
130624570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  }
130724570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  return std::make_pair(VR, OriginalVR);
130824570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek}
130924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek
13104240096011a187807058f887eb81df750ffa17feTed Kremenekvoid BlockDataRegion::LazyInitializeReferencedVars() {
13114240096011a187807058f887eb81df750ffa17feTed Kremenek  if (ReferencedVars)
13124240096011a187807058f887eb81df750ffa17feTed Kremenek    return;
13134240096011a187807058f887eb81df750ffa17feTed Kremenek
13141d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *AC = getCodeRegion()->getAnalysisDeclContext();
13151d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext::referenced_decls_iterator I, E;
13164240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::tie(I, E) = AC->getReferencedBlockVars(BC->getDecl());
1317dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
13184240096011a187807058f887eb81df750ffa17feTed Kremenek  if (I == E) {
13194240096011a187807058f887eb81df750ffa17feTed Kremenek    ReferencedVars = (void*) 0x1;
13204240096011a187807058f887eb81df750ffa17feTed Kremenek    return;
13214240096011a187807058f887eb81df750ffa17feTed Kremenek  }
1322dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
13234240096011a187807058f887eb81df750ffa17feTed Kremenek  MemRegionManager &MemMgr = *getMemRegionManager();
13244240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &A = MemMgr.getAllocator();
13254240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVectorContext BC(A);
1326dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
13274240096011a187807058f887eb81df750ffa17feTed Kremenek  typedef BumpVector<const MemRegion*> VarVec;
13284240096011a187807058f887eb81df750ffa17feTed Kremenek  VarVec *BV = (VarVec*) A.Allocate<VarVec>();
132902b1df62ff6fa9526619ee0db78e2af4186e490dTed Kremenek  new (BV) VarVec(BC, E - I);
133085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  VarVec *BVOriginal = (VarVec*) A.Allocate<VarVec>();
133185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  new (BVOriginal) VarVec(BC, E - I);
1332dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
133367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  for ( ; I != E; ++I) {
133467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    const VarRegion *VR = 0;
133585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const VarRegion *OriginalVR = 0;
133624570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    llvm::tie(VR, OriginalVR) = getCaptureRegions(*I);
133767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(VR);
133885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    assert(OriginalVR);
133967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BV->push_back(VR, BC);
134085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    BVOriginal->push_back(OriginalVR, BC);
134167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
1342dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
13434240096011a187807058f887eb81df750ffa17feTed Kremenek  ReferencedVars = BV;
134485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  OriginalVars = BVOriginal;
13454240096011a187807058f887eb81df750ffa17feTed Kremenek}
13464240096011a187807058f887eb81df750ffa17feTed Kremenek
13474240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator
13484240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_begin() const {
13494240096011a187807058f887eb81df750ffa17feTed Kremenek  const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars();
13504240096011a187807058f887eb81df750ffa17feTed Kremenek
13514240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVector<const MemRegion*> *Vec =
13524240096011a187807058f887eb81df750ffa17feTed Kremenek    static_cast<BumpVector<const MemRegion*>*>(ReferencedVars);
1353dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
135485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  if (Vec == (void*) 0x1)
135585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    return BlockDataRegion::referenced_vars_iterator(0, 0);
135685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
135785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  BumpVector<const MemRegion*> *VecOriginal =
135885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    static_cast<BumpVector<const MemRegion*>*>(OriginalVars);
135985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
136085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  return BlockDataRegion::referenced_vars_iterator(Vec->begin(),
136185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                                   VecOriginal->begin());
13624240096011a187807058f887eb81df750ffa17feTed Kremenek}
13634240096011a187807058f887eb81df750ffa17feTed Kremenek
13644240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator
13654240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_end() const {
13664240096011a187807058f887eb81df750ffa17feTed Kremenek  const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars();
13674240096011a187807058f887eb81df750ffa17feTed Kremenek
13684240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVector<const MemRegion*> *Vec =
13694240096011a187807058f887eb81df750ffa17feTed Kremenek    static_cast<BumpVector<const MemRegion*>*>(ReferencedVars);
1370dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
137185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  if (Vec == (void*) 0x1)
137285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    return BlockDataRegion::referenced_vars_iterator(0, 0);
137385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
137485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  BumpVector<const MemRegion*> *VecOriginal =
137585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    static_cast<BumpVector<const MemRegion*>*>(OriginalVars);
137685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
137785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  return BlockDataRegion::referenced_vars_iterator(Vec->end(),
137885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                                   VecOriginal->end());
13794240096011a187807058f887eb81df750ffa17feTed Kremenek}
13805846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek
13815846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenekconst VarRegion *BlockDataRegion::getOriginalRegion(const VarRegion *R) const {
13825846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  for (referenced_vars_iterator I = referenced_vars_begin(),
13835846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek                                E = referenced_vars_end();
13845846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek       I != E; ++I) {
13855846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek    if (I.getCapturedRegion() == R)
13865846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek      return I.getOriginalRegion();
13875846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  }
13885846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  return 0;
13895846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek}
1390