void ReachingDefAna::ComputeINOUTWtList(){ map <BasicBlock*,bool> visitedFlag; queue <BasicBlock*> toVisit; for( list<BasicBlock*>::iterator it = pr->get_begin(), end = pr->get_end(); it != end; ++it){ toVisit.push(*it); visitedFlag[*it] = true; } while( !toVisit.empty() ){ BasicBlock* cBB = toVisit.front(); cout << "\n::VISITING " << cBB->getBBLabel() << " ::\n"; toVisit.pop(); visitedFlag[cBB] = false; bitvec in = cBB->getIn(); bitvec out = cBB->getOut(); bitvec tin(in.getSize()); bitvec tout(out.getSize()); for(list<BasicBlock*>::iterator pit = cBB->get_begin_pred(), pend = cBB->get_end_pred(); pit != pend; ++pit){ tin = tin | (*pit)->getOut(); } tout = tin - cBB->getKill(); tout = tout | cBB->getGen(); cBB->setIn(tin); if( out != tout ){ cBB->setOut(tout); for(list<BasicBlock*>::iterator it = cBB->get_begin_succ(), end = cBB->get_end_succ(); it != end; ++it){ if(visitedFlag[*it] == false){ visitedFlag[*it] = true; toVisit.push(*it); } } } printBB(cBB); } string ts("ReachingDefWtList"); createDotFile(ts); }
void ReachingDefAna::createDotFile(string& name){ std::string Filename = "cfg." + name + ".dot"; ofstream ost; ost.open(Filename.c_str()); BasicBlock* succN; ost <<"digraph \"CFG for " << name << "' function\" {\n label=\"CFG for " << name <<"\";\n"; for (list<BasicBlock*>::iterator it = pr->get_begin(), bbie = pr->get_end(); it != bbie; ++it){ BasicBlock* BB = *it; ost << "\nNode" << BB << " [shape=record,label=\"{ Node:"<< BB->getBBLabel() << ": "; printBB(BB,ost); for (list<instruction*>::iterator instit = BB->get_begin_inst(), instend = BB->get_end_inst(); instit != instend; ++instit) { ost << "\\l"; (*instit)->print_instruction(ost); } ost << "}}\"];"; for (list<BasicBlock*>::iterator SI = BB->get_begin_succ(), E = BB->get_end_succ(); SI != E; ++SI) { succN = *SI; ost << "\n"; ost <<"Node" << BB <<" -> "<<"Node" << succN <<";"; } } ost << "}\n"; }