From 511191ce8920160525611be2be754c32a0724c3e Mon Sep 17 00:00:00 2001 From: Zhongxing Xu Date: Tue, 21 Oct 2008 05:27:10 +0000 Subject: [PATCH] Add ElementRegion to represent memory chunks for array elements. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57891 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../clang/Analysis/PathSensitive/MemRegion.h | 30 +++++++++++++++++-- lib/Analysis/MemRegion.cpp | 28 +++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/include/clang/Analysis/PathSensitive/MemRegion.h b/include/clang/Analysis/PathSensitive/MemRegion.h index 69e4abb7bd..ed9c6e2bd4 100644 --- a/include/clang/Analysis/PathSensitive/MemRegion.h +++ b/include/clang/Analysis/PathSensitive/MemRegion.h @@ -19,6 +19,7 @@ #include "clang/AST/Decl.h" #include "clang/AST/DeclObjC.h" #include "clang/Analysis/PathSensitive/SymbolManager.h" +#include "clang/Analysis/PathSensitive/RValues.h" #include "llvm/Support/Casting.h" #include "llvm/ADT/FoldingSet.h" #include "llvm/Support/Allocator.h" @@ -37,7 +38,8 @@ public: enum Kind { MemSpaceRegionKind, SymbolicRegionKind, // Typed regions. BEG_TYPED_REGIONS, - VarRegionKind, FieldRegionKind, ObjCIvarRegionKind, + VarRegionKind, FieldRegionKind, ElementRegionKind, + ObjCIvarRegionKind, AnonTypedRegionKind, AnonPointeeRegionKind, END_TYPED_REGIONS }; private: @@ -257,7 +259,27 @@ public: return R->getKind() == ObjCIvarRegionKind; } }; - + +class ElementRegion : public SubRegion { + friend class MemRegionManager; + + SVal Index; + + ElementRegion(SVal Idx, const MemRegion* sReg) + : SubRegion(sReg, ElementRegionKind), Index(Idx) {} + + static void ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx, + const MemRegion* superRegion); + +public: + + void Profile(llvm::FoldingSetNodeID& ID) const; + + static bool classof(const MemRegion* R) { + return R->getKind() == ElementRegionKind; + } +}; + //===----------------------------------------------------------------------===// // MemRegionManager - Factory object for creating regions. //===----------------------------------------------------------------------===// @@ -305,7 +327,9 @@ public: return getVarRegion(vd, vd->hasLocalStorage() ? getStackRegion() : getGlobalsRegion()); } - + + ElementRegion* getElementRegion(SVal Idx, const MemRegion* superRegion); + /// getFieldRegion - Retrieve or create the memory region associated with /// a specified FieldDecl. 'superRegion' corresponds to the containing /// memory region (which typically represents the memory representing diff --git a/lib/Analysis/MemRegion.cpp b/lib/Analysis/MemRegion.cpp index d8efef2e67..cae053f595 100644 --- a/lib/Analysis/MemRegion.cpp +++ b/lib/Analysis/MemRegion.cpp @@ -65,6 +65,16 @@ void SymbolicRegion::Profile(llvm::FoldingSetNodeID& ID) const { SymbolicRegion::ProfileRegion(ID, sym); } +void ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx, + const MemRegion* superRegion) { + ID.AddInteger(MemRegion::ElementRegionKind); + ID.AddPointer(superRegion); + Idx.Profile(ID); +} + +void ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const { + ElementRegion::ProfileRegion(ID, Index, superRegion); +} //===----------------------------------------------------------------------===// // Region pretty-printing. //===----------------------------------------------------------------------===// @@ -141,6 +151,24 @@ VarRegion* MemRegionManager::getVarRegion(const VarDecl* d, return R; } +ElementRegion* MemRegionManager::getElementRegion(SVal Idx, + const MemRegion* superRegion){ + llvm::FoldingSetNodeID ID; + ElementRegion::ProfileRegion(ID, Idx, superRegion); + + void* InsertPos; + MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos); + ElementRegion* R = cast_or_null(data); + + if (!R) { + R = (ElementRegion*) A.Allocate(); + new (R) ElementRegion(Idx, superRegion); + Regions.InsertNode(R, InsertPos); + } + + return R; +} + /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. SymbolicRegion* MemRegionManager::getSymbolicRegion(const SymbolID sym) { -- 2.40.0