Skip to content

Commit 664de48

Browse files
Merge pull request #4806 from romainbrenguier/clean-up/find-symbols
Clean-up find_symbols
2 parents 2a1c22b + 3abe34e commit 664de48

File tree

15 files changed

+108
-117
lines changed

15 files changed

+108
-117
lines changed

src/ansi-c/expr2c.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,7 @@ static std::string clean_identifier(const irep_idt &id)
112112

113113
void expr2ct::get_shorthands(const exprt &expr)
114114
{
115-
find_symbols_sett symbols;
116-
find_symbols(expr, symbols);
115+
const std::unordered_set<irep_idt> symbols = find_symbol_identifiers(expr);
117116

118117
// avoid renaming parameters, if possible
119118
for(const auto &symbol_id : symbols)

src/goto-instrument/accelerate/accelerate.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -392,11 +392,11 @@ void acceleratet::add_dirty_checks()
392392
find_symbols_sett read;
393393

394394
if(it->has_condition())
395-
find_symbols(it->get_condition(), read);
395+
find_symbols_or_nexts(it->get_condition(), read);
396396

397397
if(it->is_assign())
398398
{
399-
find_symbols(it->get_assign().rhs(), read);
399+
find_symbols_or_nexts(it->get_assign().rhs(), read);
400400
}
401401

402402
for(find_symbols_sett::iterator jt=read.begin();

src/goto-instrument/accelerate/acceleration_utils.cpp

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -211,23 +211,15 @@ void acceleration_utilst::stash_variables(
211211
expr_sett modified,
212212
substitutiont &substitution)
213213
{
214-
find_symbols_sett vars;
215-
216-
for(expr_sett::iterator it=modified.begin();
217-
it!=modified.end();
218-
++it)
219-
{
220-
find_symbols(*it, vars);
221-
}
222-
223-
irep_idt loop_counter_name=to_symbol_expr(loop_counter).get_identifier();
214+
find_symbols_sett vars =
215+
find_symbols_or_nexts(modified.begin(), modified.end());
216+
const irep_idt &loop_counter_name =
217+
to_symbol_expr(loop_counter).get_identifier();
224218
vars.erase(loop_counter_name);
225219

226-
for(find_symbols_sett::iterator it=vars.begin();
227-
it!=vars.end();
228-
++it)
220+
for(const irep_idt &symbol : vars)
229221
{
230-
const symbolt &orig = symbol_table.lookup_ref(*it);
222+
const symbolt &orig = symbol_table.lookup_ref(symbol);
231223
symbolt stashed_sym=fresh_symbol("polynomial::stash", orig.type);
232224
substitution[orig.symbol_expr()]=stashed_sym.symbol_expr();
233225
program.assign(stashed_sym.symbol_expr(), orig.symbol_expr());

src/goto-instrument/accelerate/polynomial_accelerator.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -752,23 +752,14 @@ void polynomial_acceleratort::stash_variables(
752752
expr_sett modified,
753753
substitutiont &substitution)
754754
{
755-
find_symbols_sett vars;
756-
757-
for(expr_sett::iterator it=modified.begin();
758-
it!=modified.end();
759-
++it)
760-
{
761-
find_symbols(*it, vars);
762-
}
763-
755+
find_symbols_sett vars =
756+
find_symbols_or_nexts(modified.begin(), modified.end());
764757
irep_idt loop_counter_name=to_symbol_expr(loop_counter).get_identifier();
765758
vars.erase(loop_counter_name);
766759

767-
for(find_symbols_sett::iterator it=vars.begin();
768-
it!=vars.end();
769-
++it)
760+
for(const irep_idt &id : vars)
770761
{
771-
const symbolt &orig = symbol_table.lookup_ref(*it);
762+
const symbolt &orig = symbol_table.lookup_ref(id);
772763
symbolt stashed_sym=utils.fresh_symbol("polynomial::stash", orig.type);
773764
substitution[orig.symbol_expr()]=stashed_sym.symbol_expr();
774765
program.assign(stashed_sym.symbol_expr(), orig.symbol_expr());

src/goto-instrument/concurrency.cpp

Lines changed: 29 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -78,34 +78,22 @@ class concurrency_instrumentationt
7878

7979
void concurrency_instrumentationt::instrument(exprt &expr)
8080
{
81-
std::set<exprt> symbols;
82-
83-
find_symbols(expr, symbols);
84-
8581
replace_symbolt replace_symbol;
8682

87-
for(std::set<exprt>::const_iterator
88-
s_it=symbols.begin();
89-
s_it!=symbols.end();
90-
s_it++)
83+
for(const symbol_exprt &s : find_symbols(expr))
9184
{
92-
if(s_it->id()==ID_symbol)
93-
{
94-
const symbol_exprt &s = to_symbol_expr(*s_it);
85+
shared_varst::const_iterator v_it = shared_vars.find(s.get_identifier());
9586

96-
shared_varst::const_iterator v_it = shared_vars.find(s.get_identifier());
97-
98-
if(v_it!=shared_vars.end())
99-
{
100-
UNIMPLEMENTED;
101-
// not yet done: neither array_symbol nor w_index_symbol are actually
102-
// initialized anywhere
103-
const shared_vart &shared_var = v_it->second;
104-
const index_exprt new_expr(
105-
*shared_var.array_symbol, *shared_var.w_index_symbol);
106-
107-
replace_symbol.insert(s, new_expr);
108-
}
87+
if(v_it != shared_vars.end())
88+
{
89+
UNIMPLEMENTED;
90+
// not yet done: neither array_symbol nor w_index_symbol are actually
91+
// initialized anywhere
92+
const shared_vart &shared_var = v_it->second;
93+
const index_exprt new_expr(
94+
*shared_var.array_symbol, *shared_var.w_index_symbol);
95+
96+
replace_symbol.insert(s, new_expr);
10997
}
11098
}
11199
}
@@ -143,42 +131,29 @@ void concurrency_instrumentationt::instrument(
143131

144132
void concurrency_instrumentationt::collect(const exprt &expr)
145133
{
146-
std::set<exprt> symbols;
134+
for(const auto &identifier : find_symbol_identifiers(expr))
135+
{
136+
namespacet ns(symbol_table);
137+
const symbolt &symbol = ns.lookup(identifier);
147138

148-
find_symbols(expr, symbols);
139+
if(!symbol.is_state_var)
140+
continue;
149141

150-
for(std::set<exprt>::const_iterator
151-
s_it=symbols.begin();
152-
s_it!=symbols.end();
153-
s_it++)
154-
{
155-
if(s_it->id()==ID_symbol)
142+
if(symbol.is_thread_local)
156143
{
157-
const irep_idt identifier=
158-
to_symbol_expr(*s_it).get_identifier();
159-
160-
namespacet ns(symbol_table);
161-
const symbolt &symbol=ns.lookup(identifier);
144+
if(thread_local_vars.find(identifier) != thread_local_vars.end())
145+
continue;
162146

163-
if(!symbol.is_state_var)
147+
thread_local_vart &thread_local_var = thread_local_vars[identifier];
148+
thread_local_var.type = symbol.type;
149+
}
150+
else
151+
{
152+
if(shared_vars.find(identifier) != shared_vars.end())
164153
continue;
165154

166-
if(symbol.is_thread_local)
167-
{
168-
if(thread_local_vars.find(identifier)!=thread_local_vars.end())
169-
continue;
170-
171-
thread_local_vart &thread_local_var=thread_local_vars[identifier];
172-
thread_local_var.type=symbol.type;
173-
}
174-
else
175-
{
176-
if(shared_vars.find(identifier)!=shared_vars.end())
177-
continue;
178-
179-
shared_vart &shared_var=shared_vars[identifier];
180-
shared_var.type=symbol.type;
181-
}
155+
shared_vart &shared_var = shared_vars[identifier];
156+
shared_var.type = symbol.type;
182157
}
183158
}
184159
}

src/goto-instrument/dump_c.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -849,7 +849,7 @@ void dump_ct::convert_global_variable(
849849

850850
find_symbols_sett syms;
851851
if(symbol.value.is_not_nil())
852-
find_symbols(symbol.value, syms);
852+
find_symbols_or_nexts(symbol.value, syms);
853853

854854
// add a tentative declaration to cater for symbols in the initializer
855855
// relying on it this symbol

src/goto-instrument/full_slicer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ void full_slicert::add_decl_dead(
6767

6868
find_symbols_sett syms;
6969

70-
node.PC->apply([&syms](const exprt &e) { find_symbols(e, syms); });
70+
node.PC->apply([&syms](const exprt &e) { find_symbols_or_nexts(e, syms); });
7171

7272
for(find_symbols_sett::const_iterator
7373
it=syms.begin();

src/goto-programs/goto_program.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -716,7 +716,7 @@ void goto_programt::instructiont::validate(
716716
auto expr_symbol_finder = [&](const exprt &e) {
717717
find_symbols_sett typetags;
718718
find_type_symbols(e.type(), typetags);
719-
find_symbols(e, typetags);
719+
find_symbols_or_nexts(e, typetags);
720720
const symbolt *symbol;
721721
for(const auto &identifier : typetags)
722722
{

src/goto-symex/postcondition.cpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -160,16 +160,12 @@ bool postconditiont::is_used(
160160
else if(expr.id()==ID_dereference)
161161
{
162162
// aliasing may happen here
163-
std::vector<exprt> expr_set =
163+
const std::vector<exprt> expr_set =
164164
value_set.get_value_set(to_dereference_expr(expr).pointer(), ns);
165-
std::unordered_set<irep_idt> symbols;
166-
167-
for(const exprt &e : expr_set)
168-
{
169-
const exprt tmp = get_original_name(e);
170-
find_symbols(tmp, symbols);
171-
}
172-
165+
const auto original_names = make_range(expr_set).map(
166+
[](const exprt &e) { return get_original_name(e); });
167+
const std::unordered_set<irep_idt> symbols =
168+
find_symbols_or_nexts(original_names.begin(), original_names.end());
173169
return symbols.find(identifier)!=symbols.end();
174170
}
175171
else

src/goto-symex/precondition.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,8 @@ void preconditiont::compute_rec(exprt &dest)
114114

115115
const std::vector<exprt> expr_set = value_sets.get_values(
116116
SSA_step.source.function_id, target, deref_expr.pointer());
117-
std::unordered_set<irep_idt> symbols;
118-
119-
for(const exprt &e : expr_set)
120-
find_symbols(e, symbols);
117+
const std::unordered_set<irep_idt> symbols =
118+
find_symbols_or_nexts(expr_set.begin(), expr_set.end());
121119

122120
if(symbols.find(lhs_identifier)!=symbols.end())
123121
{

src/goto-symex/symex_dead.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ void goto_symext::symex_dead(statet &state, const symbol_exprt &symbol_expr)
3232

3333
const exprt fields = state.field_sensitivity.get_fields(ns, state, ssa);
3434
find_symbols_sett fields_set;
35-
find_symbols(fields, fields_set);
35+
find_symbols_or_nexts(fields, fields_set);
3636

3737
for(const irep_idt &l1_identifier : fields_set)
3838
{

src/goto-symex/symex_decl.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,7 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
6565

6666
// L2 renaming
6767
const exprt fields = state.field_sensitivity.get_fields(ns, state, ssa);
68-
std::set<symbol_exprt> fields_set;
69-
find_symbols(fields, fields_set);
70-
71-
for(const auto &l1_symbol : fields_set)
68+
for(const auto &l1_symbol : find_symbols(fields))
7269
{
7370
ssa_exprt field_ssa = to_ssa_expr(l1_symbol);
7471
std::size_t field_generation =

src/solvers/refinement/refine_arrays.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,7 @@ void bv_refinementt::freeze_lazy_constraints()
111111

112112
for(const auto &constraint : lazy_array_constraints)
113113
{
114-
std::set<symbol_exprt> symbols_in_constraint;
115-
find_symbols(constraint.lazy, symbols_in_constraint);
116-
for(const auto &symbol : symbols_in_constraint)
114+
for(const auto &symbol : find_symbols(constraint.lazy))
117115
{
118116
const bvt bv=convert_bv(symbol);
119117
forall_literals(b_it, bv)

src/util/find_symbols.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ Author: Daniel Kroening, [email protected]
88

99
#include "find_symbols.h"
1010

11-
#include "std_types.h"
11+
#include "expr_iterator.h"
12+
#include "range.h"
1213
#include "std_expr.h"
14+
#include "std_types.h"
1315

1416
enum class kindt { F_TYPE, F_TYPE_NON_PTR, F_EXPR, F_BOTH };
1517

16-
void find_symbols(
17-
const exprt &src,
18-
find_symbols_sett &dest)
18+
void find_symbols_or_nexts(const exprt &src, find_symbols_sett &dest)
1919
{
2020
find_symbols(src, dest, true, true);
2121
}
@@ -81,6 +81,23 @@ void find_symbols(
8181
});
8282
}
8383

84+
std::set<symbol_exprt> find_symbols(const exprt &src)
85+
{
86+
return make_range(src.depth_begin(), src.depth_end())
87+
.filter([](const exprt &e) { return e.id() == ID_symbol; })
88+
.map([](const exprt &e) { return to_symbol_expr(e); });
89+
}
90+
91+
std::unordered_set<irep_idt> find_symbol_identifiers(const exprt &src)
92+
{
93+
std::unordered_set<irep_idt> result;
94+
src.visit_pre([&](const exprt &e) {
95+
if(e.id() == ID_symbol)
96+
result.insert(to_symbol_expr(e).get_identifier());
97+
});
98+
return result;
99+
}
100+
84101
void find_symbols(kindt kind, const typet &src, find_symbols_sett &dest);
85102

86103
void find_symbols(kindt kind, const exprt &src, find_symbols_sett &dest)

src/util/find_symbols.h

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ Author: Daniel Kroening, [email protected]
1010
#ifndef CPROVER_UTIL_FIND_SYMBOLS_H
1111
#define CPROVER_UTIL_FIND_SYMBOLS_H
1212

13+
#include <algorithm>
1314
#include <set>
1415
#include <unordered_set>
1516

17+
#include "deprecate.h"
1618
#include "irep.h"
1719

1820
class exprt;
@@ -21,24 +23,50 @@ class typet;
2123

2224
typedef std::unordered_set<irep_idt> find_symbols_sett;
2325

24-
void find_symbols(
25-
const exprt &src,
26-
find_symbols_sett &dest);
27-
26+
/// Add to the set \p dest the sub-expressions of \p src with id ID_symbol or
27+
/// ID_next_symbol
28+
void find_symbols_or_nexts(const exprt &src, find_symbols_sett &dest);
29+
30+
/// \return set of sub-expressions of the expressions contained in the range
31+
/// defined by \p begin and \p end which have id ID_symbol or ID_next_symbol
32+
template <typename iteratort>
33+
find_symbols_sett find_symbols_or_nexts(iteratort begin, iteratort end)
34+
{
35+
static_assert(
36+
std::is_base_of<exprt, typename iteratort::value_type>::value,
37+
"find_symbols takes exprt iterators as arguments");
38+
find_symbols_sett result;
39+
std::for_each(
40+
begin, end, [&](const exprt &e) { find_symbols_or_nexts(e, result); });
41+
return result;
42+
}
43+
44+
/// Add to the set \p dest the sub-expressions of \p src with id ID_symbol if
45+
/// \p current is true, and ID_next_symbol if \p next is true
2846
void find_symbols(
2947
const exprt &src,
3048
find_symbols_sett &dest,
3149
bool current,
3250
bool next);
3351

52+
/// Find sub expressions with id ID_symbol or ID_next_symbol
53+
DEPRECATED(SINCE(2019, 06, 17, "Unused"))
3454
void find_symbols(
3555
const exprt &src,
3656
std::set<exprt> &dest);
3757

58+
/// Find sub expressions with id ID_symbol
3859
void find_symbols(
3960
const exprt &src,
4061
std::set<symbol_exprt> &dest);
4162

63+
/// Find sub expressions with id ID_symbol
64+
std::set<symbol_exprt> find_symbols(const exprt &src);
65+
66+
/// Find identifiers of the sub expressions with id ID_symbol
67+
std::unordered_set<irep_idt> find_symbol_identifiers(const exprt &src);
68+
69+
/// \return true if one of the symbols in \p src is present in \p symbols
4270
bool has_symbol(
4371
const exprt &src,
4472
const find_symbols_sett &symbols);

0 commit comments

Comments
 (0)