Add a separate MemSpaceRegion for function/method arguments passed on the stack.
This will simplify the logic of StoreManagers that want to specially reason about the values of parameters. llvm-svn: 74715
This commit is contained in:
parent
0a2c458ae0
commit
7e4a9a02c3
|
@ -583,15 +583,17 @@ class MemRegionManager {
|
|||
llvm::BumpPtrAllocator& A;
|
||||
llvm::FoldingSet<MemRegion> Regions;
|
||||
|
||||
MemSpaceRegion* globals;
|
||||
MemSpaceRegion* stack;
|
||||
MemSpaceRegion* heap;
|
||||
MemSpaceRegion* unknown;
|
||||
MemSpaceRegion* code;
|
||||
MemSpaceRegion *globals;
|
||||
MemSpaceRegion *stack;
|
||||
MemSpaceRegion *stackArguments;
|
||||
MemSpaceRegion *heap;
|
||||
MemSpaceRegion *unknown;
|
||||
MemSpaceRegion *code;
|
||||
|
||||
public:
|
||||
MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a)
|
||||
: C(c), A(a), globals(0), stack(0), heap(0), unknown(0), code(0) {}
|
||||
: C(c), A(a), globals(0), stack(0), stackArguments(0), heap(0),
|
||||
unknown(0), code(0) {}
|
||||
|
||||
~MemRegionManager() {}
|
||||
|
||||
|
@ -599,24 +601,28 @@ public:
|
|||
|
||||
/// getStackRegion - Retrieve the memory region associated with the
|
||||
/// current stack frame.
|
||||
MemSpaceRegion* getStackRegion();
|
||||
MemSpaceRegion *getStackRegion();
|
||||
|
||||
/// getStackArgumentsRegion - Retrieve the memory region associated with
|
||||
/// function/method arguments of the current stack frame.
|
||||
MemSpaceRegion *getStackArgumentsRegion();
|
||||
|
||||
/// getGlobalsRegion - Retrieve the memory region associated with
|
||||
/// all global variables.
|
||||
MemSpaceRegion* getGlobalsRegion();
|
||||
MemSpaceRegion *getGlobalsRegion();
|
||||
|
||||
/// getHeapRegion - Retrieve the memory region associated with the
|
||||
/// generic "heap".
|
||||
MemSpaceRegion* getHeapRegion();
|
||||
MemSpaceRegion *getHeapRegion();
|
||||
|
||||
/// getUnknownRegion - Retrieve the memory region associated with unknown
|
||||
/// memory space.
|
||||
MemSpaceRegion* getUnknownRegion();
|
||||
MemSpaceRegion *getUnknownRegion();
|
||||
|
||||
MemSpaceRegion* getCodeRegion();
|
||||
MemSpaceRegion *getCodeRegion();
|
||||
|
||||
/// getAllocaRegion - Retrieve a region associated with a call to alloca().
|
||||
AllocaRegion* getAllocaRegion(const Expr* Ex, unsigned Cnt);
|
||||
AllocaRegion *getAllocaRegion(const Expr* Ex, unsigned Cnt);
|
||||
|
||||
/// getCompoundLiteralRegion - Retrieve the region associated with a
|
||||
/// given CompoundLiteral.
|
||||
|
@ -784,8 +790,12 @@ template <> struct MemRegionManagerTrait<VarRegion> {
|
|||
typedef MemRegion SuperRegionTy;
|
||||
static const SuperRegionTy* getSuperRegion(MemRegionManager& MRMgr,
|
||||
const VarDecl *d) {
|
||||
return d->hasLocalStorage() ? MRMgr.getStackRegion()
|
||||
: MRMgr.getGlobalsRegion();
|
||||
if (d->hasLocalStorage()) {
|
||||
return isa<ParmVarDecl>(d) || isa<ImplicitParamDecl>(d)
|
||||
? MRMgr.getStackArgumentsRegion() : MRMgr.getStackRegion();
|
||||
}
|
||||
|
||||
return MRMgr.getGlobalsRegion();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -223,6 +223,10 @@ MemSpaceRegion* MemRegionManager::getStackRegion() {
|
|||
return LazyAllocate(stack);
|
||||
}
|
||||
|
||||
MemSpaceRegion* MemRegionManager::getStackArgumentsRegion() {
|
||||
return LazyAllocate(stackArguments);
|
||||
}
|
||||
|
||||
MemSpaceRegion* MemRegionManager::getGlobalsRegion() {
|
||||
return LazyAllocate(globals);
|
||||
}
|
||||
|
@ -332,8 +336,10 @@ const MemSpaceRegion *MemRegion::getMemorySpace() const {
|
|||
}
|
||||
|
||||
bool MemRegion::hasStackStorage() const {
|
||||
if (const MemSpaceRegion *MS = getMemorySpace())
|
||||
return MS == getMemRegionManager()->getStackRegion();
|
||||
if (const MemSpaceRegion *MS = getMemorySpace()) {
|
||||
MemRegionManager *Mgr = getMemRegionManager();
|
||||
return MS == Mgr->getStackRegion() || MS == Mgr->getStackArgumentsRegion();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -348,7 +354,9 @@ bool MemRegion::hasHeapStorage() const {
|
|||
bool MemRegion::hasHeapOrStackStorage() const {
|
||||
if (const MemSpaceRegion *MS = getMemorySpace()) {
|
||||
MemRegionManager *Mgr = getMemRegionManager();
|
||||
return MS == Mgr->getHeapRegion() || MS == Mgr->getStackRegion();
|
||||
return MS == Mgr->getHeapRegion()
|
||||
|| MS == Mgr->getStackRegion()
|
||||
|| MS == Mgr->getStackArgumentsRegion();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue