@@ -236,8 +236,10 @@ exprt flatten_byte_update(
236
236
src.id ()==ID_byte_update_big_endian?ID_byte_extract_big_endian:
237
237
throw " unexpected src.id() in flatten_byte_update" ,
238
238
subtype);
239
-
240
- byte_extract_expr.copy_to_operands (src.op2 (), i_expr);
239
+
240
+ byte_extract_expr.op ()=src.op2 ();
241
+ byte_extract_expr.offset ()=i_expr;
242
+
241
243
new_value=flatten_byte_extract (byte_extract_expr, ns);
242
244
}
243
245
@@ -256,27 +258,47 @@ exprt flatten_byte_update(
256
258
}
257
259
else // sub_size!=1
258
260
{
259
- if (element_size==1 ) // byte-granularity update
261
+ exprt result=src.op0 ();
262
+
263
+ for (mp_integer i=0 ; i<element_size; ++i)
260
264
{
265
+ exprt i_expr=from_integer (i, ns.follow (src.op1 ().type ()));
266
+
267
+ exprt new_value;
268
+
269
+ if (element_size==1 )
270
+ new_value=src.op2 ();
271
+ else
272
+ {
273
+ byte_extract_exprt byte_extract_expr (
274
+ src.id ()==ID_byte_update_little_endian?ID_byte_extract_little_endian:
275
+ src.id ()==ID_byte_update_big_endian?ID_byte_extract_big_endian:
276
+ throw " unexpected src.id() in flatten_byte_update" ,
277
+ array_type.subtype ());
278
+ new_value=byte_extract_expr;
279
+ }
280
+
261
281
div_exprt div_offset (src.op1 (), from_integer (sub_size, src.op1 ().type ()));
262
282
mod_exprt mod_offset (src.op1 (), from_integer (sub_size, src.op1 ().type ()));
263
283
264
284
index_exprt index_expr (src.op0 (), div_offset, array_type.subtype ());
265
285
266
286
byte_update_exprt byte_update_expr (src.id (), array_type.subtype ());
267
- byte_update_expr.copy_to_operands (index_expr, mod_offset, src.op2 ());
287
+ byte_update_expr.op ()=index_expr;
288
+ byte_update_expr.offset ()=mod_offset;
289
+ byte_update_expr.value ()=new_value;
268
290
269
291
// Call recurisvely, the array is gone!
270
292
exprt flattened_byte_update_expr=
271
293
flatten_byte_update (byte_update_expr, ns);
272
294
273
295
with_exprt with_expr (
274
- src. op0 () , div_offset, flattened_byte_update_expr);
296
+ result , div_offset, flattened_byte_update_expr);
275
297
276
- return with_expr;
298
+ result= with_expr;
277
299
}
278
- else
279
- throw " flatten_byte_update can only do byte updates of non-byte arrays right now " ;
300
+
301
+ return result ;
280
302
}
281
303
}
282
304
else
@@ -287,7 +309,9 @@ exprt flatten_byte_update(
287
309
}
288
310
else if (t.id ()==ID_signedbv ||
289
311
t.id ()==ID_unsignedbv ||
290
- t.id ()==ID_floatbv)
312
+ t.id ()==ID_floatbv ||
313
+ t.id ()==ID_c_bool ||
314
+ t.id ()==ID_pointer)
291
315
{
292
316
// do a shift, mask and OR
293
317
std::size_t width=to_bitvector_type (t).get_width ();
@@ -324,7 +348,8 @@ exprt flatten_byte_update(
324
348
}
325
349
else
326
350
{
327
- throw " flatten_byte_update can only do array and scalars right now" ;
351
+ throw " flatten_byte_update can only do array and scalars "
352
+ " right now, but " +t.id_string ();
328
353
}
329
354
}
330
355
0 commit comments