17 #include <unordered_set>
29 typedef std::unordered_set<irep_idt>
linest;
30 typedef std::unordered_map<irep_idt, linest>
filest;
39 for(
const auto &instruction : gf_entry.second.body.instructions)
41 const auto &source_location = instruction.source_location();
43 filest &files = dest[source_location.get_working_directory()];
44 const irep_idt &file = source_location.get_file();
46 if(!file.
empty() && !source_location.is_built_in())
48 files[file].insert(source_location.get_line());
61 for(
auto const &files : eloc_map)
62 for(
auto const &lines : files.second)
63 eloc+=lines.second.size();
65 std::cout <<
"Effective lines of code: " << eloc <<
'\n';
73 for(
auto const &files : eloc_map)
74 for(
auto const &lines : files.second)
77 if(!files.first.empty())
80 for(
const irep_idt &line : lines.second)
81 std::cout << file <<
':' << line <<
'\n';
88 goto_functionst::function_mapt::const_iterator start=
92 !start->second.body_available())
94 std::cout <<
"No entry point found, path length undefined\n";
98 struct visited_cfg_nodet
102 visited_cfg_nodet():visited(
false)
113 const cfgt::entryt &start_node =
115 const cfgt::entryt &last_node =
119 cfg.shortest_path(start_node, last_node, shortest_path);
120 std::cout <<
"Shortest control-flow path: " << shortest_path.size()
121 <<
" instructions\n";
123 std::size_t n_loops=0, loop_ins=0;
130 i_it->is_backwards_goto() ||
131 i_it == gf_entry.second.body.instructions.begin())
133 const cfgt::entryt &node = cfg.get_node_index(i_it);
135 cfg.shortest_loop(node, loop);
140 loop_ins+=loop.size()-1;
147 std::cout <<
"Loop information: " << n_loops <<
" loops, "
148 << loop_ins <<
" instructions in shortest paths of loop bodies\n";
150 std::size_t n_reachable=0;
151 cfg.visit_reachable(start_node);
152 for(std::size_t i=0; i<cfg.size(); ++i)
155 std::cout <<
"Reachable instructions: " << n_reachable <<
"\n";
164 goto_functionst::function_mapt::const_iterator f_it =
166 const bool has_initialize =
168 std::unordered_set<irep_idt> initialized;
172 for(
const auto &ins : f_it->second.body.instructions)
177 ode.
build(ins.assign_lhs(), ns);
192 const symbolt &symbol = symbol_entry.second;
197 (has_initialize && initialized.find(symbol.
name) == initialized.end()))
203 if(bits.has_value() && bits.value() > 0)
204 total_size += bits.value();
207 std::cout <<
"Total size of global objects: " << total_size <<
" bits\n";