@@ -138,34 +138,28 @@ void smt2_convt::define_object_size(
138
138
const exprt &expr)
139
139
{
140
140
assert (expr.id ()==ID_object_size);
141
- const exprt &ptr = expr.op0 ();
142
- std::size_t size_width = boolbv_width (expr.type ());
143
- std::size_t pointer_width = boolbv_width (ptr.type ());
144
- std::size_t number = 0 ;
145
- std::size_t h=pointer_width-1 ;
146
- std::size_t l=pointer_width-config.bv_encoding .object_bits ;
141
+ const exprt &ptr=expr.op0 ();
142
+ std::size_t size_width=boolbv_width (expr.type ());
143
+ std::size_t number=0 ;
144
+ std::size_t object_bits=pointer_logic.get_object_width ();
147
145
148
146
for (const auto &o : pointer_logic.objects )
149
147
{
150
- const typet &type = ns.follow (o.type ());
151
- exprt size_expr = size_of_expr (type, ns);
152
- mp_integer object_size;
148
+ const typet &type=ns.follow (o.type ());
149
+ mp_integer object_size=pointer_offset_size (type, ns);
153
150
154
- if (o.id ()!=ID_symbol ||
155
- size_expr.is_nil () ||
156
- to_integer (size_expr, object_size))
151
+ if (o.id ()!=ID_symbol || object_size<=0 )
157
152
{
158
153
++number;
159
154
continue ;
160
155
}
161
156
162
157
out << " (assert (implies (= " <<
163
- " ((_ extract " << h << " " << l << " ) " ;
158
+ " ((_ extract " << object_bits- 1 << " 0 ) " ;
164
159
convert_expr (ptr);
165
- out << " ) (_ bv" << number << " "
166
- << config.bv_encoding .object_bits << " ))"
167
- << " (= " << id << " (_ bv" << object_size.to_ulong () << " "
168
- << size_width << " ))))\n " ;
160
+ out << " ) (_ bv" << number << " " << object_bits << " ))" <<
161
+ " (= " << id << " (_ bv" << object_size.to_ulong () << " " <<
162
+ size_width << " ))))\n " ;
169
163
170
164
++number;
171
165
}
@@ -456,10 +450,12 @@ exprt smt2_convt::parse_rec(const irept &src, const typet &_type)
456
450
to_integer (bv_expr, v);
457
451
458
452
// split into object and offset
459
- mp_integer pow =power (2 , width-config.bv_encoding .object_bits );
453
+ std::size_t object_bits=pointer_logic.get_object_width ();
454
+ std::size_t offset_bits=pointer_logic.get_offset_width ();
455
+ mp_integer pow =power (2 , object_bits);
460
456
pointer_logict::pointert ptr;
461
- ptr.object =integer2size_t (v/ pow );
462
- ptr.offset =v% pow ;
457
+ ptr.object =integer2size_t (v% pow );
458
+ ptr.offset =(v% power ( 2 , object_bits+offset_bits))/ pow ;
463
459
return pointer_logic.pointer_expr (ptr, to_pointer_type (type));
464
460
}
465
461
else if (type.id ()==ID_struct)
@@ -487,12 +483,18 @@ void smt2_convt::convert_address_of_rec(
487
483
expr.id ()==ID_string_constant ||
488
484
expr.id ()==ID_label)
489
485
{
486
+ std::string addr=
487
+ expr.id ()==ID_symbol?
488
+ expr.get_string (ID_identifier)+" $address" :
489
+ " (_ bv0 " +std::to_string (pointer_logic.get_address_width ())+" )" ;
490
+
490
491
out
491
- << " (concat (_ bv"
492
- << pointer_logic.add_object (expr) << " "
493
- << config.bv_encoding .object_bits << " )"
494
- << " (_ bv0 "
495
- << boolbv_width (result_type)-config.bv_encoding .object_bits << " ))" ;
492
+ << " (concat "
493
+ << " (concat "
494
+ << " (_ bv" << pointer_logic.add_object (expr)
495
+ << " " << pointer_logic.get_object_width () << " ) "
496
+ << " (_ bv0 " << pointer_logic.get_offset_width () << " )) "
497
+ << addr << " )" ;
496
498
}
497
499
else if (expr.id ()==ID_index)
498
500
{
@@ -1312,38 +1314,32 @@ void smt2_convt::convert_expr(const exprt &expr)
1312
1314
{
1313
1315
assert (expr.operands ().size ()==1 );
1314
1316
assert (expr.op0 ().type ().id ()==ID_pointer);
1315
- std::size_t offset_bits=
1316
- boolbv_width (expr. op0 (). type ())-config. bv_encoding . object_bits ;
1317
- std::size_t result_width =boolbv_width (expr.type ());
1317
+ std::size_t object_bits=pointer_logic. get_object_width ();
1318
+ std:: size_t offset_bits=pointer_logic. get_offset_width () ;
1319
+ std::size_t ext =boolbv_width (expr.type ())-offset_bits ;
1318
1320
1319
- // max extract width
1320
- if (offset_bits>result_width)
1321
- offset_bits=result_width;
1322
-
1323
- // too few bits?
1324
- if (result_width>offset_bits)
1325
- out << " ((_ zero_extend " << result_width-offset_bits << " ) " ;
1321
+ if (ext>0 )
1322
+ out << " ((_ zero_extend " << ext << " ) " ;
1326
1323
1327
- out << " ((_ extract " << offset_bits-1 << " 0) " ;
1324
+ out << " ((_ extract " << object_bits+offset_bits-1
1325
+ << " " << object_bits << " ) " ;
1328
1326
convert_expr (expr.op0 ());
1329
1327
out << " )" ;
1330
1328
1331
- if (result_width>offset_bits )
1329
+ if (ext> 0 )
1332
1330
out << " )" ; // zero_extend
1333
1331
}
1334
1332
else if (expr.id ()==ID_pointer_object)
1335
1333
{
1336
1334
assert (expr.operands ().size ()==1 );
1337
1335
assert (expr.op0 ().type ().id ()==ID_pointer);
1338
- std::size_t ext= boolbv_width (expr. type ())-config. bv_encoding . object_bits ;
1339
- std::size_t pointer_width =boolbv_width (expr.op0 (). type ());
1336
+ std::size_t object_bits=pointer_logic. get_object_width () ;
1337
+ std::size_t ext =boolbv_width (expr.type ())-object_bits ;
1340
1338
1341
1339
if (ext>0 )
1342
1340
out << " ((_ zero_extend " << ext << " ) " ;
1343
1341
1344
- out << " ((_ extract "
1345
- << pointer_width-1 << " "
1346
- << pointer_width-config.bv_encoding .object_bits << " ) " ;
1342
+ out << " ((_ extract " << object_bits-1 << " 0) " ;
1347
1343
convert_expr (expr.op0 ());
1348
1344
out << " )" ;
1349
1345
@@ -1357,14 +1353,12 @@ void smt2_convt::convert_expr(const exprt &expr)
1357
1353
else if (expr.id ()==ID_invalid_pointer)
1358
1354
{
1359
1355
assert (expr.operands ().size ()==1 );
1356
+ std::size_t object_bits=pointer_logic.get_object_width ();
1360
1357
1361
- std::size_t pointer_width=boolbv_width (expr.op0 ().type ());
1362
- out << " (= ((_ extract "
1363
- << pointer_width-1 << " "
1364
- << pointer_width-config.bv_encoding .object_bits << " ) " ;
1358
+ out << " (= ((_ extract " << object_bits-1 << " 0) " ;
1365
1359
convert_expr (expr.op0 ());
1366
1360
out << " ) (_ bv" << pointer_logic.get_invalid_object ()
1367
- << " " << config. bv_encoding . object_bits << " ))" ;
1361
+ << " " << object_bits << " ))" ;
1368
1362
}
1369
1363
else if (expr.id ()==" pointer_object_has_type" )
1370
1364
{
@@ -2721,31 +2715,28 @@ void smt2_convt::convert_is_dynamic_object(const exprt &expr)
2721
2715
pointer_logic.get_dynamic_objects (dynamic_objects);
2722
2716
2723
2717
assert (expr.operands ().size ()==1 );
2718
+ std::size_t object_bits=pointer_logic.get_object_width ();
2724
2719
2725
2720
if (dynamic_objects.empty ())
2726
2721
out << " false" ;
2727
2722
else
2728
2723
{
2729
- std::size_t pointer_width=boolbv_width (expr.op0 ().type ());
2730
-
2731
- out << " (let ((?obj ((_ extract "
2732
- << pointer_width-1 << " "
2733
- << pointer_width-config.bv_encoding .object_bits << " ) " ;
2724
+ out << " (let ((?obj ((_ extract " << object_bits << " 0) " ;
2734
2725
convert_expr (expr.op0 ());
2735
2726
out << " ))) " ;
2736
2727
2737
2728
if (dynamic_objects.size ()==1 )
2738
2729
{
2739
2730
out << " (= (_ bv" << dynamic_objects.front ()
2740
- << " " << config. bv_encoding . object_bits << " ) ?obj)" ;
2731
+ << " " << object_bits << " ) ?obj)" ;
2741
2732
}
2742
2733
else
2743
2734
{
2744
2735
out << " (or" ;
2745
2736
2746
2737
for (const auto &object : dynamic_objects)
2747
2738
out << " (= (_ bv" << object
2748
- << " " << config. bv_encoding . object_bits << " ) ?obj)" ;
2739
+ << " " << object_bits << " ) ?obj)" ;
2749
2740
2750
2741
out << " )" ; // or
2751
2742
}
0 commit comments