Changeset View
Changeset View
Standalone View
Standalone View
cfe/trunk/lib/StaticAnalyzer/Core/SymbolManager.cpp
Show First 20 Lines • Show All 109 Lines • ▼ Show 20 Lines | SymbolRef SymExpr::symbol_iterator::operator*() { | ||||
assert(!itr.empty() && "attempting to dereference an 'end' iterator"); | assert(!itr.empty() && "attempting to dereference an 'end' iterator"); | ||||
return itr.back(); | return itr.back(); | ||||
} | } | ||||
void SymExpr::symbol_iterator::expand() { | void SymExpr::symbol_iterator::expand() { | ||||
const SymExpr *SE = itr.pop_back_val(); | const SymExpr *SE = itr.pop_back_val(); | ||||
switch (SE->getKind()) { | switch (SE->getKind()) { | ||||
case SymExpr::RegionValueKind: | case SymExpr::SymbolRegionValueKind: | ||||
case SymExpr::ConjuredKind: | case SymExpr::SymbolConjuredKind: | ||||
case SymExpr::DerivedKind: | case SymExpr::SymbolDerivedKind: | ||||
case SymExpr::ExtentKind: | case SymExpr::SymbolExtentKind: | ||||
case SymExpr::MetadataKind: | case SymExpr::SymbolMetadataKind: | ||||
return; | return; | ||||
case SymExpr::CastSymbolKind: | case SymExpr::SymbolCastKind: | ||||
itr.push_back(cast<SymbolCast>(SE)->getOperand()); | itr.push_back(cast<SymbolCast>(SE)->getOperand()); | ||||
return; | return; | ||||
case SymExpr::SymIntKind: | case SymExpr::SymIntExprKind: | ||||
itr.push_back(cast<SymIntExpr>(SE)->getLHS()); | itr.push_back(cast<SymIntExpr>(SE)->getLHS()); | ||||
return; | return; | ||||
case SymExpr::IntSymKind: | case SymExpr::IntSymExprKind: | ||||
itr.push_back(cast<IntSymExpr>(SE)->getRHS()); | itr.push_back(cast<IntSymExpr>(SE)->getRHS()); | ||||
return; | return; | ||||
case SymExpr::SymSymKind: { | case SymExpr::SymSymExprKind: { | ||||
const SymSymExpr *x = cast<SymSymExpr>(SE); | const SymSymExpr *x = cast<SymSymExpr>(SE); | ||||
itr.push_back(x->getLHS()); | itr.push_back(x->getLHS()); | ||||
itr.push_back(x->getRHS()); | itr.push_back(x->getRHS()); | ||||
return; | return; | ||||
} | } | ||||
} | } | ||||
llvm_unreachable("unhandled expansion case"); | llvm_unreachable("unhandled expansion case"); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 311 Lines • ▼ Show 20 Lines | bool SymbolReaper::isLive(SymbolRef sym) { | ||||
if (TheLiving.count(sym)) { | if (TheLiving.count(sym)) { | ||||
markDependentsLive(sym); | markDependentsLive(sym); | ||||
return true; | return true; | ||||
} | } | ||||
bool KnownLive; | bool KnownLive; | ||||
switch (sym->getKind()) { | switch (sym->getKind()) { | ||||
case SymExpr::RegionValueKind: | case SymExpr::SymbolRegionValueKind: | ||||
KnownLive = isLiveRegion(cast<SymbolRegionValue>(sym)->getRegion()); | KnownLive = isLiveRegion(cast<SymbolRegionValue>(sym)->getRegion()); | ||||
break; | break; | ||||
case SymExpr::ConjuredKind: | case SymExpr::SymbolConjuredKind: | ||||
KnownLive = false; | KnownLive = false; | ||||
break; | break; | ||||
case SymExpr::DerivedKind: | case SymExpr::SymbolDerivedKind: | ||||
KnownLive = isLive(cast<SymbolDerived>(sym)->getParentSymbol()); | KnownLive = isLive(cast<SymbolDerived>(sym)->getParentSymbol()); | ||||
break; | break; | ||||
case SymExpr::ExtentKind: | case SymExpr::SymbolExtentKind: | ||||
KnownLive = isLiveRegion(cast<SymbolExtent>(sym)->getRegion()); | KnownLive = isLiveRegion(cast<SymbolExtent>(sym)->getRegion()); | ||||
break; | break; | ||||
case SymExpr::MetadataKind: | case SymExpr::SymbolMetadataKind: | ||||
KnownLive = MetadataInUse.count(sym) && | KnownLive = MetadataInUse.count(sym) && | ||||
isLiveRegion(cast<SymbolMetadata>(sym)->getRegion()); | isLiveRegion(cast<SymbolMetadata>(sym)->getRegion()); | ||||
if (KnownLive) | if (KnownLive) | ||||
MetadataInUse.erase(sym); | MetadataInUse.erase(sym); | ||||
break; | break; | ||||
case SymExpr::SymIntKind: | case SymExpr::SymIntExprKind: | ||||
KnownLive = isLive(cast<SymIntExpr>(sym)->getLHS()); | KnownLive = isLive(cast<SymIntExpr>(sym)->getLHS()); | ||||
break; | break; | ||||
case SymExpr::IntSymKind: | case SymExpr::IntSymExprKind: | ||||
KnownLive = isLive(cast<IntSymExpr>(sym)->getRHS()); | KnownLive = isLive(cast<IntSymExpr>(sym)->getRHS()); | ||||
break; | break; | ||||
case SymExpr::SymSymKind: | case SymExpr::SymSymExprKind: | ||||
KnownLive = isLive(cast<SymSymExpr>(sym)->getLHS()) && | KnownLive = isLive(cast<SymSymExpr>(sym)->getLHS()) && | ||||
isLive(cast<SymSymExpr>(sym)->getRHS()); | isLive(cast<SymSymExpr>(sym)->getRHS()); | ||||
break; | break; | ||||
case SymExpr::CastSymbolKind: | case SymExpr::SymbolCastKind: | ||||
KnownLive = isLive(cast<SymbolCast>(sym)->getOperand()); | KnownLive = isLive(cast<SymbolCast>(sym)->getOperand()); | ||||
break; | break; | ||||
} | } | ||||
if (KnownLive) | if (KnownLive) | ||||
markLive(sym); | markLive(sym); | ||||
return KnownLive; | return KnownLive; | ||||
▲ Show 20 Lines • Show All 63 Lines • Show Last 20 Lines |