diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2008-10-25 14:13:41 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2008-10-25 14:13:41 +0000 |
commit | d1aac353e5f0388ff40f6fdc78bbc474d45b5de3 (patch) | |
tree | 29a1f567ee9e3bb86079ecde6e3c731dd339d717 /clang/lib/Analysis/MemRegion.cpp | |
parent | 80422b07c52486ffca6b70ccfec02b97d30d068b (diff) | |
download | bcm5719-llvm-d1aac353e5f0388ff40f6fdc78bbc474d45b5de3.tar.gz bcm5719-llvm-d1aac353e5f0388ff40f6fdc78bbc474d45b5de3.zip |
Add StringRegion to MemRegions.
llvm-svn: 58137
Diffstat (limited to 'clang/lib/Analysis/MemRegion.cpp')
-rw-r--r-- | clang/lib/Analysis/MemRegion.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/clang/lib/Analysis/MemRegion.cpp b/clang/lib/Analysis/MemRegion.cpp index 5dad3560f0a..f14e0cba447 100644 --- a/clang/lib/Analysis/MemRegion.cpp +++ b/clang/lib/Analysis/MemRegion.cpp @@ -25,6 +25,14 @@ void MemSpaceRegion::Profile(llvm::FoldingSetNodeID& ID) const { ID.AddInteger((unsigned)getKind()); } +void StringRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, + const StringLiteral* Str, + const MemRegion* superRegion) { + ID.AddInteger((unsigned) StringRegionKind); + ID.AddPointer(Str); + ID.AddPointer(superRegion); +} + void AnonTypedRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T, const MemRegion* superRegion) { ID.AddInteger((unsigned) AnonTypedRegionKind); @@ -138,6 +146,25 @@ MemSpaceRegion* MemRegionManager::getUnknownRegion() { return LazyAllocate(unknown); } +StringRegion* MemRegionManager::getStringRegion(const StringLiteral* Str) { + llvm::FoldingSetNodeID ID; + MemSpaceRegion* GlobalsR = getGlobalsRegion(); + + StringRegion::ProfileRegion(ID, Str, GlobalsR); + + void* InsertPos; + MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos); + StringRegion* R = cast_or_null<StringRegion>(data); + + if (!R) { + R = (StringRegion*) A.Allocate<StringRegion>(); + new (R) StringRegion(Str, GlobalsR); + Regions.InsertNode(R, InsertPos); + } + + return R; +} + VarRegion* MemRegionManager::getVarRegion(const VarDecl* d, const MemRegion* superRegion) { llvm::FoldingSetNodeID ID; |