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

View File

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