Skip to content

Commit c543892

Browse files
author
Owen Jones
committed
Replace objectt in value_set_fivrns.*
typedef optional<mp_integer> to offsett and use that instead of objectt. This reduces code and gets rid of an unintuitive class name.
1 parent cc8495a commit c543892

File tree

2 files changed

+63
-80
lines changed

2 files changed

+63
-80
lines changed

src/pointer-analysis/value_set_fivrns.cpp

+38-40
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ void value_set_fivrnst::output_entry(
134134
{
135135
result+=from_expr(ns, identifier, o)+", ";
136136

137-
if(o_it->second.offset_is_set)
138-
result+=integer2string(o_it->second.offset)+"";
137+
if(o_it->second)
138+
result += integer2string(*o_it->second) + "";
139139
else
140140
result+='*';
141141

@@ -211,8 +211,8 @@ exprt value_set_fivrnst::to_expr(object_map_dt::const_iterator it) const
211211

212212
od.object()=object;
213213

214-
if(it->second.offset_is_set)
215-
od.offset()=from_integer(it->second.offset, index_type());
214+
if(it->second)
215+
od.offset() = from_integer(*it->second, index_type());
216216

217217
od.type()=od.object().type();
218218

@@ -476,32 +476,31 @@ void value_set_fivrnst::get_value_set_rec(
476476

477477
forall_objects(it, pointer_expr_set.read())
478478
{
479-
objectt object=it->second;
479+
offsett offset = it->second;
480480

481-
if(object.offset_is_zero() &&
482-
expr.operands().size()==2)
481+
if(offset_is_zero(offset) && expr.operands().size() == 2)
483482
{
484483
if(expr.op0().type().id()!=ID_pointer)
485484
{
486485
mp_integer i;
487486
if(to_integer(expr.op0(), i))
488-
object.offset_is_set=false;
487+
offset.reset();
489488
else
490-
object.offset=(expr.id()==ID_plus)? i : -i;
489+
*offset = (expr.id() == ID_plus) ? i : -i;
491490
}
492491
else
493492
{
494493
mp_integer i;
495494
if(to_integer(expr.op1(), i))
496-
object.offset_is_set=false;
495+
offset.reset();
497496
else
498-
object.offset=(expr.id()==ID_plus)? i : -i;
497+
*offset = (expr.id() == ID_plus) ? i : -i;
499498
}
500499
}
501500
else
502-
object.offset_is_set=false;
501+
offset.reset();
503502

504-
insert_from(dest, it->first, object);
503+
insert_from(dest, it->first, offset);
505504
}
506505

507506
return;
@@ -689,17 +688,16 @@ void value_set_fivrnst::get_reference_set_rec(
689688
if(ns.follow(object.type())!=array_type)
690689
index_expr.make_typecast(array.type());
691690

692-
objectt o=a_it->second;
691+
offsett o = a_it->second;
693692
mp_integer i;
694693

695694
if(offset.is_zero())
696695
{
697696
}
698-
else if(!to_integer(offset, i) &&
699-
o.offset_is_zero())
700-
o.offset=i;
697+
else if(!to_integer(offset, i) && offset_is_zero(o))
698+
*o = i;
701699
else
702-
o.offset_is_set=false;
700+
o.reset();
703701

704702
insert_from(dest, index_expr, o);
705703
}
@@ -738,7 +736,7 @@ void value_set_fivrnst::get_reference_set_rec(
738736
}
739737
else
740738
{
741-
objectt o=it->second;
739+
offsett o = it->second;
742740

743741
exprt member_expr(ID_member, expr.type());
744742
member_expr.copy_to_operands(object);
@@ -983,7 +981,7 @@ void value_set_fivrnst::do_free(
983981
else
984982
{
985983
// adjust
986-
objectt o=o_it->second;
984+
offsett o = o_it->second;
987985
exprt tmp(object);
988986
to_dynamic_object_expr(tmp).valid()=exprt(ID_unknown);
989987
insert_to(new_object_map, tmp, o);
@@ -1331,39 +1329,39 @@ void value_set_fivrnst::apply_code(
13311329
bool value_set_fivrnst::insert_to(
13321330
object_mapt &dest,
13331331
object_numberingt::number_type n,
1334-
const objectt &object) const
1332+
const offsett &offset) const
13351333
{
13361334
object_map_dt &map = dest.write();
13371335
if(map.find(n)==map.end())
13381336
{
1339-
// std::cout << "NEW(" << n << "): " << object_numbering[n] << '\n';
1337+
// std::cout << "NEW(" << n << "): " << object_numbering[n] << '\n';
13401338
// new
1341-
map[n]=object;
1339+
map[n] = offset;
13421340
map.set_valid_at(n, to_function, to_target_index);
13431341
return true;
13441342
}
13451343
else
13461344
{
1347-
// std::cout << "UPD " << n << '\n';
1348-
objectt &old=map[n];
1345+
// std::cout << "UPD " << n << '\n';
1346+
offsett &old_offset = map[n];
13491347

13501348
bool res = map.set_valid_at(n, to_function, to_target_index);
13511349

1352-
if(old.offset_is_set && object.offset_is_set)
1350+
if(old_offset && offset)
13531351
{
1354-
if(old.offset==object.offset)
1352+
if(*old_offset == *offset)
13551353
return res;
13561354
else
13571355
{
1358-
old.offset_is_set=false;
1356+
old_offset.reset();
13591357
return true;
13601358
}
13611359
}
1362-
else if(!old.offset_is_set)
1360+
else if(!old_offset)
13631361
return res;
13641362
else
13651363
{
1366-
old.offset_is_set=false;
1364+
old_offset.reset();
13671365
return true;
13681366
}
13691367
}
@@ -1372,39 +1370,39 @@ bool value_set_fivrnst::insert_to(
13721370
bool value_set_fivrnst::insert_from(
13731371
object_mapt &dest,
13741372
object_numberingt::number_type n,
1375-
const objectt &object) const
1373+
const offsett &offset) const
13761374
{
13771375
object_map_dt &map = dest.write();
13781376
if(map.find(n)==map.end())
13791377
{
1380-
// std::cout << "NEW(" << n << "): " << object_numbering[n] << '\n';
1378+
// std::cout << "NEW(" << n << "): " << object_numbering[n] << '\n';
13811379
// new
1382-
map[n]=object;
1380+
map[n] = offset;
13831381
map.set_valid_at(n, from_function, from_target_index);
13841382
return true;
13851383
}
13861384
else
13871385
{
1388-
// std::cout << "UPD " << n << '\n';
1389-
objectt &old=map[n];
1386+
// std::cout << "UPD " << n << '\n';
1387+
offsett &old_offset = map[n];
13901388

13911389
bool res = map.set_valid_at(n, from_function, from_target_index);
13921390

1393-
if(old.offset_is_set && object.offset_is_set)
1391+
if(old_offset && offset)
13941392
{
1395-
if(old.offset==object.offset)
1393+
if(*old_offset == *offset)
13961394
return res;
13971395
else
13981396
{
1399-
old.offset_is_set=false;
1397+
old_offset.reset();
14001398
return true;
14011399
}
14021400
}
1403-
else if(!old.offset_is_set)
1401+
else if(!old_offset)
14041402
return res;
14051403
else
14061404
{
1407-
old.offset_is_set=false;
1405+
old_offset.reset();
14081406
return true;
14091407
}
14101408
}

src/pointer-analysis/value_set_fivrns.h

+25-40
Original file line numberDiff line numberDiff line change
@@ -51,33 +51,21 @@ class value_set_fivrnst
5151

5252
typedef irep_idt idt;
5353

54-
class objectt
54+
/// Represents the offset into an object: either a unique integer offset,
55+
/// or an unknown value, represented by `!offset`.
56+
typedef optionalt<mp_integer> offsett;
57+
bool offset_is_zero(offsett offset) const
5558
{
56-
public:
57-
objectt() :
58-
offset_is_set(false)
59-
{
60-
}
61-
62-
explicit objectt(const mp_integer &_offset):
63-
offset(_offset),
64-
offset_is_set(true)
65-
{
66-
}
67-
68-
mp_integer offset;
69-
bool offset_is_set;
70-
bool offset_is_zero() const
71-
{ return offset_is_set && offset.is_zero(); }
72-
};
59+
return offset && offset->is_zero();
60+
}
7361

7462
class object_map_dt
7563
{
7664
public:
7765
object_map_dt() {}
7866
static const object_map_dt blank;
7967

80-
typedef std::map<object_numberingt::number_type, objectt> objmapt;
68+
typedef std::map<object_numberingt::number_type, offsett> objmapt;
8169
objmapt objmap;
8270

8371
// NOLINTNEXTLINE(readability/identifiers)
@@ -97,19 +85,19 @@ class value_set_fivrnst
9785
bool empty() const { return objmap.empty(); }
9886
void clear() { objmap.clear(); validity_ranges.clear(); }
9987

100-
objectt &operator[](object_numberingt::number_type k)
88+
offsett &operator[](object_numberingt::number_type k)
10189
{
10290
return objmap[k];
10391
}
10492

10593
// operator[] is the only way to insert something!
10694
std::pair<iterator, bool>
107-
insert(const std::pair<object_numberingt::number_type, objectt> &)
95+
insert(const std::pair<object_numberingt::number_type, offsett> &)
10896
{
10997
UNREACHABLE;
11098
}
11199
iterator
112-
insert(iterator, const std::pair<object_numberingt::number_type, objectt> &)
100+
insert(iterator, const std::pair<object_numberingt::number_type, offsett> &)
113101
{
114102
UNREACHABLE;
115103
}
@@ -160,28 +148,26 @@ class value_set_fivrnst
160148

161149
bool insert_to(object_mapt &dest, const exprt &src) const
162150
{
163-
return insert_to(dest, object_numbering.number(src), objectt());
151+
return insert_to(dest, object_numbering.number(src), offsett());
164152
}
165153

166154
bool insert_to(
167155
object_mapt &dest,
168156
const exprt &src,
169-
const mp_integer &offset) const
157+
const mp_integer &offset_value) const
170158
{
171-
return insert_to(dest, object_numbering.number(src), objectt(offset));
159+
return insert_to(dest, object_numbering.number(src), offsett(offset_value));
172160
}
173161

174162
bool insert_to(
175163
object_mapt &dest,
176164
object_numberingt::number_type n,
177-
const objectt &object) const;
165+
const offsett &offset) const;
178166

179-
bool insert_to(
180-
object_mapt &dest,
181-
const exprt &expr,
182-
const objectt &object) const
167+
bool
168+
insert_to(object_mapt &dest, const exprt &expr, const offsett &offset) const
183169
{
184-
return insert_to(dest, object_numbering.number(expr), object);
170+
return insert_to(dest, object_numbering.number(expr), offset);
185171
}
186172

187173
bool insert_from(object_mapt &dest, object_map_dt::const_iterator it) const
@@ -191,28 +177,27 @@ class value_set_fivrnst
191177

192178
bool insert_from(object_mapt &dest, const exprt &src) const
193179
{
194-
return insert_from(dest, object_numbering.number(src), objectt());
180+
return insert_from(dest, object_numbering.number(src), offsett());
195181
}
196182

197183
bool insert_from(
198184
object_mapt &dest,
199185
const exprt &src,
200-
const mp_integer &offset) const
186+
const mp_integer &offset_value) const
201187
{
202-
return insert_from(dest, object_numbering.number(src), objectt(offset));
188+
return insert_from(
189+
dest, object_numbering.number(src), offsett(offset_value));
203190
}
204191

205192
bool insert_from(
206193
object_mapt &dest,
207194
object_numberingt::number_type n,
208-
const objectt &object) const;
195+
const offsett &offset) const;
209196

210-
bool insert_from(
211-
object_mapt &dest,
212-
const exprt &expr,
213-
const objectt &object) const
197+
bool
198+
insert_from(object_mapt &dest, const exprt &expr, const offsett &offset) const
214199
{
215-
return insert_from(dest, object_numbering.number(expr), object);
200+
return insert_from(dest, object_numbering.number(expr), offset);
216201
}
217202

218203
struct entryt

0 commit comments

Comments
 (0)