Skip to content

Commit b98f58a

Browse files
Make level argument of rename a template argument
The level argument is always known from the call site (except for rename recursive calls), and there are only 3 possible values, so it makes sense to have it as a template argument. This will be useful in particular, when we want the return type to depend on the level.
1 parent 3c3fbad commit b98f58a

10 files changed

+50
-60
lines changed

src/goto-instrument/accelerate/scratch_program.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ exprt scratch_programt::eval(const exprt &e)
7171
{
7272
exprt ssa=e;
7373

74-
symex_state->rename(ssa, ns);
74+
symex_state->rename<goto_symex_statet::L2>(ssa, ns);
7575

7676
return checker->get(ssa);
7777
}

src/goto-symex/goto_symex_state.cpp

Lines changed: 32 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,11 @@ void goto_symex_statet::assignment(
162162
bool allow_pointer_unsoundness)
163163
{
164164
// identifier should be l0 or l1, make sure it's l1
165-
rename(lhs, ns, L1);
165+
rename<L1>(lhs, ns);
166166
irep_idt l1_identifier=lhs.get_identifier();
167167

168168
// the type might need renaming
169-
rename(lhs.type(), l1_identifier, ns);
169+
rename<L2>(lhs.type(), l1_identifier, ns);
170170
lhs.update_type();
171171
if(run_validation_checks)
172172
{
@@ -266,15 +266,13 @@ ssa_exprt
266266
goto_symex_statet::rename_level0_ssa(ssa_exprt ssa, const namespacet &ns)
267267
{
268268
set_l0_indices(ssa, ns);
269-
rename(ssa.type(), ssa.get_identifier(), ns, L0);
269+
rename<L0>(ssa.type(), ssa.get_identifier(), ns);
270270
ssa.update_type();
271271
return ssa;
272272
}
273273

274-
void goto_symex_statet::rename(
275-
exprt &expr,
276-
const namespacet &ns,
277-
levelt level)
274+
template <goto_symex_statet::levelt level>
275+
void goto_symex_statet::rename(exprt &expr, const namespacet &ns)
278276
{
279277
// rename all the symbols with their last known value
280278

@@ -290,13 +288,13 @@ void goto_symex_statet::rename(
290288
else if(level == L1)
291289
{
292290
set_l1_indices(ssa, ns);
293-
rename(expr.type(), ssa.get_identifier(), ns, level);
291+
rename<level>(expr.type(), ssa.get_identifier(), ns);
294292
ssa.update_type();
295293
}
296294
else if(level==L2)
297295
{
298296
set_l1_indices(ssa, ns);
299-
rename(expr.type(), ssa.get_identifier(), ns, level);
297+
rename<level>(expr.type(), ssa.get_identifier(), ns);
300298
ssa.update_type();
301299

302300
if(l2_thread_read_encoding(ssa, ns))
@@ -325,32 +323,27 @@ void goto_symex_statet::rename(
325323
// we never rename function symbols
326324
if(as_const(expr).type().id() == ID_code)
327325
{
328-
rename(
329-
expr.type(),
330-
to_symbol_expr(expr).get_identifier(),
331-
ns,
332-
level);
333-
326+
rename<level>(expr.type(), to_symbol_expr(expr).get_identifier(), ns);
334327
return;
335328
}
336329

337330
expr=ssa_exprt(expr);
338-
rename(expr, ns, level);
331+
rename<level>(expr, ns);
339332
}
340333
else if(expr.id()==ID_address_of)
341334
{
342335
auto &address_of_expr = to_address_of_expr(expr);
343-
rename_address(address_of_expr.object(), ns, level);
336+
rename_address<level>(address_of_expr.object(), ns);
344337
to_pointer_type(expr.type()).subtype() =
345338
as_const(address_of_expr).object().type();
346339
}
347340
else
348341
{
349-
rename(expr.type(), irep_idt(), ns, level);
342+
rename<level>(expr.type(), irep_idt(), ns);
350343

351344
// do this recursively
352345
Forall_operands(it, expr)
353-
rename(*it, ns, level);
346+
rename<level>(*it, ns);
354347

355348
const exprt &c_expr = as_const(expr);
356349
INVARIANT(
@@ -541,10 +534,8 @@ bool goto_symex_statet::l2_thread_write_encoding(
541534
return threads.size()>1;
542535
}
543536

544-
void goto_symex_statet::rename_address(
545-
exprt &expr,
546-
const namespacet &ns,
547-
levelt level)
537+
template <goto_symex_statet::levelt level>
538+
void goto_symex_statet::rename_address(exprt &expr, const namespacet &ns)
548539
{
549540
if(expr.id()==ID_symbol &&
550541
expr.get_bool(ID_C_SSA_symbol))
@@ -554,42 +545,42 @@ void goto_symex_statet::rename_address(
554545
// only do L1!
555546
set_l1_indices(ssa, ns);
556547

557-
rename(expr.type(), ssa.get_identifier(), ns, level);
548+
rename<level>(expr.type(), ssa.get_identifier(), ns);
558549
ssa.update_type();
559550
}
560551
else if(expr.id()==ID_symbol)
561552
{
562553
expr=ssa_exprt(expr);
563-
rename_address(expr, ns, level);
554+
rename_address<level>(expr, ns);
564555
}
565556
else
566557
{
567558
if(expr.id()==ID_index)
568559
{
569560
index_exprt &index_expr=to_index_expr(expr);
570561

571-
rename_address(index_expr.array(), ns, level);
562+
rename_address<level>(index_expr.array(), ns);
572563
PRECONDITION(index_expr.array().type().id() == ID_array);
573564
expr.type() = to_array_type(index_expr.array().type()).subtype();
574565

575566
// the index is not an address
576-
rename(index_expr.index(), ns, level);
567+
rename<level>(index_expr.index(), ns);
577568
}
578569
else if(expr.id()==ID_if)
579570
{
580571
// the condition is not an address
581572
if_exprt &if_expr=to_if_expr(expr);
582-
rename(if_expr.cond(), ns, level);
583-
rename_address(if_expr.true_case(), ns, level);
584-
rename_address(if_expr.false_case(), ns, level);
573+
rename<level>(if_expr.cond(), ns);
574+
rename_address<level>(if_expr.true_case(), ns);
575+
rename_address<level>(if_expr.false_case(), ns);
585576

586577
if_expr.type()=if_expr.true_case().type();
587578
}
588579
else if(expr.id()==ID_member)
589580
{
590581
member_exprt &member_expr=to_member_expr(expr);
591582

592-
rename_address(member_expr.struct_op(), ns, level);
583+
rename_address<level>(member_expr.struct_op(), ns);
593584

594585
// type might not have been renamed in case of nesting of
595586
// structs and pointers/arrays
@@ -606,17 +597,17 @@ void goto_symex_statet::rename_address(
606597
expr.type()=comp.type();
607598
}
608599
else
609-
rename(expr.type(), irep_idt(), ns, level);
600+
rename<level>(expr.type(), irep_idt(), ns);
610601
}
611602
else
612603
{
613604
// this could go wrong, but we would have to re-typecheck ...
614-
rename(expr.type(), irep_idt(), ns, level);
605+
rename<level>(expr.type(), irep_idt(), ns);
615606

616607
// do this recursively; we assume here
617608
// that all the operands are addresses
618609
Forall_operands(it, expr)
619-
rename_address(*it, ns, level);
610+
rename_address<level>(*it, ns);
620611
}
621612
}
622613
}
@@ -674,11 +665,11 @@ static bool requires_renaming(const typet &type, const namespacet &ns)
674665
return false;
675666
}
676667

668+
template <goto_symex_statet::levelt level>
677669
void goto_symex_statet::rename(
678670
typet &type,
679671
const irep_idt &l1_identifier,
680-
const namespacet &ns,
681-
levelt level)
672+
const namespacet &ns)
682673
{
683674
// check whether there are symbol expressions in the type; if not, there
684675
// is no need to expand the struct/union tags in the type
@@ -717,8 +708,8 @@ void goto_symex_statet::rename(
717708
if(type.id()==ID_array)
718709
{
719710
auto &array_type = to_array_type(type);
720-
rename(array_type.subtype(), irep_idt(), ns, level);
721-
rename(array_type.size(), ns, level);
711+
rename<level>(array_type.subtype(), irep_idt(), ns);
712+
rename<level>(array_type.size(), ns);
722713
}
723714
else if(type.id() == ID_struct || type.id() == ID_union)
724715
{
@@ -729,14 +720,14 @@ void goto_symex_statet::rename(
729720
{
730721
// be careful, or it might get cyclic
731722
if(component.type().id() == ID_array)
732-
rename(to_array_type(component.type()).size(), ns, level);
723+
rename<level>(to_array_type(component.type()).size(), ns);
733724
else if(component.type().id() != ID_pointer)
734-
rename(component.type(), irep_idt(), ns, level);
725+
rename<level>(component.type(), irep_idt(), ns);
735726
}
736727
}
737728
else if(type.id()==ID_pointer)
738729
{
739-
rename(to_pointer_type(type).subtype(), irep_idt(), ns, level);
730+
rename<level>(to_pointer_type(type).subtype(), irep_idt(), ns);
740731
}
741732

742733
if(level==L2 &&

src/goto-symex/goto_symex_state.h

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -179,15 +179,13 @@ class goto_symex_statet final : public goto_statet
179179
///
180180
/// A full explanation of SSA (which is why we do this renaming) is in
181181
/// the SSA section of background-concepts.md.
182-
void rename(exprt &expr, const namespacet &ns, levelt level=L2);
182+
template <levelt level = L2>
183+
void rename(exprt &expr, const namespacet &ns);
183184

184185
ssa_exprt rename_level0_ssa(ssa_exprt ssa, const namespacet &ns);
185186

186-
void rename(
187-
typet &type,
188-
const irep_idt &l1_identifier,
189-
const namespacet &ns,
190-
levelt level=L2);
187+
template <levelt level = L2>
188+
void rename(typet &type, const irep_idt &l1_identifier, const namespacet &ns);
191189

192190
void assignment(
193191
ssa_exprt &lhs, // L0/L1
@@ -198,7 +196,8 @@ class goto_symex_statet final : public goto_statet
198196
bool allow_pointer_unsoundness=false);
199197

200198
protected:
201-
void rename_address(exprt &expr, const namespacet &ns, levelt level);
199+
template <levelt>
200+
void rename_address(exprt &expr, const namespacet &ns);
202201

203202
/// Update level 0 values.
204203
void set_l0_indices(ssa_exprt &expr, const namespacet &ns);

src/goto-symex/symex_dead.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ void goto_symext::symex_dead(statet &state)
2727
// We also prevent propagation of old values.
2828

2929
ssa_exprt ssa(code.symbol());
30-
state.rename(ssa, ns, goto_symex_statet::L1);
30+
state.rename<goto_symex_statet::L1>(ssa, ns);
3131

3232
// in case of pointers, put something into the value set
3333
if(code.symbol().type().id() == ID_pointer)
@@ -38,7 +38,7 @@ void goto_symext::symex_dead(statet &state)
3838
else
3939
rhs=exprt(ID_invalid);
4040

41-
state.rename(rhs, ns, goto_symex_statet::L1);
41+
state.rename<goto_symex_statet::L1>(rhs, ns);
4242
state.value_set.assign(ssa, rhs, ns, true, false);
4343
}
4444

src/goto-symex/symex_decl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
3838
// We also prevent propagation of old values.
3939

4040
ssa_exprt ssa(expr);
41-
state.rename(ssa, ns, goto_symex_statet::L1);
41+
state.rename<goto_symex_statet::L1>(ssa, ns);
4242
const irep_idt &l1_identifier=ssa.get_identifier();
4343

4444
// rename type to L2
@@ -54,7 +54,7 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
5454
else
5555
rhs=exprt(ID_invalid);
5656

57-
state.rename(rhs, ns, goto_symex_statet::L1);
57+
state.rename<goto_symex_statet::L1>(rhs, ns);
5858
state.value_set.assign(ssa, rhs, ns, true, false);
5959
}
6060

src/goto-symex/symex_dereference.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,11 +357,11 @@ void goto_symext::dereference(exprt &expr, statet &state)
357357
// from different frames. Would be enough to rename
358358
// symbols whose address is taken.
359359
PRECONDITION(!state.call_stack().empty());
360-
state.rename(expr, ns, goto_symex_statet::L1);
360+
state.rename<goto_symex_statet::L1>(expr, ns);
361361

362362
// start the recursion!
363363
dereference_rec(expr, state);
364364
// dereferencing may introduce new symbol_exprt
365365
// (like __CPROVER_memory)
366-
state.rename(expr, ns, goto_symex_statet::L1);
366+
state.rename<goto_symex_statet::L1>(expr, ns);
367367
}

src/goto-symex/symex_dereference_state.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ symex_dereference_statet::get_or_create_failed_symbol(const exprt &expr)
5151
symbolt sym=*symbol;
5252
symbolt *sym_ptr=nullptr;
5353
symbol_exprt sym_expr=sym.symbol_expr();
54-
state.rename(sym_expr, ns, goto_symex_statet::L1);
54+
state.rename<goto_symex_statet::L1>(sym_expr, ns);
5555
sym.name=to_ssa_expr(sym_expr).get_identifier();
5656
state.symbol_table.move(sym, sym_ptr);
5757
return sym_ptr;
@@ -71,7 +71,7 @@ symex_dereference_statet::get_or_create_failed_symbol(const exprt &expr)
7171
symbolt sym=*symbol;
7272
symbolt *sym_ptr=nullptr;
7373
symbol_exprt sym_expr=sym.symbol_expr();
74-
state.rename(sym_expr, ns, goto_symex_statet::L1);
74+
state.rename<goto_symex_statet::L1>(sym_expr, ns);
7575
sym.name=to_ssa_expr(sym_expr).get_identifier();
7676
state.symbol_table.move(sym, sym_ptr);
7777
return sym_ptr;

src/goto-symex/symex_function_call.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ static void locality(
418418
// identifiers may be shared among functions
419419
// (e.g., due to inlining or other code restructuring)
420420

421-
state.rename(ssa, ns, goto_symex_statet::L1);
421+
state.rename<goto_symex_statet::L1>(ssa, ns);
422422

423423
irep_idt l1_name=ssa.get_identifier();
424424
unsigned offset=0;

src/goto-symex/symex_goto.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ void goto_symext::symex_goto(statet &state)
249249
exprt new_rhs = boolean_negate(new_guard);
250250

251251
ssa_exprt new_lhs(guard_symbol_expr);
252-
state.rename(new_lhs, ns, goto_symex_statet::L1);
252+
state.rename<goto_symex_statet::L1>(new_lhs, ns);
253253
state.assignment(new_lhs, new_rhs, ns, true, false);
254254

255255
guardt guard{true_exprt{}};

src/goto-symex/symex_start_thread.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ void goto_symext::symex_start_thread(statet &state)
7373
std::forward_as_tuple(lhs.get_l1_object_identifier()),
7474
std::forward_as_tuple(lhs, 0));
7575
CHECK_RETURN(emplace_result.second);
76-
state.rename(lhs, ns, goto_symex_statet::L1);
76+
state.rename<goto_symex_statet::L1>(lhs, ns);
7777
const irep_idt l1_name=lhs.get_l1_object_identifier();
7878
// store it
7979
state.l1_history.insert(l1_name);

0 commit comments

Comments
 (0)