Basic_block *Function::find_label_BB(OPLabel* label){ Basic_block *BB = new Basic_block(); for(int i=0; i<_myBB.size(); i++){ if(get_BB(i)->get_head()->get_line()->type_line()==line_Lab){ if(!get_BB(i)->get_head()->get_line()->get_content().compare(0, (get_BB(i)->get_head()->get_line()->get_content().size()-1),label->get_op())){ return get_BB(i);} } } return BB; }
Basic_block *Function::find_label_BB(OPLabel* label){ //Basic_block *BB = new Basic_block(); int size=(int)_myBB.size(); string str; for(int i=0; i<size; i++){ if(get_BB(i)->is_labeled()){ str=get_BB(i)->get_head()->get_content(); if(!str.compare(0, (str.size()-1),label->get_op())){ return get_BB(i); } } } return NULL; }
void Function::test(){ int size=(int)_myBB.size(); for(int i=0;i<size; i++){ get_BB(i)->test(); } return; }
void Function::test(){ for(int i=0;i<_myBB.size(); i++){ get_BB(i)->test(); } }
void Function::comput_succ_pred_BB(){ list <Basic_block*> BBtmp; Basic_block * BB = new Basic_block(); /*Calcul des successeurs*/ for(int i=0; i<_myBB.size(); i++){ BB = get_BB(i); if(get_BB(i)->get_end()->get_line()->type_line()==line_Instru){ //si l'instru n'est pas un br alors 1 successeur le BB suivant if(get_BB(i)->get_branch()==NULL && ((i+1) < _myBB.size()) || dynamic_cast< Instruction *> (get_BB(i)->get_branch()->get_line())->get_opcode()==jal || dynamic_cast< Instruction *> (get_BB(i)->get_branch()->get_line())->get_opcode()==jalr ){ BB->set_successor1( get_BB(i+1)); } //si l'instru est un BR inconditiennel 1 successeur le BB pointé par le label else if(dynamic_cast< Instruction *> (get_BB(i)->get_branch()->get_line())->get_opcode()==j){ if(find_label_BB(dynamic_cast< Instruction *> (get_BB(i)->get_branch()->get_line())->get_op1())->get_head()){ //cout<<"coucou1"<<endl; BB->set_successor1(find_label_BB( dynamic_cast< Instruction *> (get_BB(i)->get_branch()->get_line())->get_op1())); } }//cout<<"here too\n";} //si l'instru est un BR conditionnel 2 successeur le BB pointé et le BB suivant else if((dynamic_cast< Instruction *> (get_BB(i)->get_branch()->get_line())->get_opcode()==beq || dynamic_cast< Instruction *> (get_BB(i)->get_branch()->get_line())->get_opcode()==bne) && ((i+1)< _myBB.size())){ if(find_label_BB( dynamic_cast< Instruction *> (get_BB(i)->get_branch()->get_line())->get_op3())->get_head()){ BB->set_successor1(find_label_BB( dynamic_cast< Instruction *> (get_BB(i)->get_branch()->get_line())->get_op3())); } BB->set_successor2(get_BB(i+1)); //cout<<"here too too\n"; } else if(dynamic_cast< Instruction *> (get_BB(i)->get_branch()->get_line())->get_opcode()!=jr && ((i+1)< _myBB.size())){ if(find_label_BB( dynamic_cast< Instruction *> (get_BB(i)->get_branch()->get_line())->get_op2())->get_head()){ BB->set_successor1(find_label_BB( dynamic_cast< Instruction *> (get_BB(i)->get_branch()->get_line())->get_op2())); } BB->set_successor2(get_BB(i+1)); //cout<<"and finaly here too\n"; } //sinon pas de successeur else ; BBtmp.push_back(BB); BB = new Basic_block(); } } _myBB.clear(); list<Basic_block*>::iterator it; it=BBtmp.begin(); for (int i=0; i< BBtmp.size();i++ ){ _myBB.push_back(*it); it++; } /*Calcul des predecesseur*/ for(int i=0;i<_myBB.size(); i++){ for(int j=0; j<_myBB.size(); j++){ //cout<<"nbr de succ de BB"<<j<<" "<<get_BB(j)->get_nbr_succ()<<endl; if(get_BB(j)->get_nbr_succ()){ if(get_BB(i)->get_index() == get_BB(j)->get_successor1()->get_index()){ get_BB(i)->set_predecessor(get_BB(j)); } } if(get_BB(j)->get_nbr_succ()==2){ if(get_BB(i)->get_index() == get_BB(j)->get_successor2()->get_index()){ get_BB(i)->set_predecessor(get_BB(j)); } } } } }