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