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();
1516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  while (r != nullptr) {
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());
1766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return SSR ? SSR->getStackFrame() : nullptr;
1775348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek}
1785348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
1795348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek//===----------------------------------------------------------------------===//
18032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose// Region extents.
18132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose//===----------------------------------------------------------------------===//
18232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
183e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan RoseDefinedOrUnknownSVal TypedValueRegion::getExtent(SValBuilder &svalBuilder) const {
1849c378f705405d37f49795d5e915989de774fe11fTed Kremenek  ASTContext &Ctx = svalBuilder.getContext();
18549f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall  QualType T = getDesugaredValueType(Ctx);
18632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
18752e04c537633377fb14cfa4fa3c95e3e510fc942Jordy Rose  if (isa<VariableArrayType>(T))
188c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek    return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this));
1891acb394679b6e644044a0f6c358229759009b1a6Jordan Rose  if (T->isIncompleteType())
19032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    return UnknownVal();
19132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
19299c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  CharUnits size = Ctx.getTypeSizeInChars(T);
19399c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  QualType sizeTy = svalBuilder.getArrayIndexType();
19499c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  return svalBuilder.makeIntVal(size.getQuantity(), sizeTy);
19532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
19632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
197c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal FieldRegion::getExtent(SValBuilder &svalBuilder) const {
198d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose  // Force callers to deal with bitfields explicitly.
199d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose  if (getDecl()->isBitField())
200d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose    return UnknownVal();
201d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose
202c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal Extent = DeclRegion::getExtent(svalBuilder);
20332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
20432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  // A zero-length array at the end of a struct often stands for dynamically-
20532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  // allocated extra memory.
20632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  if (Extent.isZeroConstant()) {
20749f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall    QualType T = getDesugaredValueType(svalBuilder.getContext());
20832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
20932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    if (isa<ConstantArrayType>(T))
21032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose      return UnknownVal();
21132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  }
21232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
21332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  return Extent;
21432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
21532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
216c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal AllocaRegion::getExtent(SValBuilder &svalBuilder) const {
217c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this));
21832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
21932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
220c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal SymbolicRegion::getExtent(SValBuilder &svalBuilder) const {
221c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this));
22232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
22332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
224c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal StringRegion::getExtent(SValBuilder &svalBuilder) const {
22599c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  return svalBuilder.makeIntVal(getStringLiteral()->getByteLength()+1,
22699c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek                                svalBuilder.getArrayIndexType());
22732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
22832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
229c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin KramerObjCIvarRegion::ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg)
230c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
231c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
232c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramerconst ObjCIvarDecl *ObjCIvarRegion::getDecl() const {
233c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  return cast<ObjCIvarDecl>(D);
234c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer}
235c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
236c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin KramerQualType ObjCIvarRegion::getValueType() const {
237c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  return getDecl()->getType();
238c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer}
239c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
2404fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing XuQualType CXXBaseObjectRegion::getValueType() const {
2414411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  return QualType(getDecl()->getTypeForDecl(), 0);
2424fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
2434fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
24432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose//===----------------------------------------------------------------------===//
2455348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek// FoldingSet profiling.
2465348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek//===----------------------------------------------------------------------===//
2475348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
2489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekvoid MemSpaceRegion::Profile(llvm::FoldingSetNodeID& ID) const {
2499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddInteger((unsigned)getKind());
2509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
2519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
25267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekvoid StackSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const {
25367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ID.AddInteger((unsigned)getKind());
25467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ID.AddPointer(getStackFrame());
25567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
25667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
257dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekvoid StaticGlobalSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const {
258dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ID.AddInteger((unsigned)getKind());
259dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ID.AddPointer(getCodeRegion());
260dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}
261dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid StringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                 const StringLiteral* Str,
264e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                                 const MemRegion* superRegion) {
265e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  ID.AddInteger((unsigned) StringRegionKind);
266e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  ID.AddPointer(Str);
267e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  ID.AddPointer(superRegion);
268e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}
269e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
2704c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekvoid ObjCStringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2714c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                                     const ObjCStringLiteral* Str,
2724c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                                     const MemRegion* superRegion) {
2734c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ID.AddInteger((unsigned) ObjCStringRegionKind);
2744c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ID.AddPointer(Str);
2754c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ID.AddPointer(superRegion);
2764c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}
2774c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
2787090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekvoid AllocaRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2799c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                 const Expr *Ex, unsigned cnt,
280dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks                                 const MemRegion *superRegion) {
2817090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  ID.AddInteger((unsigned) AllocaRegionKind);
2827090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  ID.AddPointer(Ex);
2837090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  ID.AddInteger(cnt);
284dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks  ID.AddPointer(superRegion);
2857090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
2867090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
2877090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekvoid AllocaRegion::Profile(llvm::FoldingSetNodeID& ID) const {
2887ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  ProfileRegion(ID, Ex, Cnt, superRegion);
2897090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
2907090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
291329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekvoid CompoundLiteralRegion::Profile(llvm::FoldingSetNodeID& ID) const {
292329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion::ProfileRegion(ID, CL, superRegion);
293329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
294329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
295329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekvoid CompoundLiteralRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2969c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                          const CompoundLiteralExpr *CL,
297329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                                          const MemRegion* superRegion) {
298329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ID.AddInteger((unsigned) CompoundLiteralRegionKind);
299329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ID.AddPointer(CL);
300329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ID.AddPointer(superRegion);
301329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
302329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
303de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekvoid CXXThisRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
304de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                  const PointerType *PT,
305de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                  const MemRegion *sRegion) {
306de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ID.AddInteger((unsigned) CXXThisRegionKind);
307de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ID.AddPointer(PT);
308de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ID.AddPointer(sRegion);
309de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
310de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
311de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekvoid CXXThisRegion::Profile(llvm::FoldingSetNodeID &ID) const {
312de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  CXXThisRegion::ProfileRegion(ID, ThisPointerTy, superRegion);
313de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
314dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
315c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramervoid ObjCIvarRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
316c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer                                   const ObjCIvarDecl *ivd,
317c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer                                   const MemRegion* superRegion) {
318c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
319c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer}
320c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
3219c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid DeclRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D,
3229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                               const MemRegion* superRegion, Kind k) {
3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddInteger((unsigned) k);
3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddPointer(D);
3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddPointer(superRegion);
3269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
3279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekvoid DeclRegion::Profile(llvm::FoldingSetNodeID& ID) const {
3299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  DeclRegion::ProfileRegion(ID, D, superRegion, getKind());
3309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
3319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
332d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekvoid VarRegion::Profile(llvm::FoldingSetNodeID &ID) const {
33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  VarRegion::ProfileRegion(ID, getDecl(), superRegion);
334d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek}
335d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
336250101353b711a409b075f1bc11070dddec7100bTed Kremenekvoid SymbolicRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym,
337250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                   const MemRegion *sreg) {
338993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ID.AddInteger((unsigned) MemRegion::SymbolicRegionKind);
3396d0e2d2f3c1b6531f303aac7e48aa1eb05900f2aTed Kremenek  ID.Add(sym);
340250101353b711a409b075f1bc11070dddec7100bTed Kremenek  ID.AddPointer(sreg);
341993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
342993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
343993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekvoid SymbolicRegion::Profile(llvm::FoldingSetNodeID& ID) const {
344250101353b711a409b075f1bc11070dddec7100bTed Kremenek  SymbolicRegion::ProfileRegion(ID, sym, getSuperRegion());
345993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
346993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
347f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenekvoid ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                  QualType ElementType, SVal Idx,
349511191ce8920160525611be2be754c32a0724c3eZhongxing Xu                                  const MemRegion* superRegion) {
350511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ID.AddInteger(MemRegion::ElementRegionKind);
351f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ID.Add(ElementType);
352511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ID.AddPointer(superRegion);
353511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  Idx.Profile(ID);
354511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}
355511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
356511191ce8920160525611be2be754c32a0724c3eZhongxing Xuvoid ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const {
357f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ElementRegion::ProfileRegion(ID, ElementType, Index, superRegion);
358511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}
35927b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu
360eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid FunctionTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
3615fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks                                       const NamedDecl *FD,
362eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek                                       const MemRegion*) {
363eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  ID.AddInteger(MemRegion::FunctionTextRegionKind);
364abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  ID.AddPointer(FD);
365ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
366ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
367eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid FunctionTextRegion::Profile(llvm::FoldingSetNodeID& ID) const {
368eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  FunctionTextRegion::ProfileRegion(ID, FD, superRegion);
369eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
370eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
371eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid BlockTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                    const BlockDecl *BD, CanQualType,
3731d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                    const AnalysisDeclContext *AC,
37467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                    const MemRegion*) {
375eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  ID.AddInteger(MemRegion::BlockTextRegionKind);
376eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  ID.AddPointer(BD);
377eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
378eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
379eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid BlockTextRegion::Profile(llvm::FoldingSetNodeID& ID) const {
38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockTextRegion::ProfileRegion(ID, BD, locTy, AC, superRegion);
381ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
382ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
3830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekvoid BlockDataRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
3840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                                    const BlockTextRegion *BC,
3850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                                    const LocationContext *LC,
3863eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling                                    unsigned BlkCount,
38767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                    const MemRegion *sReg) {
3880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  ID.AddInteger(MemRegion::BlockDataRegionKind);
3890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  ID.AddPointer(BC);
3900a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  ID.AddPointer(LC);
3913eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling  ID.AddInteger(BlkCount);
39267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ID.AddPointer(sReg);
3930a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
3940a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
3950a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekvoid BlockDataRegion::Profile(llvm::FoldingSetNodeID& ID) const {
3963eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling  BlockDataRegion::ProfileRegion(ID, BC, LC, BlockCount, getSuperRegion());
3970a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
3980a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
39902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuvoid CXXTempObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
40002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                        Expr const *Ex,
40102fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                        const MemRegion *sReg) {
402bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  ID.AddPointer(Ex);
403bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  ID.AddPointer(sReg);
404bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}
405bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
40602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuvoid CXXTempObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const {
407bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  ProfileRegion(ID, Ex, getSuperRegion());
408bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}
409bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
4104fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid CXXBaseObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
4114411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                        const CXXRecordDecl *RD,
4124411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                        bool IsVirtual,
4134411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                        const MemRegion *SReg) {
4144411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  ID.AddPointer(RD);
4154411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  ID.AddBoolean(IsVirtual);
4164411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  ID.AddPointer(SReg);
4174fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
4184fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
4194fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid CXXBaseObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const {
4204411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  ProfileRegion(ID, getDecl(), isVirtual(), superRegion);
4214fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
4224fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
423026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu//===----------------------------------------------------------------------===//
42499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// Region anchors.
42599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
42699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
42799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid GlobalsSpaceRegion::anchor() { }
42899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid HeapSpaceRegion::anchor() { }
42999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UnknownSpaceRegion::anchor() { }
43099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StackLocalsSpaceRegion::anchor() { }
43199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StackArgumentsSpaceRegion::anchor() { }
43299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TypedRegion::anchor() { }
43399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TypedValueRegion::anchor() { }
43499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CodeTextRegion::anchor() { }
43599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid SubRegion::anchor() { }
43699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
43799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
4389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// Region pretty-printing.
4399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
4409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4418800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekvoid MemRegion::dump() const {
4428800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  dumpToStream(llvm::errs());
4437f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek}
4447f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekstd::string MemRegion::getString() const {
4469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::string s;
4479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::raw_string_ostream os(s);
4488800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  dumpToStream(os);
4499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  return os.str();
4509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
4519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4529c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid MemRegion::dumpToStream(raw_ostream &os) const {
4539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  os << "<Unknown Region>";
4549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
4559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4569c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid AllocaRegion::dumpToStream(raw_ostream &os) const {
45731ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky  os << "alloca{" << (const void*) Ex << ',' << Cnt << '}';
4587090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
4597090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
4609c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid FunctionTextRegion::dumpToStream(raw_ostream &os) const {
461abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  os << "code{" << getDecl()->getDeclName().getAsString() << '}';
46272e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek}
46372e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek
4649c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid BlockTextRegion::dumpToStream(raw_ostream &os) const {
46531ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky  os << "block_code{" << (const void*) this << '}';
466eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
467eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
4689c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid BlockDataRegion::dumpToStream(raw_ostream &os) const {
4693eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling  os << "block_data{" << BC;
4703eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling  os << "; ";
4713eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling  for (BlockDataRegion::referenced_vars_iterator
4723eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling         I = referenced_vars_begin(),
4733eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling         E = referenced_vars_end(); I != E; ++I)
4743eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling    os << "(" << I.getCapturedRegion() << "," <<
4753eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling                 I.getOriginalRegion() << ") ";
4763eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling  os << '}';
4770a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
4780a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
4799c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid CompoundLiteralRegion::dumpToStream(raw_ostream &os) const {
4805639a3ec15bdbf0b93376bbbae3adaf724f092a7Ted Kremenek  // FIXME: More elaborate pretty-printing.
48131ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky  os << "{ " << (const void*) CL <<  " }";
4829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
4839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXTempObjectRegion::dumpToStream(raw_ostream &os) const {
485782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin  os << "temp_object{" << getValueType().getAsString() << ','
48631ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky     << (const void*) Ex << '}';
487e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu}
488e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu
4895f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXBaseObjectRegion::dumpToStream(raw_ostream &os) const {
4904411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  os << "base{" << superRegion << ',' << getDecl()->getName() << '}';
4914fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
4924fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
4935f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXThisRegion::dumpToStream(raw_ostream &os) const {
494de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  os << "this";
495de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
496de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
4979c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid ElementRegion::dumpToStream(raw_ostream &os) const {
49819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  os << "element{" << superRegion << ','
49919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek     << Index << ',' << getElementType().getAsString() << '}';
500993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
501993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
5029c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid FieldRegion::dumpToStream(raw_ostream &os) const {
503b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  os << superRegion << "->" << *getDecl();
5044bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek}
5054bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
5069c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid ObjCIvarRegion::dumpToStream(raw_ostream &os) const {
507b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  os << "ivar{" << superRegion << ',' << *getDecl() << '}';
508bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek}
509bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek
5109c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid StringRegion::dumpToStream(raw_ostream &os) const {
511ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  assert(Str != nullptr && "Expecting non-null StringLiteral");
5126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Str->printPretty(os, nullptr, PrintingPolicy(getContext().getLangOpts()));
513b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu}
514b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
5154c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekvoid ObjCStringRegion::dumpToStream(raw_ostream &os) const {
516ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  assert(Str != nullptr && "Expecting non-null ObjCStringLiteral");
5176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Str->printPretty(os, nullptr, PrintingPolicy(getContext().getLangOpts()));
5184c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}
5194c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
5209c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid SymbolicRegion::dumpToStream(raw_ostream &os) const {
521aef5d2205a4425a4d3e1b0e28d46ed80763651dfTed Kremenek  os << "SymRegion{" << sym << '}';
522329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
523329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
5249c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid VarRegion::dumpToStream(raw_ostream &os) const {
525b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  os << *cast<VarDecl>(D);
526cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu}
527cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
52819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekvoid RegionRawOffset::dump() const {
52919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  dumpToStream(llvm::errs());
53019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
53119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
5329c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid RegionRawOffset::dumpToStream(raw_ostream &os) const {
5339ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  os << "raw_offset{" << getRegion() << ',' << getOffset().getQuantity() << '}';
53419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
53519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
5365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid StaticGlobalSpaceRegion::dumpToStream(raw_ostream &os) const {
537fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek  os << "StaticGlobalsMemSpace{" << CR << '}';
538fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek}
539fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
540eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalInternalSpaceRegion::dumpToStream(raw_ostream &os) const {
541eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  os << "GlobalInternalSpaceRegion";
542eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}
543eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
544eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalSystemSpaceRegion::dumpToStream(raw_ostream &os) const {
545eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  os << "GlobalSystemSpaceRegion";
546eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}
547eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
548eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalImmutableSpaceRegion::dumpToStream(raw_ostream &os) const {
549eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  os << "GlobalImmutableSpaceRegion";
550eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}
551eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
55236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid HeapSpaceRegion::dumpToStream(raw_ostream &os) const {
55336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  os << "HeapSpaceRegion";
55436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose}
55536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
55636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid UnknownSpaceRegion::dumpToStream(raw_ostream &os) const {
55736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  os << "UnknownSpaceRegion";
55836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose}
55936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
56036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid StackArgumentsSpaceRegion::dumpToStream(raw_ostream &os) const {
56136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  os << "StackArgumentsSpaceRegion";
56236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose}
56336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
56436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid StackLocalsSpaceRegion::dumpToStream(raw_ostream &os) const {
56536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  os << "StackLocalsSpaceRegion";
56636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose}
56736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
568919e8a1c6698bfa6848571d366430126bced727dJordan Rosebool MemRegion::canPrintPretty() const {
569716859df842e5a56e816d820d8326ead152dd9e4Anna Zaks  return canPrintPrettyAsExpr();
570919e8a1c6698bfa6848571d366430126bced727dJordan Rose}
571919e8a1c6698bfa6848571d366430126bced727dJordan Rose
57279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksbool MemRegion::canPrintPrettyAsExpr() const {
573716859df842e5a56e816d820d8326ead152dd9e4Anna Zaks  return false;
57479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks}
57579d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks
576919e8a1c6698bfa6848571d366430126bced727dJordan Rosevoid MemRegion::printPretty(raw_ostream &os) const {
5779e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  assert(canPrintPretty() && "This region cannot be printed pretty.");
5789e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  os << "'";
57979d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  printPrettyAsExpr(os);
5809e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  os << "'";
5819e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  return;
5829e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks}
5839e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks
58479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksvoid MemRegion::printPrettyAsExpr(raw_ostream &os) const {
58579d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  llvm_unreachable("This region cannot be printed pretty.");
5863d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  return;
5873d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks}
5883d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
589716859df842e5a56e816d820d8326ead152dd9e4Anna Zaksbool VarRegion::canPrintPrettyAsExpr() const {
590919e8a1c6698bfa6848571d366430126bced727dJordan Rose  return true;
591919e8a1c6698bfa6848571d366430126bced727dJordan Rose}
592919e8a1c6698bfa6848571d366430126bced727dJordan Rose
59379d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksvoid VarRegion::printPrettyAsExpr(raw_ostream &os) const {
5943d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  os << getDecl()->getName();
5953d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks}
5963d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
597716859df842e5a56e816d820d8326ead152dd9e4Anna Zaksbool ObjCIvarRegion::canPrintPrettyAsExpr() const {
59843b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek  return true;
59943b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek}
60043b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek
60179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksvoid ObjCIvarRegion::printPrettyAsExpr(raw_ostream &os) const {
60243b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek  os << getDecl()->getName();
60343b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek}
60443b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek
605919e8a1c6698bfa6848571d366430126bced727dJordan Rosebool FieldRegion::canPrintPretty() const {
6069e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  return true;
6079e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks}
6089e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks
60979d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksbool FieldRegion::canPrintPrettyAsExpr() const {
61079d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  return superRegion->canPrintPrettyAsExpr();
61179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks}
61279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks
61379d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaksvoid FieldRegion::printPrettyAsExpr(raw_ostream &os) const {
61479d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  assert(canPrintPrettyAsExpr());
61579d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  superRegion->printPrettyAsExpr(os);
61679d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  os << "." << getDecl()->getName();
617919e8a1c6698bfa6848571d366430126bced727dJordan Rose}
618919e8a1c6698bfa6848571d366430126bced727dJordan Rose
619919e8a1c6698bfa6848571d366430126bced727dJordan Rosevoid FieldRegion::printPretty(raw_ostream &os) const {
62079d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  if (canPrintPrettyAsExpr()) {
6219e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks    os << "\'";
62279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks    printPrettyAsExpr(os);
6239e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks    os << "'";
6249e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  } else {
62579d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks    os << "field " << "\'" << getDecl()->getName() << "'";
6269e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  }
6279e2f5977a180ae927d05e844c65b8a7873be48a4Anna Zaks  return;
6283d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks}
6293d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
63007d8470effc0b0364801adddb6ff92bd22334402Anna Zaksbool CXXBaseObjectRegion::canPrintPrettyAsExpr() const {
63179d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks  return superRegion->canPrintPrettyAsExpr();
63279d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks}
63379d0cceb8847bfe6dc9da8eb2ea2f3c6bb73b813Anna Zaks
63407d8470effc0b0364801adddb6ff92bd22334402Anna Zaksvoid CXXBaseObjectRegion::printPrettyAsExpr(raw_ostream &os) const {
63507d8470effc0b0364801adddb6ff92bd22334402Anna Zaks  superRegion->printPrettyAsExpr(os);
63607d8470effc0b0364801adddb6ff92bd22334402Anna Zaks}
63707d8470effc0b0364801adddb6ff92bd22334402Anna Zaks
6389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
6399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager methods.
6409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
64119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
64267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG>
64367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region) {
6441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!region) {
64567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    region = (REG*) A.Allocate<REG>();
64667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    new (region) REG(this);
6479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
648a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
6499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  return region;
6509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
6519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
65267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG, typename ARG>
65367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region, ARG a) {
65467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  if (!region) {
65567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    region = (REG*) A.Allocate<REG>();
65667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    new (region) REG(this, a);
65767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
658dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
65967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return region;
66067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
66167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
66267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackLocalsSpaceRegion*
6632b87ae45e129b941d0a4d221c9d4842385a119bdTed KremenekMemRegionManager::getStackLocalsRegion(const StackFrameContext *STC) {
6642b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  assert(STC);
665c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  StackLocalsSpaceRegion *&R = StackLocalsSpaceRegions[STC];
666c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
667c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  if (R)
668c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    return R;
669c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
670c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  R = A.Allocate<StackLocalsSpaceRegion>();
671c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  new (R) StackLocalsSpaceRegion(this, STC);
672c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  return R;
6739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
6749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
67567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackArgumentsSpaceRegion *
67667d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getStackArgumentsRegion(const StackFrameContext *STC) {
6772b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  assert(STC);
678c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  StackArgumentsSpaceRegion *&R = StackArgumentsSpaceRegions[STC];
679c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
680c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  if (R)
681c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    return R;
682c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
683c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  R = A.Allocate<StackArgumentsSpaceRegion>();
684c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  new (R) StackArgumentsSpaceRegion(this, STC);
685c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  return R;
686d05552a21377f493c882298c59e8829040b01d34Ted Kremenek}
687d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
688dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst GlobalsSpaceRegion
689eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks*MemRegionManager::getGlobalsRegion(MemRegion::Kind K,
690eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks                                    const CodeTextRegion *CR) {
691eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  if (!CR) {
692eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    if (K == MemRegion::GlobalSystemSpaceRegionKind)
693eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      return LazyAllocate(SystemGlobals);
694eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    if (K == MemRegion::GlobalImmutableSpaceRegionKind)
695eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      return LazyAllocate(ImmutableGlobals);
696eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    assert(K == MemRegion::GlobalInternalSpaceRegionKind);
697eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return LazyAllocate(InternalGlobals);
698eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
699dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
700eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  assert(K == MemRegion::StaticGlobalSpaceRegionKind);
701dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  StaticGlobalSpaceRegion *&R = StaticsGlobalSpaceRegions[CR];
702dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  if (R)
703dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R;
704dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
705dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  R = A.Allocate<StaticGlobalSpaceRegion>();
706dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  new (R) StaticGlobalSpaceRegion(this, CR);
707dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  return R;
7089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
7099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
71067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst HeapSpaceRegion *MemRegionManager::getHeapRegion() {
7119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  return LazyAllocate(heap);
7129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
7139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
714b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getUnknownRegion() {
715178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  return LazyAllocate(unknown);
716178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu}
717178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
718b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getCodeRegion() {
719ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  return LazyAllocate(code);
720ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
721ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
722250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
723250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Constructing regions.
724250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
725dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst StringRegion* MemRegionManager::getStringRegion(const StringLiteral* Str){
72667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<StringRegion>(Str, getGlobalsRegion());
727e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}
728e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
7294c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekconst ObjCStringRegion *
7304c62b557e269a27515dfca1f754ae936c8fdb824Ted KremenekMemRegionManager::getObjCStringRegion(const ObjCStringLiteral* Str){
7314c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  return getSubRegion<ObjCStringRegion>(Str, getGlobalsRegion());
7324c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}
7334c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
7347fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// Look through a chain of LocationContexts to either find the
7357fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// StackFrameContext that matches a DeclContext, or find a VarRegion
7367fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// for a variable captured by a block.
7377fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenekstatic llvm::PointerUnion<const StackFrameContext *, const VarRegion *>
7387fa9b4f258636d89342eda28f21a986c8ac353b1Ted KremenekgetStackOrCaptureRegionForDeclContext(const LocationContext *LC,
7397fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek                                      const DeclContext *DC,
7407fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek                                      const VarDecl *VD) {
7417fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek  while (LC) {
7427fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    if (const StackFrameContext *SFC = dyn_cast<StackFrameContext>(LC)) {
7437fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      if (cast<DeclContext>(SFC->getDecl()) == DC)
7447fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        return SFC;
7457fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    }
7467fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    if (const BlockInvocationContext *BC =
7477fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        dyn_cast<BlockInvocationContext>(LC)) {
7487fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      const BlockDataRegion *BR =
7497fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        static_cast<const BlockDataRegion*>(BC->getContextData());
7507fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      // FIXME: This can be made more efficient.
7517fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      for (BlockDataRegion::referenced_vars_iterator
7527fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek           I = BR->referenced_vars_begin(),
7537fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek           E = BR->referenced_vars_end(); I != E; ++I) {
7547fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        if (const VarRegion *VR = dyn_cast<VarRegion>(I.getOriginalRegion()))
7557fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek          if (VR->getDecl() == VD)
7567fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek            return cast<VarRegion>(I.getCapturedRegion());
7577fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      }
7587fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    }
7597fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
7607fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    LC = LC->getParent();
7617fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek  }
7626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return (const StackFrameContext *)nullptr;
7637fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek}
7647fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
765b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst VarRegion* MemRegionManager::getVarRegion(const VarDecl *D,
766b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                                const LocationContext *LC) {
7676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const MemRegion *sReg = nullptr;
7681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
769eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  if (D->hasGlobalStorage() && !D->isStaticLocal()) {
770eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
771eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    // First handle the globals defined in system headers.
772eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    if (C.getSourceManager().isInSystemHeader(D->getLocation())) {
773eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // Whitelist the system globals which often DO GET modified, assume the
774eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // rest are immutable.
775eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      if (D->getName().find("errno") != StringRef::npos)
776eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion(MemRegion::GlobalSystemSpaceRegionKind);
777eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      else
778eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind);
779eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
780eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    // Treat other globals as GlobalInternal unless they are constants.
781eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    } else {
782eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      QualType GQT = D->getType();
783eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      const Type *GT = GQT.getTypePtrOrNull();
784eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // TODO: We could walk the complex types here and see if everything is
785eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // constified.
786eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      if (GT && GQT.isConstQualified() && GT->isArithmeticType())
787eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind);
788eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      else
789eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion();
790eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    }
791eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
792eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  // Finally handle static locals.
793eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  } else {
79467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // FIXME: Once we implement scope handling, we will need to properly lookup
79567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // 'D' to the proper LocationContext.
7962b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    const DeclContext *DC = D->getDeclContext();
7977fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    llvm::PointerUnion<const StackFrameContext *, const VarRegion *> V =
7987fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      getStackOrCaptureRegionForDeclContext(LC, DC, D);
7997fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
8007fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    if (V.is<const VarRegion*>())
8017fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      return V.get<const VarRegion*>();
8027fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
8037fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    const StackFrameContext *STC = V.get<const StackFrameContext*>();
8042b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
8052b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    if (!STC)
8062b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek      sReg = getUnknownRegion();
8072b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    else {
808dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      if (D->hasLocalStorage()) {
809dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        sReg = isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D)
810dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek               ? static_cast<const MemRegion*>(getStackArgumentsRegion(STC))
811dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek               : static_cast<const MemRegion*>(getStackLocalsRegion(STC));
812dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      }
813dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      else {
814dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        assert(D->isStaticLocal());
8155fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks        const Decl *STCD = STC->getDecl();
8165fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks        if (isa<FunctionDecl>(STCD) || isa<ObjCMethodDecl>(STCD))
817eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks          sReg = getGlobalsRegion(MemRegion::StaticGlobalSpaceRegionKind,
8185fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks                                  getFunctionTextRegion(cast<NamedDecl>(STCD)));
8195fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks        else if (const BlockDecl *BD = dyn_cast<BlockDecl>(STCD)) {
820eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose          // FIXME: The fallback type here is totally bogus -- though it should
821eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose          // never be queried, it will prevent uniquing with the real
822eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose          // BlockTextRegion. Ideally we'd fix the AST so that we always had a
823eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose          // signature.
824eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose          QualType T;
825eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose          if (const TypeSourceInfo *TSI = BD->getSignatureAsWritten())
826eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose            T = TSI->getType();
827eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose          else
828eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose            T = getContext().getFunctionNoProtoType(getContext().VoidTy);
829eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose
830dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          const BlockTextRegion *BTR =
831eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose            getBlockTextRegion(BD, C.getCanonicalType(T),
832eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose                               STC->getAnalysisDeclContext());
833eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks          sReg = getGlobalsRegion(MemRegion::StaticGlobalSpaceRegionKind,
834eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks                                  BTR);
835dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        }
836dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        else {
837dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          sReg = getGlobalsRegion();
838dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        }
839dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      }
8402b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    }
84167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
842dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
84367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<VarRegion>(D, sReg);
84467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
8451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
84667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst VarRegion *MemRegionManager::getVarRegion(const VarDecl *D,
84767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                                const MemRegion *superR) {
84867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<VarRegion>(D, superR);
8499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
8509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
851b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockDataRegion *
852b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted KremenekMemRegionManager::getBlockDataRegion(const BlockTextRegion *BC,
8533eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling                                     const LocationContext *LC,
8543eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling                                     unsigned blockCount) {
8556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const MemRegion *sReg = nullptr;
85699c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek  const BlockDecl *BD = BC->getDecl();
85799c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek  if (!BD->hasCaptures()) {
85899c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    // This handles 'static' blocks.
85999c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind);
86067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
86167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  else {
86299c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    if (LC) {
86399c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // FIXME: Once we implement scope handling, we want the parent region
86499c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // to be the scope.
86599c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      const StackFrameContext *STC = LC->getCurrentStackFrame();
86699c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      assert(STC);
86799c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      sReg = getStackLocalsRegion(STC);
86899c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    }
86999c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    else {
87099c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // We allow 'LC' to be NULL for cases where want BlockDataRegions
87199c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // without context-sensitivity.
87299c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      sReg = getUnknownRegion();
87399c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    }
87467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
87567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
8763eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling  return getSubRegion<BlockDataRegion>(BC, LC, blockCount, sReg);
8770a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
8780a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
87976b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labathconst CXXTempObjectRegion *
88076b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel LabathMemRegionManager::getCXXStaticTempObjectRegion(const Expr *Ex) {
88176b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath  return getSubRegion<CXXTempObjectRegion>(
8826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Ex, getGlobalsRegion(MemRegion::GlobalInternalSpaceRegionKind, nullptr));
88376b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath}
88476b5dd48c9dbf2ed3e5830060ea55b81b7d1cca0Pavel Labath
885b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst CompoundLiteralRegion*
8869c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getCompoundLiteralRegion(const CompoundLiteralExpr *CL,
88767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                           const LocationContext *LC) {
888dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
8896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const MemRegion *sReg = nullptr;
890dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
89167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  if (CL->isFileScope())
89267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    sReg = getGlobalsRegion();
89367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  else {
89467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    const StackFrameContext *STC = LC->getCurrentStackFrame();
89567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(STC);
89667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    sReg = getStackLocalsRegion(STC);
89767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
898dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
89967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<CompoundLiteralRegion>(CL, sReg);
900329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
901329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
902b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ElementRegion*
90302282acd7a42d06a3178e3102d34a585bd82dd9fTed KremenekMemRegionManager::getElementRegion(QualType elementType, NonLoc Idx,
904465373946b5ae84f7c3d890cc25cb23fd88dd650Ted Kremenek                                   const MemRegion* superRegion,
9059c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                   ASTContext &Ctx){
906143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu
90732f901092daa4a53c7e012408c1f59d73ba29ff5Ted Kremenek  QualType T = Ctx.getCanonicalType(elementType).getUnqualifiedType();
908abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek
909511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  llvm::FoldingSetNodeID ID;
910143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu  ElementRegion::ProfileRegion(ID, T, Idx, superRegion);
911511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
9129c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
913511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
914511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ElementRegion* R = cast_or_null<ElementRegion>(data);
915511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
916511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  if (!R) {
917511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    R = (ElementRegion*) A.Allocate<ElementRegion>();
918143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu    new (R) ElementRegion(T, Idx, superRegion);
919511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    Regions.InsertNode(R, InsertPos);
920511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
921511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
922511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  return R;
923511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}
924511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
925b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst FunctionTextRegion *
9265fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna ZaksMemRegionManager::getFunctionTextRegion(const NamedDecl *FD) {
92767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<FunctionTextRegion>(FD, getCodeRegion());
928ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
929ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
930b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockTextRegion *
93167d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getBlockTextRegion(const BlockDecl *BD, CanQualType locTy,
9321d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                     AnalysisDeclContext *AC) {
93367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<BlockTextRegion>(BD, locTy, AC, getCodeRegion());
934eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
935eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
936eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
937993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
938b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst SymbolicRegion *MemRegionManager::getSymbolicRegion(SymbolRef sym) {
93967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<SymbolicRegion>(sym, getUnknownRegion());
940993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
941993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
942e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaksconst SymbolicRegion *MemRegionManager::getSymbolicHeapRegion(SymbolRef Sym) {
943e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  return getSubRegion<SymbolicRegion>(Sym, getHeapRegion());
944e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks}
945e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks
946de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst FieldRegion*
9479c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getFieldRegion(const FieldDecl *d,
948b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                 const MemRegion* superRegion){
949eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  return getSubRegion<FieldRegion>(d, superRegion);
9509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
9519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
952b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ObjCIvarRegion*
9539c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getObjCIvarRegion(const ObjCIvarDecl *d,
954993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek                                    const MemRegion* superRegion) {
955eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  return getSubRegion<ObjCIvarRegion>(d, superRegion);
956a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek}
957a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
95802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuconst CXXTempObjectRegion*
95902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing XuMemRegionManager::getCXXTempObjectRegion(Expr const *E,
96002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                         LocationContext const *LC) {
961bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  const StackFrameContext *SFC = LC->getCurrentStackFrame();
962bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  assert(SFC);
96302fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  return getSubRegion<CXXTempObjectRegion>(E, getStackLocalsRegion(SFC));
964bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}
965bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
9664411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose/// Checks whether \p BaseClass is a valid virtual or direct non-virtual base
9674411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose/// class of the type of \p Super.
9684411b423e91da0a2c879b70c0222aeba35f72044Jordan Rosestatic bool isValidBaseClass(const CXXRecordDecl *BaseClass,
9694411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                             const TypedValueRegion *Super,
9704411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                             bool IsVirtual) {
971ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose  BaseClass = BaseClass->getCanonicalDecl();
972ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose
9734411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  const CXXRecordDecl *Class = Super->getValueType()->getAsCXXRecordDecl();
9744411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  if (!Class)
9754411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    return true;
9764411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose
9774411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  if (IsVirtual)
9784411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    return Class->isVirtuallyDerivedFrom(BaseClass);
9794411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose
980651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &I : Class->bases()) {
981651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (I.getType()->getAsCXXRecordDecl()->getCanonicalDecl() == BaseClass)
9824411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      return true;
9834411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  }
984b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
9854411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  return false;
9864411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose}
9874411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose
9884411b423e91da0a2c879b70c0222aeba35f72044Jordan Roseconst CXXBaseObjectRegion *
9894411b423e91da0a2c879b70c0222aeba35f72044Jordan RoseMemRegionManager::getCXXBaseObjectRegion(const CXXRecordDecl *RD,
9904411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                         const MemRegion *Super,
9914411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose                                         bool IsVirtual) {
9926d35b412fc0289681f320acc389f7a83066ec9e2NAKAMURA Takumi  if (isa<TypedValueRegion>(Super)) {
9936d35b412fc0289681f320acc389f7a83066ec9e2NAKAMURA Takumi    assert(isValidBaseClass(RD, dyn_cast<TypedValueRegion>(Super), IsVirtual));
994b6d0f4c8dd162b019681b60d06f7ad33500f4146Aaron Ballman    (void)&isValidBaseClass;
9954411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose
9964411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose    if (IsVirtual) {
9974411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      // Virtual base regions should not be layered, since the layout rules
9984411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      // are different.
9994411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      while (const CXXBaseObjectRegion *Base =
10004411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose               dyn_cast<CXXBaseObjectRegion>(Super)) {
10014411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose        Super = Base->getSuperRegion();
1002b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose      }
10034411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      assert(Super && !isa<MemSpaceRegion>(Super));
1004b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    }
1005b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  }
1006b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
10074411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose  return getSubRegion<CXXBaseObjectRegion>(RD, IsVirtual, Super);
10084fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
10094fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
1010de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst CXXThisRegion*
1011de0d26310191215a6d1d189dc419f87af18ce6beTed KremenekMemRegionManager::getCXXThisRegion(QualType thisPointerTy,
1012de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                   const LocationContext *LC) {
1013de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const StackFrameContext *STC = LC->getCurrentStackFrame();
1014de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  assert(STC);
1015de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const PointerType *PT = thisPointerTy->getAs<PointerType>();
1016de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  assert(PT);
1017de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return getSubRegion<CXXThisRegion>(PT, getStackArgumentsRegion(STC));
1018de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
1019de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
1020b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst AllocaRegion*
10219c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getAllocaRegion(const Expr *E, unsigned cnt,
102267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                  const LocationContext *LC) {
102367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *STC = LC->getCurrentStackFrame();
102467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  assert(STC);
102567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<AllocaRegion>(E, cnt, getStackLocalsRegion(STC));
10267090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
10277090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
1028bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekconst MemSpaceRegion *MemRegion::getMemorySpace() const {
1029bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemRegion *R = this;
1030bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const SubRegion* SR = dyn_cast<SubRegion>(this);
10311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1032993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  while (SR) {
1033bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek    R = SR->getSuperRegion();
1034bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek    SR = dyn_cast<SubRegion>(R);
10359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
10361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1037bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  return dyn_cast<MemSpaceRegion>(R);
10389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
10391670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
1040bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekbool MemRegion::hasStackStorage() const {
104167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackSpaceRegion>(getMemorySpace());
1042bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek}
1043dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu
1044de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackNonParametersStorage() const {
1045de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return isa<StackLocalsSpaceRegion>(getMemorySpace());
10461508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek}
10471508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek
1048de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackParametersStorage() const {
104967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackArgumentsSpaceRegion>(getMemorySpace());
1050dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek}
1051dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek
10521508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenekbool MemRegion::hasGlobalsOrParametersStorage() const {
105367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemSpaceRegion *MS = getMemorySpace();
105467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackArgumentsSpaceRegion>(MS) ||
105567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek         isa<GlobalsSpaceRegion>(MS);
10561508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek}
10571670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
1058adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// getBaseRegion strips away all elements and fields, and get the base region
1059adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// of them.
1060adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xuconst MemRegion *MemRegion::getBaseRegion() const {
1061adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *R = this;
1062adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  while (true) {
106368b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek    switch (R->getKind()) {
106468b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::ElementRegionKind:
106568b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::FieldRegionKind:
106668b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::ObjCIvarRegionKind:
1067e17da65c5773e0285b22e33d1431b13fbcd8942cZhongxing Xu      case MemRegion::CXXBaseObjectRegionKind:
106868b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        R = cast<SubRegion>(R)->getSuperRegion();
106968b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        continue;
107068b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      default:
107168b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        break;
1072adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu    }
1073adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu    break;
1074adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  }
1075adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  return R;
1076adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu}
1077adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
10785f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaksbool MemRegion::isSubRegionOf(const MemRegion *R) const {
1079522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks  return false;
1080522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks}
1081522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks
10821670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===//
10831670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek// View handling.
10841670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===//
10851670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
1086b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Roseconst MemRegion *MemRegion::StripCasts(bool StripBaseCasts) const {
10870e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  const MemRegion *R = this;
10880e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  while (true) {
1089c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    switch (R->getKind()) {
1090c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    case ElementRegionKind: {
1091c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      const ElementRegion *ER = cast<ElementRegion>(R);
1092c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      if (!ER->getIndex().isZeroConstant())
1093c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose        return R;
1094c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      R = ER->getSuperRegion();
1095c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      break;
1096c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    }
1097c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    case CXXBaseObjectRegionKind:
1098b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose      if (!StripBaseCasts)
1099b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose        return R;
1100c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      R = cast<CXXBaseObjectRegion>(R)->getSuperRegion();
1101c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      break;
1102c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    default:
1103c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      return R;
11040e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek    }
11050e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  }
11060e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek}
110719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
11088ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaksconst SymbolicRegion *MemRegion::getSymbolicBase() const {
11098ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks  const SubRegion *SubR = dyn_cast<SubRegion>(this);
11108ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks
11118ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks  while (SubR) {
11128ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks    if (const SymbolicRegion *SymR = dyn_cast<SymbolicRegion>(SubR))
11138ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks      return SymR;
11148ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks    SubR = dyn_cast<SubRegion>(SubR->getSuperRegion());
11158ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks  }
11166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
11178ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks}
11188ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks
111919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// FIXME: Merge with the implementation of the same method in Store.cpp
112019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekstatic bool IsCompleteType(ASTContext &Ctx, QualType Ty) {
112119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  if (const RecordType *RT = Ty->getAs<RecordType>()) {
112219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    const RecordDecl *D = RT->getDecl();
1123952b017601f9c82b51119c3a1600f1312a833db9Douglas Gregor    if (!D->getDefinition())
112419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      return false;
112519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  }
112619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
112719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  return true;
112819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
112919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
11307caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing XuRegionRawOffset ElementRegion::getAsArrayOffset() const {
1131199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits offset = CharUnits::Zero();
113219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  const ElementRegion *ER = this;
11336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const MemRegion *superR = nullptr;
113419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  ASTContext &C = getContext();
11351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
113619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  // FIXME: Handle multi-dimensional arrays.
113719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
113819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  while (ER) {
113919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    superR = ER->getSuperRegion();
11401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
114119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    // FIXME: generalize to symbolic offsets.
114219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    SVal index = ER->getIndex();
1143dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie    if (Optional<nonloc::ConcreteInt> CI = index.getAs<nonloc::ConcreteInt>()) {
114419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      // Update the offset.
114519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      int64_t i = CI->getValue().getSExtValue();
11461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
114719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      if (i != 0) {
114819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        QualType elemType = ER->getElementType();
11491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
115019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        // If we are pointing to an incomplete type, go no further.
115119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        if (!IsCompleteType(C, elemType)) {
115219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek          superR = ER;
115319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek          break;
115419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        }
11551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1156199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck        CharUnits size = C.getTypeSizeInChars(elemType);
115719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        offset += (i * size);
115819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      }
115919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
116019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      // Go to the next ElementRegion (if any).
116119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      ER = dyn_cast<ElementRegion>(superR);
116219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      continue;
116319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    }
11641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
116619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  }
11671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
116819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  assert(superR && "super region cannot be NULL");
11699ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  return RegionRawOffset(superR, offset);
117019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
117119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
11726dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose
11736dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose/// Returns true if \p Base is an immediate base class of \p Child
11746dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rosestatic bool isImmediateBase(const CXXRecordDecl *Child,
11756dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose                            const CXXRecordDecl *Base) {
11766dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  // Note that we do NOT canonicalize the base class here, because
11776dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  // ASTRecordLayout doesn't either. If that leads us down the wrong path,
11786dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  // so be it; at least we won't crash.
1179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &I : Child->bases()) {
1180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (I.getType()->getAsCXXRecordDecl() == Base)
11816dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose      return true;
11826dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  }
11836dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose
11846dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose  return false;
11856dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose}
11866dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose
1187e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing XuRegionOffset MemRegion::getAsOffset() const {
1188e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *R = this;
11896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const MemRegion *SymbolicOffsetBase = nullptr;
1190e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t Offset = 0;
1191e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1192e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  while (1) {
1193e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    switch (R->getKind()) {
11949d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case GenericMemSpaceRegionKind:
11959d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case StackLocalsSpaceRegionKind:
11969d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case StackArgumentsSpaceRegionKind:
11979d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case HeapSpaceRegionKind:
11989d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case UnknownSpaceRegionKind:
11999d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case StaticGlobalSpaceRegionKind:
12009d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case GlobalInternalSpaceRegionKind:
12019d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case GlobalSystemSpaceRegionKind:
12029d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case GlobalImmutableSpaceRegionKind:
12039d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      // Stores can bind directly to a region space to set a default value.
12049d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      assert(Offset == 0 && !SymbolicOffsetBase);
12059d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      goto Finish;
12069d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose
12079d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case FunctionTextRegionKind:
12089d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case BlockTextRegionKind:
12099d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case BlockDataRegionKind:
12109d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      // These will never have bindings, but may end up having values requested
12119d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      // if the user does some strange casting.
12129d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      if (Offset != 0)
12139d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose        SymbolicOffsetBase = R;
12149d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      goto Finish;
1215824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1216e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case SymbolicRegionKind:
1217e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case AllocaRegionKind:
1218e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case CompoundLiteralRegionKind:
1219e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case CXXThisRegionKind:
1220e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case StringRegionKind:
12219d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose    case ObjCStringRegionKind:
1222e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case VarRegionKind:
122302fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    case CXXTempObjectRegionKind:
12249d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose      // Usual base regions.
1225e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      goto Finish;
1226824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
12271e934431adba0f459668a59c6059b9596fd627b4Jordan Rose    case ObjCIvarRegionKind:
12281e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // This is a little strange, but it's a compromise between
12291e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // ObjCIvarRegions having unknown compile-time offsets (when using the
12301e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // non-fragile runtime) and yet still being distinct, non-overlapping
12311e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // regions. Thus we treat them as "like" base regions for the purposes
12321e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      // of computing offsets.
12331e934431adba0f459668a59c6059b9596fd627b4Jordan Rose      goto Finish;
12341e934431adba0f459668a59c6059b9596fd627b4Jordan Rose
1235e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose    case CXXBaseObjectRegionKind: {
1236e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      const CXXBaseObjectRegion *BOR = cast<CXXBaseObjectRegion>(R);
1237e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      R = BOR->getSuperRegion();
1238e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
1239e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      QualType Ty;
12406dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose      bool RootIsSymbolic = false;
1241e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      if (const TypedValueRegion *TVR = dyn_cast<TypedValueRegion>(R)) {
1242e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        Ty = TVR->getDesugaredValueType(getContext());
1243e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      } else if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(R)) {
1244e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // If our base region is symbolic, we don't know what type it really is.
1245e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // Pretend the type of the symbol is the true dynamic type.
1246e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // (This will at least be self-consistent for the life of the symbol.)
1247732cdf383f9030ff2b9fb28dfbdae2285ded80c6Ted Kremenek        Ty = SR->getSymbol()->getType()->getPointeeType();
12486dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        RootIsSymbolic = true;
1249e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      }
1250e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
1251e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      const CXXRecordDecl *Child = Ty->getAsCXXRecordDecl();
12529f6441ad92c30028032eb3df6f4a7f2ebe393a68Jordan Rose      if (!Child) {
1253e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // We cannot compute the offset of the base class.
1254824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        SymbolicOffsetBase = R;
1255e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      }
1256824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
12576dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose      if (RootIsSymbolic) {
12586dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        // Base layers on symbolic regions may not be type-correct.
12596dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        // Double-check the inheritance here, and revert to a symbolic offset
12606dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        // if it's invalid (e.g. due to a reinterpret_cast).
12616dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        if (BOR->isVirtual()) {
12626dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose          if (!Child->isVirtuallyDerivedFrom(BOR->getDecl()))
12636dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose            SymbolicOffsetBase = R;
12646dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        } else {
12656dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose          if (!isImmediateBase(Child, BOR->getDecl()))
12666dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose            SymbolicOffsetBase = R;
12676dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose        }
12686dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose      }
12696dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose
1270824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      // Don't bother calculating precise offsets if we already have a
1271824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      // symbolic offset somewhere in the chain.
1272824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      if (SymbolicOffsetBase)
1273824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        continue;
1274824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1275e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      CharUnits BaseOffset;
12764411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      const ASTRecordLayout &Layout = getContext().getASTRecordLayout(Child);
12774411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose      if (BOR->isVirtual())
12784411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose        BaseOffset = Layout.getVBaseClassOffset(BOR->getDecl());
1279e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      else
12804411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose        BaseOffset = Layout.getBaseClassOffset(BOR->getDecl());
1281e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
1282e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      // The base offset is in chars, not in bits.
1283e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      Offset += BaseOffset.getQuantity() * getContext().getCharWidth();
1284e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      break;
1285e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose    }
1286e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case ElementRegionKind: {
1287e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const ElementRegion *ER = cast<ElementRegion>(R);
1288824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      R = ER->getSuperRegion();
1289e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1290824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      QualType EleTy = ER->getValueType();
1291824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      if (!IsCompleteType(getContext(), EleTy)) {
1292824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        // We cannot compute the offset of the base class.
1293824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        SymbolicOffsetBase = R;
1294824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        continue;
1295824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      }
1296e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1297e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      SVal Index = ER->getIndex();
1298dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie      if (Optional<nonloc::ConcreteInt> CI =
12995251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie              Index.getAs<nonloc::ConcreteInt>()) {
1300824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        // Don't bother calculating precise offsets if we already have a
1301824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        // symbolic offset somewhere in the chain.
1302824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        if (SymbolicOffsetBase)
1303824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose          continue;
1304824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1305e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        int64_t i = CI->getValue().getSExtValue();
1306e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // This type size is in bits.
1307e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        Offset += i * getContext().getTypeSize(EleTy);
1308e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      } else {
1309e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        // We cannot compute offset for non-concrete index.
1310824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        SymbolicOffsetBase = R;
1311e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      }
13127caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu      break;
1313e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
1314e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case FieldRegionKind: {
1315e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const FieldRegion *FR = cast<FieldRegion>(R);
1316824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      R = FR->getSuperRegion();
1317824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1318e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const RecordDecl *RD = FR->getDecl()->getParent();
1319786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose      if (RD->isUnion() || !RD->isCompleteDefinition()) {
1320e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        // We cannot compute offset for incomplete type.
1321786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose        // For unions, we could treat everything as offset 0, but we'd rather
1322786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose        // treat each field as a symbolic offset so they aren't stored on top
1323786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose        // of each other, since we depend on things in typed regions actually
1324786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose        // matching their types.
1325824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        SymbolicOffsetBase = R;
1326824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      }
1327824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1328824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      // Don't bother calculating precise offsets if we already have a
1329824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      // symbolic offset somewhere in the chain.
1330824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose      if (SymbolicOffsetBase)
1331824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose        continue;
1332824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose
1333e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      // Get the field number.
1334e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      unsigned idx = 0;
1335e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      for (RecordDecl::field_iterator FI = RD->field_begin(),
1336e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu             FE = RD->field_end(); FI != FE; ++FI, ++idx)
1337581deb3da481053c4993c7600f97acf7768caac5David Blaikie        if (FR->getDecl() == *FI)
1338e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu          break;
13397caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
1340e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
1341e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      // This is offset in bits.
1342e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      Offset += Layout.getFieldOffset(idx);
1343e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      break;
1344e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
1345e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
1346e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  }
13477caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
1348e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu Finish:
1349824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose  if (SymbolicOffsetBase)
1350824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose    return RegionOffset(SymbolicOffsetBase, RegionOffset::Symbolic);
1351e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  return RegionOffset(R, Offset);
13527caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu}
13537caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
13544240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
13554240096011a187807058f887eb81df750ffa17feTed Kremenek// BlockDataRegion
13564240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
13574240096011a187807058f887eb81df750ffa17feTed Kremenek
135824570c4c258545f8310e4bc96503a5668982cf67Ted Kremenekstd::pair<const VarRegion *, const VarRegion *>
135924570c4c258545f8310e4bc96503a5668982cf67Ted KremenekBlockDataRegion::getCaptureRegions(const VarDecl *VD) {
136024570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  MemRegionManager &MemMgr = *getMemRegionManager();
13616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const VarRegion *VR = nullptr;
13626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const VarRegion *OriginalVR = nullptr;
136324570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek
1364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!VD->hasAttr<BlocksAttr>() && VD->hasLocalStorage()) {
136524570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    VR = MemMgr.getVarRegion(VD, this);
136624570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    OriginalVR = MemMgr.getVarRegion(VD, LC);
136724570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  }
136824570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  else {
136924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    if (LC) {
137024570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek      VR = MemMgr.getVarRegion(VD, LC);
137124570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek      OriginalVR = VR;
137224570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    }
137324570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    else {
137424570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek      VR = MemMgr.getVarRegion(VD, MemMgr.getUnknownRegion());
137524570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek      OriginalVR = MemMgr.getVarRegion(VD, LC);
137624570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek    }
137724570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  }
137824570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek  return std::make_pair(VR, OriginalVR);
137924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek}
138024570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek
13814240096011a187807058f887eb81df750ffa17feTed Kremenekvoid BlockDataRegion::LazyInitializeReferencedVars() {
13824240096011a187807058f887eb81df750ffa17feTed Kremenek  if (ReferencedVars)
13834240096011a187807058f887eb81df750ffa17feTed Kremenek    return;
13844240096011a187807058f887eb81df750ffa17feTed Kremenek
13851d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *AC = getCodeRegion()->getAnalysisDeclContext();
13861d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext::referenced_decls_iterator I, E;
1387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::tie(I, E) = AC->getReferencedBlockVars(BC->getDecl());
1388dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
13894240096011a187807058f887eb81df750ffa17feTed Kremenek  if (I == E) {
13904240096011a187807058f887eb81df750ffa17feTed Kremenek    ReferencedVars = (void*) 0x1;
13914240096011a187807058f887eb81df750ffa17feTed Kremenek    return;
13924240096011a187807058f887eb81df750ffa17feTed Kremenek  }
1393dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
13944240096011a187807058f887eb81df750ffa17feTed Kremenek  MemRegionManager &MemMgr = *getMemRegionManager();
13954240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &A = MemMgr.getAllocator();
13964240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVectorContext BC(A);
1397dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
13984240096011a187807058f887eb81df750ffa17feTed Kremenek  typedef BumpVector<const MemRegion*> VarVec;
13994240096011a187807058f887eb81df750ffa17feTed Kremenek  VarVec *BV = (VarVec*) A.Allocate<VarVec>();
140002b1df62ff6fa9526619ee0db78e2af4186e490dTed Kremenek  new (BV) VarVec(BC, E - I);
140185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  VarVec *BVOriginal = (VarVec*) A.Allocate<VarVec>();
140285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  new (BVOriginal) VarVec(BC, E - I);
1403dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
140467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  for ( ; I != E; ++I) {
14056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    const VarRegion *VR = nullptr;
14066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    const VarRegion *OriginalVR = nullptr;
1407651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    std::tie(VR, OriginalVR) = getCaptureRegions(*I);
140867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(VR);
140985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    assert(OriginalVR);
141067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BV->push_back(VR, BC);
141185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    BVOriginal->push_back(OriginalVR, BC);
141267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
1413dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
14144240096011a187807058f887eb81df750ffa17feTed Kremenek  ReferencedVars = BV;
141585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  OriginalVars = BVOriginal;
14164240096011a187807058f887eb81df750ffa17feTed Kremenek}
14174240096011a187807058f887eb81df750ffa17feTed Kremenek
14184240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator
14194240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_begin() const {
14204240096011a187807058f887eb81df750ffa17feTed Kremenek  const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars();
14214240096011a187807058f887eb81df750ffa17feTed Kremenek
14224240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVector<const MemRegion*> *Vec =
14234240096011a187807058f887eb81df750ffa17feTed Kremenek    static_cast<BumpVector<const MemRegion*>*>(ReferencedVars);
1424dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
142585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  if (Vec == (void*) 0x1)
14266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return BlockDataRegion::referenced_vars_iterator(nullptr, nullptr);
14276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
142885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  BumpVector<const MemRegion*> *VecOriginal =
142985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    static_cast<BumpVector<const MemRegion*>*>(OriginalVars);
143085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
143185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  return BlockDataRegion::referenced_vars_iterator(Vec->begin(),
143285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                                   VecOriginal->begin());
14334240096011a187807058f887eb81df750ffa17feTed Kremenek}
14344240096011a187807058f887eb81df750ffa17feTed Kremenek
14354240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator
14364240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_end() const {
14374240096011a187807058f887eb81df750ffa17feTed Kremenek  const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars();
14384240096011a187807058f887eb81df750ffa17feTed Kremenek
14394240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVector<const MemRegion*> *Vec =
14404240096011a187807058f887eb81df750ffa17feTed Kremenek    static_cast<BumpVector<const MemRegion*>*>(ReferencedVars);
1441dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
144285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  if (Vec == (void*) 0x1)
14436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return BlockDataRegion::referenced_vars_iterator(nullptr, nullptr);
14446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
144585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  BumpVector<const MemRegion*> *VecOriginal =
144685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    static_cast<BumpVector<const MemRegion*>*>(OriginalVars);
144785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
144885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  return BlockDataRegion::referenced_vars_iterator(Vec->end(),
144985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                                   VecOriginal->end());
14504240096011a187807058f887eb81df750ffa17feTed Kremenek}
14515846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek
14525846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenekconst VarRegion *BlockDataRegion::getOriginalRegion(const VarRegion *R) const {
14535846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  for (referenced_vars_iterator I = referenced_vars_begin(),
14545846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek                                E = referenced_vars_end();
14555846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek       I != E; ++I) {
14565846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek    if (I.getCapturedRegion() == R)
14575846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek      return I.getOriginalRegion();
14585846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek  }
14596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
14605846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek}
1461da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1462da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev//===----------------------------------------------------------------------===//
1463da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev// RegionAndSymbolInvalidationTraits
1464da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev//===----------------------------------------------------------------------===//
1465da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1466da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsevvoid RegionAndSymbolInvalidationTraits::setTrait(SymbolRef Sym,
1467da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev                                                 InvalidationKinds IK) {
1468da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  SymTraitsMap[Sym] |= IK;
1469da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev}
1470da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1471da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsevvoid RegionAndSymbolInvalidationTraits::setTrait(const MemRegion *MR,
1472da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev                                                 InvalidationKinds IK) {
1473da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  assert(MR);
1474da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(MR))
1475da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev    setTrait(SR->getSymbol(), IK);
1476da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  else
1477da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev    MRTraitsMap[MR] |= IK;
1478da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev}
1479da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1480da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsevbool RegionAndSymbolInvalidationTraits::hasTrait(SymbolRef Sym,
1481da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev                                                 InvalidationKinds IK) {
1482da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  const_symbol_iterator I = SymTraitsMap.find(Sym);
1483da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  if (I != SymTraitsMap.end())
1484da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev    return I->second & IK;
1485da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1486da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  return false;
1487da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev}
1488da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1489da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsevbool RegionAndSymbolInvalidationTraits::hasTrait(const MemRegion *MR,
1490da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev                                                 InvalidationKinds IK) {
1491da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  if (!MR)
1492da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev    return false;
1493da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1494da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(MR))
1495da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev    return hasTrait(SR->getSymbol(), IK);
1496da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1497da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  const_region_iterator I = MRTraitsMap.find(MR);
1498da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  if (I != MRTraitsMap.end())
1499da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev    return I->second & IK;
1500da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev
1501da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev  return false;
1502da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev}
1503