bool read_bin_goto_object( std::istream &in, const std::string &filename, symbol_tablet &symbol_table, goto_functionst &functions, message_handlert &message_handler) { messaget message(message_handler); { char hdr[4]; hdr[0]=in.get(); hdr[1]=in.get(); hdr[2]=in.get(); if(hdr[0]=='G' && hdr[1]=='B' && hdr[2]=='F') { // OK! } else { hdr[3]=in.get(); if(hdr[0]==0x7f && hdr[1]=='G' && hdr[2]=='B' && hdr[3]=='F') { // OK! } else if(hdr[0]==0x7f && hdr[1]=='E' && hdr[2]=='L' && hdr[3]=='F') { if(filename!="") message.error() << "Sorry, but I can't read ELF binary `" << filename << "'" << messaget::eom; else message.error() << "Sorry, but I can't read ELF binaries" << messaget::eom; return true; } else { message.error() << "`" << filename << "' is not a goto-binary" << messaget::eom; return true; } } } irep_serializationt::ireps_containert ic; irep_serializationt irepconverter(ic); // symbol_serializationt symbolconverter(ic); { std::size_t version=irepconverter.read_gb_word(in); switch(version) { case 1: case 2: message.error() << "The input was compiled with an old version of " "goto-cc; please recompile" << messaget::eom; return true; case 3: return read_bin_goto_object_v3(in, filename, symbol_table, functions, message_handler, irepconverter); break; default: message.error() << "The input was compiled with an unsupported version of " "goto-cc; please recompile" << messaget::eom; return true; } } return false; }
bool read_goto_object( std::istream &in, const std::string &filename, symbol_tablet &symbol_table, goto_functionst &functions, message_handlert &message_handler) { messaget message(message_handler); xml_parser.clear(); xml_parser.filename = filename; xml_parser.in = ∈ xml_parser.set_message_handler(message_handler); if (xml_parser.parse()) return true; xmlt &top = xml_parser.parse_tree.element; if (top.get_attribute("version")!=XML_VERSION) { message.error() << "The input was compiled with a different version of " "goto-cc, please recompile." << messaget::eom; return true; } xml_irep_convertt::ireps_containert ic; xml_irep_convertt irepconverter(ic); xml_symbol_convertt symbolconverter(ic); xml_goto_function_convertt gfconverter(ic); if(top.name.substr(0, 11)=="goto-object") { for(xmlt::elementst::const_iterator sec_it=top.elements.begin(); sec_it != top.elements.end(); sec_it++) { xmlt sec = *sec_it; if (sec.name=="irep_hash_map") { for(xmlt::elementst::const_iterator irep_it = sec.elements.begin(); irep_it != sec.elements.end(); irep_it++) { irept i; irepconverter.convert(*irep_it, i); irepconverter.insert(irep_it->get_attribute("id"), i); } } else if (sec.name=="symbols") { for(xmlt::elementst::const_iterator sym_it = sec.elements.begin(); sym_it != sec.elements.end(); sym_it++) { symbolt symbol; symbolconverter.convert(*sym_it, symbol); // std::cout << "Adding Symbol: " << symbol.name << std::endl; if(!symbol.is_type && symbol.type.id()=="code") { // makes sure there is an empty function // for this symbol. if we got code for it, // it will be added lateron. functions.function_map[symbol.name].type= to_code_type(symbol.type); } symbol_table.add(symbol); } } else if (sec.name=="functions") { for(xmlt::elementst::const_iterator fun_it = sec.elements.begin(); fun_it != sec.elements.end(); fun_it++) { std::string fname = fun_it->get_attribute("name"); //std::cout << "Adding function body: " << fname << std::endl; goto_functionst::goto_functiont &f = functions.function_map[fname]; gfconverter.convert(*fun_it, f); } } else { message.error() << "Unknown Section '" << sec.name << "' in object file." << messaget::eom; return true; } } } else { message.error() << "no goto-object" << messaget::eom; return true; } xml_parser.clear(); return false; }