Skip to content

Commit 4c101fa

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 ac22d55 commit 4c101fa

13 files changed

+71
-79
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>
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>
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_assign.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ void goto_symext::symex_assign_symbol(
212212
tmp_ssa_rhs.swap(ssa_rhs);
213213
}
214214

215-
state.rename(ssa_rhs, ns);
215+
state.rename<goto_symex_statet::L2>(ssa_rhs, ns);
216216
do_simplify(ssa_rhs);
217217

218218
ssa_exprt ssa_lhs=lhs;
@@ -228,7 +228,7 @@ void goto_symext::symex_assign_symbol(
228228
ssa_full_lhs=add_to_lhs(ssa_full_lhs, ssa_lhs);
229229
const bool record_events=state.record_events;
230230
state.record_events=false;
231-
state.rename(ssa_full_lhs, ns);
231+
state.rename<goto_symex_statet::L2>(ssa_full_lhs, ns);
232232
state.record_events=record_events;
233233

234234
guardt tmp_guard(state.guard);
@@ -407,7 +407,7 @@ void goto_symext::symex_assign_if(
407407
guardt old_guard=guard;
408408

409409
exprt renamed_guard=lhs.cond();
410-
state.rename(renamed_guard, ns);
410+
state.rename<goto_symex_statet::L2>(renamed_guard, ns);
411411
do_simplify(renamed_guard);
412412

413413
if(!renamed_guard.is_false())

src/goto-symex/symex_builtin_functions.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ void goto_symext::symex_allocate(
7171
else
7272
{
7373
exprt tmp_size=size;
74-
state.rename(tmp_size, ns); // to allow constant propagation
74+
state.rename<goto_symex_statet::L2>(
75+
tmp_size, ns); // to allow constant propagation
7576
simplify(tmp_size, ns);
7677

7778
// special treatment for sizeof(T)*x
@@ -163,7 +164,8 @@ void goto_symext::symex_allocate(
163164
state.symbol_table.add(value_symbol);
164165

165166
exprt zero_init=code.op1();
166-
state.rename(zero_init, ns); // to allow constant propagation
167+
state.rename<goto_symex_statet::L2>(
168+
zero_init, ns); // to allow constant propagation
167169
simplify(zero_init, ns);
168170

169171
INVARIANT(
@@ -232,7 +234,7 @@ void goto_symext::symex_gcc_builtin_va_arg_next(
232234
return; // ignore
233235

234236
exprt tmp=code.op0();
235-
state.rename(tmp, ns); // to allow constant propagation
237+
state.rename<goto_symex_statet::L2>(tmp, ns); // to allow constant propagation
236238
do_simplify(tmp);
237239
irep_idt id=get_symbol(tmp);
238240

@@ -310,7 +312,7 @@ void goto_symext::symex_printf(
310312
PRECONDITION(!rhs.operands().empty());
311313

312314
exprt tmp_rhs=rhs;
313-
state.rename(tmp_rhs, ns);
315+
state.rename<goto_symex_statet::L2>(tmp_rhs, ns);
314316
do_simplify(tmp_rhs);
315317

316318
const exprt::operandst &operands=tmp_rhs.operands();
@@ -336,14 +338,14 @@ void goto_symext::symex_input(
336338

337339
exprt id_arg=code.op0();
338340

339-
state.rename(id_arg, ns);
341+
state.rename<goto_symex_statet::L2>(id_arg, ns);
340342

341343
std::list<exprt> args;
342344

343345
for(std::size_t i=1; i<code.operands().size(); i++)
344346
{
345347
args.push_back(code.operands()[i]);
346-
state.rename(args.back(), ns);
348+
state.rename<goto_symex_statet::L2>(args.back(), ns);
347349
do_simplify(args.back());
348350
}
349351

@@ -360,14 +362,14 @@ void goto_symext::symex_output(
360362

361363
exprt id_arg=code.op0();
362364

363-
state.rename(id_arg, ns);
365+
state.rename<goto_symex_statet::L2>(id_arg, ns);
364366

365367
std::list<exprt> args;
366368

367369
for(std::size_t i=1; i<code.operands().size(); i++)
368370
{
369371
args.push_back(code.operands()[i]);
370-
state.rename(args.back(), ns);
372+
state.rename<goto_symex_statet::L2>(args.back(), ns);
371373
do_simplify(args.back());
372374
}
373375

@@ -481,7 +483,7 @@ void goto_symext::symex_trace(
481483
for(std::size_t j=2; j<code.arguments().size(); j++)
482484
{
483485
exprt var(code.arguments()[j]);
484-
state.rename(var, ns);
486+
state.rename<goto_symex_statet::L2>(var, ns);
485487
vars.push_back(var);
486488
}
487489

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

0 commit comments

Comments
 (0)