MemRegion.cpp revision e0d24eb1060a213ec9820dc02c45f26b2d5b348b
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"
179b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h"
185e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer#include "clang/Analysis/AnalysisContext.h"
195e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer#include "clang/Analysis/Support/BumpVector.h"
20199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck#include "clang/AST/CharUnits.h"
21c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer#include "clang/AST/DeclObjC.h"
227caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu#include "clang/AST/RecordLayout.h"
23eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks#include "clang/Basic/SourceManager.h"
241309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include "llvm/Support/raw_ostream.h"
259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekusing namespace clang;
279ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenekusing namespace ento;
289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
29250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
30bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek// MemRegion Construction.
31bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek//===----------------------------------------------------------------------===//
32bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
33bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate<typename RegionTy> struct MemRegionManagerTrait;
34bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
35bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1>
36bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getRegion(const A1 a1) {
37dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
38bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion =
39bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1);
40dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
41bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  llvm::FoldingSetNodeID ID;
42bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy::ProfileRegion(ID, a1, superRegion);
439c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
44bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
45bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                                                   InsertPos));
46dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
47bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  if (!R) {
48bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
49bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    new (R) RegionTy(a1, superRegion);
50bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    Regions.InsertNode(R, InsertPos);
51bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
52dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
53bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  return R;
54bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek}
55bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
56bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1>
57bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1,
58bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                         const MemRegion *superRegion) {
59bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  llvm::FoldingSetNodeID ID;
60bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy::ProfileRegion(ID, a1, superRegion);
619c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
62bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
63bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                                                   InsertPos));
64dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
65bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  if (!R) {
66bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
67bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    new (R) RegionTy(a1, superRegion);
68bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    Regions.InsertNode(R, InsertPos);
69bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
70dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
71bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  return R;
72bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek}
73bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
74bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1, typename A2>
75bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getRegion(const A1 a1, const A2 a2) {
76dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
77bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion =
78bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1, a2);
79dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
80bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  llvm::FoldingSetNodeID ID;
81bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy::ProfileRegion(ID, a1, a2, superRegion);
829c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
83bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
84bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                                                   InsertPos));
85dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
86bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  if (!R) {
87bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
88bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    new (R) RegionTy(a1, a2, superRegion);
89bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    Regions.InsertNode(R, InsertPos);
90bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
91dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
92bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  return R;
93bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek}
94bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
95bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1, typename A2>
96bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2,
97bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                         const MemRegion *superRegion) {
98dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
99bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  llvm::FoldingSetNodeID ID;
100bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy::ProfileRegion(ID, a1, a2, superRegion);
1019c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
102bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
103bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                                                   InsertPos));
104dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
105bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  if (!R) {
106bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
107bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    new (R) RegionTy(a1, a2, superRegion);
108bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    Regions.InsertNode(R, InsertPos);
109bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
110dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
111bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  return R;
112bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek}
113bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
11467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename RegionTy, typename A1, typename A2, typename A3>
11567d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2, const A3 a3,
11667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                         const MemRegion *superRegion) {
117dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
11867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  llvm::FoldingSetNodeID ID;
11967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy::ProfileRegion(ID, a1, a2, a3, superRegion);
1209c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
12167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
12267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                                                   InsertPos));
123dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
12467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  if (!R) {
12567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
12667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    new (R) RegionTy(a1, a2, a3, superRegion);
12767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Regions.InsertNode(R, InsertPos);
128bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
129dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
13067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return R;
13167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
132bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
133bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek//===----------------------------------------------------------------------===//
1344240096011a187807058f887eb81df750ffa17feTed Kremenek// Object destruction.
135250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed KremenekMemRegion::~MemRegion() {}
1389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1394240096011a187807058f887eb81df750ffa17feTed KremenekMemRegionManager::~MemRegionManager() {
1404240096011a187807058f887eb81df750ffa17feTed Kremenek  // All regions and their data are BumpPtrAllocated.  No need to call
1414240096011a187807058f887eb81df750ffa17feTed Kremenek  // their destructors.
1424240096011a187807058f887eb81df750ffa17feTed Kremenek}
1434240096011a187807058f887eb81df750ffa17feTed Kremenek
1444240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
1454240096011a187807058f887eb81df750ffa17feTed Kremenek// Basic methods.
1464240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
1474240096011a187807058f887eb81df750ffa17feTed Kremenek
1487e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xubool SubRegion::isSubRegionOf(const MemRegion* R) const {
1497e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  const MemRegion* r = getSuperRegion();
1507e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  while (r != 0) {
1517e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu    if (r == R)
1527e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu      return true;
1537e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu    if (const SubRegion* sr = dyn_cast<SubRegion>(r))
1547e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu      r = sr->getSuperRegion();
1557e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu    else
1567e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu      break;
1577e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  }
1587e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  return false;
1597e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu}
1607e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu
161a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted KremenekMemRegionManager* SubRegion::getMemRegionManager() const {
162a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  const SubRegion* r = this;
163a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  do {
164a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    const MemRegion *superRegion = r->getSuperRegion();
165a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    if (const SubRegion *sr = dyn_cast<SubRegion>(superRegion)) {
166a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek      r = sr;
167a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek      continue;
168a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    }
169a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    return superRegion->getMemRegionManager();
170a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  } while (1);
171a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
172a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
1735348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenekconst StackFrameContext *VarRegion::getStackFrame() const {
1745348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  const StackSpaceRegion *SSR = dyn_cast<StackSpaceRegion>(getMemorySpace());
1755348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  return SSR ? SSR->getStackFrame() : NULL;
1765348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek}
1775348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
1785348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek//===----------------------------------------------------------------------===//
17932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose// Region extents.
18032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose//===----------------------------------------------------------------------===//
18132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
182e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan RoseDefinedOrUnknownSVal TypedValueRegion::getExtent(SValBuilder &svalBuilder) const {
1839c378f705405d37f49795d5e915989de774fe11fTed Kremenek  ASTContext &Ctx = svalBuilder.getContext();
18449f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall  QualType T = getDesugaredValueType(Ctx);
18532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
18652e04c537633377fb14cfa4fa3c95e3e510fc942Jordy Rose  if (isa<VariableArrayType>(T))
187c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek    return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this));
18852e04c537633377fb14cfa4fa3c95e3e510fc942Jordy Rose  if (isa<IncompleteArrayType>(T))
18932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    return UnknownVal();
19032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
19199c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  CharUnits size = Ctx.getTypeSizeInChars(T);
19299c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  QualType sizeTy = svalBuilder.getArrayIndexType();
19399c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  return svalBuilder.makeIntVal(size.getQuantity(), sizeTy);
19432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
19532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
196c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal FieldRegion::getExtent(SValBuilder &svalBuilder) const {
197c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal Extent = DeclRegion::getExtent(svalBuilder);
19832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
19932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  // A zero-length array at the end of a struct often stands for dynamically-
20032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  // allocated extra memory.
20132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  if (Extent.isZeroConstant()) {
20249f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall    QualType T = getDesugaredValueType(svalBuilder.getContext());
20332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
20432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    if (isa<ConstantArrayType>(T))
20532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose      return UnknownVal();
20632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  }
20732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
20832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  return Extent;
20932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
21032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
211c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal AllocaRegion::getExtent(SValBuilder &svalBuilder) const {
212c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this));
21332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
21432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
215c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal SymbolicRegion::getExtent(SValBuilder &svalBuilder) const {
216c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this));
21732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
21832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
219c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal StringRegion::getExtent(SValBuilder &svalBuilder) const {
22099c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  return svalBuilder.makeIntVal(getStringLiteral()->getByteLength()+1,
22199c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek                                svalBuilder.getArrayIndexType());
22232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
22332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
224c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin KramerObjCIvarRegion::ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg)
225c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {}
226c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
227c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramerconst ObjCIvarDecl *ObjCIvarRegion::getDecl() const {
228c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  return cast<ObjCIvarDecl>(D);
229c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer}
230c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
231c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin KramerQualType ObjCIvarRegion::getValueType() const {
232c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  return getDecl()->getType();
233c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer}
234c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
2354fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing XuQualType CXXBaseObjectRegion::getValueType() const {
2364fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  return QualType(decl->getTypeForDecl(), 0);
2374fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
2384fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
23932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose//===----------------------------------------------------------------------===//
2405348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek// FoldingSet profiling.
2415348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek//===----------------------------------------------------------------------===//
2425348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
2439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekvoid MemSpaceRegion::Profile(llvm::FoldingSetNodeID& ID) const {
2449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddInteger((unsigned)getKind());
2459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
2469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
24767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekvoid StackSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const {
24867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ID.AddInteger((unsigned)getKind());
24967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ID.AddPointer(getStackFrame());
25067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
25167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
252dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekvoid StaticGlobalSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const {
253dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ID.AddInteger((unsigned)getKind());
254dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ID.AddPointer(getCodeRegion());
255dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}
256dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid StringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                 const StringLiteral* Str,
259e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                                 const MemRegion* superRegion) {
260e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  ID.AddInteger((unsigned) StringRegionKind);
261e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  ID.AddPointer(Str);
262e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  ID.AddPointer(superRegion);
263e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}
264e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
2654c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekvoid ObjCStringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2664c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                                     const ObjCStringLiteral* Str,
2674c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek                                     const MemRegion* superRegion) {
2684c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ID.AddInteger((unsigned) ObjCStringRegionKind);
2694c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ID.AddPointer(Str);
2704c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  ID.AddPointer(superRegion);
2714c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}
2724c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
2737090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekvoid AllocaRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2749c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                 const Expr *Ex, unsigned cnt,
2757ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                                 const MemRegion *) {
2767090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  ID.AddInteger((unsigned) AllocaRegionKind);
2777090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  ID.AddPointer(Ex);
2787090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  ID.AddInteger(cnt);
2797090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
2807090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
2817090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekvoid AllocaRegion::Profile(llvm::FoldingSetNodeID& ID) const {
2827ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  ProfileRegion(ID, Ex, Cnt, superRegion);
2837090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
2847090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
285329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekvoid CompoundLiteralRegion::Profile(llvm::FoldingSetNodeID& ID) const {
286329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion::ProfileRegion(ID, CL, superRegion);
287329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
288329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
289329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekvoid CompoundLiteralRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2909c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                          const CompoundLiteralExpr *CL,
291329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                                          const MemRegion* superRegion) {
292329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ID.AddInteger((unsigned) CompoundLiteralRegionKind);
293329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ID.AddPointer(CL);
294329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ID.AddPointer(superRegion);
295329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
296329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
297de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekvoid CXXThisRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
298de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                  const PointerType *PT,
299de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                  const MemRegion *sRegion) {
300de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ID.AddInteger((unsigned) CXXThisRegionKind);
301de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ID.AddPointer(PT);
302de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ID.AddPointer(sRegion);
303de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
304de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
305de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekvoid CXXThisRegion::Profile(llvm::FoldingSetNodeID &ID) const {
306de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  CXXThisRegion::ProfileRegion(ID, ThisPointerTy, superRegion);
307de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
308dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
309c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramervoid ObjCIvarRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
310c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer                                   const ObjCIvarDecl *ivd,
311c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer                                   const MemRegion* superRegion) {
312c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind);
313c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer}
314c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
3159c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid DeclRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D,
3169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                               const MemRegion* superRegion, Kind k) {
3179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddInteger((unsigned) k);
3189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddPointer(D);
3199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddPointer(superRegion);
3209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
3219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
3229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekvoid DeclRegion::Profile(llvm::FoldingSetNodeID& ID) const {
3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  DeclRegion::ProfileRegion(ID, D, superRegion, getKind());
3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
326d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekvoid VarRegion::Profile(llvm::FoldingSetNodeID &ID) const {
32767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  VarRegion::ProfileRegion(ID, getDecl(), superRegion);
328d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek}
329d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
330250101353b711a409b075f1bc11070dddec7100bTed Kremenekvoid SymbolicRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym,
331250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                   const MemRegion *sreg) {
332993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ID.AddInteger((unsigned) MemRegion::SymbolicRegionKind);
3336d0e2d2f3c1b6531f303aac7e48aa1eb05900f2aTed Kremenek  ID.Add(sym);
334250101353b711a409b075f1bc11070dddec7100bTed Kremenek  ID.AddPointer(sreg);
335993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
336993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
337993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekvoid SymbolicRegion::Profile(llvm::FoldingSetNodeID& ID) const {
338250101353b711a409b075f1bc11070dddec7100bTed Kremenek  SymbolicRegion::ProfileRegion(ID, sym, getSuperRegion());
339993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
340993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
341f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenekvoid ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
3421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                  QualType ElementType, SVal Idx,
343511191ce8920160525611be2be754c32a0724c3eZhongxing Xu                                  const MemRegion* superRegion) {
344511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ID.AddInteger(MemRegion::ElementRegionKind);
345f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ID.Add(ElementType);
346511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ID.AddPointer(superRegion);
347511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  Idx.Profile(ID);
348511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}
349511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
350511191ce8920160525611be2be754c32a0724c3eZhongxing Xuvoid ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const {
351f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ElementRegion::ProfileRegion(ID, ElementType, Index, superRegion);
352511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}
35327b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu
354eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid FunctionTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
355eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek                                       const FunctionDecl *FD,
356eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek                                       const MemRegion*) {
357eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  ID.AddInteger(MemRegion::FunctionTextRegionKind);
358abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  ID.AddPointer(FD);
359ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
360ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
361eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid FunctionTextRegion::Profile(llvm::FoldingSetNodeID& ID) const {
362eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  FunctionTextRegion::ProfileRegion(ID, FD, superRegion);
363eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
364eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
365eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid BlockTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
36667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                    const BlockDecl *BD, CanQualType,
3671d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                    const AnalysisDeclContext *AC,
36867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                    const MemRegion*) {
369eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  ID.AddInteger(MemRegion::BlockTextRegionKind);
370eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  ID.AddPointer(BD);
371eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
372eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
373eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid BlockTextRegion::Profile(llvm::FoldingSetNodeID& ID) const {
37467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockTextRegion::ProfileRegion(ID, BD, locTy, AC, superRegion);
375ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
376ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
3770a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekvoid BlockDataRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
3780a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                                    const BlockTextRegion *BC,
3790a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                                    const LocationContext *LC,
38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                    const MemRegion *sReg) {
3810a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  ID.AddInteger(MemRegion::BlockDataRegionKind);
3820a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  ID.AddPointer(BC);
3830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  ID.AddPointer(LC);
38467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ID.AddPointer(sReg);
3850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
3860a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
3870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekvoid BlockDataRegion::Profile(llvm::FoldingSetNodeID& ID) const {
38867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockDataRegion::ProfileRegion(ID, BC, LC, getSuperRegion());
3890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
3900a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
39102fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuvoid CXXTempObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
39202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                        Expr const *Ex,
39302fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                        const MemRegion *sReg) {
394bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  ID.AddPointer(Ex);
395bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  ID.AddPointer(sReg);
396bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}
397bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
39802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuvoid CXXTempObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const {
399bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  ProfileRegion(ID, Ex, getSuperRegion());
400bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}
401bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
4024fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid CXXBaseObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
4034fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                                        const CXXRecordDecl *decl,
4044fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                                        const MemRegion *sReg) {
4054fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  ID.AddPointer(decl);
4064fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  ID.AddPointer(sReg);
4074fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
4084fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
4094fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid CXXBaseObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const {
4104fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  ProfileRegion(ID, decl, superRegion);
4114fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
4124fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
413026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu//===----------------------------------------------------------------------===//
41499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// Region anchors.
41599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
41699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
41799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid GlobalsSpaceRegion::anchor() { }
41899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid HeapSpaceRegion::anchor() { }
41999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UnknownSpaceRegion::anchor() { }
42099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StackLocalsSpaceRegion::anchor() { }
42199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StackArgumentsSpaceRegion::anchor() { }
42299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TypedRegion::anchor() { }
42399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TypedValueRegion::anchor() { }
42499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CodeTextRegion::anchor() { }
42599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid SubRegion::anchor() { }
42699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
42799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
4289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// Region pretty-printing.
4299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
4309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4318800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekvoid MemRegion::dump() const {
4328800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  dumpToStream(llvm::errs());
4337f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek}
4347f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
4359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekstd::string MemRegion::getString() const {
4369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::string s;
4379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::raw_string_ostream os(s);
4388800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  dumpToStream(os);
4399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  return os.str();
4409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
4419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4429c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid MemRegion::dumpToStream(raw_ostream &os) const {
4439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  os << "<Unknown Region>";
4449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4469c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid AllocaRegion::dumpToStream(raw_ostream &os) const {
4477090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  os << "alloca{" << (void*) Ex << ',' << Cnt << '}';
4487090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
4497090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
4509c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid FunctionTextRegion::dumpToStream(raw_ostream &os) const {
451abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  os << "code{" << getDecl()->getDeclName().getAsString() << '}';
45272e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek}
45372e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek
4549c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid BlockTextRegion::dumpToStream(raw_ostream &os) const {
4550a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  os << "block_code{" << (void*) this << '}';
456eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
457eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
4589c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid BlockDataRegion::dumpToStream(raw_ostream &os) const {
4590a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  os << "block_data{" << BC << '}';
4600a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
4610a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
4629c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid CompoundLiteralRegion::dumpToStream(raw_ostream &os) const {
4635639a3ec15bdbf0b93376bbbae3adaf724f092a7Ted Kremenek  // FIXME: More elaborate pretty-printing.
4645639a3ec15bdbf0b93376bbbae3adaf724f092a7Ted Kremenek  os << "{ " << (void*) CL <<  " }";
4659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
4669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXTempObjectRegion::dumpToStream(raw_ostream &os) const {
468782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin  os << "temp_object{" << getValueType().getAsString() << ','
469782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin     << (void*) Ex << '}';
470e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu}
471e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu
4725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXBaseObjectRegion::dumpToStream(raw_ostream &os) const {
473e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  os << "base{" << superRegion << ',' << decl->getName() << '}';
4744fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
4754fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
4765f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXThisRegion::dumpToStream(raw_ostream &os) const {
477de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  os << "this";
478de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
479de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
4809c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid ElementRegion::dumpToStream(raw_ostream &os) const {
48119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  os << "element{" << superRegion << ','
48219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek     << Index << ',' << getElementType().getAsString() << '}';
483993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
484993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
4859c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid FieldRegion::dumpToStream(raw_ostream &os) const {
486b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  os << superRegion << "->" << *getDecl();
4874bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek}
4884bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
4899c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid ObjCIvarRegion::dumpToStream(raw_ostream &os) const {
490b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  os << "ivar{" << superRegion << ',' << *getDecl() << '}';
491bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek}
492bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek
4939c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid StringRegion::dumpToStream(raw_ostream &os) const {
4944e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  Str->printPretty(os, 0, PrintingPolicy(getContext().getLangOpts()));
495b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu}
496b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
4974c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekvoid ObjCStringRegion::dumpToStream(raw_ostream &os) const {
4984e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  Str->printPretty(os, 0, PrintingPolicy(getContext().getLangOpts()));
4994c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}
5004c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
5019c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid SymbolicRegion::dumpToStream(raw_ostream &os) const {
502aef5d2205a4425a4d3e1b0e28d46ed80763651dfTed Kremenek  os << "SymRegion{" << sym << '}';
503329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
504329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
5059c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid VarRegion::dumpToStream(raw_ostream &os) const {
506b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  os << *cast<VarDecl>(D);
507cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu}
508cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
50919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekvoid RegionRawOffset::dump() const {
51019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  dumpToStream(llvm::errs());
51119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
51219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
5139c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid RegionRawOffset::dumpToStream(raw_ostream &os) const {
5149ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  os << "raw_offset{" << getRegion() << ',' << getOffset().getQuantity() << '}';
51519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
51619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
5175f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid StaticGlobalSpaceRegion::dumpToStream(raw_ostream &os) const {
518fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek  os << "StaticGlobalsMemSpace{" << CR << '}';
519fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek}
520fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
521eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalInternalSpaceRegion::dumpToStream(raw_ostream &os) const {
522eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  os << "GlobalInternalSpaceRegion";
523eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}
524eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
525eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalSystemSpaceRegion::dumpToStream(raw_ostream &os) const {
526eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  os << "GlobalSystemSpaceRegion";
527eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}
528eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
529eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalImmutableSpaceRegion::dumpToStream(raw_ostream &os) const {
530eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  os << "GlobalImmutableSpaceRegion";
531eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}
532eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
53336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid HeapSpaceRegion::dumpToStream(raw_ostream &os) const {
53436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  os << "HeapSpaceRegion";
53536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose}
53636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
53736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid UnknownSpaceRegion::dumpToStream(raw_ostream &os) const {
53836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  os << "UnknownSpaceRegion";
53936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose}
54036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
54136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid StackArgumentsSpaceRegion::dumpToStream(raw_ostream &os) const {
54236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  os << "StackArgumentsSpaceRegion";
54336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose}
54436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
54536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid StackLocalsSpaceRegion::dumpToStream(raw_ostream &os) const {
54636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose  os << "StackLocalsSpaceRegion";
54736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose}
54836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose
5493d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaksvoid MemRegion::dumpPretty(raw_ostream &os) const {
5503d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  return;
5513d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks}
5523d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
5533d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaksvoid VarRegion::dumpPretty(raw_ostream &os) const {
5543d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  os << getDecl()->getName();
5553d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks}
5563d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
5573d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaksvoid FieldRegion::dumpPretty(raw_ostream &os) const {
5583d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  superRegion->dumpPretty(os);
5593d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks  os << "->" << getDecl();
5603d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks}
5613d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks
5629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
5639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager methods.
5649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
56519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
56667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG>
56767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region) {
5681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!region) {
56967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    region = (REG*) A.Allocate<REG>();
57067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    new (region) REG(this);
5719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
572a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
5739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  return region;
5749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
5759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
57667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG, typename ARG>
57767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region, ARG a) {
57867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  if (!region) {
57967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    region = (REG*) A.Allocate<REG>();
58067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    new (region) REG(this, a);
58167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
582dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
58367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return region;
58467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
58567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
58667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackLocalsSpaceRegion*
5872b87ae45e129b941d0a4d221c9d4842385a119bdTed KremenekMemRegionManager::getStackLocalsRegion(const StackFrameContext *STC) {
5882b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  assert(STC);
589c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  StackLocalsSpaceRegion *&R = StackLocalsSpaceRegions[STC];
590c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
591c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  if (R)
592c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    return R;
593c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
594c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  R = A.Allocate<StackLocalsSpaceRegion>();
595c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  new (R) StackLocalsSpaceRegion(this, STC);
596c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  return R;
5979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
5989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
59967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackArgumentsSpaceRegion *
60067d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getStackArgumentsRegion(const StackFrameContext *STC) {
6012b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  assert(STC);
602c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  StackArgumentsSpaceRegion *&R = StackArgumentsSpaceRegions[STC];
603c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
604c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  if (R)
605c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    return R;
606c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
607c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  R = A.Allocate<StackArgumentsSpaceRegion>();
608c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  new (R) StackArgumentsSpaceRegion(this, STC);
609c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  return R;
610d05552a21377f493c882298c59e8829040b01d34Ted Kremenek}
611d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
612dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst GlobalsSpaceRegion
613eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks*MemRegionManager::getGlobalsRegion(MemRegion::Kind K,
614eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks                                    const CodeTextRegion *CR) {
615eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  if (!CR) {
616eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    if (K == MemRegion::GlobalSystemSpaceRegionKind)
617eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      return LazyAllocate(SystemGlobals);
618eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    if (K == MemRegion::GlobalImmutableSpaceRegionKind)
619eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      return LazyAllocate(ImmutableGlobals);
620eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    assert(K == MemRegion::GlobalInternalSpaceRegionKind);
621eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    return LazyAllocate(InternalGlobals);
622eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  }
623dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
624eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  assert(K == MemRegion::StaticGlobalSpaceRegionKind);
625dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  StaticGlobalSpaceRegion *&R = StaticsGlobalSpaceRegions[CR];
626dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  if (R)
627dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R;
628dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
629dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  R = A.Allocate<StaticGlobalSpaceRegion>();
630dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  new (R) StaticGlobalSpaceRegion(this, CR);
631dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  return R;
6329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
6339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
63467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst HeapSpaceRegion *MemRegionManager::getHeapRegion() {
6359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  return LazyAllocate(heap);
6369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
6379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
638b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getUnknownRegion() {
639178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  return LazyAllocate(unknown);
640178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu}
641178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
642b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getCodeRegion() {
643ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  return LazyAllocate(code);
644ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
645ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
646250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
647250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Constructing regions.
648250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
649dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst StringRegion* MemRegionManager::getStringRegion(const StringLiteral* Str){
65067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<StringRegion>(Str, getGlobalsRegion());
651e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}
652e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
6534c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekconst ObjCStringRegion *
6544c62b557e269a27515dfca1f754ae936c8fdb824Ted KremenekMemRegionManager::getObjCStringRegion(const ObjCStringLiteral* Str){
6554c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek  return getSubRegion<ObjCStringRegion>(Str, getGlobalsRegion());
6564c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek}
6574c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek
6587fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// Look through a chain of LocationContexts to either find the
6597fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// StackFrameContext that matches a DeclContext, or find a VarRegion
6607fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// for a variable captured by a block.
6617fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenekstatic llvm::PointerUnion<const StackFrameContext *, const VarRegion *>
6627fa9b4f258636d89342eda28f21a986c8ac353b1Ted KremenekgetStackOrCaptureRegionForDeclContext(const LocationContext *LC,
6637fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek                                      const DeclContext *DC,
6647fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek                                      const VarDecl *VD) {
6657fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek  while (LC) {
6667fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    if (const StackFrameContext *SFC = dyn_cast<StackFrameContext>(LC)) {
6677fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      if (cast<DeclContext>(SFC->getDecl()) == DC)
6687fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        return SFC;
6697fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    }
6707fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    if (const BlockInvocationContext *BC =
6717fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        dyn_cast<BlockInvocationContext>(LC)) {
6727fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      const BlockDataRegion *BR =
6737fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        static_cast<const BlockDataRegion*>(BC->getContextData());
6747fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      // FIXME: This can be made more efficient.
6757fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      for (BlockDataRegion::referenced_vars_iterator
6767fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek           I = BR->referenced_vars_begin(),
6777fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek           E = BR->referenced_vars_end(); I != E; ++I) {
6787fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek        if (const VarRegion *VR = dyn_cast<VarRegion>(I.getOriginalRegion()))
6797fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek          if (VR->getDecl() == VD)
6807fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek            return cast<VarRegion>(I.getCapturedRegion());
6817fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      }
6827fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    }
6837fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
6847fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    LC = LC->getParent();
6857fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek  }
6867fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek  return (const StackFrameContext*)0;
6877fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek}
6887fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
689b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst VarRegion* MemRegionManager::getVarRegion(const VarDecl *D,
690b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                                const LocationContext *LC) {
69167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemRegion *sReg = 0;
6921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
693eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  if (D->hasGlobalStorage() && !D->isStaticLocal()) {
694eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
695eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    // First handle the globals defined in system headers.
696eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    if (C.getSourceManager().isInSystemHeader(D->getLocation())) {
697eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // Whitelist the system globals which often DO GET modified, assume the
698eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // rest are immutable.
699eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      if (D->getName().find("errno") != StringRef::npos)
700eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion(MemRegion::GlobalSystemSpaceRegionKind);
701eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      else
702eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind);
703eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
704eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    // Treat other globals as GlobalInternal unless they are constants.
705eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    } else {
706eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      QualType GQT = D->getType();
707eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      const Type *GT = GQT.getTypePtrOrNull();
708eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // TODO: We could walk the complex types here and see if everything is
709eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      // constified.
710eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      if (GT && GQT.isConstQualified() && GT->isArithmeticType())
711eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind);
712eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks      else
713eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks        sReg = getGlobalsRegion();
714eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks    }
715eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
716eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  // Finally handle static locals.
717eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  } else {
71867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // FIXME: Once we implement scope handling, we will need to properly lookup
71967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // 'D' to the proper LocationContext.
7202b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    const DeclContext *DC = D->getDeclContext();
7217fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    llvm::PointerUnion<const StackFrameContext *, const VarRegion *> V =
7227fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      getStackOrCaptureRegionForDeclContext(LC, DC, D);
7237fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
7247fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    if (V.is<const VarRegion*>())
7257fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek      return V.get<const VarRegion*>();
7267fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek
7277fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek    const StackFrameContext *STC = V.get<const StackFrameContext*>();
7282b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
7292b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    if (!STC)
7302b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek      sReg = getUnknownRegion();
7312b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    else {
732dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      if (D->hasLocalStorage()) {
733dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        sReg = isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D)
734dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek               ? static_cast<const MemRegion*>(getStackArgumentsRegion(STC))
735dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek               : static_cast<const MemRegion*>(getStackLocalsRegion(STC));
736dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      }
737dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      else {
738dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        assert(D->isStaticLocal());
739dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        const Decl *D = STC->getDecl();
740dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
741eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks          sReg = getGlobalsRegion(MemRegion::StaticGlobalSpaceRegionKind,
742eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks                                  getFunctionTextRegion(FD));
743dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        else if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
744dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          const BlockTextRegion *BTR =
745dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek            getBlockTextRegion(BD,
746dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek                     C.getCanonicalType(BD->getSignatureAsWritten()->getType()),
7471d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                     STC->getAnalysisDeclContext());
748eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks          sReg = getGlobalsRegion(MemRegion::StaticGlobalSpaceRegionKind,
749eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks                                  BTR);
750dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        }
751dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        else {
752dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          // FIXME: For ObjC-methods, we need a new CodeTextRegion.  For now
753dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          // just use the main global memspace.
754dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          sReg = getGlobalsRegion();
755dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        }
756dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      }
7572b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    }
75867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
759dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
76067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<VarRegion>(D, sReg);
76167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
7621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
76367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst VarRegion *MemRegionManager::getVarRegion(const VarDecl *D,
76467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                                const MemRegion *superR) {
76567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<VarRegion>(D, superR);
7669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
7679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
768b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockDataRegion *
769b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted KremenekMemRegionManager::getBlockDataRegion(const BlockTextRegion *BC,
770b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                     const LocationContext *LC) {
77167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemRegion *sReg = 0;
77299c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek  const BlockDecl *BD = BC->getDecl();
77399c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek  if (!BD->hasCaptures()) {
77499c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    // This handles 'static' blocks.
77599c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind);
77667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
77767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  else {
77899c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    if (LC) {
77999c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // FIXME: Once we implement scope handling, we want the parent region
78099c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // to be the scope.
78199c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      const StackFrameContext *STC = LC->getCurrentStackFrame();
78299c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      assert(STC);
78399c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      sReg = getStackLocalsRegion(STC);
78499c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    }
78599c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    else {
78699c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // We allow 'LC' to be NULL for cases where want BlockDataRegions
78799c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      // without context-sensitivity.
78899c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek      sReg = getUnknownRegion();
78999c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek    }
79067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
79167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
79267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<BlockDataRegion>(BC, LC, sReg);
7930a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
7940a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
795b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst CompoundLiteralRegion*
7969c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getCompoundLiteralRegion(const CompoundLiteralExpr *CL,
79767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                           const LocationContext *LC) {
798dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
79967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemRegion *sReg = 0;
800dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
80167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  if (CL->isFileScope())
80267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    sReg = getGlobalsRegion();
80367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  else {
80467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    const StackFrameContext *STC = LC->getCurrentStackFrame();
80567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(STC);
80667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    sReg = getStackLocalsRegion(STC);
80767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
808dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
80967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<CompoundLiteralRegion>(CL, sReg);
810329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
811329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
812b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ElementRegion*
81302282acd7a42d06a3178e3102d34a585bd82dd9fTed KremenekMemRegionManager::getElementRegion(QualType elementType, NonLoc Idx,
814465373946b5ae84f7c3d890cc25cb23fd88dd650Ted Kremenek                                   const MemRegion* superRegion,
8159c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                   ASTContext &Ctx){
816143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu
81732f901092daa4a53c7e012408c1f59d73ba29ff5Ted Kremenek  QualType T = Ctx.getCanonicalType(elementType).getUnqualifiedType();
818abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek
819511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  llvm::FoldingSetNodeID ID;
820143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu  ElementRegion::ProfileRegion(ID, T, Idx, superRegion);
821511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
8229c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
823511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
824511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ElementRegion* R = cast_or_null<ElementRegion>(data);
825511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
826511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  if (!R) {
827511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    R = (ElementRegion*) A.Allocate<ElementRegion>();
828143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu    new (R) ElementRegion(T, Idx, superRegion);
829511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    Regions.InsertNode(R, InsertPos);
830511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
831511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
832511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  return R;
833511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}
834511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
835b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst FunctionTextRegion *
836eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed KremenekMemRegionManager::getFunctionTextRegion(const FunctionDecl *FD) {
83767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<FunctionTextRegion>(FD, getCodeRegion());
838ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
839ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
840b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockTextRegion *
84167d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getBlockTextRegion(const BlockDecl *BD, CanQualType locTy,
8421d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                     AnalysisDeclContext *AC) {
84367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<BlockTextRegion>(BD, locTy, AC, getCodeRegion());
844eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
845eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
846eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
847993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
848b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst SymbolicRegion *MemRegionManager::getSymbolicRegion(SymbolRef sym) {
84967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<SymbolicRegion>(sym, getUnknownRegion());
850993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
851993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
852e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaksconst SymbolicRegion *MemRegionManager::getSymbolicHeapRegion(SymbolRef Sym) {
853e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  return getSubRegion<SymbolicRegion>(Sym, getHeapRegion());
854e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks}
855e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks
856de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst FieldRegion*
8579c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getFieldRegion(const FieldDecl *d,
858b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                 const MemRegion* superRegion){
859eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  return getSubRegion<FieldRegion>(d, superRegion);
8609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
8619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
862b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ObjCIvarRegion*
8639c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getObjCIvarRegion(const ObjCIvarDecl *d,
864993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek                                    const MemRegion* superRegion) {
865eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  return getSubRegion<ObjCIvarRegion>(d, superRegion);
866a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek}
867a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
86802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuconst CXXTempObjectRegion*
86902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing XuMemRegionManager::getCXXTempObjectRegion(Expr const *E,
87002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                         LocationContext const *LC) {
871bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  const StackFrameContext *SFC = LC->getCurrentStackFrame();
872bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  assert(SFC);
87302fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  return getSubRegion<CXXTempObjectRegion>(E, getStackLocalsRegion(SFC));
874bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}
875bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
8764fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuconst CXXBaseObjectRegion *
8774fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing XuMemRegionManager::getCXXBaseObjectRegion(const CXXRecordDecl *decl,
8784fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                                         const MemRegion *superRegion) {
8794fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  return getSubRegion<CXXBaseObjectRegion>(decl, superRegion);
8804fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
8814fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
882de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst CXXThisRegion*
883de0d26310191215a6d1d189dc419f87af18ce6beTed KremenekMemRegionManager::getCXXThisRegion(QualType thisPointerTy,
884de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                   const LocationContext *LC) {
885de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const StackFrameContext *STC = LC->getCurrentStackFrame();
886de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  assert(STC);
887de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const PointerType *PT = thisPointerTy->getAs<PointerType>();
888de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  assert(PT);
889de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return getSubRegion<CXXThisRegion>(PT, getStackArgumentsRegion(STC));
890de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
891de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
892b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst AllocaRegion*
8939c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getAllocaRegion(const Expr *E, unsigned cnt,
89467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                  const LocationContext *LC) {
89567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *STC = LC->getCurrentStackFrame();
89667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  assert(STC);
89767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<AllocaRegion>(E, cnt, getStackLocalsRegion(STC));
8987090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
8997090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
900bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekconst MemSpaceRegion *MemRegion::getMemorySpace() const {
901bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemRegion *R = this;
902bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const SubRegion* SR = dyn_cast<SubRegion>(this);
9031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
904993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  while (SR) {
905bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek    R = SR->getSuperRegion();
906bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek    SR = dyn_cast<SubRegion>(R);
9079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
9081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
909bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  return dyn_cast<MemSpaceRegion>(R);
9109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
9111670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
912bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekbool MemRegion::hasStackStorage() const {
91367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackSpaceRegion>(getMemorySpace());
914bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek}
915dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu
916de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackNonParametersStorage() const {
917de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return isa<StackLocalsSpaceRegion>(getMemorySpace());
9181508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek}
9191508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek
920de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackParametersStorage() const {
92167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackArgumentsSpaceRegion>(getMemorySpace());
922dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek}
923dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek
9241508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenekbool MemRegion::hasGlobalsOrParametersStorage() const {
92567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemSpaceRegion *MS = getMemorySpace();
92667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackArgumentsSpaceRegion>(MS) ||
92767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek         isa<GlobalsSpaceRegion>(MS);
9281508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek}
9291670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
930adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// getBaseRegion strips away all elements and fields, and get the base region
931adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// of them.
932adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xuconst MemRegion *MemRegion::getBaseRegion() const {
933adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *R = this;
934adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  while (true) {
93568b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek    switch (R->getKind()) {
93668b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::ElementRegionKind:
93768b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::FieldRegionKind:
93868b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::ObjCIvarRegionKind:
939e17da65c5773e0285b22e33d1431b13fbcd8942cZhongxing Xu      case MemRegion::CXXBaseObjectRegionKind:
94068b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        R = cast<SubRegion>(R)->getSuperRegion();
94168b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        continue;
94268b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      default:
94368b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        break;
944adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu    }
945adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu    break;
946adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  }
947adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  return R;
948adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu}
949adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
9501670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===//
9511670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek// View handling.
9521670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===//
9531670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
954479529e679957fbb92b56e116e3c86734429331eZhongxing Xuconst MemRegion *MemRegion::StripCasts() const {
9550e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  const MemRegion *R = this;
9560e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  while (true) {
957c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    switch (R->getKind()) {
958c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    case ElementRegionKind: {
959c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      const ElementRegion *ER = cast<ElementRegion>(R);
960c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      if (!ER->getIndex().isZeroConstant())
961c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose        return R;
962c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      R = ER->getSuperRegion();
963c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      break;
964c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    }
965c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    case CXXBaseObjectRegionKind:
966c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      R = cast<CXXBaseObjectRegion>(R)->getSuperRegion();
967c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      break;
968c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    default:
969c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose      return R;
9700e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek    }
9710e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  }
9720e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek}
97319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
97419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// FIXME: Merge with the implementation of the same method in Store.cpp
97519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekstatic bool IsCompleteType(ASTContext &Ctx, QualType Ty) {
97619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  if (const RecordType *RT = Ty->getAs<RecordType>()) {
97719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    const RecordDecl *D = RT->getDecl();
978952b017601f9c82b51119c3a1600f1312a833db9Douglas Gregor    if (!D->getDefinition())
97919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      return false;
98019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  }
98119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
98219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  return true;
98319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
98419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
9857caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing XuRegionRawOffset ElementRegion::getAsArrayOffset() const {
986199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits offset = CharUnits::Zero();
98719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  const ElementRegion *ER = this;
98819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  const MemRegion *superR = NULL;
98919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  ASTContext &C = getContext();
9901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
99119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  // FIXME: Handle multi-dimensional arrays.
99219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
99319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  while (ER) {
99419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    superR = ER->getSuperRegion();
9951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
99619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    // FIXME: generalize to symbolic offsets.
99719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    SVal index = ER->getIndex();
99819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    if (nonloc::ConcreteInt *CI = dyn_cast<nonloc::ConcreteInt>(&index)) {
99919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      // Update the offset.
100019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      int64_t i = CI->getValue().getSExtValue();
10011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
100219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      if (i != 0) {
100319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        QualType elemType = ER->getElementType();
10041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
100519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        // If we are pointing to an incomplete type, go no further.
100619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        if (!IsCompleteType(C, elemType)) {
100719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek          superR = ER;
100819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek          break;
100919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        }
10101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1011199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck        CharUnits size = C.getTypeSizeInChars(elemType);
101219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        offset += (i * size);
101319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      }
101419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
101519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      // Go to the next ElementRegion (if any).
101619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      ER = dyn_cast<ElementRegion>(superR);
101719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      continue;
101819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    }
10191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
102019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    return NULL;
102119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  }
10221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
102319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  assert(superR && "super region cannot be NULL");
10249ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  return RegionRawOffset(superR, offset);
102519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
102619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
1027e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing XuRegionOffset MemRegion::getAsOffset() const {
1028e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *R = this;
1029e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t Offset = 0;
1030e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1031e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  while (1) {
1032e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    switch (R->getKind()) {
1033e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    default:
1034e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      return RegionOffset();
1035e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case SymbolicRegionKind:
1036e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case AllocaRegionKind:
1037e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case CompoundLiteralRegionKind:
1038e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case CXXThisRegionKind:
1039e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case StringRegionKind:
1040e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case VarRegionKind:
1041e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose    case ObjCIvarRegionKind:
104202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    case CXXTempObjectRegionKind:
1043e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      goto Finish;
1044e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose    case CXXBaseObjectRegionKind: {
1045e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      const CXXBaseObjectRegion *BOR = cast<CXXBaseObjectRegion>(R);
1046e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      R = BOR->getSuperRegion();
1047e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
1048e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      QualType Ty;
1049e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      if (const TypedValueRegion *TVR = dyn_cast<TypedValueRegion>(R)) {
1050e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        Ty = TVR->getDesugaredValueType(getContext());
1051e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      } else if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(R)) {
1052e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // If our base region is symbolic, we don't know what type it really is.
1053e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // Pretend the type of the symbol is the true dynamic type.
1054e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // (This will at least be self-consistent for the life of the symbol.)
1055e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        Ty = SR->getSymbol()->getType(getContext())->getPointeeType();
1056e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      }
1057e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
1058e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      const CXXRecordDecl *Child = Ty->getAsCXXRecordDecl();
1059e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      if (!Child) {
1060e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // We cannot compute the offset of the base class.
1061e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        return RegionOffset();
1062e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      }
1063e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      const ASTRecordLayout &Layout = getContext().getASTRecordLayout(Child);
1064e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
1065e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      CharUnits BaseOffset;
1066e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      const CXXRecordDecl *Base = BOR->getDecl();
1067e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      if (Child->isVirtuallyDerivedFrom(Base))
1068e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        BaseOffset = Layout.getVBaseClassOffset(Base);
1069e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      else
1070e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        BaseOffset = Layout.getBaseClassOffset(Base);
1071e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
1072e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      // The base offset is in chars, not in bits.
1073e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      Offset += BaseOffset.getQuantity() * getContext().getCharWidth();
1074e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose      break;
1075e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose    }
1076e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case ElementRegionKind: {
1077e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const ElementRegion *ER = cast<ElementRegion>(R);
1078018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu      QualType EleTy = ER->getValueType();
1079e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1080e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      if (!IsCompleteType(getContext(), EleTy))
1081e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        return RegionOffset();
1082e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
1083e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      SVal Index = ER->getIndex();
1084e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      if (const nonloc::ConcreteInt *CI=dyn_cast<nonloc::ConcreteInt>(&Index)) {
1085e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        int64_t i = CI->getValue().getSExtValue();
1086e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        // This type size is in bits.
1087e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        Offset += i * getContext().getTypeSize(EleTy);
1088e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      } else {
1089e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        // We cannot compute offset for non-concrete index.
1090e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        return RegionOffset();
1091e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      }
1092e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      R = ER->getSuperRegion();
10937caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu      break;
1094e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
1095e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case FieldRegionKind: {
1096e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const FieldRegion *FR = cast<FieldRegion>(R);
1097e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const RecordDecl *RD = FR->getDecl()->getParent();
10985e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall      if (!RD->isCompleteDefinition())
1099e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        // We cannot compute offset for incomplete type.
1100e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose        return RegionOffset();
1101e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      // Get the field number.
1102e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      unsigned idx = 0;
1103e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      for (RecordDecl::field_iterator FI = RD->field_begin(),
1104e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu             FE = RD->field_end(); FI != FE; ++FI, ++idx)
1105581deb3da481053c4993c7600f97acf7768caac5David Blaikie        if (FR->getDecl() == *FI)
1106e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu          break;
11077caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
1108e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
1109e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      // This is offset in bits.
1110e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      Offset += Layout.getFieldOffset(idx);
1111e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      R = FR->getSuperRegion();
1112e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      break;
1113e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
1114e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
1115e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  }
11167caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
1117e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu Finish:
1118e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  return RegionOffset(R, Offset);
11197caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu}
11207caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
11214240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
11224240096011a187807058f887eb81df750ffa17feTed Kremenek// BlockDataRegion
11234240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
11244240096011a187807058f887eb81df750ffa17feTed Kremenek
11254240096011a187807058f887eb81df750ffa17feTed Kremenekvoid BlockDataRegion::LazyInitializeReferencedVars() {
11264240096011a187807058f887eb81df750ffa17feTed Kremenek  if (ReferencedVars)
11274240096011a187807058f887eb81df750ffa17feTed Kremenek    return;
11284240096011a187807058f887eb81df750ffa17feTed Kremenek
11291d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *AC = getCodeRegion()->getAnalysisDeclContext();
11301d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext::referenced_decls_iterator I, E;
11314240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::tie(I, E) = AC->getReferencedBlockVars(BC->getDecl());
1132dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
11334240096011a187807058f887eb81df750ffa17feTed Kremenek  if (I == E) {
11344240096011a187807058f887eb81df750ffa17feTed Kremenek    ReferencedVars = (void*) 0x1;
11354240096011a187807058f887eb81df750ffa17feTed Kremenek    return;
11364240096011a187807058f887eb81df750ffa17feTed Kremenek  }
1137dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
11384240096011a187807058f887eb81df750ffa17feTed Kremenek  MemRegionManager &MemMgr = *getMemRegionManager();
11394240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &A = MemMgr.getAllocator();
11404240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVectorContext BC(A);
1141dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
11424240096011a187807058f887eb81df750ffa17feTed Kremenek  typedef BumpVector<const MemRegion*> VarVec;
11434240096011a187807058f887eb81df750ffa17feTed Kremenek  VarVec *BV = (VarVec*) A.Allocate<VarVec>();
114402b1df62ff6fa9526619ee0db78e2af4186e490dTed Kremenek  new (BV) VarVec(BC, E - I);
114585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  VarVec *BVOriginal = (VarVec*) A.Allocate<VarVec>();
114685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  new (BVOriginal) VarVec(BC, E - I);
1147dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
114867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  for ( ; I != E; ++I) {
114967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    const VarDecl *VD = *I;
115067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    const VarRegion *VR = 0;
115185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    const VarRegion *OriginalVR = 0;
1152dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
115385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    if (!VD->getAttr<BlocksAttr>() && VD->hasLocalStorage()) {
115467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek      VR = MemMgr.getVarRegion(VD, this);
115585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      OriginalVR = MemMgr.getVarRegion(VD, LC);
115685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    }
115767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    else {
115885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      if (LC) {
115967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek        VR = MemMgr.getVarRegion(VD, LC);
116085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek        OriginalVR = VR;
116185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek      }
116267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek      else {
116367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek        VR = MemMgr.getVarRegion(VD, MemMgr.getUnknownRegion());
116485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek        OriginalVR = MemMgr.getVarRegion(VD, LC);
116567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek      }
116667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    }
1167dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
116867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(VR);
116985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    assert(OriginalVR);
117067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BV->push_back(VR, BC);
117185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    BVOriginal->push_back(OriginalVR, BC);
117267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
1173dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
11744240096011a187807058f887eb81df750ffa17feTed Kremenek  ReferencedVars = BV;
117585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  OriginalVars = BVOriginal;
11764240096011a187807058f887eb81df750ffa17feTed Kremenek}
11774240096011a187807058f887eb81df750ffa17feTed Kremenek
11784240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator
11794240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_begin() const {
11804240096011a187807058f887eb81df750ffa17feTed Kremenek  const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars();
11814240096011a187807058f887eb81df750ffa17feTed Kremenek
11824240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVector<const MemRegion*> *Vec =
11834240096011a187807058f887eb81df750ffa17feTed Kremenek    static_cast<BumpVector<const MemRegion*>*>(ReferencedVars);
1184dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
118585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  if (Vec == (void*) 0x1)
118685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    return BlockDataRegion::referenced_vars_iterator(0, 0);
118785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
118885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  BumpVector<const MemRegion*> *VecOriginal =
118985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    static_cast<BumpVector<const MemRegion*>*>(OriginalVars);
119085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
119185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  return BlockDataRegion::referenced_vars_iterator(Vec->begin(),
119285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                                   VecOriginal->begin());
11934240096011a187807058f887eb81df750ffa17feTed Kremenek}
11944240096011a187807058f887eb81df750ffa17feTed Kremenek
11954240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator
11964240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_end() const {
11974240096011a187807058f887eb81df750ffa17feTed Kremenek  const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars();
11984240096011a187807058f887eb81df750ffa17feTed Kremenek
11994240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVector<const MemRegion*> *Vec =
12004240096011a187807058f887eb81df750ffa17feTed Kremenek    static_cast<BumpVector<const MemRegion*>*>(ReferencedVars);
1201dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
120285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  if (Vec == (void*) 0x1)
120385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    return BlockDataRegion::referenced_vars_iterator(0, 0);
120485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
120585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  BumpVector<const MemRegion*> *VecOriginal =
120685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek    static_cast<BumpVector<const MemRegion*>*>(OriginalVars);
120785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek
120885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek  return BlockDataRegion::referenced_vars_iterator(Vec->end(),
120985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek                                                   VecOriginal->end());
12104240096011a187807058f887eb81df750ffa17feTed Kremenek}
1211