Skip to content

Commit 377a515

Browse files
committed
Introducing function 'get_may_alias_values'.
1 parent c0de6fb commit 377a515

File tree

3 files changed

+72
-0
lines changed

3 files changed

+72
-0
lines changed

src/pointer-analysis/value_set.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include <cassert>
1212
#include <ostream>
13+
#include <algorithm>
1314

1415
#include <util/symbol_table.h>
1516
#include <util/simplify_expr.h>
@@ -368,6 +369,61 @@ void value_sett::get_value_set(
368369
#endif
369370
}
370371

372+
static exprt get_uniform_expr(const exprt &expr)
373+
{
374+
if(expr.id()==ID_object_descriptor)
375+
{
376+
object_descriptor_exprt ob;
377+
ob.object() = get_uniform_expr(to_object_descriptor_expr(expr).object());
378+
ob.offset() = to_object_descriptor_expr(expr).offset();
379+
return ob;
380+
}
381+
if(expr.id()==ID_external_value_set)
382+
{
383+
exprt copy = expr;
384+
copy.set(ID_is_initializer, ID_0);
385+
return copy;
386+
}
387+
return expr;
388+
}
389+
390+
static typet get_alias_type(const exprt &expr)
391+
{
392+
if(expr.id()==ID_object_descriptor)
393+
{
394+
object_descriptor_exprt ob_expr=to_object_descriptor_expr(expr);
395+
if(ob_expr.offset().id()==ID_invalid || ob_expr.offset().id()==ID_unknown)
396+
return pointer_type(ob_expr.object().type());
397+
}
398+
return pointer_type(expr.type());
399+
}
400+
401+
void value_sett::get_may_alias_set(
402+
const exprt &expr,
403+
value_setst::valuest &dest,
404+
const namespacet &ns) const
405+
{
406+
object_mapt pointed_objects;
407+
get_value_set(expr, pointed_objects, ns, false);
408+
std::vector<exprt> uniform_pointed_objects;
409+
for(const auto &num_obj : pointed_objects.read())
410+
uniform_pointed_objects.push_back(get_uniform_expr(to_expr(num_obj)));
411+
412+
for(const auto &name_entry : values)
413+
for(const auto &enum_eobj : name_entry.second.object_map.read())
414+
{
415+
if(std::find(uniform_pointed_objects.cbegin(),
416+
uniform_pointed_objects.cend(),
417+
get_uniform_expr(to_expr(enum_eobj)))!=
418+
uniform_pointed_objects.cend())
419+
{
420+
dest.push_back(symbol_exprt(
421+
name_entry.second.identifier,
422+
get_alias_type(to_expr(enum_eobj))));
423+
}
424+
}
425+
}
426+
371427
void value_sett::get_value_set(
372428
const exprt &expr,
373429
object_mapt &dest,

src/pointer-analysis/value_set.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,11 @@ class value_sett
221221
value_setst::valuest &dest,
222222
const namespacet &ns) const;
223223

224+
void get_may_alias_set(
225+
const exprt &expr,
226+
value_setst::valuest &dest,
227+
const namespacet &ns) const;
228+
224229
expr_sett &get(
225230
const idt &identifier,
226231
const std::string &suffix);

src/pointer-analysis/value_set_analysis.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,17 @@ class value_set_analysis_baset:
113113
baset::ns);
114114
}
115115

116+
virtual void get_may_alias_values(
117+
locationt l,
118+
const exprt &expr,
119+
value_setst::valuest &dest)
120+
{
121+
((const value_sett&)(*this)[l].value_set).get_may_alias_set(
122+
expr,
123+
dest,
124+
baset::ns);
125+
}
126+
116127
/*******************************************************************\
117128
118129
Function: value_set_analysis_baset::is_singular

0 commit comments

Comments
 (0)