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