Skip to content

Commit 2ff6a73

Browse files
Type for the result of rename_level0
This makes explicit the fact that the expression has been renamed. Making it possible to define functions which only accept expression which have been through renaming.
1 parent b10550f commit 2ff6a73

File tree

5 files changed

+29
-17
lines changed

5 files changed

+29
-17
lines changed

src/goto-symex/goto_symex_state.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ exprt goto_symex_statet::rename_level0(exprt expr, const namespacet &ns)
285285
// rename all the symbols with their last known value
286286
if(auto ssa = expr_try_dynamic_cast<ssa_exprt>(expr))
287287
{
288-
return rename_level0(*ssa, ns);
288+
return rename_level0(*ssa, ns).expr;
289289
}
290290
else if(expr.id() == ID_symbol)
291291
{
@@ -320,14 +320,14 @@ exprt goto_symex_statet::rename_level0(exprt expr, const namespacet &ns)
320320
}
321321
}
322322

323-
ssa_exprt
323+
level0t<ssa_exprt>
324324
goto_symex_statet::rename_level0(const symbol_exprt &expr, const namespacet &ns)
325325
{
326326
ssa_exprt ssa{expr};
327327
set_l0_indices(level0, ssa, source.thread_nr, ns);
328328
rename(ssa.type(), ssa.get_identifier(), ns, L0);
329329
ssa.update_type();
330-
return ssa;
330+
return level0t<ssa_exprt>{ssa};
331331
}
332332

333333
ssa_exprt goto_symex_statet::rename_level1_ssa(

src/goto-symex/goto_symex_state.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ class goto_symex_statet final
7171
enum levelt { L0=0, L1=1, L2=2 };
7272

7373
// performs renaming _up to_ the given level
74-
ssa_exprt rename_level0(const symbol_exprt &expr, const namespacet &ns);
74+
level0t<ssa_exprt>
75+
rename_level0(const symbol_exprt &expr, const namespacet &ns);
7576
ssa_exprt rename_level1_ssa(ssa_exprt expr, const namespacet &ns);
7677
exprt rename_level1(exprt expr, const namespacet &ns);
7778
ssa_exprt rename_level2_ssa(ssa_exprt expr, const namespacet &ns);

src/goto-symex/renaming_level.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ struct symex_renaming_levelt
5151
}
5252
};
5353

54+
/// Wrapper for expressions that have been renamed at level0
55+
template <typename underlyingt>
56+
struct level0t
57+
{
58+
static_assert(
59+
std::is_base_of<exprt, underlyingt>::value,
60+
"underlyingt should inherit from exprt");
61+
underlyingt expr;
62+
};
63+
5464
/// Set the level 0 renaming of SSA expressions.
5565
/// Level 0 corresponds to threads.
5666
/// The renaming is built for one particular interleaving.

src/goto-symex/symex_function_call.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -399,39 +399,40 @@ void goto_symext::locality(
399399
it++)
400400
{
401401
// get L0 name
402-
ssa_exprt ssa = state.rename_level0(ns.lookup(*it).symbol_expr(), ns);
403-
const irep_idt l0_name=ssa.get_identifier();
402+
level0t<ssa_exprt> l0 =
403+
state.rename_level0(ns.lookup(*it).symbol_expr(), ns);
404+
const irep_idt l0_name = l0.expr.get_identifier();
404405

405406
// save old L1 name for popping the frame
406407
auto c_it = state.level1.current_names.find(l0_name);
407408

408409
if(c_it != state.level1.current_names.end())
409410
{
410411
frame.old_level1.emplace(l0_name, c_it->second);
411-
c_it->second = std::make_pair(ssa, frame_nr);
412+
c_it->second = std::make_pair(l0.expr, frame_nr);
412413
}
413414
else
414415
{
415416
c_it = state.level1.current_names
416-
.emplace(l0_name, std::make_pair(ssa, frame_nr))
417+
.emplace(l0_name, std::make_pair(l0.expr, frame_nr))
417418
.first;
418419
}
419420

420421
// do L1 renaming -- these need not be unique, as
421422
// identifiers may be shared among functions
422423
// (e.g., due to inlining or other code restructuring)
423424

424-
state.rename_level1(ssa, ns);
425+
state.rename_level1(l0.expr, ns);
425426

426-
irep_idt l1_name=ssa.get_identifier();
427+
irep_idt l1_name = l0.expr.get_identifier();
427428
unsigned offset=0;
428429

429430
while(state.l1_history.find(l1_name)!=state.l1_history.end())
430431
{
431432
symex_renaming_levelt::increase_counter(c_it);
432433
++offset;
433-
ssa.set_level_1(frame_nr+offset);
434-
l1_name=ssa.get_identifier();
434+
l0.expr.set_level_1(frame_nr + offset);
435+
l1_name = l0.expr.get_identifier();
435436
}
436437

437438
// now unique -- store

src/goto-symex/symex_start_thread.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,14 @@ void goto_symext::symex_start_thread(statet &state)
6565
ssa_exprt lhs(c_it->second.first.get_original_expr());
6666

6767
// get L0 name for current thread
68-
lhs.set_level_0(t);
68+
level0t<ssa_exprt> l0_lhs = state.rename_level0(lhs, ns);
6969

7070
// set up L1 name
7171
auto emplace_result = state.level1.current_names.emplace(
72-
lhs.get_l1_object_identifier(), std::make_pair(lhs, 0));
72+
lhs.get_l1_object_identifier(), std::make_pair(l0_lhs.expr, 0));
7373
CHECK_RETURN(emplace_result.second);
74-
state.rename_level1(lhs, ns);
75-
const irep_idt l1_name=lhs.get_l1_object_identifier();
74+
state.rename_level1(l0_lhs.expr, ns);
75+
const irep_idt l1_name = l0_lhs.expr.get_l1_object_identifier();
7676
// store it
7777
state.l1_history.insert(l1_name);
7878
new_thread.call_stack.back().local_objects.insert(l1_name);
@@ -85,7 +85,7 @@ void goto_symext::symex_start_thread(statet &state)
8585
state.record_events=false;
8686
symex_assign_symbol(
8787
state,
88-
lhs,
88+
l0_lhs.expr,
8989
nil_exprt(),
9090
rhs,
9191
guard,

0 commit comments

Comments
 (0)