@@ -1238,11 +1238,18 @@ static smt_termt convert_expr_to_smt(
1238
1238
1239
1239
static smt_termt convert_expr_to_smt (
1240
1240
const object_size_exprt &object_size,
1241
- const sub_expression_mapt &converted)
1241
+ const sub_expression_mapt &converted,
1242
+ const smt_object_sizet::make_applicationt &call_object_size)
1242
1243
{
1243
- UNIMPLEMENTED_FEATURE (
1244
- " Generation of SMT formula for object_size expression: " +
1245
- object_size.pretty ());
1244
+ const smt_termt &pointer = converted.at (object_size.pointer ());
1245
+ const auto pointer_sort = pointer.get_sort ().cast <smt_bit_vector_sortt>();
1246
+ INVARIANT (
1247
+ pointer_sort, " Pointers should be encoded as bit vector sorted terms." );
1248
+ const std::size_t pointer_width = pointer_sort->bit_width ();
1249
+ return call_object_size (
1250
+ std::vector<smt_termt>{smt_bit_vector_theoryt::extract (
1251
+ pointer_width - 1 ,
1252
+ pointer_width - config.bv_encoding .object_bits )(pointer)});
1246
1253
}
1247
1254
1248
1255
static smt_termt
@@ -1291,7 +1298,8 @@ static smt_termt convert_expr_to_smt(
1291
1298
static smt_termt dispatch_expr_to_smt_conversion (
1292
1299
const exprt &expr,
1293
1300
const sub_expression_mapt &converted,
1294
- const smt_object_mapt &object_map)
1301
+ const smt_object_mapt &object_map,
1302
+ const smt_object_sizet::make_applicationt &call_object_size)
1295
1303
{
1296
1304
if (const auto symbol = expr_try_dynamic_cast<symbol_exprt>(expr))
1297
1305
{
@@ -1589,7 +1597,7 @@ static smt_termt dispatch_expr_to_smt_conversion(
1589
1597
}
1590
1598
if (const auto object_size = expr_try_dynamic_cast<object_size_exprt>(expr))
1591
1599
{
1592
- return convert_expr_to_smt (*object_size, converted);
1600
+ return convert_expr_to_smt (*object_size, converted, call_object_size );
1593
1601
}
1594
1602
if (const auto let = expr_try_dynamic_cast<let_exprt>(expr))
1595
1603
{
@@ -1647,8 +1655,10 @@ at_scope_exitt<functiont> at_scope_exit(functiont exit_function)
1647
1655
}
1648
1656
#endif
1649
1657
1650
- smt_termt
1651
- convert_expr_to_smt (const exprt &expr, const smt_object_mapt &object_map)
1658
+ smt_termt convert_expr_to_smt (
1659
+ const exprt &expr,
1660
+ const smt_object_mapt &object_map,
1661
+ const smt_object_sizet::make_applicationt &object_size)
1652
1662
{
1653
1663
#ifndef CPROVER_INVARIANT_DO_NOT_CHECK
1654
1664
static bool in_conversion = false ;
@@ -1665,8 +1675,8 @@ convert_expr_to_smt(const exprt &expr, const smt_object_mapt &object_map)
1665
1675
const auto find_result = sub_expression_map.find (expr);
1666
1676
if (find_result != sub_expression_map.cend ())
1667
1677
return ;
1668
- smt_termt term =
1669
- dispatch_expr_to_smt_conversion ( expr, sub_expression_map, object_map);
1678
+ smt_termt term = dispatch_expr_to_smt_conversion (
1679
+ expr, sub_expression_map, object_map, object_size );
1670
1680
sub_expression_map.emplace_hint (find_result, expr, std::move (term));
1671
1681
});
1672
1682
return std::move (sub_expression_map.at (expr));
0 commit comments