MemRegion.cpp revision da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//== MemRegion.cpp - Abstract memory regions for static analysis --*- C++ -*--// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file defines MemRegion and its subclasses. MemRegion defines a 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// partially-typed abstraction of memory useful for path-sensitive dataflow 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// analyses. 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "clang/AST/Attr.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "clang/AST/CharUnits.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "clang/AST/DeclObjC.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "clang/AST/RecordLayout.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Analysis/AnalysisContext.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Analysis/Support/BumpVector.h" 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "clang/Basic/SourceManager.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/raw_ostream.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using namespace clang; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace ento; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MemRegion Construction. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)template<typename RegionTy> struct MemRegionManagerTrait; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <typename RegionTy, typename A1> 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RegionTy* MemRegionManager::getRegion(const A1 a1) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion = 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::FoldingSetNodeID ID; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegionTy::ProfileRegion(ID, a1, superRegion); 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void *InsertPos; 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InsertPos)); 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!R) { 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) R = (RegionTy*) A.Allocate<RegionTy>(); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new (R) RegionTy(a1, superRegion); 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Regions.InsertNode(R, InsertPos); 528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return R; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename RegionTy, typename A1> 58558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochRegionTy* MemRegionManager::getSubRegion(const A1 a1, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion *superRegion) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::FoldingSetNodeID ID; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegionTy::ProfileRegion(ID, a1, superRegion); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *InsertPos; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InsertPos)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!R) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R = (RegionTy*) A.Allocate<RegionTy>(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new (R) RegionTy(a1, superRegion); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Regions.InsertNode(R, InsertPos); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return R; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename RegionTy, typename A1, typename A2> 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RegionTy* MemRegionManager::getRegion(const A1 a1, const A2 a2) { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const typename MemRegionManagerTrait<RegionTy>::SuperRegionTy *superRegion = 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MemRegionManagerTrait<RegionTy>::getSuperRegion(*this, a1, a2); 802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::FoldingSetNodeID ID; 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) RegionTy::ProfileRegion(ID, a1, a2, superRegion); 83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void *InsertPos; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InsertPos)); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!R) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R = (RegionTy*) A.Allocate<RegionTy>(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new (R) RegionTy(a1, a2, superRegion); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Regions.InsertNode(R, InsertPos); 918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return R; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)template <typename RegionTy, typename A1, typename A2> 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2, 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const MemRegion *superRegion) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::FoldingSetNodeID ID; 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RegionTy::ProfileRegion(ID, a1, a2, superRegion); 102a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void *InsertPos; 1030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InsertPos)); 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!R) { 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) R = (RegionTy*) A.Allocate<RegionTy>(); 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new (R) RegionTy(a1, a2, superRegion); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Regions.InsertNode(R, InsertPos); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return R; 113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename RegionTy, typename A1, typename A2, typename A3> 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2, const A3 a3, 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const MemRegion *superRegion) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::FoldingSetNodeID ID; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegionTy::ProfileRegion(ID, a1, a2, a3, superRegion); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *InsertPos; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegionTy* R = cast_or_null<RegionTy>(Regions.FindNodeOrInsertPos(ID, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertPos)); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!R) { 12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) R = (RegionTy*) A.Allocate<RegionTy>(); 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new (R) RegionTy(a1, a2, a3, superRegion); 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Regions.InsertNode(R, InsertPos); 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return R; 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Object destruction. 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//===----------------------------------------------------------------------===// 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)MemRegion::~MemRegion() {} 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)MemRegionManager::~MemRegionManager() { 141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // All regions and their data are BumpPtrAllocated. No need to call 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // their destructors. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Basic methods. 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SubRegion::isSubRegionOf(const MemRegion* R) const { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion* r = getSuperRegion(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (r != 0) { 152a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (r == R) 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (const SubRegion* sr = dyn_cast<SubRegion>(r)) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r = sr->getSuperRegion(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MemRegionManager* SubRegion::getMemRegionManager() const { 1638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const SubRegion* r = this; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion *superRegion = r->getSuperRegion(); 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (const SubRegion *sr = dyn_cast<SubRegion>(superRegion)) { 1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch r = sr; 168b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) continue; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 170558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return superRegion->getMemRegionManager(); 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } while (1); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const StackFrameContext *VarRegion::getStackFrame() const { 17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const StackSpaceRegion *SSR = dyn_cast<StackSpaceRegion>(getMemorySpace()); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SSR ? SSR->getStackFrame() : NULL; 177d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)//===----------------------------------------------------------------------===// 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Region extents. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DefinedOrUnknownSVal TypedValueRegion::getExtent(SValBuilder &svalBuilder) const { 18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASTContext &Ctx = svalBuilder.getContext(); 1858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) QualType T = getDesugaredValueType(Ctx); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (isa<VariableArrayType>(T)) 1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this)); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (T->isIncompleteType()) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UnknownVal(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharUnits size = Ctx.getTypeSizeInChars(T); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType sizeTy = svalBuilder.getArrayIndexType(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return svalBuilder.makeIntVal(size.getQuantity(), sizeTy); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)DefinedOrUnknownSVal FieldRegion::getExtent(SValBuilder &svalBuilder) const { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force callers to deal with bitfields explicitly. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (getDecl()->isBitField()) 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return UnknownVal(); 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DefinedOrUnknownSVal Extent = DeclRegion::getExtent(svalBuilder); 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A zero-length array at the end of a struct often stands for dynamically- 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // allocated extra memory. 2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (Extent.isZeroConstant()) { 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QualType T = getDesugaredValueType(svalBuilder.getContext()); 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (isa<ConstantArrayType>(T)) 210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return UnknownVal(); 211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return Extent; 2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDefinedOrUnknownSVal AllocaRegion::getExtent(SValBuilder &svalBuilder) const { 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this)); 21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)DefinedOrUnknownSVal SymbolicRegion::getExtent(SValBuilder &svalBuilder) const { 2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return nonloc::SymbolVal(svalBuilder.getSymbolManager().getExtentSymbol(this)); 2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDefinedOrUnknownSVal StringRegion::getExtent(SValBuilder &svalBuilder) const { 2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return svalBuilder.makeIntVal(getStringLiteral()->getByteLength()+1, 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch svalBuilder.getArrayIndexType()); 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochObjCIvarRegion::ObjCIvarRegion(const ObjCIvarDecl *ivd, const MemRegion* sReg) 2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst ObjCIvarDecl *ObjCIvarRegion::getDecl() const { 2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return cast<ObjCIvarDecl>(D); 2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochQualType ObjCIvarRegion::getValueType() const { 2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return getDecl()->getType(); 2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochQualType CXXBaseObjectRegion::getValueType() const { 241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return QualType(getDecl()->getTypeForDecl(), 0); 242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//===----------------------------------------------------------------------===// 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// FoldingSet profiling. 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//===----------------------------------------------------------------------===// 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void MemSpaceRegion::Profile(llvm::FoldingSetNodeID& ID) const { 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ID.AddInteger((unsigned)getKind()); 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StackSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddInteger((unsigned)getKind()); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(getStackFrame()); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StaticGlobalSpaceRegion::Profile(llvm::FoldingSetNodeID &ID) const { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddInteger((unsigned)getKind()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(getCodeRegion()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const StringLiteral* Str, 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MemRegion* superRegion) { 265558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ID.AddInteger((unsigned) StringRegionKind); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(Str); 267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ID.AddPointer(superRegion); 268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ObjCStringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjCStringLiteral* Str, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion* superRegion) { 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ID.AddInteger((unsigned) ObjCStringRegionKind); 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ID.AddPointer(Str); 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ID.AddPointer(superRegion); 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AllocaRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 2790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const Expr *Ex, unsigned cnt, 2800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const MemRegion *superRegion) { 2810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ID.AddInteger((unsigned) AllocaRegionKind); 2820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ID.AddPointer(Ex); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddInteger(cnt); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(superRegion); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AllocaRegion::Profile(llvm::FoldingSetNodeID& ID) const { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileRegion(ID, Ex, Cnt, superRegion); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CompoundLiteralRegion::Profile(llvm::FoldingSetNodeID& ID) const { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompoundLiteralRegion::ProfileRegion(ID, CL, superRegion); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CompoundLiteralRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompoundLiteralExpr *CL, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion* superRegion) { 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ID.AddInteger((unsigned) CompoundLiteralRegionKind); 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ID.AddPointer(CL); 300c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch ID.AddPointer(superRegion); 301c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch} 302c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 303c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochvoid CXXThisRegion::ProfileRegion(llvm::FoldingSetNodeID &ID, 304c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch const PointerType *PT, 305c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch const MemRegion *sRegion) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddInteger((unsigned) CXXThisRegionKind); 307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ID.AddPointer(PT); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(sRegion); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CXXThisRegion::Profile(llvm::FoldingSetNodeID &ID) const { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CXXThisRegion::ProfileRegion(ID, ThisPointerTy, superRegion); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ObjCIvarRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjCIvarDecl *ivd, 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion* superRegion) { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeclRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion* superRegion, Kind k) { 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddInteger((unsigned) k); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(D); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(superRegion); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeclRegion::Profile(llvm::FoldingSetNodeID& ID) const { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeclRegion::ProfileRegion(ID, D, superRegion, getKind()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VarRegion::Profile(llvm::FoldingSetNodeID &ID) const { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VarRegion::ProfileRegion(ID, getDecl(), superRegion); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SymbolicRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym, 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion *sreg) { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddInteger((unsigned) MemRegion::SymbolicRegionKind); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.Add(sym); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(sreg); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SymbolicRegion::Profile(llvm::FoldingSetNodeID& ID) const { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SymbolicRegion::ProfileRegion(ID, sym, getSuperRegion()); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType ElementType, SVal Idx, 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion* superRegion) { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddInteger(MemRegion::ElementRegionKind); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.Add(ElementType); 3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ID.AddPointer(superRegion); 3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Idx.Profile(ID); 3547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ElementRegion::ProfileRegion(ID, ElementType, Index, superRegion); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void FunctionTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NamedDecl *FD, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion*) { 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddInteger(MemRegion::FunctionTextRegionKind); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(FD); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FunctionTextRegion::Profile(llvm::FoldingSetNodeID& ID) const { 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FunctionTextRegion::ProfileRegion(ID, FD, superRegion); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BlockDecl *BD, CanQualType, 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AnalysisDeclContext *AC, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion*) { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddInteger(MemRegion::BlockTextRegionKind); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(BD); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockTextRegion::Profile(llvm::FoldingSetNodeID& ID) const { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockTextRegion::ProfileRegion(ID, BD, locTy, AC, superRegion); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockDataRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BlockTextRegion *BC, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *LC, 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const MemRegion *sReg) { 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddInteger(MemRegion::BlockDataRegionKind); 3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ID.AddPointer(BC); 3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ID.AddPointer(LC); 3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ID.AddPointer(sReg); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockDataRegion::Profile(llvm::FoldingSetNodeID& ID) const { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockDataRegion::ProfileRegion(ID, BC, LC, getSuperRegion()); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CXXTempObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID, 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr const *Ex, 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion *sReg) { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(Ex); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(sReg); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CXXTempObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileRegion(ID, Ex, getSuperRegion()); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CXXBaseObjectRegion::ProfileRegion(llvm::FoldingSetNodeID &ID, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CXXRecordDecl *RD, 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsVirtual, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion *SReg) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(RD); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddBoolean(IsVirtual); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(SReg); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CXXBaseObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const { 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileRegion(ID, getDecl(), isVirtual(), superRegion); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Region anchors. 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GlobalsSpaceRegion::anchor() { } 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HeapSpaceRegion::anchor() { } 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UnknownSpaceRegion::anchor() { } 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StackLocalsSpaceRegion::anchor() { } 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StackArgumentsSpaceRegion::anchor() { } 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TypedRegion::anchor() { } 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TypedValueRegion::anchor() { } 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CodeTextRegion::anchor() { } 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SubRegion::anchor() { } 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Region pretty-printing. 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//===----------------------------------------------------------------------===// 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MemRegion::dump() const { 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dumpToStream(llvm::errs()); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string MemRegion::getString() const { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string s; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::raw_string_ostream os(s); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dumpToStream(os); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return os.str(); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MemRegion::dumpToStream(raw_ostream &os) const { 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os << "<Unknown Region>"; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AllocaRegion::dumpToStream(raw_ostream &os) const { 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os << "alloca{" << (const void*) Ex << ',' << Cnt << '}'; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FunctionTextRegion::dumpToStream(raw_ostream &os) const { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os << "code{" << getDecl()->getDeclName().getAsString() << '}'; 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockTextRegion::dumpToStream(raw_ostream &os) const { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os << "block_code{" << (const void*) this << '}'; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockDataRegion::dumpToStream(raw_ostream &os) const { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os << "block_data{" << BC << '}'; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CompoundLiteralRegion::dumpToStream(raw_ostream &os) const { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FIXME: More elaborate pretty-printing. 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os << "{ " << (const void*) CL << " }"; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CXXTempObjectRegion::dumpToStream(raw_ostream &os) const { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os << "temp_object{" << getValueType().getAsString() << ',' 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << (const void*) Ex << '}'; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CXXBaseObjectRegion::dumpToStream(raw_ostream &os) const { 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os << "base{" << superRegion << ',' << getDecl()->getName() << '}'; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CXXThisRegion::dumpToStream(raw_ostream &os) const { 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os << "this"; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ElementRegion::dumpToStream(raw_ostream &os) const { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os << "element{" << superRegion << ',' 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << Index << ',' << getElementType().getAsString() << '}'; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void FieldRegion::dumpToStream(raw_ostream &os) const { 4948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) os << superRegion << "->" << *getDecl(); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ObjCIvarRegion::dumpToStream(raw_ostream &os) const { 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os << "ivar{" << superRegion << ',' << *getDecl() << '}'; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StringRegion::dumpToStream(raw_ostream &os) const { 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Str->printPretty(os, 0, PrintingPolicy(getContext().getLangOpts())); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void ObjCStringRegion::dumpToStream(raw_ostream &os) const { 5068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Str->printPretty(os, 0, PrintingPolicy(getContext().getLangOpts())); 5078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void SymbolicRegion::dumpToStream(raw_ostream &os) const { 5108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) os << "SymRegion{" << sym << '}'; 5118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void VarRegion::dumpToStream(raw_ostream &os) const { 5148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) os << *cast<VarDecl>(D); 5158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void RegionRawOffset::dump() const { 5188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) dumpToStream(llvm::errs()); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void RegionRawOffset::dumpToStream(raw_ostream &os) const { 5228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) os << "raw_offset{" << getRegion() << ',' << getOffset().getQuantity() << '}'; 5238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StaticGlobalSpaceRegion::dumpToStream(raw_ostream &os) const { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os << "StaticGlobalsMemSpace{" << CR << '}'; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GlobalInternalSpaceRegion::dumpToStream(raw_ostream &os) const { 5308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) os << "GlobalInternalSpaceRegion"; 5318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void GlobalSystemSpaceRegion::dumpToStream(raw_ostream &os) const { 5348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) os << "GlobalSystemSpaceRegion"; 5358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void GlobalImmutableSpaceRegion::dumpToStream(raw_ostream &os) const { 5388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) os << "GlobalImmutableSpaceRegion"; 5398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void HeapSpaceRegion::dumpToStream(raw_ostream &os) const { 5428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) os << "HeapSpaceRegion"; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void UnknownSpaceRegion::dumpToStream(raw_ostream &os) const { 5468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) os << "UnknownSpaceRegion"; 5478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void StackArgumentsSpaceRegion::dumpToStream(raw_ostream &os) const { 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os << "StackArgumentsSpaceRegion"; 5518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void StackLocalsSpaceRegion::dumpToStream(raw_ostream &os) const { 5548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) os << "StackLocalsSpaceRegion"; 5558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MemRegion::canPrintPretty() const { 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return canPrintPrettyAsExpr(); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool MemRegion::canPrintPrettyAsExpr() const { 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MemRegion::printPretty(raw_ostream &os) const { 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(canPrintPretty() && "This region cannot be printed pretty."); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os << "'"; 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) printPrettyAsExpr(os); 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os << "'"; 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MemRegion::printPrettyAsExpr(raw_ostream &os) const { 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) llvm_unreachable("This region cannot be printed pretty."); 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool VarRegion::canPrintPrettyAsExpr() const { 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void VarRegion::printPrettyAsExpr(raw_ostream &os) const { 58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) os << getDecl()->getName(); 58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 586558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool ObjCIvarRegion::canPrintPrettyAsExpr() const { 587558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return true; 588558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ObjCIvarRegion::printPrettyAsExpr(raw_ostream &os) const { 5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) os << getDecl()->getName(); 5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool FieldRegion::canPrintPretty() const { 5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 596558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 597558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 598558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool FieldRegion::canPrintPrettyAsExpr() const { 599558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return superRegion->canPrintPrettyAsExpr(); 60058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 60158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 60258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void FieldRegion::printPrettyAsExpr(raw_ostream &os) const { 60358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) assert(canPrintPrettyAsExpr()); 6048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) superRegion->printPrettyAsExpr(os); 60558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) os << "." << getDecl()->getName(); 60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 60758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 60858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void FieldRegion::printPretty(raw_ostream &os) const { 60958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (canPrintPrettyAsExpr()) { 61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) os << "\'"; 61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) printPrettyAsExpr(os); 61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) os << "'"; 613558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } else { 6148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) os << "field " << "\'" << getDecl()->getName() << "'"; 6150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 6168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 6178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 6188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool CXXBaseObjectRegion::canPrintPrettyAsExpr() const { 6208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return superRegion->canPrintPrettyAsExpr(); 6218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 6228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CXXBaseObjectRegion::printPrettyAsExpr(raw_ostream &os) const { 6248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) superRegion->printPrettyAsExpr(os); 6258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 6268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)//===----------------------------------------------------------------------===// 6288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// MemRegionManager methods. 6298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)//===----------------------------------------------------------------------===// 6308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)template <typename REG> 6328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)const REG *MemRegionManager::LazyAllocate(REG*& region) { 6338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!region) { 6348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) region = (REG*) A.Allocate<REG>(); 63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new (region) REG(this); 636558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return region; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename REG, typename ARG> 642868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const REG *MemRegionManager::LazyAllocate(REG*& region, ARG a) { 6430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!region) { 6440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) region = (REG*) A.Allocate<REG>(); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new (region) REG(this, a); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 647868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 64890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return region; 64990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 65090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const StackLocalsSpaceRegion* 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MemRegionManager::getStackLocalsRegion(const StackFrameContext *STC) { 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(STC); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StackLocalsSpaceRegion *&R = StackLocalsSpaceRegions[STC]; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (R) 6577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return R; 658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) R = A.Allocate<StackLocalsSpaceRegion>(); 660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new (R) StackLocalsSpaceRegion(this, STC); 661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return R; 662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const StackArgumentsSpaceRegion * 665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MemRegionManager::getStackArgumentsRegion(const StackFrameContext *STC) { 666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(STC); 667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StackArgumentsSpaceRegion *&R = StackArgumentsSpaceRegions[STC]; 668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (R) 670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return R; 671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) R = A.Allocate<StackArgumentsSpaceRegion>(); 673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new (R) StackArgumentsSpaceRegion(this, STC); 674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return R; 675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const GlobalsSpaceRegion 678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)*MemRegionManager::getGlobalsRegion(MemRegion::Kind K, 679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const CodeTextRegion *CR) { 680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!CR) { 681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (K == MemRegion::GlobalSystemSpaceRegionKind) 682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return LazyAllocate(SystemGlobals); 683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (K == MemRegion::GlobalImmutableSpaceRegionKind) 684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return LazyAllocate(ImmutableGlobals); 685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(K == MemRegion::GlobalInternalSpaceRegionKind); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return LazyAllocate(InternalGlobals); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(K == MemRegion::StaticGlobalSpaceRegionKind); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StaticGlobalSpaceRegion *&R = StaticsGlobalSpaceRegions[CR]; 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (R) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return R; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R = A.Allocate<StaticGlobalSpaceRegion>(); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new (R) StaticGlobalSpaceRegion(this, CR); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return R; 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const HeapSpaceRegion *MemRegionManager::getHeapRegion() { 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return LazyAllocate(heap); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MemSpaceRegion *MemRegionManager::getUnknownRegion() { 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return LazyAllocate(unknown); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MemSpaceRegion *MemRegionManager::getCodeRegion() { 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return LazyAllocate(code); 70990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 71090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Constructing regions. 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 7147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst StringRegion* MemRegionManager::getStringRegion(const StringLiteral* Str){ 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return getSubRegion<StringRegion>(Str, getGlobalsRegion()); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst ObjCStringRegion * 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MemRegionManager::getObjCStringRegion(const ObjCStringLiteral* Str){ 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return getSubRegion<ObjCStringRegion>(Str, getGlobalsRegion()); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// Look through a chain of LocationContexts to either find the 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// StackFrameContext that matches a DeclContext, or find a VarRegion 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// for a variable captured by a block. 7267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic llvm::PointerUnion<const StackFrameContext *, const VarRegion *> 7277dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochgetStackOrCaptureRegionForDeclContext(const LocationContext *LC, 7287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const DeclContext *DC, 7297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const VarDecl *VD) { 7307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch while (LC) { 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const StackFrameContext *SFC = dyn_cast<StackFrameContext>(LC)) { 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cast<DeclContext>(SFC->getDecl()) == DC) 733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SFC; 734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const BlockInvocationContext *BC = 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dyn_cast<BlockInvocationContext>(LC)) { 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BlockDataRegion *BR = 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const BlockDataRegion*>(BC->getContextData()); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FIXME: This can be made more efficient. 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (BlockDataRegion::referenced_vars_iterator 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) I = BR->referenced_vars_begin(), 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) E = BR->referenced_vars_end(); I != E; ++I) { 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const VarRegion *VR = dyn_cast<VarRegion>(I.getOriginalRegion())) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (VR->getDecl() == VD) 745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return cast<VarRegion>(I.getCapturedRegion()); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 749a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LC = LC->getParent(); 750a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 751a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return (const StackFrameContext*)0; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const VarRegion* MemRegionManager::getVarRegion(const VarDecl *D, 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *LC) { 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion *sReg = 0; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (D->hasGlobalStorage() && !D->isStaticLocal()) { 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First handle the globals defined in system headers. 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (C.getSourceManager().isInSystemHeader(D->getLocation())) { 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whitelist the system globals which often DO GET modified, assume the 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rest are immutable. 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (D->getName().find("errno") != StringRef::npos) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sReg = getGlobalsRegion(MemRegion::GlobalSystemSpaceRegionKind); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Treat other globals as GlobalInternal unless they are constants. 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType GQT = D->getType(); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Type *GT = GQT.getTypePtrOrNull(); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: We could walk the complex types here and see if everything is 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // constified. 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GT && GQT.isConstQualified() && GT->isArithmeticType()) 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind); 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sReg = getGlobalsRegion(); 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 780f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 781f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Finally handle static locals. 782f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 783f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // FIXME: Once we implement scope handling, we will need to properly lookup 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 'D' to the proper LocationContext. 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DeclContext *DC = D->getDeclContext(); 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) llvm::PointerUnion<const StackFrameContext *, const VarRegion *> V = 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getStackOrCaptureRegionForDeclContext(LC, DC, D); 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (V.is<const VarRegion*>()) 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return V.get<const VarRegion*>(); 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StackFrameContext *STC = V.get<const StackFrameContext*>(); 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!STC) 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sReg = getUnknownRegion(); 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 797ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (D->hasLocalStorage()) { 798ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch sReg = isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D) 799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ? static_cast<const MemRegion*>(getStackArgumentsRegion(STC)) 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : static_cast<const MemRegion*>(getStackLocalsRegion(STC)); 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(D->isStaticLocal()); 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Decl *STCD = STC->getDecl(); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (isa<FunctionDecl>(STCD) || isa<ObjCMethodDecl>(STCD)) 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sReg = getGlobalsRegion(MemRegion::StaticGlobalSpaceRegionKind, 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getFunctionTextRegion(cast<NamedDecl>(STCD))); 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (const BlockDecl *BD = dyn_cast<BlockDecl>(STCD)) { 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // FIXME: The fallback type here is totally bogus -- though it should 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // never be queried, it will prevent uniquing with the real 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BlockTextRegion. Ideally we'd fix the AST so that we always had a 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // signature. 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QualType T; 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const TypeSourceInfo *TSI = BD->getSignatureAsWritten()) 8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) T = TSI->getType(); 8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) T = getContext().getFunctionNoProtoType(getContext().VoidTy); 8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BlockTextRegion *BTR = 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getBlockTextRegion(BD, C.getCanonicalType(T), 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) STC->getAnalysisDeclContext()); 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sReg = getGlobalsRegion(MemRegion::StaticGlobalSpaceRegionKind, 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BTR); 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sReg = getGlobalsRegion(); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return getSubRegion<VarRegion>(D, sReg); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)const VarRegion *MemRegionManager::getVarRegion(const VarDecl *D, 836eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const MemRegion *superR) { 837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return getSubRegion<VarRegion>(D, superR); 8387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)const BlockDataRegion * 8410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)MemRegionManager::getBlockDataRegion(const BlockTextRegion *BC, 8420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const LocationContext *LC) { 8430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const MemRegion *sReg = 0; 8440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const BlockDecl *BD = BC->getDecl(); 8450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!BD->hasCaptures()) { 8460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // This handles 'static' blocks. 8470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind); 8480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 8490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) else { 8500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (LC) { 8510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // FIXME: Once we implement scope handling, we want the parent region 8520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // to be the scope. 8530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const StackFrameContext *STC = LC->getCurrentStackFrame(); 8540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) assert(STC); 8550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) sReg = getStackLocalsRegion(STC); 8560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 8570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) else { 8580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // We allow 'LC' to be NULL for cases where want BlockDataRegions 8590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // without context-sensitivity. 8600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) sReg = getUnknownRegion(); 8610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 8620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 8630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 8640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return getSubRegion<BlockDataRegion>(BC, LC, sReg); 8650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 866eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 867eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst CXXTempObjectRegion * 868eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochMemRegionManager::getCXXStaticTempObjectRegion(const Expr *Ex) { 869eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return getSubRegion<CXXTempObjectRegion>( 870eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Ex, getGlobalsRegion(MemRegion::GlobalInternalSpaceRegionKind, NULL)); 871eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 872eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 873d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)const CompoundLiteralRegion* 874d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)MemRegionManager::getCompoundLiteralRegion(const CompoundLiteralExpr *CL, 8750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const LocationContext *LC) { 8760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 8770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const MemRegion *sReg = 0; 878eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 879eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (CL->isFileScope()) 880eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch sReg = getGlobalsRegion(); 881eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else { 882eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const StackFrameContext *STC = LC->getCurrentStackFrame(); 883eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch assert(STC); 884eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch sReg = getStackLocalsRegion(STC); 885eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 8862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 887eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return getSubRegion<CompoundLiteralRegion>(CL, sReg); 8880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 8890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 8900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)const ElementRegion* 891d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)MemRegionManager::getElementRegion(QualType elementType, NonLoc Idx, 892d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const MemRegion* superRegion, 8930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASTContext &Ctx){ 894d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 895eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch QualType T = Ctx.getCanonicalType(elementType).getUnqualifiedType(); 896eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 897868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) llvm::FoldingSetNodeID ID; 898868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ElementRegion::ProfileRegion(ID, T, Idx, superRegion); 899868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 900eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void *InsertPos; 90168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos); 9020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ElementRegion* R = cast_or_null<ElementRegion>(data); 9030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 904a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!R) { 905a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) R = (ElementRegion*) A.Allocate<ElementRegion>(); 906a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new (R) ElementRegion(T, Idx, superRegion); 907a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Regions.InsertNode(R, InsertPos); 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 909eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return R; 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const FunctionTextRegion * 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MemRegionManager::getFunctionTextRegion(const NamedDecl *FD) { 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return getSubRegion<FunctionTextRegion>(FD, getCodeRegion()); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const BlockTextRegion * 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MemRegionManager::getBlockTextRegion(const BlockDecl *BD, CanQualType locTy, 9204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AnalysisDeclContext *AC) { 9215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return getSubRegion<BlockTextRegion>(BD, locTy, AC, getCodeRegion()); 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SymbolicRegion *MemRegionManager::getSymbolicRegion(SymbolRef sym) { 9274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return getSubRegion<SymbolicRegion>(sym, getUnknownRegion()); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 930a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const SymbolicRegion *MemRegionManager::getSymbolicHeapRegion(SymbolRef Sym) { 9314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return getSubRegion<SymbolicRegion>(Sym, getHeapRegion()); 932a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const FieldRegion* 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MemRegionManager::getFieldRegion(const FieldDecl *d, 9365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const MemRegion* superRegion){ 9374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return getSubRegion<FieldRegion>(d, superRegion); 9384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 939868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const ObjCIvarRegion* 9418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)MemRegionManager::getObjCIvarRegion(const ObjCIvarDecl *d, 9425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const MemRegion* superRegion) { 9435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return getSubRegion<ObjCIvarRegion>(d, superRegion); 9444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 9454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const CXXTempObjectRegion* 947868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)MemRegionManager::getCXXTempObjectRegion(Expr const *E, 9487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LocationContext const *LC) { 949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const StackFrameContext *SFC = LC->getCurrentStackFrame(); 950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch assert(SFC); 9518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return getSubRegion<CXXTempObjectRegion>(E, getStackLocalsRegion(SFC)); 952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 9537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 954d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)/// Checks whether \p BaseClass is a valid virtual or direct non-virtual base 9554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/// class of the type of \p Super. 956d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)static bool isValidBaseClass(const CXXRecordDecl *BaseClass, 9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const TypedValueRegion *Super, 958a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool IsVirtual) { 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BaseClass = BaseClass->getCanonicalDecl(); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CXXRecordDecl *Class = Super->getValueType()->getAsCXXRecordDecl(); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Class) 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsVirtual) 966a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return Class->isVirtuallyDerivedFrom(BaseClass); 967a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 968a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (CXXRecordDecl::base_class_const_iterator I = Class->bases_begin(), 969a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) E = Class->bases_end(); 970a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) I != E; ++I) { 971a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (I->getType()->getAsCXXRecordDecl()->getCanonicalDecl() == BaseClass) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const CXXBaseObjectRegion * 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MemRegionManager::getCXXBaseObjectRegion(const CXXRecordDecl *RD, 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MemRegion *Super, 981a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool IsVirtual) { 982a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (isa<TypedValueRegion>(Super)) { 983a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) assert(isValidBaseClass(RD, dyn_cast<TypedValueRegion>(Super), IsVirtual)); 984a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) (void)&isValidBaseClass; 985a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsVirtual) { 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Virtual base regions should not be layered, since the layout rules 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // are different. 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (const CXXBaseObjectRegion *Base = 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dyn_cast<CXXBaseObjectRegion>(Super)) { 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Super = Base->getSuperRegion(); 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(Super && !isa<MemSpaceRegion>(Super)); 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return getSubRegion<CXXBaseObjectRegion>(RD, IsVirtual, Super); 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const CXXThisRegion* 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MemRegionManager::getCXXThisRegion(QualType thisPointerTy, 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *LC) { 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StackFrameContext *STC = LC->getCurrentStackFrame(); 1004ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch assert(STC); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PointerType *PT = thisPointerTy->getAs<PointerType>(); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(PT); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return getSubRegion<CXXThisRegion>(PT, getStackArgumentsRegion(STC)); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const AllocaRegion* 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MemRegionManager::getAllocaRegion(const Expr *E, unsigned cnt, 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *LC) { 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StackFrameContext *STC = LC->getCurrentStackFrame(); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(STC); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return getSubRegion<AllocaRegion>(E, cnt, getStackLocalsRegion(STC)); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MemSpaceRegion *MemRegion::getMemorySpace() const { 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion *R = this; 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SubRegion* SR = dyn_cast<SubRegion>(this); 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (SR) { 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) R = SR->getSuperRegion(); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SR = dyn_cast<SubRegion>(R); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return dyn_cast<MemSpaceRegion>(R); 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1029a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MemRegion::hasStackStorage() const { 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return isa<StackSpaceRegion>(getMemorySpace()); 1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MemRegion::hasStackNonParametersStorage() const { 1035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return isa<StackLocalsSpaceRegion>(getMemorySpace()); 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MemRegion::hasStackParametersStorage() const { 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return isa<StackArgumentsSpaceRegion>(getMemorySpace()); 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MemRegion::hasGlobalsOrParametersStorage() const { 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemSpaceRegion *MS = getMemorySpace(); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return isa<StackArgumentsSpaceRegion>(MS) || 1045ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch isa<GlobalsSpaceRegion>(MS); 1046ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// getBaseRegion strips away all elements and fields, and get the base region 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of them. 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MemRegion *MemRegion::getBaseRegion() const { 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MemRegion *R = this; 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (true) { 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (R->getKind()) { 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case MemRegion::ElementRegionKind: 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MemRegion::FieldRegionKind: 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case MemRegion::ObjCIvarRegionKind: 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MemRegion::CXXBaseObjectRegionKind: 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R = cast<SubRegion>(R)->getSuperRegion(); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return R; 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool MemRegion::isSubRegionOf(const MemRegion *R) const { 1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//===----------------------------------------------------------------------===// 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// View handling. 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 1075a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const MemRegion *MemRegion::StripCasts(bool StripBaseCasts) const { 1077a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const MemRegion *R = this; 1078a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) while (true) { 1079a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switch (R->getKind()) { 1080a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case ElementRegionKind: { 1081a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ElementRegion *ER = cast<ElementRegion>(R); 1082a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!ER->getIndex().isZeroConstant()) 1083a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return R; 1084a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) R = ER->getSuperRegion(); 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CXXBaseObjectRegionKind: 1088a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!StripBaseCasts) 1089a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return R; 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) R = cast<CXXBaseObjectRegion>(R)->getSuperRegion(); 1091a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 1092a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) default: 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return R; 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SymbolicRegion *MemRegion::getSymbolicBase() const { 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SubRegion *SubR = dyn_cast<SubRegion>(this); 1100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) while (SubR) { 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (const SymbolicRegion *SymR = dyn_cast<SymbolicRegion>(SubR)) 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SymR; 1104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SubR = dyn_cast<SubRegion>(SubR->getSuperRegion()); 1105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return 0; 1107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// FIXME: Merge with the implementation of the same method in Store.cpp 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool IsCompleteType(ASTContext &Ctx, QualType Ty) { 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const RecordType *RT = Ty->getAs<RecordType>()) { 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RecordDecl *D = RT->getDecl(); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!D->getDefinition()) 1114a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 1115a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 1116a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1117a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return true; 1118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 1119a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1120a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)RegionRawOffset ElementRegion::getAsArrayOffset() const { 1121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) CharUnits offset = CharUnits::Zero(); 1122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const ElementRegion *ER = this; 1123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const MemRegion *superR = NULL; 1124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ASTContext &C = getContext(); 1125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // FIXME: Handle multi-dimensional arrays. 1127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1128a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) while (ER) { 1129ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch superR = ER->getSuperRegion(); 1130a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1131a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // FIXME: generalize to symbolic offsets. 1132a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SVal index = ER->getIndex(); 11335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (Optional<nonloc::ConcreteInt> CI = index.getAs<nonloc::ConcreteInt>()) { 11345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Update the offset. 1135a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) int64_t i = CI->getValue().getSExtValue(); 1136a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1137a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (i != 0) { 1138a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) QualType elemType = ER->getElementType(); 1139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1140a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // If we are pointing to an incomplete type, go no further. 114158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!IsCompleteType(C, elemType)) { 114258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) superR = ER; 114358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 114458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 114558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 114658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CharUnits size = C.getTypeSizeInChars(elemType); 114758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) offset += (i * size); 114858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 114958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 115058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Go to the next ElementRegion (if any). 115158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ER = dyn_cast<ElementRegion>(superR); 115258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) continue; 115358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 115458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 115558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return NULL; 115658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 115758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 115858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) assert(superR && "super region cannot be NULL"); 115958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return RegionRawOffset(superR, offset); 116058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 116158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 116258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 116358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/// Returns true if \p Base is an immediate base class of \p Child 116458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)static bool isImmediateBase(const CXXRecordDecl *Child, 116558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CXXRecordDecl *Base) { 116658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Note that we do NOT canonicalize the base class here, because 116758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // ASTRecordLayout doesn't either. If that leads us down the wrong path, 116858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // so be it; at least we won't crash. 116958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (CXXRecordDecl::base_class_const_iterator I = Child->bases_begin(), 117058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) E = Child->bases_end(); 117158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) I != E; ++I) { 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (I->getType()->getAsCXXRecordDecl() == Base) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RegionOffset MemRegion::getAsOffset() const { 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MemRegion *R = this; 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MemRegion *SymbolicOffsetBase = 0; 1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64_t Offset = 0; 1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (1) { 11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (R->getKind()) { 1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case GenericMemSpaceRegionKind: 1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case StackLocalsSpaceRegionKind: 1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case StackArgumentsSpaceRegionKind: 1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case HeapSpaceRegionKind: 1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case UnknownSpaceRegionKind: 1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case StaticGlobalSpaceRegionKind: 1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case GlobalInternalSpaceRegionKind: 1193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case GlobalSystemSpaceRegionKind: 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case GlobalImmutableSpaceRegionKind: 1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Stores can bind directly to a region space to set a default value. 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(Offset == 0 && !SymbolicOffsetBase); 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto Finish; 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case FunctionTextRegionKind: 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BlockTextRegionKind: 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BlockDataRegionKind: 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // These will never have bindings, but may end up having values requested 12035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // if the user does some strange casting. 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Offset != 0) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SymbolicOffsetBase = R; 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto Finish; 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SymbolicRegionKind: 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AllocaRegionKind: 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CompoundLiteralRegionKind: 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CXXThisRegionKind: 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case StringRegionKind: 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ObjCStringRegionKind: 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case VarRegionKind: 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CXXTempObjectRegionKind: 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Usual base regions. 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto Finish; 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ObjCIvarRegionKind: 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is a little strange, but it's a compromise between 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ObjCIvarRegions having unknown compile-time offsets (when using the 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // non-fragile runtime) and yet still being distinct, non-overlapping 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // regions. Thus we treat them as "like" base regions for the purposes 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of computing offsets. 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto Finish; 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CXXBaseObjectRegionKind: { 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CXXBaseObjectRegion *BOR = cast<CXXBaseObjectRegion>(R); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R = BOR->getSuperRegion(); 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType Ty; 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool RootIsSymbolic = false; 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const TypedValueRegion *TVR = dyn_cast<TypedValueRegion>(R)) { 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Ty = TVR->getDesugaredValueType(getContext()); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(R)) { 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If our base region is symbolic, we don't know what type it really is. 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Pretend the type of the symbol is the true dynamic type. 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (This will at least be self-consistent for the life of the symbol.) 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Ty = SR->getSymbol()->getType()->getPointeeType(); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RootIsSymbolic = true; 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CXXRecordDecl *Child = Ty->getAsCXXRecordDecl(); 1244ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!Child) { 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We cannot compute the offset of the base class. 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SymbolicOffsetBase = R; 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RootIsSymbolic) { 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Base layers on symbolic regions may not be type-correct. 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Double-check the inheritance here, and revert to a symbolic offset 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if it's invalid (e.g. due to a reinterpret_cast). 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (BOR->isVirtual()) { 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Child->isVirtuallyDerivedFrom(BOR->getDecl())) 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SymbolicOffsetBase = R; 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!isImmediateBase(Child, BOR->getDecl())) 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SymbolicOffsetBase = R; 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Don't bother calculating precise offsets if we already have a 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // symbolic offset somewhere in the chain. 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (SymbolicOffsetBase) 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharUnits BaseOffset; 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ASTRecordLayout &Layout = getContext().getASTRecordLayout(Child); 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (BOR->isVirtual()) 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BaseOffset = Layout.getVBaseClassOffset(BOR->getDecl()); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BaseOffset = Layout.getBaseClassOffset(BOR->getDecl()); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The base offset is in chars, not in bits. 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Offset += BaseOffset.getQuantity() * getContext().getCharWidth(); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ElementRegionKind: { 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ElementRegion *ER = cast<ElementRegion>(R); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R = ER->getSuperRegion(); 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType EleTy = ER->getValueType(); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsCompleteType(getContext(), EleTy)) { 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We cannot compute the offset of the base class. 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SymbolicOffsetBase = R; 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SVal Index = ER->getIndex(); 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Optional<nonloc::ConcreteInt> CI = 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Index.getAs<nonloc::ConcreteInt>()) { 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't bother calculating precise offsets if we already have a 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // symbolic offset somewhere in the chain. 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SymbolicOffsetBase) 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64_t i = CI->getValue().getSExtValue(); 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This type size is in bits. 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Offset += i * getContext().getTypeSize(EleTy); 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We cannot compute offset for non-concrete index. 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SymbolicOffsetBase = R; 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 130690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case FieldRegionKind: { 1307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const FieldRegion *FR = cast<FieldRegion>(R); 1308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) R = FR->getSuperRegion(); 1309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 131090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const RecordDecl *RD = FR->getDecl()->getParent(); 131190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (RD->isUnion() || !RD->isCompleteDefinition()) { 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We cannot compute offset for incomplete type. 1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // For unions, we could treat everything as offset 0, but we'd rather 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // treat each field as a symbolic offset so they aren't stored on top 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of each other, since we depend on things in typed regions actually 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // matching their types. 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SymbolicOffsetBase = R; 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1320ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Don't bother calculating precise offsets if we already have a 1321ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // symbolic offset somewhere in the chain. 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (SymbolicOffsetBase) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Get the field number. 13265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned idx = 0; 13275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (RecordDecl::field_iterator FI = RD->field_begin(), 13285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FE = RD->field_end(); FI != FE; ++FI, ++idx) 13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (FR->getDecl() == *FI) 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD); 1333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is offset in bits. 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Offset += Layout.getFieldOffset(idx); 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Finish: 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (SymbolicOffsetBase) 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RegionOffset(SymbolicOffsetBase, RegionOffset::Symbolic); 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RegionOffset(R, Offset); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// BlockDataRegion 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::pair<const VarRegion *, const VarRegion *> 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BlockDataRegion::getCaptureRegions(const VarDecl *VD) { 1352ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch MemRegionManager &MemMgr = *getMemRegionManager(); 1353ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const VarRegion *VR = 0; 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const VarRegion *OriginalVR = 0; 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!VD->getAttr<BlocksAttr>() && VD->hasLocalStorage()) { 13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VR = MemMgr.getVarRegion(VD, this); 13585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OriginalVR = MemMgr.getVarRegion(VD, LC); 13595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else { 13615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (LC) { 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VR = MemMgr.getVarRegion(VD, LC); 1363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OriginalVR = VR; 1364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) else { 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VR = MemMgr.getVarRegion(VD, MemMgr.getUnknownRegion()); 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OriginalVR = MemMgr.getVarRegion(VD, LC); 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::make_pair(VR, OriginalVR); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BlockDataRegion::LazyInitializeReferencedVars() { 13745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ReferencedVars) 13755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 13765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AnalysisDeclContext *AC = getCodeRegion()->getAnalysisDeclContext(); 13785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AnalysisDeclContext::referenced_decls_iterator I, E; 13795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) llvm::tie(I, E) = AC->getReferencedBlockVars(BC->getDecl()); 13805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (I == E) { 13825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ReferencedVars = (void*) 0x1; 13835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 13845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MemRegionManager &MemMgr = *getMemRegionManager(); 13875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) llvm::BumpPtrAllocator &A = MemMgr.getAllocator(); 13885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BumpVectorContext BC(A); 13895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef BumpVector<const MemRegion*> VarVec; 13915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VarVec *BV = (VarVec*) A.Allocate<VarVec>(); 13925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new (BV) VarVec(BC, E - I); 13935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VarVec *BVOriginal = (VarVec*) A.Allocate<VarVec>(); 13945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new (BVOriginal) VarVec(BC, E - I); 13955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for ( ; I != E; ++I) { 13975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const VarRegion *VR = 0; 13985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const VarRegion *OriginalVR = 0; 13995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) llvm::tie(VR, OriginalVR) = getCaptureRegions(*I); 14005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(VR); 1401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assert(OriginalVR); 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BV->push_back(VR, BC); 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BVOriginal->push_back(OriginalVR, BC); 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ReferencedVars = BV; 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OriginalVars = BVOriginal; 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BlockDataRegion::referenced_vars_iterator 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BlockDataRegion::referenced_vars_begin() const { 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars(); 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) BumpVector<const MemRegion*> *Vec = 1415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<BumpVector<const MemRegion*>*>(ReferencedVars); 1416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (Vec == (void*) 0x1) 1418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return BlockDataRegion::referenced_vars_iterator(0, 0); 1419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) BumpVector<const MemRegion*> *VecOriginal = 1421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<BumpVector<const MemRegion*>*>(OriginalVars); 1422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return BlockDataRegion::referenced_vars_iterator(Vec->begin(), 1424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VecOriginal->begin()); 1425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)BlockDataRegion::referenced_vars_iterator 1428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)BlockDataRegion::referenced_vars_end() const { 1429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const_cast<BlockDataRegion*>(this)->LazyInitializeReferencedVars(); 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1431ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch BumpVector<const MemRegion*> *Vec = 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<BumpVector<const MemRegion*>*>(ReferencedVars); 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Vec == (void*) 0x1) 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return BlockDataRegion::referenced_vars_iterator(0, 0); 1436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) BumpVector<const MemRegion*> *VecOriginal = 1438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<BumpVector<const MemRegion*>*>(OriginalVars); 1439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 14405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return BlockDataRegion::referenced_vars_iterator(Vec->end(), 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VecOriginal->end()); 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const VarRegion *BlockDataRegion::getOriginalRegion(const VarRegion *R) const { 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (referenced_vars_iterator I = referenced_vars_begin(), 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) E = referenced_vars_end(); 1447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) I != E; ++I) { 1448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (I.getCapturedRegion() == R) 1449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return I.getOriginalRegion(); 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RegionAndSymbolInvalidationTraits 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1458ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RegionAndSymbolInvalidationTraits::setTrait(SymbolRef Sym, 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidationKinds IK) { 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SymTraitsMap[Sym] |= IK; 14617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 14627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 14637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RegionAndSymbolInvalidationTraits::setTrait(const MemRegion *MR, 14647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InvalidationKinds IK) { 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(MR); 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(MR)) 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setTrait(SR->getSymbol(), IK); 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MRTraitsMap[MR] |= IK; 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool RegionAndSymbolInvalidationTraits::hasTrait(SymbolRef Sym, 14738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) InvalidationKinds IK) { 14744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const_symbol_iterator I = SymTraitsMap.find(Sym); 14754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (I != SymTraitsMap.end()) 14764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return I->second & IK; 14774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 14784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegionAndSymbolInvalidationTraits::hasTrait(const MemRegion *MR, 14824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) InvalidationKinds IK) { 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!MR) 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(MR)) 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hasTrait(SR->getSymbol(), IK); 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_region_iterator I = MRTraitsMap.find(MR); 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (I != MRTraitsMap.end()) 149158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return I->second & IK; 1492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 149358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 149458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 149558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)