Ejemplo n.º 1
0
void Function::comput_succ_pred_BB(){
  
  list<Basic_block*>::iterator it, it2;
  Basic_block *current;
  Instruction *instr;
  Basic_block *succ=NULL;
  // IMPORTANT ne pas enlever la ligne ci-dessous 
  if (BB_pred_succ) return;
  int size= (int) _myBB.size();
  it=_myBB.begin();
  current=*it;
  cout<<"debut comput succ pred bb"<<endl;

  for (int i=0; i<size; i++){
    current=*it;
    it2 = it;
    
    instr = (Instruction*)current->get_branch();

    if(instr != NULL) {
      if(instr->get_opcode() != j && instr->get_opcode() != jal && instr->get_opcode() != jalr  && instr->get_opcode() != jr){

	Basic_block* suc1 = find_label_BB(instr->get_op_label());
	it2++;
	Basic_block *suc2 = *it2;
	current->set_link_succ_pred(suc1);
	current->set_link_succ_pred(suc2);
      }
      else{

	if(instr->get_opcode() == j){
	  Basic_block *suc = find_label_BB(instr->get_op_label()); 
	  current->set_link_succ_pred(suc);
	}
	else {
	  if(instr->is_call()){
	    it2++;
	    Basic_block *suc = *it2;
	    current->set_link_succ_pred(suc);
	  }
	}
      } 
      it++;
    }
    else {
      it++;
      Basic_block *tmp = *it;
      if(tmp != NULL)
	current->set_link_succ_pred(tmp); 
    }
  }
  cout<<"fin comput succ pred bb"<<endl;
  // ne pas enlever la ligne ci-dessous
  BB_pred_succ = true;
  return;
}
Ejemplo n.º 2
0
// NB : penser  utiliser la méthode set_link_succ_pred(Basic_block *) de la classe Basic_block  
void Function::comput_succ_pred_BB(){
  
   list<Basic_block*>::iterator it, it2;
   Basic_block *current;
   Instruction *instr;
   int nbi;
   Operand* op;
   
   Basic_block *succ=NULL;
   
   int size= (int) _myBB.size(); // nombre de BB
   it=_myBB.begin();   //1er BB
   //remarque : le dernier block n'a pas de successeurs
 
   for(int i=0; i<size-1; i++) {
     current = *it;
     instr = current->get_instruction_at_index(current->get_nb_inst()-2);

     // si saut
     if(instr->is_branch()) {
       // saut conditionnel
       if(instr->is_cond_branch()) {
	 // ajout suivant
	 current->set_link_succ_pred(*(++it));
	 // label = op3
	 op = instr->get_op3();
       }
       else {
	 // label = op1
	 op = instr->get_op1();
	 it++;
       }
       // ajout du label
       succ = find_label_BB((dynamic_cast<OPLabel * > (op)));
       current->set_link_succ_pred(succ);
     } else {
       // pas de saut, ajout suivant
       current->set_link_succ_pred(*(++it));
     }
   }
   
   
   //A REMPLIR
   

}