MemRegion.h revision 3d8173c1c68f451c7492f92023d829c626845925
1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//== MemRegion.h - Abstract memory regions for static analysis --*- C++ -*--==// 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The LLVM Compiler Infrastructure 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This file is distributed under the University of Illinois Open Source 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// License. See LICENSE.TXT for details. 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//===----------------------------------------------------------------------===// 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// 10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// This file defines MemRegion and its subclasses. MemRegion defines a 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// partially-typed abstraction of memory useful for path-sensitive dataflow 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// analyses. 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//===----------------------------------------------------------------------===// 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#ifndef LLVM_CLANG_ANALYSIS_MEMREGION_H 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define LLVM_CLANG_ANALYSIS_MEMREGION_H 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "clang/AST/Decl.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "clang/AST/DeclObjC.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "clang/Analysis/PathSensitive/SymbolManager.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "clang/Analysis/PathSensitive/SVals.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "clang/AST/ASTContext.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "llvm/Support/Casting.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "llvm/ADT/FoldingSet.h" 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "llvm/ADT/ImmutableList.h" 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "llvm/ADT/ImmutableMap.h" 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "llvm/Support/Allocator.h" 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace llvm { class raw_ostream; } 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace clang { 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MemRegionManager; 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// MemRegion - The root abstract class for all memory regions. 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MemRegion : public llvm::FoldingSetNode { 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic: 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum Kind { MemSpaceRegionKind, SymbolicRegionKind, 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AllocaRegionKind, 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Typed regions. 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BEG_TYPED_REGIONS, 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CompoundLiteralRegionKind, 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StringRegionKind, ElementRegionKind, 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AnonTypedRegionKind, 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AnonPointeeRegionKind, 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Decl Regions. 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BEG_DECL_REGIONS, 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch VarRegionKind, FieldRegionKind, 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ObjCIvarRegionKind, ObjCObjectRegionKind, 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch END_DECL_REGIONS, 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch END_TYPED_REGIONS }; 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprivate: 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Kind kind; 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprotected: 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MemRegion(Kind k) : kind(k) {} 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~MemRegion(); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic: 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // virtual MemExtent getExtent(MemRegionManager& mrm) const = 0; 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string getString() const; 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void print(llvm::raw_ostream& os) const; 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Kind getKind() const { return kind; } 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool classof(const MemRegion*) { return true; } 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// MemSpaceRegion - A memory region that represents and "memory space"; 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// for example, the set of global variables, the stack frame, etc. 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MemSpaceRegion : public MemRegion { 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class MemRegionManager; 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MemSpaceRegion() : MemRegion(MemSpaceRegionKind) {} 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic: 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch //RegionExtent getExtent() const { return UndefinedExtent(); } 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Profile(llvm::FoldingSetNodeID& ID) const; 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool classof(const MemRegion* R) { 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return R->getKind() == MemSpaceRegionKind; 883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick/// SubRegion - A region that subsets another larger region. Most regions 923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick/// are subclasses of SubRegion. 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass SubRegion : public MemRegion { 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenprotected: 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const MemRegion* superRegion; 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {} 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic: 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const MemRegion* getSuperRegion() const { 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return superRegion; 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static bool classof(const MemRegion* R) { 104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return R->getKind() > SymbolicRegionKind; 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// AllocaRegion - A region that represents an untyped blob of bytes created 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// by a call to 'alloca'. 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AllocaRegion : public SubRegion { 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class MemRegionManager; 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprotected: 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unsigned Cnt; // Block counter. Used to distinguish different pieces of 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // memory allocated by alloca at the same call site. 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Expr* Ex; 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion* superRegion) 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {} 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic: 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Expr* getExpr() const { return Ex; } 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void Profile(llvm::FoldingSetNodeID& ID) const; 12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex, 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unsigned Cnt); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void print(llvm::raw_ostream& os) const; 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool classof(const MemRegion* R) { 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return R->getKind() == AllocaRegionKind; 133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// SymbolicRegion - A special, "non-concrete" region. Unlike other region 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// clases, SymbolicRegion represents a region that serves as an alias for 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// either a real region, a NULL pointer, etc. It essentially is used to 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// map the concept of symbolic values into the domain of regions. Symbolic 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// regions do not need to be typed. 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SymbolicRegion : public MemRegion { 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprotected: 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const SymbolRef sym; 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic: 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SymbolicRegion(const SymbolRef s) : MemRegion(SymbolicRegionKind), sym(s) {} 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SymbolRef getSymbol() const { 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return sym; 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Profile(llvm::FoldingSetNodeID& ID) const; 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym); 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void print(llvm::raw_ostream& os) const; 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool classof(const MemRegion* R) { 158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return R->getKind() == SymbolicRegionKind; 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// TypedRegion - An abstract class representing regions that are typed. 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TypedRegion : public SubRegion { 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprotected: 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {} 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic: 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual QualType getType(ASTContext&) const = 0; 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool classof(const MemRegion* R) { 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unsigned k = R->getKind(); 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS; 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// StringRegion - Region associated with a StringLiteral. 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass StringRegion : public TypedRegion { 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class MemRegionManager; 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const StringLiteral* Str; 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickprotected: 1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StringRegion(const StringLiteral* str, MemRegion* sreg) 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : TypedRegion(sreg, StringRegionKind), Str(str) {} 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static void ProfileRegion(llvm::FoldingSetNodeID& ID, 18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const StringLiteral* Str, 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const MemRegion* superRegion); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic: 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const StringLiteral* getStringLiteral() const { return Str; } 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch QualType getType(ASTContext& C) const { 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return C.getCanonicalType(Str->getType()); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void Profile(llvm::FoldingSetNodeID& ID) const { 2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ProfileRegion(ID, Str, superRegion); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void print(llvm::raw_ostream& os) const; 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static bool classof(const MemRegion* R) { 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return R->getKind() == StringRegionKind; 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AnonTypedRegion : public TypedRegion { 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class MemRegionManager; 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch QualType T; 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AnonTypedRegion(QualType t, const MemRegion* sreg) 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : TypedRegion(sreg, AnonTypedRegionKind), T(t) {} 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T, 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const MemRegion* superRegion); 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic: 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch QualType getType(ASTContext& C) const { 22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return T; 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Profile(llvm::FoldingSetNodeID& ID) const { 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProfileRegion(ID, T, superRegion); 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool classof(const MemRegion* R) { 23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return R->getKind() == AnonTypedRegionKind; 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/// AnonPointeeRegion - anonymous regions pointed-to by pointer function 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// parameters or pointer globals. In RegionStoreManager, we assume pointer 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// parameters or globals point at some anonymous region. Such regions are not 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// the regions associated with the pointer variables themselves. They are 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/// identified by the symbols that are concretized. We create them lazily. 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AnonPointeeRegion : public TypedRegion { 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class MemRegionManager; 24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sym - the symbol that is concretized. 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SymbolRef Sym; 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Ty - the type of the region. 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch QualType T; 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AnonPointeeRegion(SymbolRef sym, QualType t, MemRegion* sreg) 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : TypedRegion(sreg, AnonPointeeRegionKind), Sym(sym), T(t) {} 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic: 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch QualType getType(ASTContext& C) const; 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef Sym, 25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const MemRegion* superRegion); 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Profile(llvm::FoldingSetNodeID& ID) const { 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProfileRegion(ID, Sym, superRegion); 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool classof(const MemRegion* R) { 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return R->getKind() == AnonPointeeRegionKind; 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/// CompoundLiteralRegion - A memory region representing a compound literal. 27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/// Compound literals are essentially temporaries that are stack allocated 27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/// or in the global constant pool. 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CompoundLiteralRegion : public TypedRegion { 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprivate: 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class MemRegionManager; 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const CompoundLiteralExpr* CL; 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CompoundLiteralRegion(const CompoundLiteralExpr* cl, const MemRegion* sReg) 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : TypedRegion(sReg, CompoundLiteralRegionKind), CL(cl) {} 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void ProfileRegion(llvm::FoldingSetNodeID& ID, 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const CompoundLiteralExpr* CL, 28272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const MemRegion* superRegion); 28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenpublic: 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch QualType getType(ASTContext& C) const { 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return C.getCanonicalType(CL->getType()); 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Profile(llvm::FoldingSetNodeID& ID) const; 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void print(llvm::raw_ostream& os) const; 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 29272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const CompoundLiteralExpr* getLiteralExpr() const { return CL; } 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool classof(const MemRegion* R) { 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return R->getKind() == CompoundLiteralRegionKind; 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DeclRegion : public TypedRegion { 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprotected: 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Decl* D; 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DeclRegion(const Decl* d, const MemRegion* sReg, Kind k) 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : TypedRegion(sReg, k), D(d) {} 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 30772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const MemRegion* superRegion, Kind k); 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic: 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Decl* getDecl() const { return D; } 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Profile(llvm::FoldingSetNodeID& ID) const; 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool classof(const MemRegion* R) { 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unsigned k = R->getKind(); 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return k > BEG_DECL_REGIONS && k < END_DECL_REGIONS; 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass VarRegion : public DeclRegion { 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class MemRegionManager; 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch VarRegion(const VarDecl* vd, const MemRegion* sReg) 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : DeclRegion(vd, sReg, VarRegionKind) {} 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD, 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const MemRegion* superRegion) { 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic: 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const VarDecl* getDecl() const { return cast<VarDecl>(D); } 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch QualType getType(ASTContext& C) const { 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return C.getCanonicalType(getDecl()->getType()); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void print(llvm::raw_ostream& os) const; 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool classof(const MemRegion* R) { 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return R->getKind() == VarRegionKind; 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 3413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FieldRegion : public DeclRegion { 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class MemRegionManager; 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FieldRegion(const FieldDecl* fd, const MemRegion* sReg) 34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : DeclRegion(fd, sReg, FieldRegionKind) {} 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenpublic: 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 35172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void print(llvm::raw_ostream& os) const; 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch QualType getType(ASTContext& C) const { 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return C.getCanonicalType(getDecl()->getType()); 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 35772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 35872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD, 35972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const MemRegion* superRegion) { 36072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static bool classof(const MemRegion* R) { 36472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return R->getKind() == FieldRegionKind; 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 36772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ObjCObjectRegion : public DeclRegion { 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class MemRegionManager; 37172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 37272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ObjCObjectRegion(const ObjCInterfaceDecl* ivd, const MemRegion* sReg) 3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : DeclRegion(ivd, sReg, ObjCObjectRegionKind) {} 3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCInterfaceDecl* ivd, 3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const MemRegion* superRegion) { 3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCObjectRegionKind); 3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickpublic: 3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const ObjCInterfaceDecl* getInterface() const { 38272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return cast<ObjCInterfaceDecl>(D); 3833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 38472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick QualType getType(ASTContext& C) const { 3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ObjCInterfaceDecl* ID = const_cast<ObjCInterfaceDecl*>(getInterface()); 3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return C.getObjCInterfaceType(ID); 3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static bool classof(const MemRegion* R) { 3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return R->getKind() == ObjCObjectRegionKind; 3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass ObjCIvarRegion : public DeclRegion { 3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick friend class MemRegionManager; 39872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ObjCIvarRegion(const ObjCIvarDecl* ivd, const MemRegion* sReg) 40072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd, 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const MemRegion* superRegion) { 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 40672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 40772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenpublic: 40872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 40972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen QualType getType(ASTContext&) const { return getDecl()->getType(); } 41072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool classof(const MemRegion* R) { 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return R->getKind() == ObjCIvarRegionKind; 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 41472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}; 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass ElementRegion : public TypedRegion { 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class MemRegionManager; 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SVal Index; 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ElementRegion(SVal Idx, const MemRegion* sReg) 42272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : TypedRegion(sReg, ElementRegionKind), Index(Idx) { 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch assert((!isa<nonloc::ConcreteInt>(&Idx) || 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cast<nonloc::ConcreteInt>(&Idx)->getValue().isSigned()) && 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "The index must be signed"); 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 42872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx, 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const MemRegion* superRegion); 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic: 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SVal getIndex() const { return Index; } 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen QualType getType(ASTContext&) const; 43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void print(llvm::raw_ostream& os) const; 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Profile(llvm::FoldingSetNodeID& ID) const; 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static bool classof(const MemRegion* R) { 44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return R->getKind() == ElementRegionKind; 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//===----------------------------------------------------------------------===// 44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// MemRegionManager - Factory object for creating regions. 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//===----------------------------------------------------------------------===// 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MemRegionManager { 45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen llvm::BumpPtrAllocator& A; 45272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen llvm::FoldingSet<MemRegion> Regions; 45372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MemSpaceRegion* globals; 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MemSpaceRegion* stack; 456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MemSpaceRegion* heap; 457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MemSpaceRegion* unknown; 458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenpublic: 460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MemRegionManager(llvm::BumpPtrAllocator& a) 461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : A(a), globals(0), stack(0), heap(0), unknown(0) {} 462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ~MemRegionManager() {} 464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /// getStackRegion - Retrieve the memory region associated with the 466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /// current stack frame. 467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MemSpaceRegion* getStackRegion(); 468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /// getGlobalsRegion - Retrieve the memory region associated with 470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /// all global variables. 471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MemSpaceRegion* getGlobalsRegion(); 472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /// getHeapRegion - Retrieve the memory region associated with the 474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /// generic "heap". 475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MemSpaceRegion* getHeapRegion(); 476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /// getUnknownRegion - Retrieve the memory region associated with unknown 478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /// memory space. 479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MemSpaceRegion* getUnknownRegion(); 480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool isGlobalsRegion(const MemRegion* R) { 482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen assert(R); 483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return R == globals; 484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch /// getAllocaRegion - Retrieve a region associated with a call to alloca(). 48772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AllocaRegion* getAllocaRegion(const Expr* Ex, unsigned Cnt); 488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch /// getCompoundLiteralRegion - Retrieve the region associated with a 490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch /// given CompoundLiteral. 49172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CompoundLiteralRegion* 492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch getCompoundLiteralRegion(const CompoundLiteralExpr* CL); 493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. 495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SymbolicRegion* getSymbolicRegion(const SymbolRef sym); 496 497 StringRegion* getStringRegion(const StringLiteral* Str); 498 499 /// getVarRegion - Retrieve or create the memory region associated with 500 /// a specified VarDecl. 501 VarRegion* getVarRegion(const VarDecl* vd); 502 503 ElementRegion* getElementRegion(SVal Idx, const MemRegion* superRegion); 504 505 /// getFieldRegion - Retrieve or create the memory region associated with 506 /// a specified FieldDecl. 'superRegion' corresponds to the containing 507 /// memory region (which typically represents the memory representing 508 /// a structure or class). 509 FieldRegion* getFieldRegion(const FieldDecl* fd, const MemRegion* superRegion); 510 511 /// getObjCObjectRegion - Retrieve or create the memory region associated with 512 /// the instance of a specified Objective-C class. 513 ObjCObjectRegion* getObjCObjectRegion(const ObjCInterfaceDecl* ID, 514 const MemRegion* superRegion); 515 516 /// getObjCIvarRegion - Retrieve or create the memory region associated with 517 /// a specified Objective-c instance variable. 'superRegion' corresponds 518 /// to the containing region (which typically represents the Objective-C 519 /// object). 520 ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd, 521 const MemRegion* superRegion); 522 523 AnonTypedRegion* getAnonTypedRegion(QualType t, const MemRegion* superRegion); 524 525 AnonPointeeRegion* getAnonPointeeRegion(SymbolRef Sym, QualType T); 526 527 bool hasStackStorage(const MemRegion* R); 528 529private: 530 MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region); 531}; 532 533 534 535} // end clang namespace 536#endif 537