@@ -69,6 +69,37 @@ static void write_symbol_table_binary(
69
69
}
70
70
}
71
71
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
+
72
103
// / Writes the functions to file, but only those with non-empty body.
73
104
static void write_goto_functions_binary (
74
105
std::ostream &out,
@@ -92,31 +123,8 @@ static void write_goto_functions_binary(
92
123
// Since version 2, goto functions are not converted to ireps,
93
124
// instead they are saved in a custom binary format
94
125
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);
120
128
}
121
129
}
122
130
0 commit comments