Skip to content

Commit 293748d

Browse files
authored
Merge pull request #6392 from diffblue/instruction_guard
Goto instruction guard/condition API
2 parents d683507 + d2801ee commit 293748d

11 files changed

+42
-23
lines changed

src/analyses/invariant_propagation.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,6 @@ void invariant_propagationt::simplify(goto_programt &goto_program)
270270
::simplify(simplified_guard, ns);
271271

272272
if(invariant_set.implies(simplified_guard).is_true())
273-
i_it->set_condition(true_exprt());
273+
i_it->condition_nonconst() = true_exprt();
274274
}
275275
}

src/analyses/variable-sensitivity/variable_sensitivity_dependence_graph.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ void variable_sensitivity_dependence_domaint::data_dependencies(
195195
}
196196
else if(to->is_goto())
197197
{
198-
eval_data_deps(to->guard, ns, domain_data_deps);
198+
eval_data_deps(to->condition(), ns, domain_data_deps);
199199
}
200200
}
201201

src/goto-checker/symex_bmc.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void symex_bmct::symex_step(
5757

5858
if(
5959
!state.guard.is_false() && state.source.pc->is_assume() &&
60-
simplify_expr(state.source.pc->guard, ns).is_false())
60+
simplify_expr(state.source.pc->condition(), ns).is_false())
6161
{
6262
log.statistics() << "aborting path on assume(false) at "
6363
<< state.source.pc->source_location << " thread "
@@ -86,7 +86,7 @@ void symex_bmct::symex_step(
8686
// sure the goto is considered covered
8787
if(
8888
cur_pc->is_goto() && cur_pc->get_target() != state.source.pc &&
89-
cur_pc->guard.is_true())
89+
cur_pc->condition().is_true())
9090
symex_coverage.covered(cur_pc, cur_pc->get_target());
9191
else if(!state.guard.is_false())
9292
symex_coverage.covered(cur_pc, state.source.pc);
@@ -109,7 +109,7 @@ void symex_bmct::merge_goto(
109109
// could the branch possibly be taken?
110110
!prev_guard.is_false() && !state.guard.is_false() &&
111111
// branches only, no single-successor goto
112-
!prev_pc->guard.is_true())
112+
!prev_pc->condition().is_true())
113113
symex_coverage.covered(prev_pc, state.source.pc);
114114
}
115115

src/goto-instrument/concurrency.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,7 @@ void concurrency_instrumentationt::instrument(
112112
}
113113
else if(it->is_assume() || it->is_assert() || it->is_goto())
114114
{
115-
exprt cond = it->get_condition();
116-
instrument(cond);
117-
it->set_condition(cond);
115+
instrument(it->condition_nonconst());
118116
}
119117
else if(it->is_function_call())
120118
{

src/goto-instrument/cover_instrument_branch.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ void cover_branch_instrumentert::instrument(
2525

2626
const bool is_function_entry_point =
2727
i_it == goto_program.instructions.begin();
28-
const bool is_conditional_goto = i_it->is_goto() && !i_it->guard.is_true();
28+
const bool is_conditional_goto =
29+
i_it->is_goto() && !i_it->condition().is_true();
2930
if(!is_function_entry_point && !is_conditional_goto)
3031
return;
3132

@@ -52,7 +53,7 @@ void cover_branch_instrumentert::instrument(
5253
std::string true_comment = "block " + b + " branch true";
5354
std::string false_comment = "block " + b + " branch false";
5455

55-
exprt guard = i_it->guard;
56+
exprt guard = i_it->condition();
5657
source_locationt source_location = i_it->source_location;
5758

5859
goto_program.insert_before_swap(i_it);

src/goto-programs/goto_convert.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ void goto_convertt::optimize_guarded_gotos(goto_programt &dest)
269269
if(it->get_target()->target_number == it_z->target_number)
270270
{
271271
it->set_target(it_goto_y->get_target());
272-
it->set_condition(boolean_negate(it->get_condition()));
272+
it->condition_nonconst() = boolean_negate(it->condition());
273273
it_goto_y->turn_into_skip();
274274
}
275275
}
@@ -876,7 +876,7 @@ void goto_convertt::convert_loop_contracts(
876876
}
877877

878878
PRECONDITION(loop->is_goto());
879-
loop->guard.add(ID_C_spec_loop_invariant).swap(invariant);
879+
loop->condition_nonconst().add(ID_C_spec_loop_invariant).swap(invariant);
880880
}
881881

882882
if(!decreases_clause.is_nil())
@@ -889,7 +889,7 @@ void goto_convertt::convert_loop_contracts(
889889
}
890890

891891
PRECONDITION(loop->is_goto());
892-
loop->guard.add(ID_C_spec_decreases).swap(decreases_clause);
892+
loop->condition_nonconst().add(ID_C_spec_decreases).swap(decreases_clause);
893893
}
894894
}
895895

src/goto-programs/goto_inline_class.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,8 @@ void goto_inlinet::insert_function_body(
282282

283283
if(instruction.has_condition())
284284
{
285-
exprt c = instruction.get_condition();
286-
replace_location(c, target->source_location);
287-
instruction.set_condition(c);
285+
replace_location(
286+
instruction.condition_nonconst(), target->source_location);
288287
}
289288
}
290289
}

src/goto-programs/goto_program.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,8 @@ class goto_programt
328328
goto_program_instruction_typet type;
329329

330330
/// Guard for gotos, assume, assert
331-
/// Use get_condition() to read, and set_condition(c) to write.
331+
/// Use condition() method to access.
332+
/// This member will eventually be protected.
332333
exprt guard;
333334

334335
/// Does this instruction have a condition?
@@ -338,19 +339,35 @@ class goto_programt
338339
}
339340

340341
/// Get the condition of gotos, assume, assert
342+
DEPRECATED(SINCE(2021, 10, 12, "Use condition() instead"))
341343
const exprt &get_condition() const
342344
{
343345
PRECONDITION(has_condition());
344346
return guard;
345347
}
346348

347349
/// Set the condition of gotos, assume, assert
350+
DEPRECATED(SINCE(2021, 10, 12, "Use condition_nonconst() instead"))
348351
void set_condition(exprt c)
349352
{
350353
PRECONDITION(has_condition());
351354
guard = std::move(c);
352355
}
353356

357+
/// Get the condition of gotos, assume, assert
358+
const exprt &condition() const
359+
{
360+
PRECONDITION(has_condition());
361+
return guard;
362+
}
363+
364+
/// Get the condition of gotos, assume, assert
365+
exprt &condition_nonconst()
366+
{
367+
PRECONDITION(has_condition());
368+
return guard;
369+
}
370+
354371
// The below will eventually become a single target only.
355372
/// The target for gotos and for start_thread nodes
356373
typedef std::list<instructiont>::iterator targett;

src/goto-programs/remove_virtual_functions.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,8 +421,8 @@ static goto_programt::targett replace_virtual_function_with_dispatch_table(
421421
!new_code_gotos.empty(),
422422
"a dispatch table entry has been processed already, "
423423
"which should have created a GOTO");
424-
new_code_gotos.instructions.back().guard =
425-
or_exprt(new_code_gotos.instructions.back().guard, class_id_test);
424+
new_code_gotos.instructions.back().condition_nonconst() = or_exprt(
425+
new_code_gotos.instructions.back().condition(), class_id_test);
426426
}
427427
else
428428
{

src/goto-programs/show_goto_functions_json.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,11 @@ json_objectt show_goto_functions_jsont::convert(
9595
instruction_entry["operands"] = std::move(operand_array);
9696
}
9797

98-
if(!instruction.guard.is_true())
98+
if(instruction.has_condition())
9999
{
100-
json_objectt guard_object=
100+
json_objectt guard_object =
101101
no_comments_irep_converter.convert_from_irep(
102-
instruction.guard);
102+
instruction.condition());
103103

104104
instruction_entry["guard"] = std::move(guard_object);
105105
}

src/goto-programs/write_goto_binary.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,11 @@ bool write_goto_binary(
9898
irepconverter.reference_convert(instruction.get_code(), out);
9999
irepconverter.reference_convert(instruction.source_location, out);
100100
write_gb_word(out, (long)instruction.type);
101-
irepconverter.reference_convert(instruction.guard, out);
101+
102+
const auto condition =
103+
instruction.has_condition() ? instruction.condition() : true_exprt();
104+
irepconverter.reference_convert(condition, out);
105+
102106
write_gb_word(out, instruction.target_number);
103107

104108
write_gb_word(out, instruction.targets.size());

0 commit comments

Comments
 (0)