MemRegion.h revision 9e24049bef26b6289cce9ac9b483c5cbb096e3ae
19e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//== MemRegion.h - Abstract memory regions for static analysis --*- C++ -*--==// 29e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 39e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// The LLVM Compiler Infrastructure 49e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 59e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// This file is distributed under the University of Illinois Open Source 69e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// License. See LICENSE.TXT for details. 79e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 89e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 99e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// This file defines MemRegion and its subclasses. MemRegion defines a 119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// partially-typed abstraction of memory useful for path-sensitive dataflow 129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// analyses. 139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// 149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#ifndef LLVM_CLANG_ANALYSIS_MEMREGION_H 179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#define LLVM_CLANG_ANALYSIS_MEMREGION_H 189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Casting.h" 209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/ADT/FoldingSet.h" 219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "llvm/Support/Allocator.h" 229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "clang/AST/Decl.h" 239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "clang/AST/DeclObjC.h" 249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <string> 259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace llvm { class raw_ostream; } 279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace clang { 299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager; 319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemRegion - The root abstract class for all memory regions. 349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegion : public llvm::FoldingSetNode { 359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek enum Kind { MemSpaceRegionKind, 379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // Typed regions. 389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek BEG_TYPED_REGIONS, 399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek VarRegionKind, FieldRegionKind, ObjCIvarRegionKind, 409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek AnonTypedRegionKind, 419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek END_TYPED_REGIONS }; 429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Kind kind; 449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion(Kind k) : kind(k) {} 479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~MemRegion(); 489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // virtual MemExtent getExtent(MemRegionManager& mrm) const = 0; 519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual const MemRegion* getSuperRegion() const = 0; 529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void Profile(llvm::FoldingSetNodeID& ID) const = 0; 539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek std::string getString() const; 559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void print(llvm::raw_ostream& os) const; 569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek Kind getKind() const { return kind; } 589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion*) { return true; } 599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// MemSpaceRegion - A memory region that represents and "memory space"; 629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// for example, the set of global variables, the stack frame, etc. 639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemSpaceRegion : public MemRegion { 649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion() : MemRegion(MemSpaceRegionKind) {} 669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek //RegionExtent getExtent() const { return UndefinedExtent(); } 699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return 0; 729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek //static void ProfileRegion(llvm::FoldingSetNodeID& ID); 759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == MemSpaceRegionKind; 799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// TypedRegion - An abstract class representing regions that are typed. 839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass TypedRegion : public MemRegion { 849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion; 869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek TypedRegion(const MemRegion* sReg, Kind k) 889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : MemRegion(k), superRegion(sReg) {}; 899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual QualType getType() const = 0; 929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // MemExtent getExtent(MemRegionManager& mrm) const; 949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* getSuperRegion() const { 959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return superRegion; 969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned k = R->getKind(); 1009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return k > BEG_TYPED_REGIONS && k < END_TYPED_REGIONS; 1019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// AnonTypedRegion - An "anonymous" region that simply types a chunk 1059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/// of memory. 1069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass AnonTypedRegion : public TypedRegion { 1079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek QualType T; 1089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 1109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek AnonTypedRegion(QualType t, MemRegion* sreg) 1129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sreg, AnonTypedRegionKind), T(t) {} 1139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T, 1159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion); 1169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek QualType getType() const { return T; } 1199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 1229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 1249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == AnonTypedRegionKind; 1259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DeclRegion : public TypedRegion { 1299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprotected: 1309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const Decl* D; 1319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion(const Decl* d, MemRegion* sReg, Kind k) 1339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : TypedRegion(sReg, k), D(d) {} 1349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D, 1369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion, Kind k); 1379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void Profile(llvm::FoldingSetNodeID& ID) const; 1409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VarRegion : public DeclRegion { 1439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 1449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek VarRegion(const VarDecl* vd, MemRegion* sReg) 1469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(vd, sReg, VarRegionKind) {} 1479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, VarDecl* VD, 1499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 1509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, VD, superRegion, VarRegionKind); 1519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const VarDecl* getDecl() const { return cast<VarDecl>(D); } 1559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek QualType getType() const { return getDecl()->getType(); } 1569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void print(llvm::raw_ostream& os) const; 1589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 1609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == VarRegionKind; 1619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass FieldRegion : public DeclRegion { 1659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 1669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek FieldRegion(const FieldDecl* fd, MemRegion* sReg) 1689e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(fd, sReg, FieldRegionKind) {} 1699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, FieldDecl* FD, 1719e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 1729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, FD, superRegion, FieldRegionKind); 1739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1759e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1769e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const FieldDecl* getDecl() const { return cast<FieldDecl>(D); } 1779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek QualType getType() const { return getDecl()->getType(); } 1789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 1809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == FieldRegionKind; 1819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 1839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass ObjCIvarRegion : public DeclRegion { 1859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek friend class MemRegionManager; 1879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ObjCIvarRegion(const ObjCIvarDecl* ivd, MemRegion* sReg) 1899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : DeclRegion(ivd, sReg, ObjCIvarRegionKind) {} 1909e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1919e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static void ProfileRegion(llvm::FoldingSetNodeID& ID, ObjCIvarDecl* ivd, 1929e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const MemRegion* superRegion) { 1939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek DeclRegion::ProfileRegion(ID, ivd, superRegion, ObjCIvarRegionKind); 1949e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 1959e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 1979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const ObjCIvarDecl* getDecl() const { return cast<ObjCIvarDecl>(D); } 1989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek QualType getType() const { return getDecl()->getType(); } 1999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek static bool classof(const MemRegion* R) { 2019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return R->getKind() == ObjCIvarRegionKind; 2029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2039e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2049e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 2069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// MemRegionManager - Factory object for creating regions. 2079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek//===----------------------------------------------------------------------===// 2089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass MemRegionManager { 2109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::BumpPtrAllocator& A; 2119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek llvm::FoldingSet<MemRegion> Regions; 2129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* globals; 2149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* stack; 2159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* heap; 2169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekpublic: 2189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegionManager(llvm::BumpPtrAllocator& a) 2199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : A(a), globals(0), stack(0), heap(0) {} 2209e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2219e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ~MemRegionManager() {} 2229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2239e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getStackRegion - Retrieve the memory region associated with the 2249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// current stack frame. 2259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getStackRegion(); 2269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getGlobalsRegion - Retrieve the memory region associated with 2289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// all global variables. 2299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getGlobalsRegion(); 2309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getHeapRegion - Retrieve the memory region associated with the 2329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// generic "heap". 2339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* getHeapRegion(); 2349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getVarRegion - Retrieve or create the memory region associated with 2369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified VarDecl. 'superRegion' corresponds to the containing 2379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region, and 'off' is the offset within the containing region. 2389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek VarRegion* getVarRegion(const VarDecl* vd, MemRegion* superRegion); 2399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek VarRegion* getVarRegion(const VarDecl* vd) { 2419e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek return getVarRegion(vd, vd->hasLocalStorage() ? getStackRegion() 2429e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek : getGlobalsRegion()); 2439e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek } 2449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getFieldRegion - Retrieve or create the memory region associated with 2469e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified FieldDecl. 'superRegion' corresponds to the containing 2479e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// memory region (which typically represents the memory representing 2489e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a structure or class). 2499e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek FieldRegion* getFieldRegion(const FieldDecl* fd, MemRegion* superRegion); 2509e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// getObjCIvarRegion - Retrieve or create the memory region associated with 2529e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// a specified Objective-c instance variable. 'superRegion' corresponds 2539e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// to the containing region (which typically represents the Objective-C 2549e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /// object). 2559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd, 2569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemRegion* superRegion); 2579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek bool hasStackStorage(const MemRegion* R); 2599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekprivate: 2619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region); 2629e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 2639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 2669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} // end clang namespace 2679e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#endif 268