Skip to content

Commit c850a76

Browse files
Move renaming_level classes to a new file
1 parent d2d7f69 commit c850a76

File tree

7 files changed

+165
-135
lines changed

7 files changed

+165
-135
lines changed

src/goto-symex/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ SRC = auto_objects.cpp \
1010
path_storage.cpp \
1111
postcondition.cpp \
1212
precondition.cpp \
13+
renaming_level.cpp \
1314
show_program.cpp \
1415
show_vcc.cpp \
1516
slice.cpp \

src/goto-symex/goto_symex_state.cpp

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -38,50 +38,6 @@ goto_symex_statet::goto_symex_statet()
3838

3939
goto_symex_statet::~goto_symex_statet()=default;
4040

41-
void goto_symex_statet::level0t::operator()(
42-
ssa_exprt &ssa_expr,
43-
const namespacet &ns,
44-
unsigned thread_nr)
45-
{
46-
// already renamed?
47-
if(!ssa_expr.get_level_0().empty())
48-
return;
49-
50-
const irep_idt &obj_identifier=ssa_expr.get_object_name();
51-
52-
// guards are not L0-renamed
53-
if(obj_identifier=="goto_symex::\\guard")
54-
return;
55-
56-
const symbolt *s;
57-
const bool found_l0 = !ns.lookup(obj_identifier, s);
58-
INVARIANT(found_l0, "level0: failed to find " + id2string(obj_identifier));
59-
60-
// don't rename shared variables or functions
61-
if(s->type.id()==ID_code ||
62-
s->is_shared())
63-
return;
64-
65-
// rename!
66-
ssa_expr.set_level_0(thread_nr);
67-
}
68-
69-
void goto_symex_statet::level1t::operator()(ssa_exprt &ssa_expr)
70-
{
71-
// already renamed?
72-
if(!ssa_expr.get_level_1().empty())
73-
return;
74-
75-
const irep_idt l0_name=ssa_expr.get_l1_object_identifier();
76-
77-
current_namest::const_iterator it=current_names.find(l0_name);
78-
if(it==current_names.end())
79-
return;
80-
81-
// rename!
82-
ssa_expr.set_level_1(it->second.second);
83-
}
84-
8541
/// write to a variable
8642
static bool check_renaming(const exprt &expr);
8743

src/goto-symex/goto_symex_state.h

Lines changed: 5 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Author: Daniel Kroening, [email protected]
2727
#include <pointer-analysis/value_set.h>
2828
#include <goto-programs/goto_function.h>
2929

30+
#include "renaming_level.h"
3031
#include "symex_target_equation.h"
3132

3233
// central data structure: state
@@ -60,86 +61,9 @@ class goto_symex_statet final
6061
// we remember all L1 renamings
6162
std::set<irep_idt> l1_history;
6263

63-
struct renaming_levelt
64-
{
65-
virtual ~renaming_levelt() { }
66-
67-
typedef std::map<irep_idt, std::pair<ssa_exprt, unsigned> > current_namest;
68-
current_namest current_names;
69-
70-
unsigned current_count(const irep_idt &identifier) const
71-
{
72-
const auto it = current_names.find(identifier);
73-
return it==current_names.end()?0:it->second.second;
74-
}
75-
76-
void increase_counter(const irep_idt &identifier)
77-
{
78-
PRECONDITION(current_names.find(identifier) != current_names.end());
79-
++current_names[identifier].second;
80-
}
81-
82-
void get_variables(std::unordered_set<ssa_exprt, irep_hash> &vars) const
83-
{
84-
for(current_namest::const_iterator it=current_names.begin();
85-
it!=current_names.end();
86-
it++)
87-
vars.insert(it->second.first);
88-
}
89-
};
90-
91-
// level 0 -- threads!
92-
// renaming built for one particular interleaving
93-
struct level0t:public renaming_levelt
94-
{
95-
void operator()(
96-
ssa_exprt &ssa_expr,
97-
const namespacet &ns,
98-
unsigned thread_nr);
99-
100-
level0t() { }
101-
virtual ~level0t() { }
102-
} level0;
103-
104-
// level 1 -- function frames
105-
// this is to preserve locality in case of recursion
106-
107-
struct level1t:public renaming_levelt
108-
{
109-
void operator()(ssa_exprt &ssa_expr);
110-
111-
void restore_from(const current_namest &other)
112-
{
113-
current_namest::iterator it=current_names.begin();
114-
for(current_namest::const_iterator
115-
ito=other.begin();
116-
ito!=other.end();
117-
++ito)
118-
{
119-
while(it!=current_names.end() && it->first<ito->first)
120-
++it;
121-
if(it==current_names.end() || ito->first<it->first)
122-
current_names.insert(it, *ito);
123-
else if(it!=current_names.end())
124-
{
125-
PRECONDITION(it->first == ito->first);
126-
it->second=ito->second;
127-
++it;
128-
}
129-
}
130-
}
131-
132-
level1t() { }
133-
virtual ~level1t() { }
134-
} level1;
135-
136-
// level 2 -- SSA
137-
138-
struct level2t:public renaming_levelt
139-
{
140-
level2t() { }
141-
virtual ~level2t() { }
142-
} level2;
64+
symex_level0t level0;
65+
symex_level1t level1;
66+
symex_level2t level2;
14367

14468
// this maps L1 names to (L2) constants
14569
class propagationt
@@ -198,7 +122,7 @@ class goto_symex_statet final
198122
{
199123
public:
200124
unsigned depth;
201-
level2t::current_namest level2_current_names;
125+
symex_level2t::current_namest level2_current_names;
202126
value_sett value_set;
203127
guardt guard;
204128
symex_targett::sourcet source;

src/goto-symex/renaming_level.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*******************************************************************\
2+
3+
Module: Symbolic Execution
4+
5+
Author: Romain Brenguier, [email protected]
6+
7+
\*******************************************************************/
8+
9+
/// \file
10+
/// Renaming levels
11+
12+
#include "renaming_level.h"
13+
14+
#include <util/namespace.h>
15+
#include <util/ssa_expr.h>
16+
#include <util/symbol.h>
17+
18+
void symex_level0t::
19+
operator()(ssa_exprt &ssa_expr, const namespacet &ns, unsigned thread_nr)
20+
{
21+
// already renamed?
22+
if(!ssa_expr.get_level_0().empty())
23+
return;
24+
25+
const irep_idt &obj_identifier = ssa_expr.get_object_name();
26+
27+
// guards are not L0-renamed
28+
if(obj_identifier == "goto_symex::\\guard")
29+
return;
30+
31+
const symbolt *s;
32+
const bool found_l0 = !ns.lookup(obj_identifier, s);
33+
INVARIANT(found_l0, "level0: failed to find " + id2string(obj_identifier));
34+
35+
// don't rename shared variables or functions
36+
if(s->type.id() == ID_code || s->is_shared())
37+
return;
38+
39+
// rename!
40+
ssa_expr.set_level_0(thread_nr);
41+
}
42+
43+
void symex_level1t::operator()(ssa_exprt &ssa_expr)
44+
{
45+
// already renamed?
46+
if(!ssa_expr.get_level_1().empty())
47+
return;
48+
49+
const irep_idt l0_name = ssa_expr.get_l1_object_identifier();
50+
51+
current_namest::const_iterator it = current_names.find(l0_name);
52+
if(it == current_names.end())
53+
return;
54+
55+
// rename!
56+
ssa_expr.set_level_1(it->second.second);
57+
}

src/goto-symex/renaming_level.h

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*******************************************************************\
2+
3+
Module: Symbolic Execution
4+
5+
Author: Romain Brenguier, [email protected]
6+
7+
\*******************************************************************/
8+
9+
/// \file
10+
/// Renaming levels
11+
12+
#ifndef CPROVER_GOTO_SYMEX_RENAMING_LEVEL_H
13+
#define CPROVER_GOTO_SYMEX_RENAMING_LEVEL_H
14+
15+
#include <map>
16+
#include <unordered_set>
17+
18+
#include <util/irep.h>
19+
#include <util/ssa_expr.h>
20+
21+
struct renaming_levelt
22+
{
23+
virtual ~renaming_levelt() = default;
24+
25+
typedef std::map<irep_idt, std::pair<ssa_exprt, unsigned>> current_namest;
26+
current_namest current_names;
27+
28+
unsigned current_count(const irep_idt &identifier) const
29+
{
30+
const auto it = current_names.find(identifier);
31+
return it == current_names.end() ? 0 : it->second.second;
32+
}
33+
34+
void increase_counter(const irep_idt &identifier)
35+
{
36+
PRECONDITION(current_names.find(identifier) != current_names.end());
37+
++current_names[identifier].second;
38+
}
39+
40+
void get_variables(std::unordered_set<ssa_exprt, irep_hash> &vars) const
41+
{
42+
for(const auto &pair : current_names)
43+
vars.insert(pair.second.first);
44+
}
45+
};
46+
47+
// level 0 -- threads!
48+
// renaming built for one particular interleaving
49+
struct symex_level0t : public renaming_levelt
50+
{
51+
void
52+
operator()(ssa_exprt &ssa_expr, const namespacet &ns, unsigned thread_nr);
53+
54+
symex_level0t() = default;
55+
~symex_level0t() override = default;
56+
};
57+
58+
// level 1 -- function frames
59+
// this is to preserve locality in case of recursion
60+
61+
struct symex_level1t : public renaming_levelt
62+
{
63+
void operator()(ssa_exprt &ssa_expr);
64+
65+
void restore_from(const current_namest &other)
66+
{
67+
auto it = current_names.begin();
68+
for(const auto &pair : other)
69+
{
70+
while(it != current_names.end() && it->first < pair.first)
71+
++it;
72+
if(it == current_names.end() || pair.first < it->first)
73+
current_names.insert(it, pair);
74+
else if(it != current_names.end())
75+
{
76+
PRECONDITION(it->first == pair.first);
77+
it->second = pair.second;
78+
++it;
79+
}
80+
}
81+
}
82+
83+
symex_level1t() = default;
84+
~symex_level1t() override = default;
85+
};
86+
87+
// level 2 -- SSA
88+
struct symex_level2t : public renaming_levelt
89+
{
90+
symex_level2t() = default;
91+
~symex_level2t() override = default;
92+
};
93+
94+
#endif // CPROVER_GOTO_SYMEX_RENAMING_LEVEL_H

src/goto-symex/symex_function_call.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -330,10 +330,9 @@ void goto_symext::pop_frame(statet &state)
330330
state.level1.restore_from(frame.old_level1);
331331

332332
// clear function-locals from L2 renaming
333-
for(goto_symex_statet::renaming_levelt::current_namest::iterator
334-
c_it=state.level2.current_names.begin();
335-
c_it!=state.level2.current_names.end();
336-
) // no ++c_it
333+
for(renaming_levelt::current_namest::iterator c_it =
334+
state.level2.current_names.begin();
335+
c_it != state.level2.current_names.end();) // no ++c_it
337336
{
338337
const irep_idt l1_o_id=c_it->second.first.get_l1_object_identifier();
339338
// could use iteration over local_objects as l1_o_id is prefix
@@ -345,8 +344,7 @@ void goto_symext::pop_frame(statet &state)
345344
++c_it;
346345
continue;
347346
}
348-
goto_symex_statet::renaming_levelt::current_namest::iterator
349-
cur=c_it;
347+
renaming_levelt::current_namest::iterator cur = c_it;
350348
++c_it;
351349
state.level2.current_names.erase(cur);
352350
}
@@ -393,7 +391,7 @@ void goto_symext::locality(
393391
const irep_idt l0_name=ssa.get_identifier();
394392

395393
// save old L1 name for popping the frame
396-
statet::level1t::current_namest::const_iterator c_it=
394+
symex_level1t::current_namest::const_iterator c_it =
397395
state.level1.current_names.find(l0_name);
398396

399397
if(c_it!=state.level1.current_names.end())

src/goto-symex/symex_start_thread.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ void goto_symext::symex_start_thread(statet &state)
5252
// create a copy of the local variables for the new thread
5353
statet::framet &frame=state.top();
5454

55-
for(goto_symex_statet::renaming_levelt::current_namest::const_iterator
56-
c_it=state.level2.current_names.begin();
57-
c_it!=state.level2.current_names.end();
55+
for(renaming_levelt::current_namest::const_iterator c_it =
56+
state.level2.current_names.begin();
57+
c_it != state.level2.current_names.end();
5858
++c_it)
5959
{
6060
const irep_idt l1_o_id=c_it->second.first.get_l1_object_identifier();

0 commit comments

Comments
 (0)