Skip to content

Commit 0805702

Browse files
authored
Merge pull request #6389 from diffblue/code_frontend_assign
introduce code_frontend_assignt
2 parents aa8ffa1 + 998b163 commit 0805702

22 files changed

+225
-105
lines changed

jbmc/src/java_bytecode/code_with_references.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ codet allocate_array(
2323
pointer_type.subtype().set(ID_element_type, element_type);
2424
side_effect_exprt java_new_array{
2525
ID_java_new_array, {array_length_expr}, pointer_type, loc};
26-
return code_assignt{expr, java_new_array, loc};
26+
return code_frontend_assignt{expr, java_new_array, loc};
2727
}
2828

2929
code_blockt
@@ -41,8 +41,8 @@ reference_allocationt::to_code(reference_substitutiont &references) const
4141
// or the "@id" json field corresponding to `reference_id` doesn't appear in
4242
// the file.
4343
code_blockt code;
44-
code.add(code_assignt{*reference.array_length,
45-
side_effect_expr_nondett{java_int_type(), loc}});
44+
code.add(code_frontend_assignt{
45+
*reference.array_length, side_effect_expr_nondett{java_int_type(), loc}});
4646
code.add(code_assumet{binary_predicate_exprt{
4747
*reference.array_length, ID_ge, from_integer(0, java_int_type())}});
4848
code.add(allocate_array(reference.expr, *reference.array_length, loc));

jbmc/src/java_bytecode/create_array_with_type_intrinsic.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ Author: Diffblue Ltd.
1414
#include <java_bytecode/java_types.h>
1515

1616
#include <util/fresh_symbol.h>
17-
#include <util/goto_instruction_code.h>
1817
#include <util/namespace.h>
1918
#include <util/pointer_expr.h>
19+
#include <util/std_code.h>
2020
#include <util/symbol_table_base.h>
2121

2222
/// Returns the symbol name for `org.cprover.CProver.createArrayWithType`
@@ -81,7 +81,7 @@ codet create_array_with_type_body(
8181
side_effect_exprt new_array_expr{
8282
ID_java_new_array, new_array_symbol.type, source_locationt{}};
8383
new_array_expr.copy_to_operands(length_argument_symbol_expr);
84-
code_block.add(code_assignt(new_array_symbol_expr, new_array_expr));
84+
code_block.add(code_frontend_assignt(new_array_symbol_expr, new_array_expr));
8585

8686
dereference_exprt existing_array(existing_array_argument_symbol_expr);
8787
dereference_exprt new_array(new_array_symbol_expr);
@@ -99,9 +99,10 @@ codet create_array_with_type_body(
9999
member_exprt new_array_element_classid(
100100
new_array, JAVA_ARRAY_ELEMENT_CLASSID_FIELD_NAME, string_typet());
101101

102-
code_block.add(code_assignt(new_array_dimension, old_array_dimension));
103102
code_block.add(
104-
code_assignt(new_array_element_classid, old_array_element_classid));
103+
code_frontend_assignt(new_array_dimension, old_array_dimension));
104+
code_block.add(code_frontend_assignt(
105+
new_array_element_classid, old_array_element_classid));
105106

106107
// return new_array
107108
code_block.add(code_returnt(new_array_symbol_expr));

jbmc/src/java_bytecode/java_bytecode_convert_class.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,7 @@ void add_java_array_types(symbol_tablet &symbol_table)
909909
member_exprt old_length(
910910
old_array, length_component.get_name(), length_component.type());
911911
java_new_array.copy_to_operands(old_length);
912-
code_assignt create_blank(local_symexpr, java_new_array);
912+
code_frontend_assignt create_blank(local_symexpr, java_new_array);
913913

914914
codet copy_type_information = code_skipt();
915915
if(l == 'a')
@@ -930,8 +930,9 @@ void add_java_array_types(symbol_tablet &symbol_table)
930930
new_array, array_element_classid_component);
931931

932932
copy_type_information = code_blockt{
933-
{code_assignt(new_array_dimension, old_array_dimension),
934-
code_assignt(new_array_element_classid, old_array_element_classid)}};
933+
{code_frontend_assignt(new_array_dimension, old_array_dimension),
934+
code_frontend_assignt(
935+
new_array_element_classid, old_array_element_classid)}};
935936
}
936937

937938
member_exprt old_data(
@@ -971,7 +972,7 @@ void add_java_array_types(symbol_tablet &symbol_table)
971972
from_integer(0, index_symexpr.type()),
972973
old_length,
973974
index_symexpr,
974-
code_assignt(std::move(new_cell), std::move(old_cell)),
975+
code_frontend_assignt(std::move(new_cell), std::move(old_cell)),
975976
location);
976977

977978
member_exprt new_base_class(

jbmc/src/java_bytecode/java_bytecode_typecheck_code.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ void java_bytecode_typecheckt::typecheck_code(codet &code)
1919

2020
if(statement==ID_assign)
2121
{
22-
code_assignt &code_assign=to_code_assign(code);
22+
code_frontend_assignt &code_assign = to_code_frontend_assign(code);
2323
typecheck_expr(code_assign.lhs());
2424
typecheck_expr(code_assign.rhs());
2525

jbmc/src/java_bytecode/java_entry_point.cpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ void java_static_lifetime_init(
122122

123123
const symbol_exprt rounding_mode =
124124
symbol_table.lookup_ref(rounding_mode_identifier()).symbol_expr();
125-
code_block.add(
126-
code_assignt{rounding_mode, from_integer(0, rounding_mode.type())});
125+
code_block.add(code_frontend_assignt{rounding_mode,
126+
from_integer(0, rounding_mode.type())});
127127

128128
object_factory_parameters.function_id = initialize_symbol.name;
129129

@@ -226,7 +226,7 @@ void java_static_lifetime_init(
226226
to_struct_expr(*zero_object), ns, to_struct_tag_type(sym.type));
227227

228228
code_block.add(
229-
std::move(code_assignt(sym.symbol_expr(), *zero_object)));
229+
std::move(code_frontend_assignt(sym.symbol_expr(), *zero_object)));
230230

231231
// Then call the init function:
232232
code_block.add(std::move(initializer_call));
@@ -257,7 +257,7 @@ void java_static_lifetime_init(
257257
}
258258
else if(sym.value.is_not_nil())
259259
{
260-
code_assignt assignment(sym.symbol_expr(), sym.value);
260+
code_frontend_assignt assignment(sym.symbol_expr(), sym.value);
261261
assignment.add_source_location()=source_location;
262262
code_block.add(assignment);
263263
}
@@ -333,7 +333,7 @@ std::pair<code_blockt, std::vector<exprt>> java_build_arguments(
333333
.symbol_expr();
334334
main_arguments[param_number] = result;
335335
init_code.add(code_declt{result});
336-
init_code.add(code_assignt{
336+
init_code.add(code_frontend_assignt{
337337
result,
338338
side_effect_exprt{ID_java_new, {}, p.type(), function.location}});
339339
continue;
@@ -417,10 +417,9 @@ std::pair<code_blockt, std::vector<exprt>> java_build_arguments(
417417
function.location,
418418
pointer_type_selector,
419419
message_handler);
420-
init_code_for_type.add(
421-
code_assignt(
422-
result_symbol.symbol_expr(),
423-
typecast_exprt(init_expr_for_parameter, p.type())));
420+
init_code_for_type.add(code_frontend_assignt(
421+
result_symbol.symbol_expr(),
422+
typecast_exprt(init_expr_for_parameter, p.type())));
424423
cases.push_back(init_code_for_type);
425424
}
426425

@@ -672,7 +671,7 @@ bool generate_java_start_function(
672671
symbol_table.add(exc_symbol);
673672

674673
// Zero-initialise the top-level exception catch variable:
675-
init_code.add(code_assignt(
674+
init_code.add(code_frontend_assignt(
676675
exc_symbol.symbol_expr(),
677676
null_pointer_exprt(to_pointer_type(exc_symbol.type))));
678677

jbmc/src/java_bytecode/java_object_factory.cpp

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ void initialize_nondet_string_fields(
399399
allocate_objects.allocate_automatic_local_object(
400400
java_int_type(), "tmp_object_factory");
401401
const side_effect_expr_nondett nondet_length(length_expr.type(), loc);
402-
code.add(code_assignt(length_expr, nondet_length));
402+
code.add(code_frontend_assignt(length_expr, nondet_length));
403403

404404
// assume (length_expr >= min_nondet_string_length);
405405
const exprt min_length =
@@ -508,8 +508,8 @@ void java_object_factoryt::gen_nondet_pointer_init(
508508
// Having created a pointer to object of type replacement_pointer_type
509509
// we now assign it back to the original pointer with a cast
510510
// from pointer_type to replacement_pointer_type
511-
assignments.add(
512-
code_assignt(expr, typecast_exprt(real_pointer_symbol, pointer_type)));
511+
assignments.add(code_frontend_assignt(
512+
expr, typecast_exprt(real_pointer_symbol, pointer_type)));
513513
return;
514514
}
515515

@@ -539,8 +539,8 @@ void java_object_factoryt::gen_nondet_pointer_init(
539539
{
540540
if(update_in_place == update_in_placet::NO_UPDATE_IN_PLACE)
541541
{
542-
assignments.add(
543-
code_assignt{expr, null_pointer_exprt{pointer_type}, location});
542+
assignments.add(code_frontend_assignt{
543+
expr, null_pointer_exprt{pointer_type}, location});
544544
}
545545
// Otherwise leave it as it is.
546546
return;
@@ -615,7 +615,7 @@ void java_object_factoryt::gen_nondet_pointer_init(
615615
update_in_placet::NO_UPDATE_IN_PLACE,
616616
location);
617617

618-
const code_assignt set_null_inst{
618+
const code_frontend_assignt set_null_inst{
619619
expr, null_pointer_exprt{pointer_type}, location};
620620

621621
const bool allow_null = depth > object_factory_parameters.min_null_tree_depth;
@@ -734,7 +734,7 @@ alternate_casest get_string_input_values_code(
734734
{
735735
const symbol_exprt s =
736736
get_or_create_string_literal_symbol(val, symbol_table, true);
737-
cases.push_back(code_assignt(expr, s));
737+
cases.push_back(code_frontend_assignt(expr, s));
738738
}
739739
return cases;
740740
}
@@ -843,7 +843,7 @@ void java_object_factoryt::gen_nondet_struct_init(
843843
allocate_objects);
844844
}
845845

846-
assignments.add(code_assignt(expr, *initial_object));
846+
assignments.add(code_frontend_assignt(expr, *initial_object));
847847
}
848848

849849
for(const auto &component : components)
@@ -865,7 +865,7 @@ void java_object_factoryt::gen_nondet_struct_init(
865865
// which is necessary to support concurrency.
866866
if(update_in_place == update_in_placet::MUST_UPDATE_IN_PLACE)
867867
continue;
868-
code_assignt code(me, from_integer(0, me.type()));
868+
code_frontend_assignt code(me, from_integer(0, me.type()));
869869
code.add_source_location() = location;
870870
assignments.add(code);
871871
}
@@ -950,7 +950,7 @@ static code_blockt assume_expr_integral(
950950
allocate_local_symbol(java_int_type(), "assume_integral_tmp");
951951
assignments.add(code_declt(aux_int), location);
952952
exprt nondet_rhs = side_effect_expr_nondett(java_int_type(), location);
953-
code_assignt aux_assign(aux_int, nondet_rhs);
953+
code_frontend_assignt aux_assign(aux_int, nondet_rhs);
954954
aux_assign.add_source_location() = location;
955955
assignments.add(aux_assign);
956956
assignments.add(
@@ -1068,7 +1068,7 @@ void java_object_factoryt::gen_nondet_init(
10681068
exprt rhs = type.id() == ID_c_bool
10691069
? get_nondet_bool(type, location)
10701070
: side_effect_expr_nondett(type, location);
1071-
code_assignt assign(expr, rhs);
1071+
code_frontend_assignt assign(expr, rhs);
10721072
assign.add_source_location() = location;
10731073

10741074
assignments.add(assign);
@@ -1084,7 +1084,7 @@ void java_object_factoryt::gen_nondet_init(
10841084
if(auto singleton = interval.as_singleton())
10851085
{
10861086
assignments.add(
1087-
code_assignt{expr, from_integer(*singleton, expr.type())});
1087+
code_frontend_assignt{expr, from_integer(*singleton, expr.type())});
10881088
}
10891089
else
10901090
{
@@ -1158,7 +1158,7 @@ static void allocate_nondet_length_array(
11581158
java_new_array.copy_to_operands(length_sym_expr);
11591159
java_new_array.set(ID_length_upper_bound, max_length_expr);
11601160
java_new_array.type().subtype().set(ID_element_type, element_type);
1161-
code_assignt assign(lhs, java_new_array);
1161+
code_frontend_assignt assign(lhs, java_new_array);
11621162
assign.add_source_location() = location;
11631163
assignments.add(assign);
11641164
}
@@ -1204,13 +1204,15 @@ static void array_primitive_init_code(
12041204
// *array_data_init = NONDET(TYPE [max_length_expr]);
12051205
side_effect_expr_nondett nondet_data(array_type, location);
12061206
const dereference_exprt data_pointer_deref{tmp_finite_array_pointer};
1207-
assignments.add(code_assignt(data_pointer_deref, std::move(nondet_data)));
1207+
assignments.add(
1208+
code_frontend_assignt(data_pointer_deref, std::move(nondet_data)));
12081209
assignments.statements().back().add_source_location() = location;
12091210

12101211
// init_array_expr = *array_data_init;
12111212
address_of_exprt tmp_nondet_pointer(
12121213
index_exprt(data_pointer_deref, from_integer(0, java_int_type())));
1213-
assignments.add(code_assignt(init_array_expr, std::move(tmp_nondet_pointer)));
1214+
assignments.add(
1215+
code_frontend_assignt(init_array_expr, std::move(tmp_nondet_pointer)));
12141216
assignments.statements().back().add_source_location() = location;
12151217
}
12161218

@@ -1251,7 +1253,7 @@ code_blockt java_object_factoryt::assign_element(
12511253
// If we're updating an existing array item, read the existing object that
12521254
// we (may) alter:
12531255
if(update_in_place != update_in_placet::NO_UPDATE_IN_PLACE)
1254-
assignments.add(code_assignt(init_expr, element));
1256+
assignments.add(code_frontend_assignt(init_expr, element));
12551257
}
12561258

12571259
// MUST_UPDATE_IN_PLACE only applies to this object.
@@ -1277,7 +1279,7 @@ code_blockt java_object_factoryt::assign_element(
12771279
{
12781280
// We used a temporary variable to update or initialise an array item;
12791281
// now write it into the array:
1280-
assignments.add(code_assignt(element, init_expr));
1282+
assignments.add(code_frontend_assignt(element, init_expr));
12811283
}
12821284
return assignments;
12831285
}
@@ -1337,7 +1339,7 @@ static void array_loop_init_code(
13371339
const symbol_exprt &array_init_symexpr =
13381340
allocate_local_symbol(init_array_expr.type(), "array_data_init");
13391341

1340-
code_assignt data_assign(array_init_symexpr, init_array_expr);
1342+
code_frontend_assignt data_assign(array_init_symexpr, init_array_expr);
13411343
data_assign.add_source_location() = location;
13421344
assignments.add(data_assign);
13431345

@@ -1505,7 +1507,8 @@ bool java_object_factoryt::gen_nondet_enum_init(
15051507

15061508
const dereference_exprt element_at_index =
15071509
array_element_from_pointer(enum_array_expr, index_expr);
1508-
code_assignt enum_assign(expr, typecast_exprt(element_at_index, expr.type()));
1510+
code_frontend_assignt enum_assign(
1511+
expr, typecast_exprt(element_at_index, expr.type()));
15091512
assignments.add(enum_assign);
15101513

15111514
return true;
@@ -1520,7 +1523,7 @@ static void assert_type_consistency(const code_blockt &assignments)
15201523
{
15211524
if(code.get_statement() != ID_assign)
15221525
continue;
1523-
const auto &assignment = to_code_assign(code);
1526+
const auto &assignment = to_code_frontend_assign(code);
15241527
INVARIANT(
15251528
assignment.lhs().type() == assignment.rhs().type(),
15261529
"object factory should produce type-consistent assignments");

jbmc/src/java_bytecode/java_static_initializers.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -179,20 +179,20 @@ static irep_idt clinit_local_init_complete_var_name(const irep_idt &class_name)
179179
return id2string(class_name) + CPROVER_PREFIX "clinit_wrapper::init_complete";
180180
}
181181

182-
/// Generates a code_assignt for clinit_statest
182+
/// Generates a code_frontend_assignt for clinit_statest
183183
/// /param expr:
184184
/// expression to be used as the LHS of generated assignment.
185185
/// /param state:
186186
/// execution state of the clint_wrapper, used as the RHS of the generated
187187
/// assignment.
188-
/// /return returns a code_assignt, assigning \p expr to the integer
188+
/// /return returns a code_frontend_assignt, assigning \p expr to the integer
189189
/// representation of \p state
190-
static code_assignt
190+
static code_frontend_assignt
191191
gen_clinit_assign(const exprt &expr, const clinit_statest state)
192192
{
193193
mp_integer initv(static_cast<int>(state));
194194
constant_exprt init_s = from_integer(initv, clinit_states_type());
195-
return code_assignt(expr, init_s);
195+
return code_frontend_assignt(expr, init_s);
196196
}
197197

198198
/// Generates an equal_exprt for clinit_statest
@@ -596,7 +596,7 @@ code_blockt get_thread_safe_clinit_wrapper_body(
596596

597597
// C::__CPROVER_PREFIX_clinit_thread_local_state = INIT_COMPLETE;
598598
{
599-
code_assignt assign = gen_clinit_assign(
599+
code_frontend_assignt assign = gen_clinit_assign(
600600
clinit_thread_local_state_sym.symbol_expr(),
601601
clinit_statest::INIT_COMPLETE);
602602
function_body.add(assign);
@@ -629,15 +629,16 @@ code_blockt get_thread_safe_clinit_wrapper_body(
629629
code_ifthenelset init_conditional(
630630
gen_clinit_eqexpr(
631631
clinit_state_sym.symbol_expr(), clinit_statest::INIT_COMPLETE),
632-
code_blockt({code_assignt(init_complete.symbol_expr(), true_exprt())}));
632+
code_blockt(
633+
{code_frontend_assignt(init_complete.symbol_expr(), true_exprt())}));
633634

634635
code_ifthenelset not_init_conditional(
635636
gen_clinit_eqexpr(
636637
clinit_state_sym.symbol_expr(), clinit_statest::NOT_INIT),
637638
code_blockt(
638639
{gen_clinit_assign(
639640
clinit_state_sym.symbol_expr(), clinit_statest::IN_PROGRESS),
640-
code_assignt(init_complete.symbol_expr(), false_exprt())}),
641+
code_frontend_assignt(init_complete.symbol_expr(), false_exprt())}),
641642
std::move(init_conditional));
642643

643644
function_body.add(std::move(not_init_conditional));
@@ -757,7 +758,8 @@ code_ifthenelset get_clinit_wrapper_body(
757758
false_exprt());
758759

759760
// add the "already-run = false" statement
760-
code_assignt set_already_run(already_run_symbol.symbol_expr(), true_exprt());
761+
code_frontend_assignt set_already_run(
762+
already_run_symbol.symbol_expr(), true_exprt());
761763
code_blockt init_body({set_already_run});
762764

763765
clinit_wrapper_do_recursive_calls(

0 commit comments

Comments
 (0)