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)