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:
parent
86bab2cddd
commit
daf4616455
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
|
|
||||||
cachedStackArgumentsFrame = STC;
|
if (R)
|
||||||
return LazyAllocate(cachedStackArgumentsRegion, STC);
|
return R;
|
||||||
|
|
||||||
|
R = A.Allocate<StackArgumentsSpaceRegion>();
|
||||||
|
new (R) StackArgumentsSpaceRegion(this, STC);
|
||||||
|
return R;
|
||||||
}
|
}
|
||||||
|
|
||||||
const GlobalsSpaceRegion *MemRegionManager::getGlobalsRegion() {
|
const GlobalsSpaceRegion *MemRegionManager::getGlobalsRegion() {
|
||||||
|
|
Loading…
Reference in New Issue