Skip to content

Commit 1d837fc

Browse files
level1t type for the result of rename_level1
This makes it explicit in the type that the expression has been renamed up to level1.
1 parent 35f8a82 commit 1d837fc

10 files changed

+82
-57
lines changed

src/goto-symex/goto_symex_state.cpp

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ void goto_symex_statet::assignment(
174174
bool allow_pointer_unsoundness)
175175
{
176176
// identifier should be l0 or l1, make sure it's l1
177-
lhs = rename_level1_ssa(std::move(lhs), ns);
177+
lhs = rename_level1_ssa(std::move(lhs), ns).expr;
178178
irep_idt l1_identifier=lhs.get_identifier();
179179

180180
// the type might need renaming
@@ -330,38 +330,50 @@ goto_symex_statet::rename_level0(const symbol_exprt &expr, const namespacet &ns)
330330
return level0t<ssa_exprt>{ssa};
331331
}
332332

333-
ssa_exprt goto_symex_statet::rename_level1_ssa(
334-
ssa_exprt ssa, const namespacet &ns)
333+
level1t<ssa_exprt> goto_symex_statet::rename_level1(
334+
level0t<ssa_exprt> l0_expr,
335+
const namespacet &ns)
336+
{
337+
set_l1_indices(level0, level1, l0_expr.expr, source.thread_nr, ns);
338+
rename(l0_expr.expr.type(), l0_expr.expr.get_identifier(), ns, L1);
339+
l0_expr.expr.update_type();
340+
return level1t<ssa_exprt>{l0_expr.expr};
341+
}
342+
343+
level1t<ssa_exprt>
344+
goto_symex_statet::rename_level1_ssa(ssa_exprt ssa, const namespacet &ns)
335345
{
336346
set_l1_indices(level0, level1, ssa, source.thread_nr, ns);
337347
rename(ssa.type(), ssa.get_identifier(), ns, L1);
338348
ssa.update_type();
339-
return ssa;
349+
return level1t<ssa_exprt>{ssa};
340350
}
341351

342-
exprt goto_symex_statet::rename_level1(exprt expr, const namespacet &ns)
352+
level1t<exprt>
353+
goto_symex_statet::rename_level1(exprt expr, const namespacet &ns)
343354
{
344355
// rename all the symbols with their last known value
345356
if(auto ssa = expr_try_dynamic_cast<ssa_exprt>(expr))
346357
{
347-
return rename_level1_ssa(*ssa, ns);
358+
expr = rename_level1_ssa(std::move(*ssa), ns).expr;
359+
return level1t<exprt>{expr};
348360
}
349-
else if(expr.id() == ID_symbol)
361+
else if(auto symbol = expr_try_dynamic_cast<symbol_exprt>(expr))
350362
{
351363
// we never rename function symbols
352-
if(expr.type().id() == ID_code)
364+
if(symbol->type().id() == ID_code)
353365
{
354-
rename(expr.type(), to_symbol_expr(expr).get_identifier(), ns, L1);
355-
return expr;
366+
rename(symbol->type(), symbol->get_identifier(), ns, L1);
367+
return level1t<exprt>{std::move(*symbol)};
356368
}
357369

358-
return rename_level1_ssa(ssa_exprt{expr}, ns);
370+
return level1t<exprt>{rename_level1_ssa(ssa_exprt{*symbol}, ns).expr};
359371
}
360372
else if(auto address_of_expr = expr_try_dynamic_cast<address_of_exprt>(expr))
361373
{
362374
rename_address(address_of_expr->object(), ns, L1);
363375
to_pointer_type(expr.type()).subtype() = address_of_expr->object().type();
364-
return expr;
376+
return level1t<exprt>{expr};
365377
}
366378
else
367379
{
@@ -370,10 +382,10 @@ exprt goto_symex_statet::rename_level1(exprt expr, const namespacet &ns)
370382

371383
// do this recursively
372384
for(auto &op : expr.operands())
373-
op = rename_level1(std::move(op), ns);
385+
op = rename_level1(std::move(op), ns).expr;
374386

375387
fix_type(expr);
376-
return expr;
388+
return level1t<exprt>{expr};
377389
}
378390
}
379391

@@ -662,7 +674,7 @@ void goto_symex_statet::rename_address(
662674
PRECONDITION(level != L0);
663675
auto rename_expr = [&](exprt &e) {
664676
if(level == L1)
665-
e = rename_level1(e, ns);
677+
e = rename_level1(e, ns).expr;
666678
else
667679
rename_level2(e, ns);
668680
};
@@ -766,7 +778,7 @@ void goto_symex_statet::rename(
766778
if(level == L0)
767779
e = rename_level0(std::move(e), ns);
768780
if(level == L1)
769-
e = rename_level1(e, ns);
781+
e = rename_level1(e, ns).expr;
770782
else
771783
rename_level2(e, ns);
772784
};

src/goto-symex/goto_symex_state.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,11 @@ class goto_symex_statet final
7373
// performs renaming _up to_ the given level
7474
level0t<ssa_exprt>
7575
rename_level0(const symbol_exprt &expr, const namespacet &ns);
76-
ssa_exprt rename_level1_ssa(ssa_exprt expr, const namespacet &ns);
77-
exprt rename_level1(exprt expr, const namespacet &ns);
78-
ssa_exprt rename_level2_ssa(ssa_exprt expr, const namespacet &ns);
79-
exprt rename_level2(exprt expr, const namespacet &ns);
76+
level1t<ssa_exprt> rename_level1_ssa(ssa_exprt expr, const namespacet &ns);
77+
level1t<exprt> rename_level1(exprt expr, const namespacet &ns);
78+
level1t<ssa_exprt>
79+
rename_level1(level0t<ssa_exprt> l0_expr, const namespacet &ns);
80+
void rename_level2(exprt &expr, const namespacet &ns);
8081
void rename(
8182
typet &type,
8283
const irep_idt &l1_identifier,

src/goto-symex/renaming_level.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@ struct level0t
6161
underlyingt expr;
6262
};
6363

64+
/// Wrapper for expressions that have been renamed at level1
65+
template <typename underlyingt>
66+
struct level1t
67+
{
68+
static_assert(
69+
std::is_base_of<exprt, underlyingt>::value,
70+
"underlyingt should inherit from exprt");
71+
underlyingt expr;
72+
};
73+
6474
/// Set the level 0 renaming of SSA expressions.
6575
/// Level 0 corresponds to threads.
6676
/// The renaming is built for one particular interleaving.

src/goto-symex/symex_dead.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ void goto_symext::symex_dead(statet &state)
2626
// We increase the L2 renaming to make these non-deterministic.
2727
// We also prevent propagation of old values.
2828

29-
ssa_exprt ssa = state.rename_level1_ssa(ssa_exprt{code.symbol()}, ns);
29+
level1t<ssa_exprt> ssa =
30+
state.rename_level1_ssa(ssa_exprt{code.symbol()}, ns);
3031

3132
// in case of pointers, put something into the value set
3233
if(code.symbol().type().id() == ID_pointer)
@@ -37,11 +38,11 @@ void goto_symext::symex_dead(statet &state)
3738
return exprt(ID_invalid);
3839
}();
3940

40-
exprt l1_rhs = state.rename_level1(std::move(rhs), ns);
41-
state.value_set.assign(ssa, l1_rhs, ns, true, false);
41+
level1t<exprt> l1_rhs = state.rename_level1(std::move(rhs), ns);
42+
state.value_set.assign(ssa.expr, l1_rhs.expr, ns, true, false);
4243
}
4344

44-
const irep_idt &l1_identifier = ssa.get_identifier();
45+
const irep_idt &l1_identifier=ssa.expr.get_identifier();
4546

4647
// prevent propagation
4748
state.propagation.erase(l1_identifier);

src/goto-symex/symex_decl.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
3737
// We increase the L2 renaming to make these non-deterministic.
3838
// We also prevent propagation of old values.
3939

40-
ssa_exprt ssa = state.rename_level1_ssa(ssa_exprt{expr}, ns);
41-
const irep_idt &l1_identifier = ssa.get_identifier();
40+
level1t<ssa_exprt> ssa = state.rename_level1_ssa(ssa_exprt{expr}, ns);
41+
const irep_idt &l1_identifier = ssa.expr.get_identifier();
4242

4343
// rename type to L2
44-
state.rename(ssa.type(), l1_identifier, ns);
45-
ssa.update_type();
44+
state.rename(ssa.expr.type(), l1_identifier, ns);
45+
ssa.expr.update_type();
4646

4747
// in case of pointers, put something into the value set
4848
if(expr.type().id() == ID_pointer)
@@ -53,8 +53,8 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
5353
return exprt(ID_invalid);
5454
}();
5555

56-
exprt l1_rhs = state.rename_level1(std::move(rhs), ns);
57-
state.value_set.assign(ssa, l1_rhs, ns, true, false);
56+
level1t<exprt> l1_rhs = state.rename_level1(std::move(rhs), ns);
57+
state.value_set.assign(ssa.expr, l1_rhs.expr, ns, true, false);
5858
}
5959

6060
// prevent propagation
@@ -64,12 +64,12 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
6464
// inlining may yield multiple declarations of the same identifier
6565
// within the same L1 context
6666
const auto level2_it = state.level2.current_names
67-
.emplace(l1_identifier, std::make_pair(ssa, 0))
67+
.emplace(l1_identifier, std::make_pair(ssa.expr, 0))
6868
.first;
6969
symex_renaming_levelt::increase_counter(level2_it);
7070
const bool record_events=state.record_events;
7171
state.record_events=false;
72-
state.rename_level2_ssa(ssa, ns);
72+
state.rename_level2(ssa.expr, ns);
7373
state.record_events=record_events;
7474

7575
// we hide the declaration of auxiliary variables
@@ -81,12 +81,12 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
8181

8282
target.decl(
8383
state.guard.as_expr(),
84-
ssa,
84+
ssa.expr,
8585
state.source,
8686
hidden ? symex_targett::assignment_typet::HIDDEN
8787
: symex_targett::assignment_typet::STATE);
8888

89-
if(state.dirty(ssa.get_object_name()) && state.atomic_section_id == 0)
89+
if(state.dirty(ssa.expr.get_object_name()) && state.atomic_section_id == 0)
9090
target.shared_write(
91-
state.guard.as_expr(), ssa, state.atomic_section_id, state.source);
91+
state.guard.as_expr(), ssa.expr, state.atomic_section_id, state.source);
9292
}

src/goto-symex/symex_dereference.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -381,12 +381,12 @@ void goto_symext::dereference(
381381
// from different frames. Would be enough to rename
382382
// symbols whose address is taken.
383383
PRECONDITION(!state.call_stack().empty());
384-
state.rename_level1(expr, ns);
384+
level1t<exprt> l1_expr = state.rename_level1(expr, ns);
385385

386386
// start the recursion!
387387
guardt guard{true_exprt{}};
388-
dereference_rec(expr, state, guard, write);
388+
dereference_rec(l1_expr.expr, state, guard, write);
389389
// dereferencing may introduce new symbol_exprt
390390
// (like __CPROVER_memory)
391-
state.rename_level1(expr, ns);
391+
expr = state.rename_level1(std::move(l1_expr.expr), ns).expr;
392392
}

src/goto-symex/symex_dereference_state.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ bool symex_dereference_statet::has_failed_symbol(
3636
{
3737
symbolt sym=*symbol;
3838
symbolt *sym_ptr=nullptr;
39-
const ssa_exprt sym_expr =
39+
const level1t<ssa_exprt> sym_expr =
4040
state.rename_level1_ssa(ssa_exprt{sym.symbol_expr()}, ns);
41-
sym.name = sym_expr.get_identifier();
41+
sym.name = sym_expr.expr.get_identifier();
4242
state.symbol_table.move(sym, sym_ptr);
4343
symbol=sym_ptr;
4444
return true;
@@ -56,9 +56,9 @@ bool symex_dereference_statet::has_failed_symbol(
5656
{
5757
symbolt sym=*symbol;
5858
symbolt *sym_ptr=nullptr;
59-
const ssa_exprt sym_expr =
59+
const level1t<ssa_exprt> sym_expr =
6060
state.rename_level1_ssa(ssa_exprt{sym.symbol_expr()}, ns);
61-
sym.name = sym_expr.get_identifier();
61+
sym.name = sym_expr.expr.get_identifier();
6262
state.symbol_table.move(sym, sym_ptr);
6363
symbol=sym_ptr;
6464
return true;

src/goto-symex/symex_function_call.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -422,17 +422,17 @@ void goto_symext::locality(
422422
// identifiers may be shared among functions
423423
// (e.g., due to inlining or other code restructuring)
424424

425-
state.rename_level1(l0.expr, ns);
425+
level1t<ssa_exprt> ssa = state.rename_level1(std::move(l0), ns);
426426

427-
irep_idt l1_name = l0.expr.get_identifier();
427+
irep_idt l1_name = ssa.expr.get_identifier();
428428
unsigned offset=0;
429429

430430
while(state.l1_history.find(l1_name)!=state.l1_history.end())
431431
{
432432
symex_renaming_levelt::increase_counter(c_it);
433433
++offset;
434-
l0.expr.set_level_1(frame_nr + offset);
435-
l1_name = l0.expr.get_identifier();
434+
ssa.expr.set_level_1(frame_nr + offset);
435+
l1_name = ssa.expr.get_identifier();
436436
}
437437

438438
// now unique -- store

src/goto-symex/symex_goto.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -246,23 +246,24 @@ void goto_symext::symex_goto(statet &state)
246246
symbol_exprt(guard_identifier, bool_typet());
247247
exprt new_rhs = boolean_negate(new_guard);
248248

249-
ssa_exprt new_lhs =
249+
level1t<ssa_exprt> new_lhs =
250250
state.rename_level1_ssa(ssa_exprt{guard_symbol_expr}, ns);
251-
state.assignment(new_lhs, new_rhs, ns, true, false);
251+
state.assignment(new_lhs.expr, new_rhs, ns, true, false);
252252

253253
guardt guard{true_exprt{}};
254254

255255
log.conditional_output(
256-
log.debug(),
257-
[this, &new_lhs](messaget::mstreamt &mstream) {
258-
mstream << "Assignment to " << new_lhs.get_identifier()
259-
<< " [" << pointer_offset_bits(new_lhs.type(), ns).value_or(0) << " bits]"
260-
<< messaget::eom;
256+
log.debug(), [this, &new_lhs](messaget::mstreamt &mstream) {
257+
mstream << "Assignment to " << new_lhs.expr.get_identifier() << " ["
258+
<< pointer_offset_bits(new_lhs.expr.type(), ns).value_or(0)
259+
<< " bits]" << messaget::eom;
261260
});
262261

263262
target.assignment(
264263
guard.as_expr(),
265-
new_lhs, new_lhs, guard_symbol_expr,
264+
new_lhs.expr,
265+
new_lhs.expr,
266+
guard_symbol_expr,
266267
new_rhs,
267268
original_source,
268269
symex_targett::assignment_typet::GUARD);

src/goto-symex/symex_start_thread.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ void goto_symext::symex_start_thread(statet &state)
7070
auto emplace_result = state.level1.current_names.emplace(
7171
lhs.get_l1_object_identifier(), std::make_pair(l0_lhs.expr, 0));
7272
CHECK_RETURN(emplace_result.second);
73-
state.rename_level1(l0_lhs.expr, ns);
74-
const irep_idt l1_name = l0_lhs.expr.get_l1_object_identifier();
73+
const level1t<ssa_exprt> l1_lhs = state.rename_level1(l0_lhs, ns);
74+
const irep_idt l1_name = l1_lhs.expr.get_l1_object_identifier();
7575
// store it
7676
state.l1_history.insert(l1_name);
7777
new_thread.call_stack.back().local_objects.insert(l1_name);
@@ -84,7 +84,7 @@ void goto_symext::symex_start_thread(statet &state)
8484
state.record_events=false;
8585
symex_assign_symbol(
8686
state,
87-
l0_lhs.expr,
87+
l1_lhs.expr,
8888
nil_exprt(),
8989
rhs,
9090
guard,

0 commit comments

Comments
 (0)