Example #1
0
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);
}
Example #2
0
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";
}