Instead of r74522, use another approach to fix xfail_regionstore_wine_crash.c.

Mark the super region of the binding of block level expr in the Environment
as live.

llvm-svn: 74525
This commit is contained in:
Zhongxing Xu 2009-06-30 13:00:53 +00:00
parent e205d43c75
commit 703db197e3
2 changed files with 11 additions and 3 deletions

View File

@ -143,8 +143,17 @@ EnvironmentManager::RemoveDeadBindings(Environment Env, Stmt* Loc,
SVal X = I.getData();
// If the block expr's value is a memory region, then mark that region.
if (isa<loc::MemRegionVal>(X))
DRoots.push_back(cast<loc::MemRegionVal>(X).getRegion());
if (isa<loc::MemRegionVal>(X)) {
const MemRegion* R = cast<loc::MemRegionVal>(X).getRegion();
DRoots.push_back(R);
// Mark the super region of the RX as live.
// e.g.: int x; char *y = (char*) &x; if (*y) ...
// 'y' => element region. 'x' is its super region.
// We only add one level super region for now.
if (const SubRegion *SR = dyn_cast<SubRegion>(R)) {
DRoots.push_back(SR->getSuperRegion());
}
}
// Mark all symbols in the block expr's value live.
MarkLiveCallback cb(SymReaper);

View File

@ -138,7 +138,6 @@ void TransferFuncs::Visit(Stmt *S) {
else {
// For block-level expressions, mark that they are live.
LiveState(S,AD) = Alive;
StmtVisitor<TransferFuncs,void>::Visit(S);
}
}