@@ -69,6 +69,37 @@ static void write_symbol_table_binary(
6969 }
7070}
7171
72+ static void write_instructions_binary (
73+ std::ostream &out,
74+ irep_serializationt &irepconverter,
75+ const std::pair<const irep_idt, goto_functiont> &fct)
76+ {
77+ write_gb_word (out, fct.second .body .instructions .size ());
78+
79+ for (const auto &instruction : fct.second .body .instructions )
80+ {
81+ irepconverter.reference_convert (instruction.code (), out);
82+ irepconverter.reference_convert (instruction.source_location (), out);
83+ write_gb_word (out, (long )instruction.type ());
84+
85+ const auto condition =
86+ instruction.has_condition () ? instruction.condition () : true_exprt ();
87+ irepconverter.reference_convert (condition, out);
88+
89+ write_gb_word (out, instruction.target_number );
90+
91+ write_gb_word (out, instruction.targets .size ());
92+
93+ for (const auto &t_it : instruction.targets )
94+ write_gb_word (out, t_it->target_number );
95+
96+ write_gb_word (out, instruction.labels .size ());
97+
98+ for (const auto &l_it : instruction.labels )
99+ irepconverter.write_string_ref (out, l_it);
100+ }
101+ }
102+
72103// / Writes the functions to file, but only those with non-empty body.
73104static void write_goto_functions_binary (
74105 std::ostream &out,
@@ -92,31 +123,8 @@ static void write_goto_functions_binary(
92123 // Since version 2, goto functions are not converted to ireps,
93124 // instead they are saved in a custom binary format
94125
95- write_gb_string (out, id2string (fct.first )); // name
96- write_gb_word (out, fct.second .body .instructions .size ()); // # instructions
97-
98- for (const auto &instruction : fct.second .body .instructions )
99- {
100- irepconverter.reference_convert (instruction.code (), out);
101- irepconverter.reference_convert (instruction.source_location (), out);
102- write_gb_word (out, (long )instruction.type ());
103-
104- const auto condition =
105- instruction.has_condition () ? instruction.condition () : true_exprt ();
106- irepconverter.reference_convert (condition, out);
107-
108- write_gb_word (out, instruction.target_number );
109-
110- write_gb_word (out, instruction.targets .size ());
111-
112- for (const auto &t_it : instruction.targets )
113- write_gb_word (out, t_it->target_number );
114-
115- write_gb_word (out, instruction.labels .size ());
116-
117- for (const auto &l_it : instruction.labels )
118- irepconverter.write_string_ref (out, l_it);
119- }
126+ write_gb_string (out, id2string (fct.first )); // name
127+ write_instructions_binary (out, irepconverter, fct);
120128 }
121129}
122130
0 commit comments