From 0dea5241bca707789d706ed1fda3a29a8fedc4c0 Mon Sep 17 00:00:00 2001 From: Zhongxing Xu Date: Tue, 23 Jun 2009 03:50:30 +0000 Subject: [PATCH] MemRegionManager: Migrate logic for getCodeTextRegion() over to using trait-based MemRegion creation. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73941 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../clang/Analysis/PathSensitive/MemRegion.h | 15 +++++++-- lib/Analysis/MemRegion.cpp | 32 +++---------------- 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/include/clang/Analysis/PathSensitive/MemRegion.h b/include/clang/Analysis/PathSensitive/MemRegion.h index c853a5fa86..ac158dc88f 100644 --- a/include/clang/Analysis/PathSensitive/MemRegion.h +++ b/include/clang/Analysis/PathSensitive/MemRegion.h @@ -249,7 +249,7 @@ public: void Profile(llvm::FoldingSetNodeID& ID) const; static void ProfileRegion(llvm::FoldingSetNodeID& ID, - const void* data, QualType t); + const void* data, QualType t, const MemRegion*); static bool classof(const MemRegion* R) { return R->getKind() == CodeTextRegionKind; @@ -793,7 +793,18 @@ template <> struct MemRegionManagerTrait { return MRMgr.getUnknownRegion(); } }; - + +template<> struct MemRegionManagerTrait { + typedef MemSpaceRegion SuperRegionTy; + static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr, + const FunctionDecl*, QualType) { + return MRMgr.getCodeRegion(); + } + static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr, + SymbolRef, QualType) { + return MRMgr.getCodeRegion(); + } +}; } // end clang namespace diff --git a/lib/Analysis/MemRegion.cpp b/lib/Analysis/MemRegion.cpp index 619d1617d0..9bd93cd6eb 100644 --- a/lib/Analysis/MemRegion.cpp +++ b/lib/Analysis/MemRegion.cpp @@ -129,14 +129,14 @@ void ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const { } void CodeTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, const void* data, - QualType t) { + QualType t, const MemRegion*) { ID.AddInteger(MemRegion::CodeTextRegionKind); ID.AddPointer(data); ID.Add(t); } void CodeTextRegion::Profile(llvm::FoldingSetNodeID& ID) const { - CodeTextRegion::ProfileRegion(ID, Data, LocationType); + CodeTextRegion::ProfileRegion(ID, Data, LocationType, superRegion); } //===----------------------------------------------------------------------===// @@ -275,35 +275,11 @@ MemRegionManager::getElementRegion(QualType elementType, SVal Idx, CodeTextRegion* MemRegionManager::getCodeTextRegion(const FunctionDecl* fd, QualType t) { - llvm::FoldingSetNodeID ID; - CodeTextRegion::ProfileRegion(ID, fd, t); - void* InsertPos; - MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos); - CodeTextRegion* R = cast_or_null(data); - - if (!R) { - R = (CodeTextRegion*) A.Allocate(); - new (R) CodeTextRegion(fd, t, getCodeRegion()); - Regions.InsertNode(R, InsertPos); - } - - return R; + return getRegion(fd, t); } CodeTextRegion* MemRegionManager::getCodeTextRegion(SymbolRef sym, QualType t) { - llvm::FoldingSetNodeID ID; - CodeTextRegion::ProfileRegion(ID, sym, t); - void* InsertPos; - MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos); - CodeTextRegion* R = cast_or_null(data); - - if (!R) { - R = (CodeTextRegion*) A.Allocate(); - new (R) CodeTextRegion(sym, t, getCodeRegion()); - Regions.InsertNode(R, InsertPos); - } - - return R; + return getRegion(sym, t); } /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. -- 2.40.0