void convert( const irept &irep, goto_programt &program ) { assert(irep.id()=="goto-program"); program.instructions.clear(); std::list< std::list<unsigned> > number_targets_list; // convert instructions back const irept::subt &subs = irep.get_sub(); for (irept::subt::const_iterator it=subs.begin(); it!=subs.end(); it++) { program.instructions.push_back(goto_programt::instructiont()); convert(*it, program.instructions.back()); number_targets_list.push_back(std::list<unsigned>()); const irept &targets=it->find(ID_targets); const irept::subt &tsubs=targets.get_sub(); for (irept::subt::const_iterator tit=tsubs.begin(); tit!=tsubs.end(); tit++) { number_targets_list.back().push_back( unsafe_string2unsigned(tit->id_string())); } } program.compute_location_numbers(); // resolve targets std::list< std::list<unsigned> >::iterator nit= number_targets_list.begin(); for(goto_programt::instructionst::iterator lit= program.instructions.begin(); lit!=program.instructions.end() && nit!=number_targets_list.end(); lit++, nit++) { for (std::list<unsigned>::iterator tit=nit->begin(); tit!=nit->end(); tit++) { goto_programt::targett fit=program.instructions.begin(); for(;fit!=program.instructions.end();fit++) { if (fit->location_number==*tit) { lit->targets.push_back(fit); break; } } if (fit==program.instructions.end()) { std::cout << "Warning: could not resolve target link " << "during irep->goto_program translation." << std::endl; throw 0; } } } program.update(); }
void convert(const xmlt &xml, goto_programt &goto_program) { goto_program.clear(); goto_programt::instructionst &instructions = goto_program.instructions; xmlt::elementst::const_iterator it = xml.elements.begin(); for(; it != xml.elements.end(); it++) { goto_programt::targett inst = goto_program.add_instruction(); inst->targets.clear(); if(it->name=="goto") { inst->type = GOTO; } else if(it->name=="assume") { inst->type = ASSUME; } else if(it->name=="assert") { inst->type = ASSERT; } else if(it->name=="skip") { inst->type = SKIP; } else if(it->name=="end_function") { inst->type = END_FUNCTION; } else if(it->name=="location") { inst->type = LOCATION; } else if(it->name=="dead") { inst->type = DEAD; } else if(it->name=="atomic_begin") { inst->type = ATOMIC_BEGIN; } else if(it->name=="atomic_end") { inst->type = ATOMIC_END; } else if(it->name=="return") { inst->make_return(); } else if(it->name=="instruction") // OTHER { inst->make_other(); } else if(it->name=="assign") { inst->make_other(); inst->type=ASSIGN; } else if(it->name=="functioncall") { inst->make_other(); inst->type=FUNCTION_CALL; } else if(it->name=="thread_start") { inst->type = START_THREAD; } else if(it->name=="thread_end") { inst->type = END_THREAD; } else { std::cout << "Unknown instruction type encountered (" << it->name << ")"; std::cout << std::endl; return; } xmlt::elementst::const_iterator eit = it->elements.begin(); for(; eit != it->elements.end(); eit++) { if(eit->name=="location") { convert(*eit, inst->location); } else if(eit->name=="variables") { } else if(eit->name=="labels") { xmlt::elementst::const_iterator lit = eit->elements.begin(); for(; lit != eit->elements.end(); lit++) { if(lit->name=="label") { std::string ls = lit->get_attribute("name"); inst->labels.push_back(ls); } else { std::cout << "Unknown node in labels section." << std::endl; return; } } } else if(eit->name=="guard") { inst->guard.remove("value"); convert(*eit, inst->guard); } else if(eit->name=="code") { convert(*eit, inst->code); } else if(eit->name=="targets") { // Don't do anything here, we'll need a second run for that } else if(eit->name=="comment") { inst->location.set("comment", eit->data); } else if(eit->name=="function") { inst->function = eit->data; } } } // assign line numbers goto_program.compute_location_numbers(); // second run, for targets goto_programt::targett ins_it = instructions.begin(); it = xml.elements.begin(); for(; it != xml.elements.end() && ins_it!=instructions.end(); it++) { xmlt::elementst::const_iterator eit = it->elements.begin(); for(; eit != it->elements.end(); eit++) { if(eit->name=="targets") { xmlt::elementst::const_iterator tit = eit->elements.begin(); for(; tit != eit->elements.end(); tit++) { if(tit->name=="target") { goto_programt::targett tins = find_instruction(xml, instructions, tit->data); if(tins != instructions.end()) { // Here we insert the iterators that somehow seem // to be strange afterwards (see line 87) ins_it->targets.push_back(tins); } else { std::cout << "Warning: instruction not found when " "resolving target links." << std::endl; } } else { std::cout << "Unknown node in targets section." << std::endl; return; } } } } ins_it++; } // resolve links goto_program.update(); // std::cout << "TNI: " << goto_program.target_numbers.size() << std::endl; }