Skip to content

Commit 00badf2

Browse files
author
Owen Jones
committed
Minor improvements to transform_function_stub()
Replaced asserts, used `lhs_expr` and `rhs_expr` as synonyms for `assignment.first` and `assignment.second`. Added some empty lines and braces.
1 parent 07e49b5 commit 00badf2

File tree

1 file changed

+42
-43
lines changed

1 file changed

+42
-43
lines changed

src/pointer-analysis/local_value_set_analysis.cpp

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -131,44 +131,41 @@ void local_value_set_analysist::transform_function_stub(
131131
const symbolt &function_symbol=ns.lookup(fname);
132132
const code_function_callt &fcall=to_code_function_call(l_call->code);
133133

134-
std::shared_ptr<lvsaa_single_external_set_summaryt> call_summary =
135-
summarydb.at(fname);
134+
const auto &assignments=summarydb.at(fname)->field_assignments;
136135

137136
// The summary gives a list of inclusions, in the form symbol1 <- symbol2,
138137
// indicating that values reachable before the call from symbol2
139-
// may now be reachable from symbol1. The assignments are simeltaneous.
138+
// may now be reachable from symbol1. The assignments are simultaneous.
140139
// Thus start by reading all RHS values, before any changes are made:
141140

142141
auto &valuesets=static_cast<domaint&>(state).value_set;
143142
std::map<exprt, local_value_sett::object_mapt> pre_call_rhs_value_sets;
144-
const std::string external_objects_basename_prefix="external_objects";
143+
const std::string per_field_evs_prefix="external_objects";
145144

146145
std::set<std::pair<std::string, std::string> > lhs_written;
147146

148-
for(const auto &assignment : call_summary->field_assignments)
147+
for(const auto &assignment : assignments)
149148
{
150149
++nstub_assignments;
150+
const auto &lhs_fieldname=assignment.first;
151151
const auto &rhs_expr=assignment.second;
152152
if(pre_call_rhs_value_sets.count(rhs_expr))
153153
continue;
154154
auto &rhs_map=pre_call_rhs_value_sets[rhs_expr];
155-
if(assignment.second.id()==ID_external_value_set)
155+
if(rhs_expr.id()==ID_external_value_set)
156156
{
157-
auto &evse=to_external_value_set(assignment.second);
157+
const auto &evse=to_external_value_set(rhs_expr);
158+
const std::string &evse_label=
159+
id2string(to_constant_expr(evse.label()).get_value());
160+
158161
// Differentiate external-set entries that only contain
159162
// their initialiser from ones that have been written:
160163
if(!evse.is_initializer())
161-
{
162-
lhs_written.insert({
163-
assignment.first.base_name,
164-
assignment.first.field_name});
165-
}
166-
if(has_prefix(
167-
id2string(to_constant_expr(evse.label()).get_value()),
168-
"external_objects"))
164+
lhs_written.insert({lhs_fieldname.base_name, lhs_fieldname.field_name});
165+
166+
if(has_prefix(evse_label, per_field_evs_prefix))
169167
{
170168
std::vector<local_value_sett::entryt*> rhs_entries;
171-
const auto &evse=to_external_value_set(assignment.second);
172169
PRECONDITION(!evse.access_path_entries().empty());
173170
const auto &apback=evse.access_path_entries().back();
174171
if(!evse.is_initializer())
@@ -181,20 +178,21 @@ void local_value_set_analysist::transform_function_stub(
181178
}
182179

183180
for(const auto &rhs_entry : rhs_entries)
181+
{
184182
valuesets.make_union_adjusting_evs_types(
185183
rhs_map,
186184
rhs_entry->object_map,
187185
evse.type());
186+
}
188187
// Also add the external set itself,
189188
// representing the possibility that the read
190189
// comes from outside *this* function as well:
191190
valuesets.insert(rhs_map, evse);
192191
}
193192
else
194193
{
195-
// This should be an external value set assigned
196-
// to initialise some global or parameter.
197-
assert(evse.access_path_entries().empty());
194+
// This should be an external value set of type ROOT_OBJECT.
195+
PRECONDITION(evse.access_path_entries().empty());
198196
const symbolt &inflow_symbol=
199197
ns.lookup(to_constant_expr(evse.label()).get_value());
200198
exprt inflow_expr;
@@ -224,7 +222,7 @@ void local_value_set_analysist::transform_function_stub(
224222
<< to_constant_expr(evse.label()).get_value()
225223
<< eom;
226224
}
227-
assert(paramidx!=(size_t)-1 && "Unknown parameter symbol?");
225+
INVARIANT(paramidx!=(size_t)-1, "Unknown parameter symbol?");
228226
inflow_expr=fcall.arguments()[paramidx];
229227
}
230228
pointer_typet expect_type=pointer_type(evse.type());
@@ -236,49 +234,48 @@ void local_value_set_analysist::transform_function_stub(
236234
else
237235
{
238236
// Ordinary value set member; just add to the RHS map.
239-
valuesets.insert(rhs_map, assignment.second);
240-
lhs_written.insert({
241-
assignment.first.base_name,
242-
assignment.first.field_name});
237+
valuesets.insert(rhs_map, rhs_expr);
238+
lhs_written.insert({lhs_fieldname.base_name, lhs_fieldname.field_name});
243239
}
244240
}
245241

246242
// OK, read all the RHS sets, now assign to the LHS symbols:
247243

248-
for(const auto &assignment : call_summary->field_assignments)
244+
for(const auto &assignment : assignments)
249245
{
246+
const auto &lhs_fieldname=assignment.first;
250247
const auto &rhs_values=pre_call_rhs_value_sets.at(assignment.second);
251248

252-
if(has_prefix(assignment.first.base_name, external_objects_basename_prefix))
249+
if(has_prefix(lhs_fieldname.base_name, per_field_evs_prefix))
253250
{
254251
std::vector<local_value_sett::entryt*> lhs_entries;
255252
const auto find_pair=std::make_pair(
256-
assignment.first.base_name,
257-
assignment.first.field_name);
253+
lhs_fieldname.base_name,
254+
lhs_fieldname.field_name);
258255
if(lhs_written.count(find_pair))
259256
get_all_field_value_sets(
260-
assignment.first.field_name,
261-
assignment.first.declared_on_type,
257+
lhs_fieldname.field_name,
258+
lhs_fieldname.declared_on_type,
262259
valuesets,
263260
lhs_entries);
264261
// Also write to the external value set itself:
265262
local_value_sett::entryt evse_entry(
266-
assignment.first.base_name,
267-
assignment.first.field_name,
268-
assignment.first.declared_on_type);
269-
std::string objkey=assignment.first.base_name+assignment.first.field_name;
263+
lhs_fieldname.base_name,
264+
lhs_fieldname.field_name,
265+
lhs_fieldname.declared_on_type);
266+
std::string objkey=lhs_fieldname.base_name+lhs_fieldname.field_name;
270267
auto insertit=valuesets.values.insert(std::make_pair(objkey, evse_entry));
271268
lhs_entries.push_back(&insertit.first->second);
272269
for(auto lhs_entry : lhs_entries)
273270
valuesets.make_union(lhs_entry->object_map, rhs_values);
274271
}
275-
else if(has_prefix(assignment.first.base_name, prefix_dynamic_object))
272+
else if(has_prefix(lhs_fieldname.base_name, prefix_dynamic_object))
276273
{
277-
std::string objkey=assignment.first.base_name+assignment.first.field_name;
274+
std::string objkey=lhs_fieldname.base_name+lhs_fieldname.field_name;
278275
local_value_sett::entryt dynobj_entry_name(
279-
assignment.first.base_name,
280-
assignment.first.field_name,
281-
assignment.first.declared_on_type);
276+
lhs_fieldname.base_name,
277+
lhs_fieldname.field_name,
278+
lhs_fieldname.declared_on_type);
282279
auto insertit=
283280
valuesets.values.insert(std::make_pair(objkey, dynobj_entry_name));
284281
valuesets.make_union(insertit.first->second.object_map, rhs_values);
@@ -287,12 +284,14 @@ void local_value_set_analysist::transform_function_stub(
287284
{
288285
// The only other kind of symbols mentioned
289286
// in summary LHS are global variables.
290-
assert(assignment.first.field_name=="");
291-
const auto &global_sym=ns.lookup(assignment.first.base_name);
287+
INVARIANT(
288+
lhs_fieldname.field_name=="",
289+
"unexpected lhs entry in call summary assignments");
290+
const auto &global_sym=ns.lookup(lhs_fieldname.base_name);
292291
local_value_sett::entryt global_entry_name(
293-
assignment.first.base_name,
292+
lhs_fieldname.base_name,
294293
"",
295-
assignment.first.declared_on_type);
294+
lhs_fieldname.declared_on_type);
296295
auto &global_entry=
297296
valuesets.get_entry(global_entry_name, global_sym.type, ns);
298297
valuesets.make_union(global_entry.object_map, rhs_values);

0 commit comments

Comments
 (0)