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
diff --git a/include/clang/Analysis/PathSensitive/MemRegion.h b/include/clang/Analysis/PathSensitive/MemRegion.h
index c853a5f..ac158dc 100644
--- a/include/clang/Analysis/PathSensitive/MemRegion.h
+++ b/include/clang/Analysis/PathSensitive/MemRegion.h
@@ -249,7 +249,7 @@
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 @@
return MRMgr.getUnknownRegion();
}
};
-
+
+template<> struct MemRegionManagerTrait<CodeTextRegion> {
+ 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 619d161..9bd93cd 100644
--- a/lib/Analysis/MemRegion.cpp
+++ b/lib/Analysis/MemRegion.cpp
@@ -129,14 +129,14 @@
}
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 @@
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<CodeTextRegion>(data);
-
- if (!R) {
- R = (CodeTextRegion*) A.Allocate<CodeTextRegion>();
- new (R) CodeTextRegion(fd, t, getCodeRegion());
- Regions.InsertNode(R, InsertPos);
- }
-
- return R;
+ return getRegion<CodeTextRegion>(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<CodeTextRegion>(data);
-
- if (!R) {
- R = (CodeTextRegion*) A.Allocate<CodeTextRegion>();
- new (R) CodeTextRegion(sym, t, getCodeRegion());
- Regions.InsertNode(R, InsertPos);
- }
-
- return R;
+ return getRegion<CodeTextRegion>(sym, t);
}
/// getSymbolicRegion - Retrieve or create a "symbolic" memory region.