/// \brief Resolves the whole graph void OffsetBasedAliasAnalysis::resolveWholeGraph() { std::deque<OffsetPointer*> dq; for(auto i : offset_pointers) i.second->color = 0; for(auto i : offset_pointers) { if(i.second->getPointerType() != OffsetPointer::Cont and i.second->color == 0) { DFS_visit_t(i.second, &dq); } } while(!dq.empty()) { OffsetPointer* rp = dq.front(); dq.pop_front(); std::deque<Address*> ad; std::set<Address*> fn; for(auto j = rp->addr_begin(), je = rp->addr_end(); j != je; j++) ad.push_front(*j); while(!ad.empty()) { Address* addr = ad.front(); ad.pop_front(); if(addr->getBase() == addr->getAddressee()) { //if the base is the very addressee, then we have a meaningless loop delete addr; } else if(addr->getBase()->getPointerType() == OffsetPointer::Phi or addr->getBase()->getPointerType() == OffsetPointer::Cont) { //if its a phi or a continuous pointer there must be expansion addr->Expand(ad, fn); } else { //if its not a phi or a continuous pointer there's nothing more to // be done fn.insert(addr); } } } }
// Resolves the whole graph void RangeBasedPointerAnalysis::resolveWholeGraph() { std::deque<RangedPointer*> dq; for(auto i : RangedPointers) i.second->color = 0; for(auto i : RangedPointers) { if(i.second->getPointerType() != RangedPointer::Cont and i.second->color == 0) { DFS_visit(i.second, &dq); } } /*std::cout << "Expanded sizes:\n"; for(auto i : RangedPointers) { for(auto j : i.second->Addresses) { std::cout << j->expanded.size(); if(j->expanded.find(i.second) != j->expanded.end()) std::cout << "SIM "; else std::cout << "NAO "; } std::cout << "\n"; } int n; std::cin >> n; */ while(!dq.empty()) { RangedPointer* rp = dq.front(); dq.pop_front(); std::deque<Address*> ad; std::set<Address*> fn; for(auto j = rp->addr_begin(), je = rp->addr_end(); j != je; j++) ad.push_front(*j); while(!ad.empty()) { Address* addr = ad.front(); ad.pop_front(); if(addr->getBase() == addr->getAddressee()) { delete addr; } else if(addr->getBase()->getPointerType() == RangedPointer::Phi or addr->getBase()->getPointerType() == RangedPointer::Cont) { //std::cout << "expand "; addr->Expand(ad, fn); } else { //std::cout << "insert\n"; fn.insert(addr); } } } }