27 cfg_nodet():node_required(false)
32 #ifdef DEBUG_FULL_SLICERT
33 std::set<unsigned> required_by;
40 typedef std::vector<cfgt::entryt> dep_node_to_cfgt;
41 typedef std::stack<cfgt::entryt> queuet;
43 inline void add_to_queue(
45 const cfgt::entryt &entry,
48 #ifdef DEBUG_FULL_SLICERT
49 cfg[entry].required_by.insert(reason->location_number);
71 const auto &instruction = instruction_and_index.first;
72 const auto instruction_node_index = instruction_and_index.second;
73 if(criterion(instruction))
74 add_to_queue(queue, instruction_node_index, instruction);
76 add_to_queue(queue, instruction_node_index, instruction);
77 else if((instruction->is_goto() && instruction->guard.is_true()) ||
78 instruction->is_throw())
79 jumps.push_back(instruction_node_index);
80 else if(instruction->is_decl())
83 decl_dead[s.get_identifier()].push(instruction_node_index);
85 else if(instruction->is_dead())
88 decl_dead[s.get_identifier()].push(instruction_node_index);
94 dep_graph(goto_functions, ns);
97 fixedpoint(goto_functions, queue, jumps, decl_dead, dep_graph);
103 if(f_it->second.body_available())
108 if(!i_it->is_end_function() &&
111 #ifdef DEBUG_FULL_SLICERT
116 for(std::set<unsigned>::const_iterator
117 req_it=node.required_by.begin();
118 req_it!=node.required_by.end();
121 if(req_it!=node.required_by.begin())
125 i_it->source_location.set_column(c);
126 i_it->source_location.set_comment(c);
141 decl_deadt &decl_dead,
144 std::vector<cfgt::entryt> dep_node_to_cfg;
145 dep_node_to_cfg.reserve(dep_graph.
size());
147 for(
unsigned i=0; i<dep_graph.
size(); ++i)
153 while(!queue.empty())
155 while(!queue.empty())
162 if(node.node_required)
166 node.node_required=
true;
185 const cfgt::nodet &node,
188 const dep_node_to_cfgt &dep_node_to_cfg)
191 dep_graph[dep_graph[node.PC].get_node_id()];
193 for(dependence_grapht::edgest::const_iterator
194 it=d_node.
in.begin();
197 add_to_queue(queue, dep_node_to_cfg[it->first], node.PC);
237 typedef std::map<goto_programt::const_targett, unsigned>
239 typedef std::map<irep_idt, goto_program_change_impactt>
293 bool _compact_output):
294 impact_mode(_impact_mode),
295 compact_output(_compact_output),
296 old_goto_functions(model_old.goto_functions),
297 ns_old(model_old.symbol_table),
298 new_goto_functions(model_new.goto_functions),
299 ns_new(model_new.symbol_table),
300 unified_diff(model_old, model_new),
301 old_dep_graph(ns_old),
302 new_dep_graph(ns_new)
322 goto_functionst::function_mapt::const_iterator old_fit =
324 goto_functionst::function_mapt::const_iterator new_fit =
332 old_fit->second.body;
336 new_fit->second.body;
360 for(
const auto &d : diff)
367 old_impact[o_it]|=
SAME;
369 assert(n_it==d.first);
370 new_impact[n_it]|=
SAME;
375 assert(o_it==d.first);
394 assert(n_it==d.first);
412 new_impact[n_it]|=
NEW;
426 for(dependence_grapht::edgest::const_iterator it = d_node.out.begin();
427 it != d_node.out.end(); ++it)
445 dep_graph[dep_graph[src].get_node_id()],
459 for(dependence_grapht::edgest::const_iterator it = d_node.in.begin();
460 it != d_node.in.end(); ++it)
481 dep_graph[dep_graph[src].get_node_id()],
492 goto_functionst::function_mapt::const_iterator>
495 function_mapt old_funcs, new_funcs;
498 old_funcs.insert(std::make_pair(it->first, it));
500 new_funcs.insert(std::make_pair(it->first, it));
502 function_mapt::const_iterator ito=old_funcs.begin();
503 for(function_mapt::const_iterator itn=new_funcs.begin();
504 itn!=new_funcs.end();
507 while(ito!=old_funcs.end() && ito->first<itn->first)
510 if(ito!=old_funcs.end() && itn->first==ito->first)
518 goto_functions_change_impactt::const_iterator oc_it=
520 for(goto_functions_change_impactt::const_iterator
542 assert(oc_it->first==nc_it->first);
564 goto_functionst::function_mapt::const_iterator f_it =
570 std::cout <<
"/** " << function_id <<
" **/\n";
574 goto_program_change_impactt::const_iterator c_entry=
576 const unsigned mod_flags =
577 c_entry == c_i.end() ?
static_cast<unsigned>(
SAME) : c_entry->second;
586 else if(mod_flags&
NEW)
612 goto_functionst::function_mapt::const_iterator o_f_it =
617 goto_functionst::function_mapt::const_iterator f_it =
623 std::cout <<
"/** " << function_id <<
" **/\n";
629 goto_program_change_impactt::const_iterator o_c_entry=
630 o_c_i.find(o_target);
631 const unsigned old_mod_flags = o_c_entry == o_c_i.end()
632 ?
static_cast<unsigned>(
SAME)
643 goto_program_change_impactt::const_iterator c_entry=
645 const unsigned mod_flags =
646 c_entry == n_c_i.end() ?
static_cast<unsigned>(
SAME) : c_entry->second;
653 if(old_mod_flags==
SAME)
666 else if(mod_flags&
NEW)
672 assert(old_mod_flags==
SAME ||
681 assert(old_mod_flags==
SAME ||
695 goto_program_change_impactt::const_iterator o_c_entry=
696 o_c_i.find(o_target);
697 const unsigned old_mod_flags = o_c_entry == o_c_i.end()
698 ?
static_cast<unsigned>(
SAME)
704 if(old_mod_flags==
SAME)
708 else if(old_mod_flags&
NEW)
732 const irep_idt &
file=target->source_location.get_file();
733 const irep_idt &line=target->source_location.get_line();
751 change_impactt c(model_old, model_new, impact_mode, compact_output);