For inline-based inter-procedural analysis, we will have multiple stack space regions. Use a dense map to store them.

llvm-svn: 96472
This commit is contained in:
Zhongxing Xu 2010-02-17 08:46:50 +00:00
parent 86bab2cddd
commit daf4616455
2 changed files with 21 additions and 18 deletions

View File

@ -798,11 +798,10 @@ class MemRegionManager {
GlobalsSpaceRegion *globals;
const StackFrameContext *cachedStackLocalsFrame;
StackLocalsSpaceRegion *cachedStackLocalsRegion;
const StackFrameContext *cachedStackArgumentsFrame;
StackArgumentsSpaceRegion *cachedStackArgumentsRegion;
llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *>
StackLocalsSpaceRegions;
llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *>
StackArgumentsSpaceRegions;
HeapSpaceRegion *heap;
UnknownSpaceRegion *unknown;
@ -810,10 +809,7 @@ class MemRegionManager {
public:
MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a)
: C(c), A(a), globals(0),
cachedStackLocalsFrame(0), cachedStackLocalsRegion(0),
cachedStackArgumentsFrame(0), cachedStackArgumentsRegion(0),
heap(0), unknown(0), code(0) {}
: C(c), A(a), globals(0), heap(0), unknown(0), code(0) {}
~MemRegionManager();

View File

@ -419,20 +419,27 @@ const REG *MemRegionManager::LazyAllocate(REG*& region, ARG a) {
const StackLocalsSpaceRegion*
MemRegionManager::getStackLocalsRegion(const StackFrameContext *STC) {
assert(STC);
if (STC == cachedStackLocalsFrame)
return cachedStackLocalsRegion;
cachedStackLocalsFrame = STC;
return LazyAllocate(cachedStackLocalsRegion, STC);
StackLocalsSpaceRegion *&R = StackLocalsSpaceRegions[STC];
if (R)
return R;
R = A.Allocate<StackLocalsSpaceRegion>();
new (R) StackLocalsSpaceRegion(this, STC);
return R;
}
const StackArgumentsSpaceRegion *
MemRegionManager::getStackArgumentsRegion(const StackFrameContext *STC) {
assert(STC);
if (STC == cachedStackArgumentsFrame)
return cachedStackArgumentsRegion;
cachedStackArgumentsFrame = STC;
return LazyAllocate(cachedStackArgumentsRegion, STC);
StackArgumentsSpaceRegion *&R = StackArgumentsSpaceRegions[STC];
if (R)
return R;
R = A.Allocate<StackArgumentsSpaceRegion>();
new (R) StackArgumentsSpaceRegion(this, STC);
return R;
}
const GlobalsSpaceRegion *MemRegionManager::getGlobalsRegion() {