@@ -108,6 +108,7 @@ static struct_exprt bv_to_struct_expr(
108
108
member_offset_bits,
109
109
member_offset_bits + component_bits - 1 );
110
110
bitvector_typet type = adjust_width (bitvector_expr.type (), component_bits);
111
+ PRECONDITION (pointer_offset_bits (bitvector_expr.type (), ns).has_value ());
111
112
operands.push_back (bv_to_expr (
112
113
extractbits_exprt{bitvector_expr, bounds.ub , bounds.lb , std::move (type)},
113
114
comp.type (),
@@ -158,6 +159,7 @@ static union_exprt bv_to_union_expr(
158
159
const typet &component_type = widest_member.has_value ()
159
160
? widest_member->first .type ()
160
161
: components.front ().type ();
162
+ PRECONDITION (pointer_offset_bits (bitvector_expr.type (), ns).has_value ());
161
163
return union_exprt{
162
164
component_name,
163
165
bv_to_expr (
@@ -205,6 +207,7 @@ static array_exprt bv_to_array_expr(
205
207
endianness_map, i * subtype_bits_int, ((i + 1 ) * subtype_bits_int) - 1 );
206
208
bitvector_typet type =
207
209
adjust_width (bitvector_expr.type (), subtype_bits_int);
210
+ PRECONDITION (pointer_offset_bits (bitvector_expr.type (), ns).has_value ());
208
211
operands.push_back (bv_to_expr (
209
212
extractbits_exprt{
210
213
bitvector_expr, bounds.ub , bounds.lb , std::move (type)},
@@ -251,6 +254,7 @@ static vector_exprt bv_to_vector_expr(
251
254
endianness_map, i * subtype_bits_int, ((i + 1 ) * subtype_bits_int) - 1 );
252
255
bitvector_typet type =
253
256
adjust_width (bitvector_expr.type (), subtype_bits_int);
257
+ PRECONDITION (pointer_offset_bits (bitvector_expr.type (), ns).has_value ());
254
258
operands.push_back (bv_to_expr (
255
259
extractbits_exprt{
256
260
bitvector_expr, bounds.ub , bounds.lb , std::move (type)},
@@ -297,6 +301,7 @@ static complex_exprt bv_to_complex_expr(
297
301
const bitvector_typet type =
298
302
adjust_width (bitvector_expr.type (), subtype_bits);
299
303
304
+ PRECONDITION (pointer_offset_bits (bitvector_expr.type (), ns).has_value ());
300
305
return complex_exprt{
301
306
bv_to_expr (
302
307
extractbits_exprt{bitvector_expr, bounds_real.ub , bounds_real.lb , type},
@@ -946,6 +951,8 @@ static exprt unpack_rec(
946
951
exprt::operandst byte_operands;
947
952
for (; bit_offset < last_bit; bit_offset += 8 )
948
953
{
954
+ PRECONDITION (
955
+ pointer_offset_bits (src_as_bitvector.type (), ns).has_value ());
949
956
extractbits_exprt extractbits (
950
957
src_as_bitvector,
951
958
from_integer (bit_offset + 7 , c_index_type ()),
@@ -2013,6 +2020,7 @@ static exprt lower_byte_update_struct(
2013
2020
elements.push_back (updated_element);
2014
2021
else
2015
2022
{
2023
+ PRECONDITION (pointer_offset_bits (updated_element.type (), ns).has_value ());
2016
2024
elements.push_back (typecast_exprt::conditional_cast (
2017
2025
extractbits_exprt{updated_element,
2018
2026
element_bits_int - 1 + (little_endian ? shift : 0 ),
@@ -2255,6 +2263,7 @@ static exprt lower_byte_update(
2255
2263
bitor_expr.type (), src.id () == ID_byte_update_little_endian, ns);
2256
2264
const auto bounds = map_bounds (endianness_map, 0 , type_bits - 1 );
2257
2265
2266
+ PRECONDITION (pointer_offset_bits (bitor_expr.type (), ns).has_value ());
2258
2267
return simplify_expr (
2259
2268
typecast_exprt::conditional_cast (
2260
2269
extractbits_exprt{
@@ -2301,6 +2310,10 @@ exprt lower_byte_update(const byte_update_exprt &src, const namespacet &ns)
2301
2310
CHECK_RETURN (update_size_expr_opt.has_value ());
2302
2311
simplify (update_size_expr_opt.value (), ns);
2303
2312
2313
+ const irep_idt extract_opcode = src.id () == ID_byte_update_little_endian
2314
+ ? ID_byte_extract_little_endian
2315
+ : ID_byte_extract_big_endian;
2316
+
2304
2317
if (!update_size_expr_opt.value ().is_constant ())
2305
2318
non_const_update_bound = *update_size_expr_opt;
2306
2319
else
@@ -2318,14 +2331,21 @@ exprt lower_byte_update(const byte_update_exprt &src, const namespacet &ns)
2318
2331
DATA_INVARIANT (
2319
2332
can_cast_type<bitvector_typet>(update_value.type ()),
2320
2333
" non-byte aligned type expected to be a bitvector type" );
2321
- size_t n_extra_bits = 8 - update_bits_int % 8 ;
2334
+ const byte_extract_exprt overlapping_byte_extract{
2335
+ extract_opcode,
2336
+ src.op (),
2337
+ simplify_expr (
2338
+ plus_exprt{
2339
+ src.offset (),
2340
+ from_integer (update_bits_int / 8 , src.offset ().type ())},
2341
+ ns),
2342
+ bv_typet{8 }};
2343
+ const exprt overlapping_byte =
2344
+ lower_byte_extract (overlapping_byte_extract, ns);
2322
2345
2323
- endianness_mapt endianness_map (
2324
- src.op ().type (), src.id () == ID_byte_update_little_endian, ns);
2325
- const auto bounds = map_bounds (
2326
- endianness_map, update_bits_int, update_bits_int + n_extra_bits - 1 );
2346
+ size_t n_extra_bits = 8 - update_bits_int % 8 ;
2327
2347
extractbits_exprt extra_bits{
2328
- src. op (), bounds. ub , bounds. lb , bv_typet{n_extra_bits}};
2348
+ overlapping_byte, n_extra_bits - 1 , 0 , bv_typet{n_extra_bits}};
2329
2349
2330
2350
update_value = concatenation_exprt{
2331
2351
typecast_exprt::conditional_cast (
@@ -2340,10 +2360,6 @@ exprt lower_byte_update(const byte_update_exprt &src, const namespacet &ns)
2340
2360
}
2341
2361
}
2342
2362
2343
- const irep_idt extract_opcode = src.id () == ID_byte_update_little_endian
2344
- ? ID_byte_extract_little_endian
2345
- : ID_byte_extract_big_endian;
2346
-
2347
2363
const byte_extract_exprt byte_extract_expr{
2348
2364
extract_opcode,
2349
2365
update_value,
0 commit comments