Skip to content

Commit aa61489

Browse files
committed
Separate out a write_instructions_binary function
Because we plan to add more writes to the functions loop and this helps make the boundaries between the code which writes different outputs clearer.
1 parent df8461d commit aa61489

File tree

1 file changed

+33
-25
lines changed

1 file changed

+33
-25
lines changed

src/goto-programs/write_goto_binary.cpp

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
73104
static 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

Comments
 (0)