19e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//== MemRegion.cpp - Abstract memory regions for static analysis --*- C++ -*--// 29e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 39e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// The LLVM Compiler Infrastructure 49e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 59e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// This file is distributed under the University of Illinois Open Source 69e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// License. See LICENSE.TXT for details. 79e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 89e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 99e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// This file defines MemRegion and its subclasses. MemRegion defines a 119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// partially-typed abstraction of memory useful for path-sensitive dataflow 129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// analyses. 139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 169b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h" 172fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/Attr.h" 18199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck#include "clang/AST/CharUnits.h" 19c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer#include "clang/AST/DeclObjC.h" 207caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu#include "clang/AST/RecordLayout.h" 2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Analysis/AnalysisContext.h" 2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Analysis/Support/BumpVector.h" 23eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks#include "clang/Basic/SourceManager.h" 2455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h" 251309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include "llvm/Support/raw_ostream.h" 269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekusing namespace clang; 289ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenekusing namespace ento; 299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 30250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 31bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek// MemRegion Construction. 32bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek//===----------------------------------------------------------------------===// 33bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 34bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate<typename RegionTy> struct MemRegionManagerTrait; 35bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 36bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1> 37bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getRegion(const A1 a1) { 38dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 39bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion = 40bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1); 41dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 42bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek llvm::FoldingSetNodeID ID; 43bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy::ProfileRegion(ID, a1, superRegion); 449c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 45bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 46bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek InsertPos)); 47dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 48bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek if (!R) { 49bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 50bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek new (R) RegionTy(a1, superRegion); 51bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek Regions.InsertNode(R, InsertPos); 52bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 53dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 54bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R; 55bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek} 56bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 57bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1> 58bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, 59bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek const MemRegion *superRegion) { 60bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek llvm::FoldingSetNodeID ID; 61bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy::ProfileRegion(ID, a1, superRegion); 629c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 63bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 64bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek InsertPos)); 65dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 66bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek if (!R) { 67bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 68bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek new (R) RegionTy(a1, superRegion); 69bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek Regions.InsertNode(R, InsertPos); 70bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 71dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 72bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R; 73bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek} 74bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 75bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1, typename A2> 76bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getRegion(const A1 a1, const A2 a2) { 77dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 78bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion = 79bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1, a2); 80dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 81bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek llvm::FoldingSetNodeID ID; 82bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy::ProfileRegion(ID, a1, a2, superRegion); 839c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 84bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 85bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek InsertPos)); 86dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 87bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek if (!R) { 88bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 89bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek new (R) RegionTy(a1, a2, superRegion); 90bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek Regions.InsertNode(R, InsertPos); 91bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 92dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 93bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R; 94bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek} 95bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 96bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenektemplate <typename RegionTy, typename A1, typename A2> 97bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2, 98bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek const MemRegion *superRegion) { 99dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 100bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek llvm::FoldingSetNodeID ID; 101bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy::ProfileRegion(ID, a1, a2, superRegion); 1029c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 103bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 104bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek InsertPos)); 105dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 106bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek if (!R) { 107bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 108bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek new (R) RegionTy(a1, a2, superRegion); 109bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek Regions.InsertNode(R, InsertPos); 110bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 111dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 112bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek return R; 113bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek} 114bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 11567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename RegionTy, typename A1, typename A2, typename A3> 11667d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekRegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2, const A3 a3, 11767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *superRegion) { 118dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 11967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek llvm::FoldingSetNodeID ID; 12067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy::ProfileRegion(ID, a1, a2, a3, superRegion); 1219c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 12267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 12367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek InsertPos)); 124dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 12567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek if (!R) { 12667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek R = (RegionTy*) A.Allocate<RegionTy>(); 12767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek new (R) RegionTy(a1, a2, a3, superRegion); 12867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek Regions.InsertNode(R, InsertPos); 129bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek } 130dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 13167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return R; 13267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek} 133bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek 134bcd7f9f8cb2f1b78e8ad991677a4364044e1deb7Ted Kremenek//===----------------------------------------------------------------------===// 1354240096011a187807058f887eb81df750ffa17feTed Kremenek// Object destruction. 136250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 1379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed KremenekMemRegion::~MemRegion() {} 1399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1404240096011a187807058f887eb81df750ffa17feTed KremenekMemRegionManager::~MemRegionManager() { 1414240096011a187807058f887eb81df750ffa17feTed Kremenek // All regions and their data are BumpPtrAllocated. No need to call 1424240096011a187807058f887eb81df750ffa17feTed Kremenek // their destructors. 1434240096011a187807058f887eb81df750ffa17feTed Kremenek} 1444240096011a187807058f887eb81df750ffa17feTed Kremenek 1454240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===// 1464240096011a187807058f887eb81df750ffa17feTed Kremenek// Basic methods. 1474240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===// 1484240096011a187807058f887eb81df750ffa17feTed Kremenek 1497e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xubool SubRegion::isSubRegionOf(const MemRegion* R) const { 1507e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu const MemRegion* r = getSuperRegion(); 1517e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu while (r != 0) { 1527e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu if (r == R) 1537e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu return true; 1547e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu if (const SubRegion* sr = dyn_cast<SubRegion>(r)) 1557e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu r = sr->getSuperRegion(); 1567e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu else 1577e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu break; 1587e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu } 1597e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu return false; 1607e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu} 1617e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu 162a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted KremenekMemRegionManager* SubRegion::getMemRegionManager() const { 163a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek const SubRegion* r = this; 164a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek do { 165a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek const MemRegion *superRegion = r->getSuperRegion(); 166a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek if (const SubRegion *sr = dyn_cast<SubRegion>(superRegion)) { 167a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek r = sr; 168a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek continue; 169a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } 170a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek return superRegion->getMemRegionManager(); 171a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek } while (1); 172a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek} 173a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 1745348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenekconst StackFrameContext *VarRegion::getStackFrame() const { 1755348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek const StackSpaceRegion *SSR = dyn_cast<StackSpaceRegion>(getMemorySpace()); 1765348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek return SSR ? SSR->getStackFrame() : NULL; 1775348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek} 1785348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek 1795348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek//===----------------------------------------------------------------------===// 18032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose// Region extents. 18132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose//===----------------------------------------------------------------------===// 18232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 183e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan RoseDefinedOrUnknownSVal TypedValueRegion::getExtent(SValBuilder &svalBuilder) const { 1849c378f705405d37f49795d5e915989de774fe11fTed Kremenek ASTContext &Ctx = svalBuilder.getContext(); 18549f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall QualType T = getDesugaredValueType(Ctx); 18632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 18752e04c537633377fb14cfa4fa3c95e3e510fc942Jordy Rose if (isa<VariableArrayType>(T)) 188c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this)); 18952e04c537633377fb14cfa4fa3c95e3e510fc942Jordy Rose if (isa<IncompleteArrayType>(T)) 19032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return UnknownVal(); 19132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 19299c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek CharUnits size = Ctx.getTypeSizeInChars(T); 19399c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek QualType sizeTy = svalBuilder.getArrayIndexType(); 19499c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek return svalBuilder.makeIntVal(size.getQuantity(), sizeTy); 19532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 19632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 197c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal FieldRegion::getExtent(SValBuilder &svalBuilder) const { 198d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose // Force callers to deal with bitfields explicitly. 199d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose if (getDecl()->isBitField()) 200d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose return UnknownVal(); 201d764e20189dbb42b38ada383a0a159f6adc0d56cJordan Rose 202c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek DefinedOrUnknownSVal Extent = DeclRegion::getExtent(svalBuilder); 20332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 20432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose // A zero-length array at the end of a struct often stands for dynamically- 20532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose // allocated extra memory. 20632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose if (Extent.isZeroConstant()) { 20749f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall QualType T = getDesugaredValueType(svalBuilder.getContext()); 20832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 20932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose if (isa<ConstantArrayType>(T)) 21032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return UnknownVal(); 21132f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose } 21232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 21332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose return Extent; 21432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 21532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 216c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal AllocaRegion::getExtent(SValBuilder &svalBuilder) const { 217c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this)); 21832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 21932f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 220c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal SymbolicRegion::getExtent(SValBuilder &svalBuilder) const { 221c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this)); 22232f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 22332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 224c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekDefinedOrUnknownSVal StringRegion::getExtent(SValBuilder &svalBuilder) const { 22599c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek return svalBuilder.makeIntVal(getStringLiteral()->getByteLength()+1, 22699c330d0149abeb7f5e52a30ad329f2588c01671Ted Kremenek svalBuilder.getArrayIndexType()); 22732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose} 22832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 229c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin KramerObjCIvarRegion::ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg) 230c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 231c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer 232c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramerconst ObjCIvarDecl *ObjCIvarRegion::getDecl() const { 233c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer return cast<ObjCIvarDecl>(D); 234c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer} 235c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer 236c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin KramerQualType ObjCIvarRegion::getValueType() const { 237c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer return getDecl()->getType(); 238c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer} 239c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer 2404fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing XuQualType CXXBaseObjectRegion::getValueType() const { 2414411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose return QualType(getDecl()->getTypeForDecl(), 0); 2424fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 2434fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 24432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose//===----------------------------------------------------------------------===// 2455348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek// FoldingSet profiling. 2465348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek//===----------------------------------------------------------------------===// 2475348f94abd0e9d3945da8d059b55b156967e8ff9Ted Kremenek 2489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekvoid MemSpaceRegion::Profile(llvm::FoldingSetNodeID& ID) const { 2499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ID.AddInteger((unsigned)getKind()); 2509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 2519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 25267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekvoid StackSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const { 25367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ID.AddInteger((unsigned)getKind()); 25467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ID.AddPointer(getStackFrame()); 25567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek} 25667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 257dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekvoid StaticGlobalSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const { 258dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek ID.AddInteger((unsigned)getKind()); 259dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek ID.AddPointer(getCodeRegion()); 260dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek} 261dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 2621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid StringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const StringLiteral* Str, 264e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu const MemRegion* superRegion) { 265e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ID.AddInteger((unsigned) StringRegionKind); 266e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ID.AddPointer(Str); 267e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu ID.AddPointer(superRegion); 268e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu} 269e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 2704c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekvoid ObjCStringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 2714c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const ObjCStringLiteral* Str, 2724c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek const MemRegion* superRegion) { 2734c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ID.AddInteger((unsigned) ObjCStringRegionKind); 2744c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ID.AddPointer(Str); 2754c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek ID.AddPointer(superRegion); 2764c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek} 2774c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 2787090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekvoid AllocaRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 2799c378f705405d37f49795d5e915989de774fe11fTed Kremenek const Expr *Ex, unsigned cnt, 280dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks const MemRegion *superRegion) { 2817090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek ID.AddInteger((unsigned) AllocaRegionKind); 2827090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek ID.AddPointer(Ex); 2837090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek ID.AddInteger(cnt); 284dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks ID.AddPointer(superRegion); 2857090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek} 2867090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 2877090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenekvoid AllocaRegion::Profile(llvm::FoldingSetNodeID& ID) const { 2887ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek ProfileRegion(ID, Ex, Cnt, superRegion); 2897090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek} 2907090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 291329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekvoid CompoundLiteralRegion::Profile(llvm::FoldingSetNodeID& ID) const { 292329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek CompoundLiteralRegion::ProfileRegion(ID, CL, superRegion); 293329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek} 294329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 295329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekvoid CompoundLiteralRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 2969c378f705405d37f49795d5e915989de774fe11fTed Kremenek const CompoundLiteralExpr *CL, 297329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek const MemRegion* superRegion) { 298329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek ID.AddInteger((unsigned) CompoundLiteralRegionKind); 299329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek ID.AddPointer(CL); 300329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek ID.AddPointer(superRegion); 301329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek} 302329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 303de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekvoid CXXThisRegion::ProfileRegion(llvm::FoldingSetNodeID &ID, 304de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *PT, 305de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const MemRegion *sRegion) { 306de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek ID.AddInteger((unsigned) CXXThisRegionKind); 307de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek ID.AddPointer(PT); 308de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek ID.AddPointer(sRegion); 309de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 310de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 311de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekvoid CXXThisRegion::Profile(llvm::FoldingSetNodeID &ID) const { 312de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek CXXThisRegion::ProfileRegion(ID, ThisPointerTy, superRegion); 313de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 314dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 315c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramervoid ObjCIvarRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 316c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer const ObjCIvarDecl *ivd, 317c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer const MemRegion* superRegion) { 318c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 319c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer} 320c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer 3219c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid DeclRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D, 3229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k) { 3239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ID.AddInteger((unsigned) k); 3249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ID.AddPointer(D); 3259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ID.AddPointer(superRegion); 3269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 3279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekvoid DeclRegion::Profile(llvm::FoldingSetNodeID& ID) const { 3299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, D, superRegion, getKind()); 3309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 3319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 332d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenekvoid VarRegion::Profile(llvm::FoldingSetNodeID &ID) const { 33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek VarRegion::ProfileRegion(ID, getDecl(), superRegion); 334d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek} 335d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek 336250101353b711a409b075f1bc11070dddec7100bTed Kremenekvoid SymbolicRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym, 337250101353b711a409b075f1bc11070dddec7100bTed Kremenek const MemRegion *sreg) { 338993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek ID.AddInteger((unsigned) MemRegion::SymbolicRegionKind); 3396d0e2d2f3c1b6531f303aac7e48aa1eb05900f2aTed Kremenek ID.Add(sym); 340250101353b711a409b075f1bc11070dddec7100bTed Kremenek ID.AddPointer(sreg); 341993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek} 342993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 343993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekvoid SymbolicRegion::Profile(llvm::FoldingSetNodeID& ID) const { 344250101353b711a409b075f1bc11070dddec7100bTed Kremenek SymbolicRegion::ProfileRegion(ID, sym, getSuperRegion()); 345993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek} 346993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 347f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenekvoid ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType ElementType, SVal Idx, 349511191ce8920160525611be2be754c32a0724c3eZhongxing Xu const MemRegion* superRegion) { 350511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ID.AddInteger(MemRegion::ElementRegionKind); 351f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ID.Add(ElementType); 352511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ID.AddPointer(superRegion); 353511191ce8920160525611be2be754c32a0724c3eZhongxing Xu Idx.Profile(ID); 354511191ce8920160525611be2be754c32a0724c3eZhongxing Xu} 355511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 356511191ce8920160525611be2be754c32a0724c3eZhongxing Xuvoid ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const { 357f936f4568700d799e7d92eecef67b0e2b822ae7eTed Kremenek ElementRegion::ProfileRegion(ID, ElementType, Index, superRegion); 358511191ce8920160525611be2be754c32a0724c3eZhongxing Xu} 35927b57063d83b00474d7563fb5d608544e2364862Zhongxing Xu 360eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid FunctionTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 3615fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks const NamedDecl *FD, 362eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek const MemRegion*) { 363eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek ID.AddInteger(MemRegion::FunctionTextRegionKind); 364abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek ID.AddPointer(FD); 365ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu} 366ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 367eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid FunctionTextRegion::Profile(llvm::FoldingSetNodeID& ID) const { 368eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek FunctionTextRegion::ProfileRegion(ID, FD, superRegion); 369eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek} 370eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 371eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid BlockTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const BlockDecl *BD, CanQualType, 3731d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek const AnalysisDeclContext *AC, 37467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion*) { 375eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek ID.AddInteger(MemRegion::BlockTextRegionKind); 376eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek ID.AddPointer(BD); 377eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek} 378eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 379eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenekvoid BlockTextRegion::Profile(llvm::FoldingSetNodeID& ID) const { 38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockTextRegion::ProfileRegion(ID, BD, locTy, AC, superRegion); 381ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu} 382ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 3830a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekvoid BlockDataRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 3840a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const BlockTextRegion *BC, 3850a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek const LocationContext *LC, 38667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *sReg) { 3870a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek ID.AddInteger(MemRegion::BlockDataRegionKind); 3880a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek ID.AddPointer(BC); 3890a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek ID.AddPointer(LC); 39067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek ID.AddPointer(sReg); 3910a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek} 3920a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 3930a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenekvoid BlockDataRegion::Profile(llvm::FoldingSetNodeID& ID) const { 39467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BlockDataRegion::ProfileRegion(ID, BC, LC, getSuperRegion()); 3950a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek} 3960a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 39702fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuvoid CXXTempObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID, 39802fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu Expr const *Ex, 39902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu const MemRegion *sReg) { 400bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu ID.AddPointer(Ex); 401bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu ID.AddPointer(sReg); 402bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu} 403bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 40402fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuvoid CXXTempObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const { 405bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu ProfileRegion(ID, Ex, getSuperRegion()); 406bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu} 407bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 4084fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid CXXBaseObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID, 4094411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const CXXRecordDecl *RD, 4104411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose bool IsVirtual, 4114411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const MemRegion *SReg) { 4124411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose ID.AddPointer(RD); 4134411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose ID.AddBoolean(IsVirtual); 4144411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose ID.AddPointer(SReg); 4154fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 4164fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 4174fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid CXXBaseObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const { 4184411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose ProfileRegion(ID, getDecl(), isVirtual(), superRegion); 4194fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 4204fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 421026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu//===----------------------------------------------------------------------===// 42299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// Region anchors. 42399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 42499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 42599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid GlobalsSpaceRegion::anchor() { } 42699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid HeapSpaceRegion::anchor() { } 42799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid UnknownSpaceRegion::anchor() { } 42899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StackLocalsSpaceRegion::anchor() { } 42999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid StackArgumentsSpaceRegion::anchor() { } 43099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TypedRegion::anchor() { } 43199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TypedValueRegion::anchor() { } 43299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CodeTextRegion::anchor() { } 43399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid SubRegion::anchor() { } 43499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 43599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 4369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// Region pretty-printing. 4379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 4389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4398800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenekvoid MemRegion::dump() const { 4408800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek dumpToStream(llvm::errs()); 4417f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek} 4427f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek 4439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekstd::string MemRegion::getString() const { 4449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string s; 4459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::raw_string_ostream os(s); 4468800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek dumpToStream(os); 4479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return os.str(); 4489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 4499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4509c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid MemRegion::dumpToStream(raw_ostream &os) const { 4519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek os << "<Unknown Region>"; 4529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 4539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4549c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid AllocaRegion::dumpToStream(raw_ostream &os) const { 45531ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky os << "alloca{" << (const void*) Ex << ',' << Cnt << '}'; 4567090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek} 4577090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 4589c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid FunctionTextRegion::dumpToStream(raw_ostream &os) const { 459abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenek os << "code{" << getDecl()->getDeclName().getAsString() << '}'; 46072e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek} 46172e032004b0d2c2c298e8e4f7027f23a21c0cc7dTed Kremenek 4629c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid BlockTextRegion::dumpToStream(raw_ostream &os) const { 46331ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky os << "block_code{" << (const void*) this << '}'; 464eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek} 465eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 4669c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid BlockDataRegion::dumpToStream(raw_ostream &os) const { 4670a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek os << "block_data{" << BC << '}'; 4680a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek} 4690a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 4709c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid CompoundLiteralRegion::dumpToStream(raw_ostream &os) const { 4715639a3ec15bdbf0b93376bbbae3adaf724f092a7Ted Kremenek // FIXME: More elaborate pretty-printing. 47231ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky os << "{ " << (const void*) CL << " }"; 4739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 4749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4755f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXTempObjectRegion::dumpToStream(raw_ostream &os) const { 476782f63ecd124f9384f988dc7e0cf4ae1540c15f6Jeffrey Yasskin os << "temp_object{" << getValueType().getAsString() << ',' 47731ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky << (const void*) Ex << '}'; 478e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu} 479e1aeb13251a4858724d2b7ad1925d25076f23d08Zhongxing Xu 4805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXBaseObjectRegion::dumpToStream(raw_ostream &os) const { 4814411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose os << "base{" << superRegion << ',' << getDecl()->getName() << '}'; 4824fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 4834fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 4845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CXXThisRegion::dumpToStream(raw_ostream &os) const { 485de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek os << "this"; 486de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 487de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 4889c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid ElementRegion::dumpToStream(raw_ostream &os) const { 48919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek os << "element{" << superRegion << ',' 49019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek << Index << ',' << getElementType().getAsString() << '}'; 491993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek} 492993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 4939c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid FieldRegion::dumpToStream(raw_ostream &os) const { 494b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer os << superRegion << "->" << *getDecl(); 4954bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek} 4964bd1eefd48c70ebef185e524d0484c00f16000cfTed Kremenek 4979c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid ObjCIvarRegion::dumpToStream(raw_ostream &os) const { 498b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer os << "ivar{" << superRegion << ',' << *getDecl() << '}'; 499bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek} 500bcfe03a0beb61082fa2f40887216d8dbca19a024Ted Kremenek 5019c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid StringRegion::dumpToStream(raw_ostream &os) const { 5024e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie Str->printPretty(os, 0, PrintingPolicy(getContext().getLangOpts())); 503b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu} 504b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 5054c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekvoid ObjCStringRegion::dumpToStream(raw_ostream &os) const { 5064e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie Str->printPretty(os, 0, PrintingPolicy(getContext().getLangOpts())); 5074c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek} 5084c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 5099c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid SymbolicRegion::dumpToStream(raw_ostream &os) const { 510aef5d2205a4425a4d3e1b0e28d46ed80763651dfTed Kremenek os << "SymRegion{" << sym << '}'; 511329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek} 512329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 5139c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid VarRegion::dumpToStream(raw_ostream &os) const { 514b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer os << *cast<VarDecl>(D); 515cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu} 516cc128b32429494fe04ed36d7ba30c011cb4e173aZhongxing Xu 51719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekvoid RegionRawOffset::dump() const { 51819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek dumpToStream(llvm::errs()); 51919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek} 52019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 5219c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid RegionRawOffset::dumpToStream(raw_ostream &os) const { 5229ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck os << "raw_offset{" << getRegion() << ',' << getOffset().getQuantity() << '}'; 52319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek} 52419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 5255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid StaticGlobalSpaceRegion::dumpToStream(raw_ostream &os) const { 526fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek os << "StaticGlobalsMemSpace{" << CR << '}'; 527fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek} 528fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek 529eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalInternalSpaceRegion::dumpToStream(raw_ostream &os) const { 530eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks os << "GlobalInternalSpaceRegion"; 531eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks} 532eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 533eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalSystemSpaceRegion::dumpToStream(raw_ostream &os) const { 534eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks os << "GlobalSystemSpaceRegion"; 535eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks} 536eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 537eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksvoid GlobalImmutableSpaceRegion::dumpToStream(raw_ostream &os) const { 538eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks os << "GlobalImmutableSpaceRegion"; 539eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks} 540eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 54136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid HeapSpaceRegion::dumpToStream(raw_ostream &os) const { 54236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose os << "HeapSpaceRegion"; 54336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose} 54436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 54536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid UnknownSpaceRegion::dumpToStream(raw_ostream &os) const { 54636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose os << "UnknownSpaceRegion"; 54736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose} 54836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 54936397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid StackArgumentsSpaceRegion::dumpToStream(raw_ostream &os) const { 55036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose os << "StackArgumentsSpaceRegion"; 55136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose} 55236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 55336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosevoid StackLocalsSpaceRegion::dumpToStream(raw_ostream &os) const { 55436397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose os << "StackLocalsSpaceRegion"; 55536397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose} 55636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 557919e8a1c6698bfa6848571d366430126bced727dJordan Rosebool MemRegion::canPrintPretty() const { 558919e8a1c6698bfa6848571d366430126bced727dJordan Rose return false; 559919e8a1c6698bfa6848571d366430126bced727dJordan Rose} 560919e8a1c6698bfa6848571d366430126bced727dJordan Rose 561919e8a1c6698bfa6848571d366430126bced727dJordan Rosevoid MemRegion::printPretty(raw_ostream &os) const { 5623d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks return; 5633d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks} 5643d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 565919e8a1c6698bfa6848571d366430126bced727dJordan Rosebool VarRegion::canPrintPretty() const { 566919e8a1c6698bfa6848571d366430126bced727dJordan Rose return true; 567919e8a1c6698bfa6848571d366430126bced727dJordan Rose} 568919e8a1c6698bfa6848571d366430126bced727dJordan Rose 569919e8a1c6698bfa6848571d366430126bced727dJordan Rosevoid VarRegion::printPretty(raw_ostream &os) const { 5703d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks os << getDecl()->getName(); 5713d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks} 5723d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 57343b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenekbool ObjCIvarRegion::canPrintPretty() const { 57443b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek return true; 57543b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek} 57643b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek 57743b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenekvoid ObjCIvarRegion::printPretty(raw_ostream &os) const { 57843b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek os << getDecl()->getName(); 57943b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek} 58043b82b823a6113fdbee54243b280db9c55ef72cbTed Kremenek 581919e8a1c6698bfa6848571d366430126bced727dJordan Rosebool FieldRegion::canPrintPretty() const { 582919e8a1c6698bfa6848571d366430126bced727dJordan Rose return superRegion->canPrintPretty(); 583919e8a1c6698bfa6848571d366430126bced727dJordan Rose} 584919e8a1c6698bfa6848571d366430126bced727dJordan Rose 585919e8a1c6698bfa6848571d366430126bced727dJordan Rosevoid FieldRegion::printPretty(raw_ostream &os) const { 586919e8a1c6698bfa6848571d366430126bced727dJordan Rose superRegion->printPretty(os); 587919e8a1c6698bfa6848571d366430126bced727dJordan Rose os << "." << getDecl()->getName(); 5883d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks} 5893d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 5909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 5919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager methods. 5929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 59319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 59467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG> 59567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region) { 5961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!region) { 59767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek region = (REG*) A.Allocate<REG>(); 59867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek new (region) REG(this); 5999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 600a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 6019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return region; 6029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 6039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 60467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenektemplate <typename REG, typename ARG> 60567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst REG *MemRegionManager::LazyAllocate(REG*& region, ARG a) { 60667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek if (!region) { 60767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek region = (REG*) A.Allocate<REG>(); 60867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek new (region) REG(this, a); 60967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 610dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 61167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return region; 61267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek} 61367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 61467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackLocalsSpaceRegion* 6152b87ae45e129b941d0a4d221c9d4842385a119bdTed KremenekMemRegionManager::getStackLocalsRegion(const StackFrameContext *STC) { 6162b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek assert(STC); 617c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackLocalsSpaceRegion *&R = StackLocalsSpaceRegions[STC]; 618c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu 619c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu if (R) 620c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu return R; 621c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu 622c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu R = A.Allocate<StackLocalsSpaceRegion>(); 623c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu new (R) StackLocalsSpaceRegion(this, STC); 624c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu return R; 6259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 6269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 62767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackArgumentsSpaceRegion * 62867d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getStackArgumentsRegion(const StackFrameContext *STC) { 6292b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek assert(STC); 630c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu StackArgumentsSpaceRegion *&R = StackArgumentsSpaceRegions[STC]; 631c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu 632c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu if (R) 633c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu return R; 634c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu 635c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu R = A.Allocate<StackArgumentsSpaceRegion>(); 636c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu new (R) StackArgumentsSpaceRegion(this, STC); 637c30470dd245e2c3b367d3d806e75bf6cc20fc18cZhongxing Xu return R; 638d05552a21377f493c882298c59e8829040b01d34Ted Kremenek} 639d05552a21377f493c882298c59e8829040b01d34Ted Kremenek 640dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst GlobalsSpaceRegion 641eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks*MemRegionManager::getGlobalsRegion(MemRegion::Kind K, 642eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const CodeTextRegion *CR) { 643eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks if (!CR) { 644eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks if (K == MemRegion::GlobalSystemSpaceRegionKind) 645eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return LazyAllocate(SystemGlobals); 646eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks if (K == MemRegion::GlobalImmutableSpaceRegionKind) 647eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return LazyAllocate(ImmutableGlobals); 648eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks assert(K == MemRegion::GlobalInternalSpaceRegionKind); 649eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks return LazyAllocate(InternalGlobals); 650eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 651dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 652eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks assert(K == MemRegion::StaticGlobalSpaceRegionKind); 653dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek StaticGlobalSpaceRegion *&R = StaticsGlobalSpaceRegions[CR]; 654dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek if (R) 655dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R; 656dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 657dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek R = A.Allocate<StaticGlobalSpaceRegion>(); 658dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek new (R) StaticGlobalSpaceRegion(this, CR); 659dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek return R; 6609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 6619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 66267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst HeapSpaceRegion *MemRegionManager::getHeapRegion() { 6639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return LazyAllocate(heap); 6649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 6659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 666b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getUnknownRegion() { 667178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu return LazyAllocate(unknown); 668178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu} 669178927517fa09ddbb04dc8ef725b5716c18aae21Zhongxing Xu 670b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst MemSpaceRegion *MemRegionManager::getCodeRegion() { 671ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu return LazyAllocate(code); 672ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu} 673ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 674250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 675250101353b711a409b075f1bc11070dddec7100bTed Kremenek// Constructing regions. 676250101353b711a409b075f1bc11070dddec7100bTed Kremenek//===----------------------------------------------------------------------===// 677dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenekconst StringRegion* MemRegionManager::getStringRegion(const StringLiteral* Str){ 67867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<StringRegion>(Str, getGlobalsRegion()); 679e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu} 680e9f4e5420895a75dd788e9891921e7781c1823b9Zhongxing Xu 6814c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekconst ObjCStringRegion * 6824c62b557e269a27515dfca1f754ae936c8fdb824Ted KremenekMemRegionManager::getObjCStringRegion(const ObjCStringLiteral* Str){ 6834c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek return getSubRegion<ObjCStringRegion>(Str, getGlobalsRegion()); 6844c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek} 6854c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek 6867fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// Look through a chain of LocationContexts to either find the 6877fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// StackFrameContext that matches a DeclContext, or find a VarRegion 6887fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek/// for a variable captured by a block. 6897fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenekstatic llvm::PointerUnion<const StackFrameContext *, const VarRegion *> 6907fa9b4f258636d89342eda28f21a986c8ac353b1Ted KremenekgetStackOrCaptureRegionForDeclContext(const LocationContext *LC, 6917fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const DeclContext *DC, 6927fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const VarDecl *VD) { 6937fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek while (LC) { 6947fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek if (const StackFrameContext *SFC = dyn_cast<StackFrameContext>(LC)) { 6957fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek if (cast<DeclContext>(SFC->getDecl()) == DC) 6967fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek return SFC; 6977fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek } 6987fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek if (const BlockInvocationContext *BC = 6997fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek dyn_cast<BlockInvocationContext>(LC)) { 7007fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const BlockDataRegion *BR = 7017fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek static_cast<const BlockDataRegion*>(BC->getContextData()); 7027fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek // FIXME: This can be made more efficient. 7037fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek for (BlockDataRegion::referenced_vars_iterator 7047fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek I = BR->referenced_vars_begin(), 7057fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek E = BR->referenced_vars_end(); I != E; ++I) { 7067fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek if (const VarRegion *VR = dyn_cast<VarRegion>(I.getOriginalRegion())) 7077fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek if (VR->getDecl() == VD) 7087fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek return cast<VarRegion>(I.getCapturedRegion()); 7097fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek } 7107fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek } 7117fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 7127fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek LC = LC->getParent(); 7137fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek } 7147fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek return (const StackFrameContext*)0; 7157fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek} 7167fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 717b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst VarRegion* MemRegionManager::getVarRegion(const VarDecl *D, 718b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const LocationContext *LC) { 71967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *sReg = 0; 7201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 721eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks if (D->hasGlobalStorage() && !D->isStaticLocal()) { 722eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 723eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks // First handle the globals defined in system headers. 724eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks if (C.getSourceManager().isInSystemHeader(D->getLocation())) { 725eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks // Whitelist the system globals which often DO GET modified, assume the 726eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks // rest are immutable. 727eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks if (D->getName().find("errno") != StringRef::npos) 728eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks sReg = getGlobalsRegion(MemRegion::GlobalSystemSpaceRegionKind); 729eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks else 730eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind); 731eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 732eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks // Treat other globals as GlobalInternal unless they are constants. 733eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } else { 734eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks QualType GQT = D->getType(); 735eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const Type *GT = GQT.getTypePtrOrNull(); 736eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks // TODO: We could walk the complex types here and see if everything is 737eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks // constified. 738eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks if (GT && GQT.isConstQualified() && GT->isArithmeticType()) 739eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind); 740eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks else 741eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks sReg = getGlobalsRegion(); 742eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } 743eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 744eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks // Finally handle static locals. 745eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } else { 74667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // FIXME: Once we implement scope handling, we will need to properly lookup 74767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek // 'D' to the proper LocationContext. 7482b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek const DeclContext *DC = D->getDeclContext(); 7497fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek llvm::PointerUnion<const StackFrameContext *, const VarRegion *> V = 7507fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek getStackOrCaptureRegionForDeclContext(LC, DC, D); 7517fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 7527fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek if (V.is<const VarRegion*>()) 7537fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek return V.get<const VarRegion*>(); 7547fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 7557fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const StackFrameContext *STC = V.get<const StackFrameContext*>(); 7562b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 7572b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek if (!STC) 7582b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek sReg = getUnknownRegion(); 7592b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek else { 760dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek if (D->hasLocalStorage()) { 761dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek sReg = isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D) 762dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek ? static_cast<const MemRegion*>(getStackArgumentsRegion(STC)) 763dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek : static_cast<const MemRegion*>(getStackLocalsRegion(STC)); 764dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 765dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek else { 766dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek assert(D->isStaticLocal()); 7675fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks const Decl *STCD = STC->getDecl(); 7685fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks if (isa<FunctionDecl>(STCD) || isa<ObjCMethodDecl>(STCD)) 769eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks sReg = getGlobalsRegion(MemRegion::StaticGlobalSpaceRegionKind, 7705fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks getFunctionTextRegion(cast<NamedDecl>(STCD))); 7715fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks else if (const BlockDecl *BD = dyn_cast<BlockDecl>(STCD)) { 772dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const BlockTextRegion *BTR = 773dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek getBlockTextRegion(BD, 774dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek C.getCanonicalType(BD->getSignatureAsWritten()->getType()), 7751d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek STC->getAnalysisDeclContext()); 776eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks sReg = getGlobalsRegion(MemRegion::StaticGlobalSpaceRegionKind, 777eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks BTR); 778dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 779dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek else { 780dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek sReg = getGlobalsRegion(); 781dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 782dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } 7832b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek } 78467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 785dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 78667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<VarRegion>(D, sReg); 78767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek} 7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 78967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst VarRegion *MemRegionManager::getVarRegion(const VarDecl *D, 79067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *superR) { 79167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<VarRegion>(D, superR); 7929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 7939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 794b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockDataRegion * 795b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted KremenekMemRegionManager::getBlockDataRegion(const BlockTextRegion *BC, 796b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const LocationContext *LC) { 79767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *sReg = 0; 79899c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek const BlockDecl *BD = BC->getDecl(); 79999c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek if (!BD->hasCaptures()) { 80099c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek // This handles 'static' blocks. 80199c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind); 80267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 80367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek else { 80499c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek if (LC) { 80599c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek // FIXME: Once we implement scope handling, we want the parent region 80699c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek // to be the scope. 80799c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek const StackFrameContext *STC = LC->getCurrentStackFrame(); 80899c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek assert(STC); 80999c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek sReg = getStackLocalsRegion(STC); 81099c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek } 81199c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek else { 81299c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek // We allow 'LC' to be NULL for cases where want BlockDataRegions 81399c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek // without context-sensitivity. 81499c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek sReg = getUnknownRegion(); 81599c06be61f13c6bfe41586b59f5747d644f1b2acTed Kremenek } 81667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 81767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 81867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<BlockDataRegion>(BC, LC, sReg); 8190a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek} 8200a8112a78d00b5140c5b7f16c3b34c2c0c13c1a0Ted Kremenek 821b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst CompoundLiteralRegion* 8229c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getCompoundLiteralRegion(const CompoundLiteralExpr *CL, 82367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC) { 824dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 82567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemRegion *sReg = 0; 826dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 82767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek if (CL->isFileScope()) 82867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek sReg = getGlobalsRegion(); 82967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek else { 83067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *STC = LC->getCurrentStackFrame(); 83167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(STC); 83267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek sReg = getStackLocalsRegion(STC); 83367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 834dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 83567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<CompoundLiteralRegion>(CL, sReg); 836329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek} 837329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek 838b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ElementRegion* 83902282acd7a42d06a3178e3102d34a585bd82dd9fTed KremenekMemRegionManager::getElementRegion(QualType elementType, NonLoc Idx, 840465373946b5ae84f7c3d890cc25cb23fd88dd650Ted Kremenek const MemRegion* superRegion, 8419c378f705405d37f49795d5e915989de774fe11fTed Kremenek ASTContext &Ctx){ 842143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu 84332f901092daa4a53c7e012408c1f59d73ba29ff5Ted Kremenek QualType T = Ctx.getCanonicalType(elementType).getUnqualifiedType(); 844abb042f33ea8e6107a7dc8efc51d2ace329f9f48Ted Kremenek 845511191ce8920160525611be2be754c32a0724c3eZhongxing Xu llvm::FoldingSetNodeID ID; 846143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu ElementRegion::ProfileRegion(ID, T, Idx, superRegion); 847511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 8489c378f705405d37f49795d5e915989de774fe11fTed Kremenek void *InsertPos; 849511191ce8920160525611be2be754c32a0724c3eZhongxing Xu MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos); 850511191ce8920160525611be2be754c32a0724c3eZhongxing Xu ElementRegion* R = cast_or_null<ElementRegion>(data); 851511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 852511191ce8920160525611be2be754c32a0724c3eZhongxing Xu if (!R) { 853511191ce8920160525611be2be754c32a0724c3eZhongxing Xu R = (ElementRegion*) A.Allocate<ElementRegion>(); 854143b2fc6fd3945c250b333383749010c2c8e3a4cZhongxing Xu new (R) ElementRegion(T, Idx, superRegion); 855511191ce8920160525611be2be754c32a0724c3eZhongxing Xu Regions.InsertNode(R, InsertPos); 856511191ce8920160525611be2be754c32a0724c3eZhongxing Xu } 857511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 858511191ce8920160525611be2be754c32a0724c3eZhongxing Xu return R; 859511191ce8920160525611be2be754c32a0724c3eZhongxing Xu} 860511191ce8920160525611be2be754c32a0724c3eZhongxing Xu 861b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst FunctionTextRegion * 8625fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna ZaksMemRegionManager::getFunctionTextRegion(const NamedDecl *FD) { 86367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<FunctionTextRegion>(FD, getCodeRegion()); 864ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu} 865ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu 866b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst BlockTextRegion * 86767d1287035767f4f6c8ca0c2bb755990012a44caTed KremenekMemRegionManager::getBlockTextRegion(const BlockDecl *BD, CanQualType locTy, 8681d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC) { 86967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<BlockTextRegion>(BD, locTy, AC, getCodeRegion()); 870eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek} 871eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 872eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 873993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek/// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 874b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst SymbolicRegion *MemRegionManager::getSymbolicRegion(SymbolRef sym) { 87567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<SymbolicRegion>(sym, getUnknownRegion()); 876993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek} 877993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 878e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaksconst SymbolicRegion *MemRegionManager::getSymbolicHeapRegion(SymbolRef Sym) { 879e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks return getSubRegion<SymbolicRegion>(Sym, getHeapRegion()); 880e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks} 881e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks 882de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst FieldRegion* 8839c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getFieldRegion(const FieldDecl *d, 884b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenek const MemRegion* superRegion){ 885eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek return getSubRegion<FieldRegion>(d, superRegion); 8869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 8879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 888b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst ObjCIvarRegion* 8899c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getObjCIvarRegion(const ObjCIvarDecl *d, 890993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const MemRegion* superRegion) { 891eeea45611d45238c34474c183cee96d47ae79e24Ted Kremenek return getSubRegion<ObjCIvarRegion>(d, superRegion); 892a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek} 893a7f1b9e8804012ed8df25d93f5a06cb26c9bbd2bTed Kremenek 89402fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xuconst CXXTempObjectRegion* 89502fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing XuMemRegionManager::getCXXTempObjectRegion(Expr const *E, 89602fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu LocationContext const *LC) { 897bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu const StackFrameContext *SFC = LC->getCurrentStackFrame(); 898bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu assert(SFC); 89902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu return getSubRegion<CXXTempObjectRegion>(E, getStackLocalsRegion(SFC)); 900bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu} 901bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu 9024411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose/// Checks whether \p BaseClass is a valid virtual or direct non-virtual base 9034411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose/// class of the type of \p Super. 9044411b423e91da0a2c879b70c0222aeba35f72044Jordan Rosestatic bool isValidBaseClass(const CXXRecordDecl *BaseClass, 9054411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const TypedValueRegion *Super, 9064411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose bool IsVirtual) { 907ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose BaseClass = BaseClass->getCanonicalDecl(); 908ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose 9094411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const CXXRecordDecl *Class = Super->getValueType()->getAsCXXRecordDecl(); 9104411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose if (!Class) 9114411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose return true; 9124411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose 9134411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose if (IsVirtual) 9144411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose return Class->isVirtuallyDerivedFrom(BaseClass); 9154411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose 9164411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose for (CXXRecordDecl::base_class_const_iterator I = Class->bases_begin(), 9174411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose E = Class->bases_end(); 9184411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose I != E; ++I) { 9194411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose if (I->getType()->getAsCXXRecordDecl()->getCanonicalDecl() == BaseClass) 9204411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose return true; 9214411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose } 922b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose 9234411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose return false; 9244411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose} 9254411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose 9264411b423e91da0a2c879b70c0222aeba35f72044Jordan Roseconst CXXBaseObjectRegion * 9274411b423e91da0a2c879b70c0222aeba35f72044Jordan RoseMemRegionManager::getCXXBaseObjectRegion(const CXXRecordDecl *RD, 9284411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const MemRegion *Super, 9294411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose bool IsVirtual) { 9306d35b412fc0289681f320acc389f7a83066ec9e2NAKAMURA Takumi if (isa<TypedValueRegion>(Super)) { 9316d35b412fc0289681f320acc389f7a83066ec9e2NAKAMURA Takumi assert(isValidBaseClass(RD, dyn_cast<TypedValueRegion>(Super), IsVirtual)); 9326d35b412fc0289681f320acc389f7a83066ec9e2NAKAMURA Takumi (void)isValidBaseClass; 9334411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose 9344411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose if (IsVirtual) { 9354411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose // Virtual base regions should not be layered, since the layout rules 9364411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose // are different. 9374411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose while (const CXXBaseObjectRegion *Base = 9384411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose dyn_cast<CXXBaseObjectRegion>(Super)) { 9394411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose Super = Base->getSuperRegion(); 940b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose } 9414411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose assert(Super && !isa<MemSpaceRegion>(Super)); 942b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose } 943b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose } 944b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose 9454411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose return getSubRegion<CXXBaseObjectRegion>(RD, IsVirtual, Super); 9464fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu} 9474fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 948de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekconst CXXThisRegion* 949de0d26310191215a6d1d189dc419f87af18ce6beTed KremenekMemRegionManager::getCXXThisRegion(QualType thisPointerTy, 950de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const LocationContext *LC) { 951de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const StackFrameContext *STC = LC->getCurrentStackFrame(); 952de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek assert(STC); 953de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek const PointerType *PT = thisPointerTy->getAs<PointerType>(); 954de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek assert(PT); 955de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return getSubRegion<CXXThisRegion>(PT, getStackArgumentsRegion(STC)); 956de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 957de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 958b48ad64a0e9e8d6488adebe597b6af32c1eb84f4Ted Kremenekconst AllocaRegion* 9599c378f705405d37f49795d5e915989de774fe11fTed KremenekMemRegionManager::getAllocaRegion(const Expr *E, unsigned cnt, 96067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC) { 96167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const StackFrameContext *STC = LC->getCurrentStackFrame(); 96267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(STC); 96367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return getSubRegion<AllocaRegion>(E, cnt, getStackLocalsRegion(STC)); 9647090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek} 9657090ae1a984eb446a5fb4da7b1f2573830653799Ted Kremenek 966bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekconst MemSpaceRegion *MemRegion::getMemorySpace() const { 967bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const MemRegion *R = this; 968bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek const SubRegion* SR = dyn_cast<SubRegion>(this); 9691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 970993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek while (SR) { 971bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek R = SR->getSuperRegion(); 972bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek SR = dyn_cast<SubRegion>(R); 9739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 9741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 975bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek return dyn_cast<MemSpaceRegion>(R); 9769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 9771670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek 978bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenekbool MemRegion::hasStackStorage() const { 97967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return isa<StackSpaceRegion>(getMemorySpace()); 980bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek} 981dd198f04897df87c52fef66398035cbf67fdc33dZhongxing Xu 982de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackNonParametersStorage() const { 983de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return isa<StackLocalsSpaceRegion>(getMemorySpace()); 9841508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek} 9851508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek 986de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekbool MemRegion::hasStackParametersStorage() const { 98767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return isa<StackArgumentsSpaceRegion>(getMemorySpace()); 988dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek} 989dc147262b1ea0636cf8e7152f19303042dffdbedTed Kremenek 9901508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenekbool MemRegion::hasGlobalsOrParametersStorage() const { 99167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const MemSpaceRegion *MS = getMemorySpace(); 99267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return isa<StackArgumentsSpaceRegion>(MS) || 99367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek isa<GlobalsSpaceRegion>(MS); 9941508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek} 9951670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek 996adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// getBaseRegion strips away all elements and fields, and get the base region 997adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu// of them. 998adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xuconst MemRegion *MemRegion::getBaseRegion() const { 999adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu const MemRegion *R = this; 1000adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu while (true) { 100168b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek switch (R->getKind()) { 100268b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek case MemRegion::ElementRegionKind: 100368b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek case MemRegion::FieldRegionKind: 100468b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek case MemRegion::ObjCIvarRegionKind: 1005e17da65c5773e0285b22e33d1431b13fbcd8942cZhongxing Xu case MemRegion::CXXBaseObjectRegionKind: 100668b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek R = cast<SubRegion>(R)->getSuperRegion(); 100768b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek continue; 100868b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek default: 100968b9a599dda7c422a417dfdc330adb5a880eb0e5Ted Kremenek break; 1010adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu } 1011adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu break; 1012adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu } 1013adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu return R; 1014adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu} 1015adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu 10165f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaksbool MemRegion::isSubRegionOf(const MemRegion *R) const { 1017522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks return false; 1018522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks} 1019522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks 10201670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===// 10211670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek// View handling. 10221670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek//===----------------------------------------------------------------------===// 10231670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek 1024b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Roseconst MemRegion *MemRegion::StripCasts(bool StripBaseCasts) const { 10250e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek const MemRegion *R = this; 10260e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek while (true) { 1027c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose switch (R->getKind()) { 1028c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose case ElementRegionKind: { 1029c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose const ElementRegion *ER = cast<ElementRegion>(R); 1030c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose if (!ER->getIndex().isZeroConstant()) 1031c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose return R; 1032c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose R = ER->getSuperRegion(); 1033c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose break; 1034c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose } 1035c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose case CXXBaseObjectRegionKind: 1036b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose if (!StripBaseCasts) 1037b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose return R; 1038c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose R = cast<CXXBaseObjectRegion>(R)->getSuperRegion(); 1039c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose break; 1040c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose default: 1041c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose return R; 10420e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek } 10430e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek } 10440e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek} 104519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 104619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek// FIXME: Merge with the implementation of the same method in Store.cpp 104719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenekstatic bool IsCompleteType(ASTContext &Ctx, QualType Ty) { 104819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek if (const RecordType *RT = Ty->getAs<RecordType>()) { 104919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek const RecordDecl *D = RT->getDecl(); 1050952b017601f9c82b51119c3a1600f1312a833db9Douglas Gregor if (!D->getDefinition()) 105119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek return false; 105219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 105319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 105419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek return true; 105519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek} 105619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 10577caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing XuRegionRawOffset ElementRegion::getAsArrayOffset() const { 1058199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits offset = CharUnits::Zero(); 105919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek const ElementRegion *ER = this; 106019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek const MemRegion *superR = NULL; 106119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek ASTContext &C = getContext(); 10621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 106319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // FIXME: Handle multi-dimensional arrays. 106419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 106519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek while (ER) { 106619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek superR = ER->getSuperRegion(); 10671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 106819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // FIXME: generalize to symbolic offsets. 106919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek SVal index = ER->getIndex(); 1070dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<nonloc::ConcreteInt> CI = index.getAs<nonloc::ConcreteInt>()) { 107119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // Update the offset. 107219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek int64_t i = CI->getValue().getSExtValue(); 10731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 107419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek if (i != 0) { 107519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek QualType elemType = ER->getElementType(); 10761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 107719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // If we are pointing to an incomplete type, go no further. 107819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek if (!IsCompleteType(C, elemType)) { 107919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek superR = ER; 108019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek break; 108119e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 10821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1083199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits size = C.getTypeSizeInChars(elemType); 108419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek offset += (i * size); 108519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 108619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 108719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek // Go to the next ElementRegion (if any). 108819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek ER = dyn_cast<ElementRegion>(superR); 108919e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek continue; 109019e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 10911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 109219e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek return NULL; 109319e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek } 10941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 109519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek assert(superR && "super region cannot be NULL"); 10969ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck return RegionRawOffset(superR, offset); 109719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek} 109819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek 10996dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose 11006dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose/// Returns true if \p Base is an immediate base class of \p Child 11016dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rosestatic bool isImmediateBase(const CXXRecordDecl *Child, 11026dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose const CXXRecordDecl *Base) { 11036dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose // Note that we do NOT canonicalize the base class here, because 11046dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose // ASTRecordLayout doesn't either. If that leads us down the wrong path, 11056dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose // so be it; at least we won't crash. 11066dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose for (CXXRecordDecl::base_class_const_iterator I = Child->bases_begin(), 11076dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose E = Child->bases_end(); 11086dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose I != E; ++I) { 11096dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose if (I->getType()->getAsCXXRecordDecl() == Base) 11106dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose return true; 11116dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose } 11126dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose 11136dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose return false; 11146dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose} 11156dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose 1116e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing XuRegionOffset MemRegion::getAsOffset() const { 1117e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const MemRegion *R = this; 1118824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose const MemRegion *SymbolicOffsetBase = 0; 1119e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu int64_t Offset = 0; 1120e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 1121e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu while (1) { 1122e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu switch (R->getKind()) { 11239d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case GenericMemSpaceRegionKind: 11249d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case StackLocalsSpaceRegionKind: 11259d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case StackArgumentsSpaceRegionKind: 11269d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case HeapSpaceRegionKind: 11279d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case UnknownSpaceRegionKind: 11289d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case StaticGlobalSpaceRegionKind: 11299d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case GlobalInternalSpaceRegionKind: 11309d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case GlobalSystemSpaceRegionKind: 11319d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case GlobalImmutableSpaceRegionKind: 11329d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose // Stores can bind directly to a region space to set a default value. 11339d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose assert(Offset == 0 && !SymbolicOffsetBase); 11349d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose goto Finish; 11359d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose 11369d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case FunctionTextRegionKind: 11379d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case BlockTextRegionKind: 11389d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case BlockDataRegionKind: 11399d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose // These will never have bindings, but may end up having values requested 11409d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose // if the user does some strange casting. 11419d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose if (Offset != 0) 11429d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose SymbolicOffsetBase = R; 11439d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose goto Finish; 1144824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 1145e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case SymbolicRegionKind: 1146e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case AllocaRegionKind: 1147e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case CompoundLiteralRegionKind: 1148e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case CXXThisRegionKind: 1149e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case StringRegionKind: 11509d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose case ObjCStringRegionKind: 1151e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case VarRegionKind: 115202fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu case CXXTempObjectRegionKind: 11539d688e219caa37e60975ec8d5bebe74a176c9c2bJordan Rose // Usual base regions. 1154e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu goto Finish; 1155824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 11561e934431adba0f459668a59c6059b9596fd627b4Jordan Rose case ObjCIvarRegionKind: 11571e934431adba0f459668a59c6059b9596fd627b4Jordan Rose // This is a little strange, but it's a compromise between 11581e934431adba0f459668a59c6059b9596fd627b4Jordan Rose // ObjCIvarRegions having unknown compile-time offsets (when using the 11591e934431adba0f459668a59c6059b9596fd627b4Jordan Rose // non-fragile runtime) and yet still being distinct, non-overlapping 11601e934431adba0f459668a59c6059b9596fd627b4Jordan Rose // regions. Thus we treat them as "like" base regions for the purposes 11611e934431adba0f459668a59c6059b9596fd627b4Jordan Rose // of computing offsets. 11621e934431adba0f459668a59c6059b9596fd627b4Jordan Rose goto Finish; 11631e934431adba0f459668a59c6059b9596fd627b4Jordan Rose 1164e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose case CXXBaseObjectRegionKind: { 1165e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose const CXXBaseObjectRegion *BOR = cast<CXXBaseObjectRegion>(R); 1166e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose R = BOR->getSuperRegion(); 1167e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 1168e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose QualType Ty; 11696dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose bool RootIsSymbolic = false; 1170e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose if (const TypedValueRegion *TVR = dyn_cast<TypedValueRegion>(R)) { 1171e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose Ty = TVR->getDesugaredValueType(getContext()); 1172e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose } else if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(R)) { 1173e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose // If our base region is symbolic, we don't know what type it really is. 1174e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose // Pretend the type of the symbol is the true dynamic type. 1175e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose // (This will at least be self-consistent for the life of the symbol.) 1176732cdf383f9030ff2b9fb28dfbdae2285ded80c6Ted Kremenek Ty = SR->getSymbol()->getType()->getPointeeType(); 11776dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose RootIsSymbolic = true; 1178e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose } 1179e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 1180e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose const CXXRecordDecl *Child = Ty->getAsCXXRecordDecl(); 11819f6441ad92c30028032eb3df6f4a7f2ebe393a68Jordan Rose if (!Child) { 1182e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose // We cannot compute the offset of the base class. 1183824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose SymbolicOffsetBase = R; 1184e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose } 1185824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 11866dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose if (RootIsSymbolic) { 11876dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose // Base layers on symbolic regions may not be type-correct. 11886dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose // Double-check the inheritance here, and revert to a symbolic offset 11896dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose // if it's invalid (e.g. due to a reinterpret_cast). 11906dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose if (BOR->isVirtual()) { 11916dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose if (!Child->isVirtuallyDerivedFrom(BOR->getDecl())) 11926dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose SymbolicOffsetBase = R; 11936dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose } else { 11946dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose if (!isImmediateBase(Child, BOR->getDecl())) 11956dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose SymbolicOffsetBase = R; 11966dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose } 11976dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose } 11986dc5c33fd4334ccf4a661c331f86e23829e51d55Jordan Rose 1199824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose // Don't bother calculating precise offsets if we already have a 1200824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose // symbolic offset somewhere in the chain. 1201824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose if (SymbolicOffsetBase) 1202824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose continue; 1203824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 1204e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose CharUnits BaseOffset; 12054411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose const ASTRecordLayout &Layout = getContext().getASTRecordLayout(Child); 12064411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose if (BOR->isVirtual()) 12074411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose BaseOffset = Layout.getVBaseClassOffset(BOR->getDecl()); 1208e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose else 12094411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose BaseOffset = Layout.getBaseClassOffset(BOR->getDecl()); 1210e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 1211e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose // The base offset is in chars, not in bits. 1212e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose Offset += BaseOffset.getQuantity() * getContext().getCharWidth(); 1213e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose break; 1214e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose } 1215e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case ElementRegionKind: { 1216e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const ElementRegion *ER = cast<ElementRegion>(R); 1217824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose R = ER->getSuperRegion(); 1218e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 1219824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose QualType EleTy = ER->getValueType(); 1220824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose if (!IsCompleteType(getContext(), EleTy)) { 1221824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose // We cannot compute the offset of the base class. 1222824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose SymbolicOffsetBase = R; 1223824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose continue; 1224824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose } 1225e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 1226e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu SVal Index = ER->getIndex(); 1227dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<nonloc::ConcreteInt> CI = 12285251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie Index.getAs<nonloc::ConcreteInt>()) { 1229824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose // Don't bother calculating precise offsets if we already have a 1230824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose // symbolic offset somewhere in the chain. 1231824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose if (SymbolicOffsetBase) 1232824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose continue; 1233824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 1234e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu int64_t i = CI->getValue().getSExtValue(); 1235e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose // This type size is in bits. 1236e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose Offset += i * getContext().getTypeSize(EleTy); 1237e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } else { 1238e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu // We cannot compute offset for non-concrete index. 1239824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose SymbolicOffsetBase = R; 1240e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 12417caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu break; 1242e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 1243e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu case FieldRegionKind: { 1244e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const FieldRegion *FR = cast<FieldRegion>(R); 1245824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose R = FR->getSuperRegion(); 1246824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 1247e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const RecordDecl *RD = FR->getDecl()->getParent(); 1248786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose if (RD->isUnion() || !RD->isCompleteDefinition()) { 1249e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu // We cannot compute offset for incomplete type. 1250786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose // For unions, we could treat everything as offset 0, but we'd rather 1251786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose // treat each field as a symbolic offset so they aren't stored on top 1252786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose // of each other, since we depend on things in typed regions actually 1253786e6204e55cc01094a3e86104c82932a65fb2caJordan Rose // matching their types. 1254824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose SymbolicOffsetBase = R; 1255824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose } 1256824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 1257824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose // Don't bother calculating precise offsets if we already have a 1258824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose // symbolic offset somewhere in the chain. 1259824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose if (SymbolicOffsetBase) 1260824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose continue; 1261824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 1262e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu // Get the field number. 1263e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu unsigned idx = 0; 1264e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu for (RecordDecl::field_iterator FI = RD->field_begin(), 1265e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu FE = RD->field_end(); FI != FE; ++FI, ++idx) 1266581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (FR->getDecl() == *FI) 1267e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu break; 12687caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 1269e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD); 1270e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu // This is offset in bits. 1271e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu Offset += Layout.getFieldOffset(idx); 1272e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu break; 1273e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 1274e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 1275e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu } 12767caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 1277e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu Finish: 1278824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose if (SymbolicOffsetBase) 1279824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose return RegionOffset(SymbolicOffsetBase, RegionOffset::Symbolic); 1280e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu return RegionOffset(R, Offset); 12817caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu} 12827caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xu 12834240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===// 12844240096011a187807058f887eb81df750ffa17feTed Kremenek// BlockDataRegion 12854240096011a187807058f887eb81df750ffa17feTed Kremenek//===----------------------------------------------------------------------===// 12864240096011a187807058f887eb81df750ffa17feTed Kremenek 128724570c4c258545f8310e4bc96503a5668982cf67Ted Kremenekstd::pair<const VarRegion *, const VarRegion *> 128824570c4c258545f8310e4bc96503a5668982cf67Ted KremenekBlockDataRegion::getCaptureRegions(const VarDecl *VD) { 128924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek MemRegionManager &MemMgr = *getMemRegionManager(); 129024570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek const VarRegion *VR = 0; 129124570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek const VarRegion *OriginalVR = 0; 129224570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek 129324570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek if (!VD->getAttr<BlocksAttr>() && VD->hasLocalStorage()) { 129424570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek VR = MemMgr.getVarRegion(VD, this); 129524570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek OriginalVR = MemMgr.getVarRegion(VD, LC); 129624570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek } 129724570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek else { 129824570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek if (LC) { 129924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek VR = MemMgr.getVarRegion(VD, LC); 130024570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek OriginalVR = VR; 130124570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek } 130224570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek else { 130324570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek VR = MemMgr.getVarRegion(VD, MemMgr.getUnknownRegion()); 130424570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek OriginalVR = MemMgr.getVarRegion(VD, LC); 130524570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek } 130624570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek } 130724570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek return std::make_pair(VR, OriginalVR); 130824570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek} 130924570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek 13104240096011a187807058f887eb81df750ffa17feTed Kremenekvoid BlockDataRegion::LazyInitializeReferencedVars() { 13114240096011a187807058f887eb81df750ffa17feTed Kremenek if (ReferencedVars) 13124240096011a187807058f887eb81df750ffa17feTed Kremenek return; 13134240096011a187807058f887eb81df750ffa17feTed Kremenek 13141d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *AC = getCodeRegion()->getAnalysisDeclContext(); 13151d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext::referenced_decls_iterator I, E; 13164240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::tie(I, E) = AC->getReferencedBlockVars(BC->getDecl()); 1317dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 13184240096011a187807058f887eb81df750ffa17feTed Kremenek if (I == E) { 13194240096011a187807058f887eb81df750ffa17feTed Kremenek ReferencedVars = (void*) 0x1; 13204240096011a187807058f887eb81df750ffa17feTed Kremenek return; 13214240096011a187807058f887eb81df750ffa17feTed Kremenek } 1322dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 13234240096011a187807058f887eb81df750ffa17feTed Kremenek MemRegionManager &MemMgr = *getMemRegionManager(); 13244240096011a187807058f887eb81df750ffa17feTed Kremenek llvm::BumpPtrAllocator &A = MemMgr.getAllocator(); 13254240096011a187807058f887eb81df750ffa17feTed Kremenek BumpVectorContext BC(A); 1326dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 13274240096011a187807058f887eb81df750ffa17feTed Kremenek typedef BumpVector<const MemRegion*> VarVec; 13284240096011a187807058f887eb81df750ffa17feTed Kremenek VarVec *BV = (VarVec*) A.Allocate<VarVec>(); 132902b1df62ff6fa9526619ee0db78e2af4186e490dTed Kremenek new (BV) VarVec(BC, E - I); 133085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek VarVec *BVOriginal = (VarVec*) A.Allocate<VarVec>(); 133185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek new (BVOriginal) VarVec(BC, E - I); 1332dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 133367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek for ( ; I != E; ++I) { 133467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const VarRegion *VR = 0; 133585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek const VarRegion *OriginalVR = 0; 133624570c4c258545f8310e4bc96503a5668982cf67Ted Kremenek llvm::tie(VR, OriginalVR) = getCaptureRegions(*I); 133767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek assert(VR); 133885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek assert(OriginalVR); 133967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek BV->push_back(VR, BC); 134085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek BVOriginal->push_back(OriginalVR, BC); 134167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 1342dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 13434240096011a187807058f887eb81df750ffa17feTed Kremenek ReferencedVars = BV; 134485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek OriginalVars = BVOriginal; 13454240096011a187807058f887eb81df750ffa17feTed Kremenek} 13464240096011a187807058f887eb81df750ffa17feTed Kremenek 13474240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator 13484240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_begin() const { 13494240096011a187807058f887eb81df750ffa17feTed Kremenek const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars(); 13504240096011a187807058f887eb81df750ffa17feTed Kremenek 13514240096011a187807058f887eb81df750ffa17feTed Kremenek BumpVector<const MemRegion*> *Vec = 13524240096011a187807058f887eb81df750ffa17feTed Kremenek static_cast<BumpVector<const MemRegion*>*>(ReferencedVars); 1353dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 135485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek if (Vec == (void*) 0x1) 135585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek return BlockDataRegion::referenced_vars_iterator(0, 0); 135685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 135785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek BumpVector<const MemRegion*> *VecOriginal = 135885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek static_cast<BumpVector<const MemRegion*>*>(OriginalVars); 135985d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 136085d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek return BlockDataRegion::referenced_vars_iterator(Vec->begin(), 136185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek VecOriginal->begin()); 13624240096011a187807058f887eb81df750ffa17feTed Kremenek} 13634240096011a187807058f887eb81df750ffa17feTed Kremenek 13644240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_iterator 13654240096011a187807058f887eb81df750ffa17feTed KremenekBlockDataRegion::referenced_vars_end() const { 13664240096011a187807058f887eb81df750ffa17feTed Kremenek const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars(); 13674240096011a187807058f887eb81df750ffa17feTed Kremenek 13684240096011a187807058f887eb81df750ffa17feTed Kremenek BumpVector<const MemRegion*> *Vec = 13694240096011a187807058f887eb81df750ffa17feTed Kremenek static_cast<BumpVector<const MemRegion*>*>(ReferencedVars); 1370dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 137185d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek if (Vec == (void*) 0x1) 137285d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek return BlockDataRegion::referenced_vars_iterator(0, 0); 137385d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 137485d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek BumpVector<const MemRegion*> *VecOriginal = 137585d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek static_cast<BumpVector<const MemRegion*>*>(OriginalVars); 137685d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek 137785d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek return BlockDataRegion::referenced_vars_iterator(Vec->end(), 137885d87df66a50a15a1957f7213802000b451a8ec9Ted Kremenek VecOriginal->end()); 13794240096011a187807058f887eb81df750ffa17feTed Kremenek} 13805846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek 13815846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenekconst VarRegion *BlockDataRegion::getOriginalRegion(const VarRegion *R) const { 13825846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek for (referenced_vars_iterator I = referenced_vars_begin(), 13835846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek E = referenced_vars_end(); 13845846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek I != E; ++I) { 13855846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek if (I.getCapturedRegion() == R) 13865846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek return I.getOriginalRegion(); 13875846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek } 13885846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek return 0; 13895846720f08a6b225484bfe663599c2b057a99bc8Ted Kremenek} 1390