MemRegion.cpp revision 99ba9e3bd70671f3441fb974895f226a83ce0e66
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"
217caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu#include "clang/AST/RecordLayout.h"
221309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include "llvm/Support/raw_ostream.h"
239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekusing namespace clang;
259ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenekusing namespace ento;
269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
27250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
28bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek// MemRegion Construction.
29bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek//===----------------------------------------------------------------------===//
30bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
31bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate<typename RegionTy> struct MemRegionManagerTrait;
32bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
33bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1>
34bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getRegion(const A1 a1) {
35dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
36bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion =
37bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1);
38dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
39bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  llvm::FoldingSetNodeID ID;
40bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy::ProfileRegion(ID, a1, superRegion);
419c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
42bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
43bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                                                   InsertPos));
44dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
45bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  if (!R) {
46bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
47bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    new (R) RegionTy(a1, superRegion);
48bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    Regions.InsertNode(R, InsertPos);
49bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
50dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
51bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  return R;
52bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek}
53bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
54bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1>
55bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1,
56bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                         const MemRegion *superRegion) {
57bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  llvm::FoldingSetNodeID ID;
58bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy::ProfileRegion(ID, a1, superRegion);
599c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
60bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
61bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                                                   InsertPos));
62dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
63bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  if (!R) {
64bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
65bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    new (R) RegionTy(a1, superRegion);
66bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    Regions.InsertNode(R, InsertPos);
67bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
68dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
69bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  return R;
70bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek}
71bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
72bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1, typename A2>
73bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getRegion(const A1 a1, const A2 a2) {
74dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
75bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion =
76bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1, a2);
77dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
78bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  llvm::FoldingSetNodeID ID;
79bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy::ProfileRegion(ID, a1, a2, superRegion);
809c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
81bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
82bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                                                   InsertPos));
83dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
84bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  if (!R) {
85bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
86bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    new (R) RegionTy(a1, a2, superRegion);
87bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    Regions.InsertNode(R, InsertPos);
88bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
89dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
90bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  return R;
91bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek}
92bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
93bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1, typename A2>
94bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2,
95bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                         const MemRegion *superRegion) {
96dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
97bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  llvm::FoldingSetNodeID ID;
98bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy::ProfileRegion(ID, a1, a2, superRegion);
999c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
100bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
101bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek                                                                   InsertPos));
102dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
103bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  if (!R) {
104bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
105bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    new (R) RegionTy(a1, a2, superRegion);
106bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek    Regions.InsertNode(R, InsertPos);
107bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
108dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
109bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  return R;
110bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek}
111bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
11267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename RegionTy, typename A1, typename A2, typename A3>
11367d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2, const A3 a3,
11467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                         const MemRegion *superRegion) {
115dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
11667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  llvm::FoldingSetNodeID ID;
11767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy::ProfileRegion(ID, a1, a2, a3, superRegion);
1189c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
11967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID,
12067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                                                   InsertPos));
121dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
12267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  if (!R) {
12367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    R = (RegionTy*) A.Allocate<RegionTy>();
12467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    new (R) RegionTy(a1, a2, a3, superRegion);
12567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    Regions.InsertNode(R, InsertPos);
126bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek  }
127dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
12867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return R;
12967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
130bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek
131bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek//===----------------------------------------------------------------------===//
1324240096011a187807058f887eb81df750ffa17feTed Kremenek// Object destruction.
133250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
1349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed KremenekMemRegion::~MemRegion() {}
1369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1374240096011a187807058f887eb81df750ffa17feTed KremenekMemRegionManager::~MemRegionManager() {
1384240096011a187807058f887eb81df750ffa17feTed Kremenek  // All regions and their data are BumpPtrAllocated.  No need to call
1394240096011a187807058f887eb81df750ffa17feTed Kremenek  // their destructors.
1404240096011a187807058f887eb81df750ffa17feTed Kremenek}
1414240096011a187807058f887eb81df750ffa17feTed Kremenek
1424240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
1434240096011a187807058f887eb81df750ffa17feTed Kremenek// Basic methods.
1444240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
1454240096011a187807058f887eb81df750ffa17feTed Kremenek
1467e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xubool SubRegion::isSubRegionOf(const MemRegion* R) const {
1477e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  const MemRegion* r = getSuperRegion();
1487e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  while (r != 0) {
1497e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu    if (r == R)
1507e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu      return true;
1517e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu    if (const SubRegion* sr = dyn_cast<SubRegion>(r))
1527e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu      r = sr->getSuperRegion();
1537e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu    else
1547e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu      break;
1557e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  }
1567e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  return false;
1577e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu}
1587e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu
159a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted KremenekMemRegionManager* SubRegion::getMemRegionManager() const {
160a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  const SubRegion* r = this;
161a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  do {
162a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    const MemRegion *superRegion = r->getSuperRegion();
163a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    if (const SubRegion *sr = dyn_cast<SubRegion>(superRegion)) {
164a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek      r = sr;
165a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek      continue;
166a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    }
167a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    return superRegion->getMemRegionManager();
168a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  } while (1);
169a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}
170a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
1715348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenekconst StackFrameContext *VarRegion::getStackFrame() const {
1725348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  const StackSpaceRegion *SSR = dyn_cast<StackSpaceRegion>(getMemorySpace());
1735348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek  return SSR ? SSR->getStackFrame() : NULL;
1745348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek}
1755348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
1765348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek//===----------------------------------------------------------------------===//
17732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose// Region extents.
17832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose//===----------------------------------------------------------------------===//
17932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
180c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal DeclRegion::getExtent(SValBuilder &svalBuilder) const {
1819c378f705405d37f49795d5e915989de774fe11fTed Kremenek  ASTContext &Ctx = svalBuilder.getContext();
18249f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall  QualType T = getDesugaredValueType(Ctx);
18332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
18452e04c537633377fb14cfa4fa3c95e3e510fc942Jordy Rose  if (isa<VariableArrayType>(T))
185c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek    return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this));
18652e04c537633377fb14cfa4fa3c95e3e510fc942Jordy Rose  if (isa<IncompleteArrayType>(T))
18732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    return UnknownVal();
18832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
18999c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  CharUnits size = Ctx.getTypeSizeInChars(T);
19099c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  QualType sizeTy = svalBuilder.getArrayIndexType();
19199c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  return svalBuilder.makeIntVal(size.getQuantity(), sizeTy);
19232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
19332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
194c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal FieldRegion::getExtent(SValBuilder &svalBuilder) const {
195c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  DefinedOrUnknownSVal Extent = DeclRegion::getExtent(svalBuilder);
19632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
19732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  // A zero-length array at the end of a struct often stands for dynamically-
19832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  // allocated extra memory.
19932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  if (Extent.isZeroConstant()) {
20049f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall    QualType T = getDesugaredValueType(svalBuilder.getContext());
20132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
20232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose    if (isa<ConstantArrayType>(T))
20332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose      return UnknownVal();
20432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  }
20532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
20632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  return Extent;
20732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
20832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
209c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal AllocaRegion::getExtent(SValBuilder &svalBuilder) const {
210c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this));
21132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
21232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
213c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal SymbolicRegion::getExtent(SValBuilder &svalBuilder) const {
214c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this));
21532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
21632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
217c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal StringRegion::getExtent(SValBuilder &svalBuilder) const {
21899c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek  return svalBuilder.makeIntVal(getStringLiteral()->getByteLength()+1,
21999c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek                                svalBuilder.getArrayIndexType());
22032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose}
22132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
2224fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing XuQualType CXXBaseObjectRegion::getValueType() const {
2234fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  return QualType(decl->getTypeForDecl(), 0);
2244fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
2254fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
22632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose//===----------------------------------------------------------------------===//
2275348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek// FoldingSet profiling.
2285348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek//===----------------------------------------------------------------------===//
2295348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek
2309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekvoid MemSpaceRegion::Profile(llvm::FoldingSetNodeID& ID) const {
2319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddInteger((unsigned)getKind());
2329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
2339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
23467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekvoid StackSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const {
23567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ID.AddInteger((unsigned)getKind());
23667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ID.AddPointer(getStackFrame());
23767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
23867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
239dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekvoid StaticGlobalSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const {
240dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ID.AddInteger((unsigned)getKind());
241dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  ID.AddPointer(getCodeRegion());
242dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}
243dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid StringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                 const StringLiteral* Str,
246e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu                                 const MemRegion* superRegion) {
247e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  ID.AddInteger((unsigned) StringRegionKind);
248e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  ID.AddPointer(Str);
249e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu  ID.AddPointer(superRegion);
250e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}
251e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
2527090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekvoid AllocaRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2539c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                 const Expr *Ex, unsigned cnt,
2547ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek                                 const MemRegion *) {
2557090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  ID.AddInteger((unsigned) AllocaRegionKind);
2567090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  ID.AddPointer(Ex);
2577090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  ID.AddInteger(cnt);
2587090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
2597090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
2607090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekvoid AllocaRegion::Profile(llvm::FoldingSetNodeID& ID) const {
2617ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  ProfileRegion(ID, Ex, Cnt, superRegion);
2627090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
2637090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
264329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekvoid CompoundLiteralRegion::Profile(llvm::FoldingSetNodeID& ID) const {
265329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  CompoundLiteralRegion::ProfileRegion(ID, CL, superRegion);
266329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
267329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
268329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekvoid CompoundLiteralRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
2699c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                          const CompoundLiteralExpr *CL,
270329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                                          const MemRegion* superRegion) {
271329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ID.AddInteger((unsigned) CompoundLiteralRegionKind);
272329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ID.AddPointer(CL);
273329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  ID.AddPointer(superRegion);
274329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
275329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
276de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekvoid CXXThisRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
277de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                  const PointerType *PT,
278de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                  const MemRegion *sRegion) {
279de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ID.AddInteger((unsigned) CXXThisRegionKind);
280de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ID.AddPointer(PT);
281de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  ID.AddPointer(sRegion);
282de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
283de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
284de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekvoid CXXThisRegion::Profile(llvm::FoldingSetNodeID &ID) const {
285de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  CXXThisRegion::ProfileRegion(ID, ThisPointerTy, superRegion);
286de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
287dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
2889c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid DeclRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D,
2899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek                               const MemRegion* superRegion, Kind k) {
2909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddInteger((unsigned) k);
2919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddPointer(D);
2929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  ID.AddPointer(superRegion);
2939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
2949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
2959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekvoid DeclRegion::Profile(llvm::FoldingSetNodeID& ID) const {
2969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  DeclRegion::ProfileRegion(ID, D, superRegion, getKind());
2979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
2989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
299d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekvoid VarRegion::Profile(llvm::FoldingSetNodeID &ID) const {
30067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  VarRegion::ProfileRegion(ID, getDecl(), superRegion);
301d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek}
302d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek
303250101353b711a409b075f1bc11070dddec7100bTed Kremenekvoid SymbolicRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym,
304250101353b711a409b075f1bc11070dddec7100bTed Kremenek                                   const MemRegion *sreg) {
305993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  ID.AddInteger((unsigned) MemRegion::SymbolicRegionKind);
3066d0e2d2f3c1b6531f303aac7e48aa1eb05900f2aTed Kremenek  ID.Add(sym);
307250101353b711a409b075f1bc11070dddec7100bTed Kremenek  ID.AddPointer(sreg);
308993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
309993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
310993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekvoid SymbolicRegion::Profile(llvm::FoldingSetNodeID& ID) const {
311250101353b711a409b075f1bc11070dddec7100bTed Kremenek  SymbolicRegion::ProfileRegion(ID, sym, getSuperRegion());
312993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
313993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
314f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenekvoid ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
3151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                  QualType ElementType, SVal Idx,
316511191ce8920160525611be2be754c32a0724c3eZhongxing Xu                                  const MemRegion* superRegion) {
317511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ID.AddInteger(MemRegion::ElementRegionKind);
318f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ID.Add(ElementType);
319511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ID.AddPointer(superRegion);
320511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  Idx.Profile(ID);
321511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}
322511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
323511191ce8920160525611be2be754c32a0724c3eZhongxing Xuvoid ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const {
324f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek  ElementRegion::ProfileRegion(ID, ElementType, Index, superRegion);
325511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}
32627b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu
327eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid FunctionTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
328eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek                                       const FunctionDecl *FD,
329eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek                                       const MemRegion*) {
330eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  ID.AddInteger(MemRegion::FunctionTextRegionKind);
331abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  ID.AddPointer(FD);
332ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
333ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
334eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid FunctionTextRegion::Profile(llvm::FoldingSetNodeID& ID) const {
335eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  FunctionTextRegion::ProfileRegion(ID, FD, superRegion);
336eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
337eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
338eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid BlockTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
33967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                    const BlockDecl *BD, CanQualType,
3401d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                    const AnalysisDeclContext *AC,
34167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                    const MemRegion*) {
342eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  ID.AddInteger(MemRegion::BlockTextRegionKind);
343eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek  ID.AddPointer(BD);
344eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
345eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
346eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid BlockTextRegion::Profile(llvm::FoldingSetNodeID& ID) const {
34767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockTextRegion::ProfileRegion(ID, BD, locTy, AC, superRegion);
348ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
349ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
3500a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekvoid BlockDataRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
3510a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                                    const BlockTextRegion *BC,
3520a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek                                    const LocationContext *LC,
35367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                    const MemRegion *sReg) {
3540a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  ID.AddInteger(MemRegion::BlockDataRegionKind);
3550a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  ID.AddPointer(BC);
3560a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  ID.AddPointer(LC);
35767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  ID.AddPointer(sReg);
3580a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
3590a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
3600a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekvoid BlockDataRegion::Profile(llvm::FoldingSetNodeID& ID) const {
36167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  BlockDataRegion::ProfileRegion(ID, BC, LC, getSuperRegion());
3620a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
3630a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
36402fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuvoid CXXTempObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
36502fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                        Expr const *Ex,
36602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                        const MemRegion *sReg) {
367bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  ID.AddPointer(Ex);
368bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  ID.AddPointer(sReg);
369bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}
370bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
37102fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuvoid CXXTempObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const {
372bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  ProfileRegion(ID, Ex, getSuperRegion());
373bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}
374bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
3754fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid CXXBaseObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID,
3764fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                                        const CXXRecordDecl *decl,
3774fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                                        const MemRegion *sReg) {
3784fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  ID.AddPointer(decl);
3794fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  ID.AddPointer(sReg);
3804fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
3814fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
3824fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid CXXBaseObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const {
3834fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  ProfileRegion(ID, decl, superRegion);
3844fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
3854fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
386026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu//===----------------------------------------------------------------------===//
38799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// Region anchors.
38899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
38999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
39099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid GlobalsSpaceRegion::anchor() { }
39199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid HeapSpaceRegion::anchor() { }
39299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UnknownSpaceRegion::anchor() { }
39399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StackLocalsSpaceRegion::anchor() { }
39499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StackArgumentsSpaceRegion::anchor() { }
39599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TypedRegion::anchor() { }
39699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TypedValueRegion::anchor() { }
39799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CodeTextRegion::anchor() { }
39899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid SubRegion::anchor() { }
39999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
40099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
4019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// Region pretty-printing.
4029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
4039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4048800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekvoid MemRegion::dump() const {
4058800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  dumpToStream(llvm::errs());
4067f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek}
4077f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek
4089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekstd::string MemRegion::getString() const {
4099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::string s;
4109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  llvm::raw_string_ostream os(s);
4118800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek  dumpToStream(os);
4129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  return os.str();
4139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
4149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4159c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid MemRegion::dumpToStream(raw_ostream &os) const {
4169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  os << "<Unknown Region>";
4179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
4189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4199c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid AllocaRegion::dumpToStream(raw_ostream &os) const {
4207090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek  os << "alloca{" << (void*) Ex << ',' << Cnt << '}';
4217090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
4227090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
4239c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid FunctionTextRegion::dumpToStream(raw_ostream &os) const {
424abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek  os << "code{" << getDecl()->getDeclName().getAsString() << '}';
42572e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek}
42672e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek
4279c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid BlockTextRegion::dumpToStream(raw_ostream &os) const {
4280a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  os << "block_code{" << (void*) this << '}';
429eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
430eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
4319c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid BlockDataRegion::dumpToStream(raw_ostream &os) const {
4320a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek  os << "block_data{" << BC << '}';
4330a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
4340a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
4359c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid CompoundLiteralRegion::dumpToStream(raw_ostream &os) const {
4365639a3ec15bdbf0b93376bbbae3adaf724f092a7Ted Kremenek  // FIXME: More elaborate pretty-printing.
4375639a3ec15bdbf0b93376bbbae3adaf724f092a7Ted Kremenek  os << "{ " << (void*) CL <<  " }";
4389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
4399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
4405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXTempObjectRegion::dumpToStream(raw_ostream &os) const {
441782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin  os << "temp_object{" << getValueType().getAsString() << ','
442782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin     << (void*) Ex << '}';
443e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu}
444e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu
4455f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXBaseObjectRegion::dumpToStream(raw_ostream &os) const {
4464fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  os << "base " << decl->getName();
4474fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
4484fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
4495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXThisRegion::dumpToStream(raw_ostream &os) const {
450de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  os << "this";
451de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
452de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
4539c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid ElementRegion::dumpToStream(raw_ostream &os) const {
45419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  os << "element{" << superRegion << ','
45519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek     << Index << ',' << getElementType().getAsString() << '}';
456993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
457993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
4589c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid FieldRegion::dumpToStream(raw_ostream &os) const {
459b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  os << superRegion << "->" << *getDecl();
4604bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek}
4614bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek
4625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid NonStaticGlobalSpaceRegion::dumpToStream(raw_ostream &os) const {
463fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek  os << "NonStaticGlobalSpaceRegion";
464fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek}
465fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
4669c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid ObjCIvarRegion::dumpToStream(raw_ostream &os) const {
467b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  os << "ivar{" << superRegion << ',' << *getDecl() << '}';
468bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek}
469bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek
4709c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid StringRegion::dumpToStream(raw_ostream &os) const {
471b27ed3d731c8885bcb473efc734b817a1216b4faTed Kremenek  Str->printPretty(os, 0, PrintingPolicy(getContext().getLangOptions()));
472b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu}
473b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu
4749c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid SymbolicRegion::dumpToStream(raw_ostream &os) const {
475aef5d2205a4425a4d3e1b0e28d46ed80763651dfTed Kremenek  os << "SymRegion{" << sym << '}';
476329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
477329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
4789c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid VarRegion::dumpToStream(raw_ostream &os) const {
479b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  os << *cast<VarDecl>(D);
480cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu}
481cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu
48219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekvoid RegionRawOffset::dump() const {
48319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  dumpToStream(llvm::errs());
48419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
48519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
4869c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid RegionRawOffset::dumpToStream(raw_ostream &os) const {
4879ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  os << "raw_offset{" << getRegion() << ',' << getOffset().getQuantity() << '}';
48819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
48919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
4905f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid StaticGlobalSpaceRegion::dumpToStream(raw_ostream &os) const {
491fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek  os << "StaticGlobalsMemSpace{" << CR << '}';
492fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek}
493fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek
4949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
4959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager methods.
4969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===//
49719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
49867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG>
49967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region) {
5001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!region) {
50167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    region = (REG*) A.Allocate<REG>();
50267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    new (region) REG(this);
5039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
504a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
5059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  return region;
5069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
5079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
50867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG, typename ARG>
50967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region, ARG a) {
51067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  if (!region) {
51167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    region = (REG*) A.Allocate<REG>();
51267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    new (region) REG(this, a);
51367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
514dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
51567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return region;
51667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
51767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
51867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackLocalsSpaceRegion*
5192b87ae45e129b941d0a4d221c9d4842385a119bdTed KremenekMemRegionManager::getStackLocalsRegion(const StackFrameContext *STC) {
5202b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  assert(STC);
521c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  StackLocalsSpaceRegion *&R = StackLocalsSpaceRegions[STC];
522c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
523c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  if (R)
524c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    return R;
525c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
526c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  R = A.Allocate<StackLocalsSpaceRegion>();
527c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  new (R) StackLocalsSpaceRegion(this, STC);
528c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  return R;
5299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
5309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
53167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackArgumentsSpaceRegion *
53267d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getStackArgumentsRegion(const StackFrameContext *STC) {
5332b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek  assert(STC);
534c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  StackArgumentsSpaceRegion *&R = StackArgumentsSpaceRegions[STC];
535c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
536c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  if (R)
537c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu    return R;
538c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu
539c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  R = A.Allocate<StackArgumentsSpaceRegion>();
540c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  new (R) StackArgumentsSpaceRegion(this, STC);
541c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu  return R;
542d05552a21377f493c882298c59e8829040b01d34Ted Kremenek}
543d05552a21377f493c882298c59e8829040b01d34Ted Kremenek
544dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst GlobalsSpaceRegion
545dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek*MemRegionManager::getGlobalsRegion(const CodeTextRegion *CR) {
546dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  if (!CR)
547dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return LazyAllocate(globals);
548dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
549dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  StaticGlobalSpaceRegion *&R = StaticsGlobalSpaceRegions[CR];
550dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  if (R)
551dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    return R;
552dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
553dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  R = A.Allocate<StaticGlobalSpaceRegion>();
554dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  new (R) StaticGlobalSpaceRegion(this, CR);
555dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  return R;
5569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
5579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
55867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst HeapSpaceRegion *MemRegionManager::getHeapRegion() {
5599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  return LazyAllocate(heap);
5609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
5619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
562b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getUnknownRegion() {
563178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu  return LazyAllocate(unknown);
564178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu}
565178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu
566b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getCodeRegion() {
567ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  return LazyAllocate(code);
568ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
569ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
570250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
571250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Constructing regions.
572250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===//
573e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
574dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst StringRegion* MemRegionManager::getStringRegion(const StringLiteral* Str){
57567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<StringRegion>(Str, getGlobalsRegion());
576e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu}
577e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu
578b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst VarRegion* MemRegionManager::getVarRegion(const VarDecl *D,
579b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                                const LocationContext *LC) {
58067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemRegion *sReg = 0;
5811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
582dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  if (D->hasGlobalStorage() && !D->isStaticLocal())
583dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    sReg = getGlobalsRegion();
584dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  else {
58567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // FIXME: Once we implement scope handling, we will need to properly lookup
58667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // 'D' to the proper LocationContext.
5872b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    const DeclContext *DC = D->getDeclContext();
5882b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    const StackFrameContext *STC = LC->getStackFrameForDeclContext(DC);
5892b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek
5902b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    if (!STC)
5912b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek      sReg = getUnknownRegion();
5922b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    else {
593dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      if (D->hasLocalStorage()) {
594dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        sReg = isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D)
595dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek               ? static_cast<const MemRegion*>(getStackArgumentsRegion(STC))
596dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek               : static_cast<const MemRegion*>(getStackLocalsRegion(STC));
597dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      }
598dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      else {
599dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        assert(D->isStaticLocal());
600dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        const Decl *D = STC->getDecl();
601dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
602dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          sReg = getGlobalsRegion(getFunctionTextRegion(FD));
603dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        else if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
604dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          const BlockTextRegion *BTR =
605dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek            getBlockTextRegion(BD,
606dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek                     C.getCanonicalType(BD->getSignatureAsWritten()->getType()),
6071d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                     STC->getAnalysisDeclContext());
608dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          sReg = getGlobalsRegion(BTR);
609dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        }
610dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        else {
611dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          // FIXME: For ObjC-methods, we need a new CodeTextRegion.  For now
612dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          // just use the main global memspace.
613dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek          sReg = getGlobalsRegion();
614dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek        }
615dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek      }
6162b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek    }
61767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
618dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
61967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<VarRegion>(D, sReg);
62067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}
6211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
62267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst VarRegion *MemRegionManager::getVarRegion(const VarDecl *D,
62367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                                const MemRegion *superR) {
62467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<VarRegion>(D, superR);
6259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
6269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
627b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockDataRegion *
628b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted KremenekMemRegionManager::getBlockDataRegion(const BlockTextRegion *BC,
629b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                     const LocationContext *LC) {
63067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemRegion *sReg = 0;
631dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
632dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek  if (LC) {
63367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // FIXME: Once we implement scope handling, we want the parent region
634dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek    // to be the scope.
63567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    const StackFrameContext *STC = LC->getCurrentStackFrame();
63667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(STC);
63767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    sReg = getStackLocalsRegion(STC);
63867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
63967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  else {
64067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // We allow 'LC' to be NULL for cases where want BlockDataRegions
64167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    // without context-sensitivity.
64267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    sReg = getUnknownRegion();
64367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
64467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
64567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<BlockDataRegion>(BC, LC, sReg);
6460a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek}
6470a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek
648b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst CompoundLiteralRegion*
6499c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getCompoundLiteralRegion(const CompoundLiteralExpr *CL,
65067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                           const LocationContext *LC) {
651dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
65267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemRegion *sReg = 0;
653dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
65467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  if (CL->isFileScope())
65567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    sReg = getGlobalsRegion();
65667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  else {
65767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    const StackFrameContext *STC = LC->getCurrentStackFrame();
65867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(STC);
65967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    sReg = getStackLocalsRegion(STC);
66067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
661dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
66267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<CompoundLiteralRegion>(CL, sReg);
663329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek}
664329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek
665b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ElementRegion*
66602282acd7a42d06a3178e3102d34a585bd82dd9fTed KremenekMemRegionManager::getElementRegion(QualType elementType, NonLoc Idx,
667465373946b5ae84f7c3d890cc25cb23fd88dd650Ted Kremenek                                   const MemRegion* superRegion,
6689c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                   ASTContext &Ctx){
669143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu
67032f901092daa4a53c7e012408c1f59d73ba29ff5Ted Kremenek  QualType T = Ctx.getCanonicalType(elementType).getUnqualifiedType();
671abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek
672511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  llvm::FoldingSetNodeID ID;
673143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu  ElementRegion::ProfileRegion(ID, T, Idx, superRegion);
674511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
6759c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *InsertPos;
676511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
677511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  ElementRegion* R = cast_or_null<ElementRegion>(data);
678511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
679511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  if (!R) {
680511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    R = (ElementRegion*) A.Allocate<ElementRegion>();
681143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu    new (R) ElementRegion(T, Idx, superRegion);
682511191ce8920160525611be2be754c32a0724c3eZhongxing Xu    Regions.InsertNode(R, InsertPos);
683511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  }
684511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
685511191ce8920160525611be2be754c32a0724c3eZhongxing Xu  return R;
686511191ce8920160525611be2be754c32a0724c3eZhongxing Xu}
687511191ce8920160525611be2be754c32a0724c3eZhongxing Xu
688b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst FunctionTextRegion *
689eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed KremenekMemRegionManager::getFunctionTextRegion(const FunctionDecl *FD) {
69067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<FunctionTextRegion>(FD, getCodeRegion());
691ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}
692ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
693b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockTextRegion *
69467d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getBlockTextRegion(const BlockDecl *BD, CanQualType locTy,
6951d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek                                     AnalysisDeclContext *AC) {
69667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<BlockTextRegion>(BD, locTy, AC, getCodeRegion());
697eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek}
698eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
699eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek
700993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
701b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst SymbolicRegion *MemRegionManager::getSymbolicRegion(SymbolRef sym) {
70267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<SymbolicRegion>(sym, getUnknownRegion());
703993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek}
704993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
705de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst FieldRegion*
7069c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getFieldRegion(const FieldDecl *d,
707b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek                                 const MemRegion* superRegion){
708eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  return getSubRegion<FieldRegion>(d, superRegion);
7099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
7109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
711b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ObjCIvarRegion*
7129c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getObjCIvarRegion(const ObjCIvarDecl *d,
713993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek                                    const MemRegion* superRegion) {
714eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek  return getSubRegion<ObjCIvarRegion>(d, superRegion);
715a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek}
716a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek
71702fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuconst CXXTempObjectRegion*
71802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing XuMemRegionManager::getCXXTempObjectRegion(Expr const *E,
71902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu                                         LocationContext const *LC) {
720bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  const StackFrameContext *SFC = LC->getCurrentStackFrame();
721bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  assert(SFC);
72202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu  return getSubRegion<CXXTempObjectRegion>(E, getStackLocalsRegion(SFC));
723bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu}
724bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
7254fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuconst CXXBaseObjectRegion *
7264fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing XuMemRegionManager::getCXXBaseObjectRegion(const CXXRecordDecl *decl,
7274fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu                                         const MemRegion *superRegion) {
7284fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  return getSubRegion<CXXBaseObjectRegion>(decl, superRegion);
7294fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
7304fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
731de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst CXXThisRegion*
732de0d26310191215a6d1d189dc419f87af18ce6beTed KremenekMemRegionManager::getCXXThisRegion(QualType thisPointerTy,
733de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek                                   const LocationContext *LC) {
734de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const StackFrameContext *STC = LC->getCurrentStackFrame();
735de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  assert(STC);
736de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  const PointerType *PT = thisPointerTy->getAs<PointerType>();
737de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  assert(PT);
738de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return getSubRegion<CXXThisRegion>(PT, getStackArgumentsRegion(STC));
739de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
740de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
741b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst AllocaRegion*
7429c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getAllocaRegion(const Expr *E, unsigned cnt,
74367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek                                  const LocationContext *LC) {
74467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const StackFrameContext *STC = LC->getCurrentStackFrame();
74567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  assert(STC);
74667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return getSubRegion<AllocaRegion>(E, cnt, getStackLocalsRegion(STC));
7477090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek}
7487090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek
749bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekconst MemSpaceRegion *MemRegion::getMemorySpace() const {
750bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const MemRegion *R = this;
751bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  const SubRegion* SR = dyn_cast<SubRegion>(this);
7521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
753993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  while (SR) {
754bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek    R = SR->getSuperRegion();
755bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek    SR = dyn_cast<SubRegion>(R);
7569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
7571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
758bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek  return dyn_cast<MemSpaceRegion>(R);
7599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
7601670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
761bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekbool MemRegion::hasStackStorage() const {
76267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackSpaceRegion>(getMemorySpace());
763bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek}
764dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu
765de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackNonParametersStorage() const {
766de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return isa<StackLocalsSpaceRegion>(getMemorySpace());
7671508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek}
7681508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek
769de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackParametersStorage() const {
77067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackArgumentsSpaceRegion>(getMemorySpace());
771dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek}
772dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek
7731508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenekbool MemRegion::hasGlobalsOrParametersStorage() const {
77467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  const MemSpaceRegion *MS = getMemorySpace();
77567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  return isa<StackArgumentsSpaceRegion>(MS) ||
77667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek         isa<GlobalsSpaceRegion>(MS);
7771508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek}
7781670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
779adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// getBaseRegion strips away all elements and fields, and get the base region
780adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// of them.
781adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xuconst MemRegion *MemRegion::getBaseRegion() const {
782adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  const MemRegion *R = this;
783adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  while (true) {
78468b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek    switch (R->getKind()) {
78568b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::ElementRegionKind:
78668b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::FieldRegionKind:
78768b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      case MemRegion::ObjCIvarRegionKind:
788e17da65c5773e0285b22e33d1431b13fbcd8942cZhongxing Xu      case MemRegion::CXXBaseObjectRegionKind:
78968b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        R = cast<SubRegion>(R)->getSuperRegion();
79068b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        continue;
79168b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek      default:
79268b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek        break;
793adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu    }
794adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu    break;
795adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  }
796adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu  return R;
797adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu}
798adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu
7991670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===//
8001670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek// View handling.
8011670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===//
8021670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
803479529e679957fbb92b56e116e3c86734429331eZhongxing Xuconst MemRegion *MemRegion::StripCasts() const {
8040e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  const MemRegion *R = this;
8050e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  while (true) {
8061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (const ElementRegion *ER = dyn_cast<ElementRegion>(R)) {
8070e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek      // FIXME: generalize.  Essentially we want to strip away ElementRegions
8080e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek      // that were layered on a symbolic region because of casts.  We only
8090e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek      // want to strip away ElementRegions, however, where the index is 0.
8100e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek      SVal index = ER->getIndex();
8110e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek      if (nonloc::ConcreteInt *CI = dyn_cast<nonloc::ConcreteInt>(&index)) {
81219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        if (CI->getValue().getSExtValue() == 0) {
8130e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek          R = ER->getSuperRegion();
8140e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek          continue;
8150e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek        }
8160e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek      }
8170e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek    }
8180e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek    break;
8190e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  }
8200e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  return R;
8210e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek}
82219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
82319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// FIXME: Merge with the implementation of the same method in Store.cpp
82419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekstatic bool IsCompleteType(ASTContext &Ctx, QualType Ty) {
82519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  if (const RecordType *RT = Ty->getAs<RecordType>()) {
82619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    const RecordDecl *D = RT->getDecl();
827952b017601f9c82b51119c3a1600f1312a833db9Douglas Gregor    if (!D->getDefinition())
82819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      return false;
82919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  }
83019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
83119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  return true;
83219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
83319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
8347caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing XuRegionRawOffset ElementRegion::getAsArrayOffset() const {
835199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits offset = CharUnits::Zero();
83619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  const ElementRegion *ER = this;
83719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  const MemRegion *superR = NULL;
83819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  ASTContext &C = getContext();
8391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
84019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  // FIXME: Handle multi-dimensional arrays.
84119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
84219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  while (ER) {
84319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    superR = ER->getSuperRegion();
8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
84519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    // FIXME: generalize to symbolic offsets.
84619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    SVal index = ER->getIndex();
84719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    if (nonloc::ConcreteInt *CI = dyn_cast<nonloc::ConcreteInt>(&index)) {
84819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      // Update the offset.
84919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      int64_t i = CI->getValue().getSExtValue();
8501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
85119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      if (i != 0) {
85219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        QualType elemType = ER->getElementType();
8531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
85419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        // If we are pointing to an incomplete type, go no further.
85519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        if (!IsCompleteType(C, elemType)) {
85619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek          superR = ER;
85719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek          break;
85819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        }
8591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
860199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck        CharUnits size = C.getTypeSizeInChars(elemType);
86119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek        offset += (i * size);
86219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      }
86319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
86419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      // Go to the next ElementRegion (if any).
86519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      ER = dyn_cast<ElementRegion>(superR);
86619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek      continue;
86719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    }
8681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
86919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek    return NULL;
87019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  }
8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
87219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek  assert(superR && "super region cannot be NULL");
8739ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck  return RegionRawOffset(superR, offset);
87419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek}
87519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek
876e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing XuRegionOffset MemRegion::getAsOffset() const {
877e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  const MemRegion *R = this;
878e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu  int64_t Offset = 0;
879e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
880e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  while (1) {
881e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    switch (R->getKind()) {
882e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    default:
883e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      return RegionOffset(0);
884e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case SymbolicRegionKind:
885e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case AllocaRegionKind:
886e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case CompoundLiteralRegionKind:
887e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case CXXThisRegionKind:
888e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case StringRegionKind:
889e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case VarRegionKind:
89002fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu    case CXXTempObjectRegionKind:
891e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      goto Finish;
892e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case ElementRegionKind: {
893e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const ElementRegion *ER = cast<ElementRegion>(R);
894018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu      QualType EleTy = ER->getValueType();
895e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
896e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      if (!IsCompleteType(getContext(), EleTy))
897e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        return RegionOffset(0);
898e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu
899e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      SVal Index = ER->getIndex();
900e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      if (const nonloc::ConcreteInt *CI=dyn_cast<nonloc::ConcreteInt>(&Index)) {
901e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        int64_t i = CI->getValue().getSExtValue();
902e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        CharUnits Size = getContext().getTypeSizeInChars(EleTy);
903e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        Offset += i * Size.getQuantity() * 8;
904e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      } else {
905e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        // We cannot compute offset for non-concrete index.
906e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        return RegionOffset(0);
907e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      }
908e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      R = ER->getSuperRegion();
9097caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu      break;
910e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
911e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    case FieldRegionKind: {
912e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const FieldRegion *FR = cast<FieldRegion>(R);
913e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const RecordDecl *RD = FR->getDecl()->getParent();
9145e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall      if (!RD->isCompleteDefinition())
915e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        // We cannot compute offset for incomplete type.
916e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        return RegionOffset(0);
917e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      // Get the field number.
918e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      unsigned idx = 0;
919e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      for (RecordDecl::field_iterator FI = RD->field_begin(),
920e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu             FE = RD->field_end(); FI != FE; ++FI, ++idx)
921e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu        if (FR->getDecl() == *FI)
922e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu          break;
9237caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
924e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
925e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      // This is offset in bits.
926e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      Offset += Layout.getFieldOffset(idx);
927e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      R = FR->getSuperRegion();
928e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu      break;
929e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
930e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu    }
931e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  }
9327caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
933e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu Finish:
934e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu  return RegionOffset(R, Offset);
9357caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu}
9367caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu
9374240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
9384240096011a187807058f887eb81df750ffa17feTed Kremenek// BlockDataRegion
9394240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===//
9404240096011a187807058f887eb81df750ffa17feTed Kremenek
9414240096011a187807058f887eb81df750ffa17feTed Kremenekvoid BlockDataRegion::LazyInitializeReferencedVars() {
9424240096011a187807058f887eb81df750ffa17feTed Kremenek  if (ReferencedVars)
9434240096011a187807058f887eb81df750ffa17feTed Kremenek    return;
9444240096011a187807058f887eb81df750ffa17feTed Kremenek
9451d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *AC = getCodeRegion()->getAnalysisDeclContext();
9461d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext::referenced_decls_iterator I, E;
9474240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::tie(I, E) = AC->getReferencedBlockVars(BC->getDecl());
948dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
9494240096011a187807058f887eb81df750ffa17feTed Kremenek  if (I == E) {
9504240096011a187807058f887eb81df750ffa17feTed Kremenek    ReferencedVars = (void*) 0x1;
9514240096011a187807058f887eb81df750ffa17feTed Kremenek    return;
9524240096011a187807058f887eb81df750ffa17feTed Kremenek  }
953dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
9544240096011a187807058f887eb81df750ffa17feTed Kremenek  MemRegionManager &MemMgr = *getMemRegionManager();
9554240096011a187807058f887eb81df750ffa17feTed Kremenek  llvm::BumpPtrAllocator &A = MemMgr.getAllocator();
9564240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVectorContext BC(A);
957dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
9584240096011a187807058f887eb81df750ffa17feTed Kremenek  typedef BumpVector<const MemRegion*> VarVec;
9594240096011a187807058f887eb81df750ffa17feTed Kremenek  VarVec *BV = (VarVec*) A.Allocate<VarVec>();
96002b1df62ff6fa9526619ee0db78e2af4186e490dTed Kremenek  new (BV) VarVec(BC, E - I);
961dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
96267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  for ( ; I != E; ++I) {
96367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    const VarDecl *VD = *I;
96467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    const VarRegion *VR = 0;
965dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
96685248734f404fbb9b2f88ecd5296761a8578def6Ted Kremenek    if (!VD->getAttr<BlocksAttr>() && VD->hasLocalStorage())
96767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek      VR = MemMgr.getVarRegion(VD, this);
96867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    else {
96967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek      if (LC)
97067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek        VR = MemMgr.getVarRegion(VD, LC);
97167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek      else {
97267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek        VR = MemMgr.getVarRegion(VD, MemMgr.getUnknownRegion());
97367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek      }
97467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    }
975dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
97667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    assert(VR);
97767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek    BV->push_back(VR, BC);
97867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek  }
979dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
9804240096011a187807058f887eb81df750ffa17feTed Kremenek  ReferencedVars = BV;
9814240096011a187807058f887eb81df750ffa17feTed Kremenek}
9824240096011a187807058f887eb81df750ffa17feTed Kremenek
9834240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator
9844240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_begin() const {
9854240096011a187807058f887eb81df750ffa17feTed Kremenek  const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars();
9864240096011a187807058f887eb81df750ffa17feTed Kremenek
9874240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVector<const MemRegion*> *Vec =
9884240096011a187807058f887eb81df750ffa17feTed Kremenek    static_cast<BumpVector<const MemRegion*>*>(ReferencedVars);
989dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
99081cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  return BlockDataRegion::referenced_vars_iterator(Vec == (void*) 0x1 ?
99181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek                                                   NULL : Vec->begin());
9924240096011a187807058f887eb81df750ffa17feTed Kremenek}
9934240096011a187807058f887eb81df750ffa17feTed Kremenek
9944240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator
9954240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_end() const {
9964240096011a187807058f887eb81df750ffa17feTed Kremenek  const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars();
9974240096011a187807058f887eb81df750ffa17feTed Kremenek
9984240096011a187807058f887eb81df750ffa17feTed Kremenek  BumpVector<const MemRegion*> *Vec =
9994240096011a187807058f887eb81df750ffa17feTed Kremenek    static_cast<BumpVector<const MemRegion*>*>(ReferencedVars);
1000dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek
100181cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek  return BlockDataRegion::referenced_vars_iterator(Vec == (void*) 0x1 ?
100281cef5889027d0f96b24afa7a0bb28d9023474edTed Kremenek                                                   NULL : Vec->end());
10034240096011a187807058f887eb81df750ffa17feTed Kremenek}
1004