Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
void Function::test(){
  int size=(int)_myBB.size();
  for(int i=0;i<size; i++){
    get_BB(i)->test();
  }
  return;
}
Exemple #4
0
void Function::test(){
	
	for(int i=0;i<_myBB.size(); i++){
		get_BB(i)->test();
	}
}
Exemple #5
0
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));	
				}
			}
		}		
	}	
	
}