Skip to content

Commit 150e324

Browse files
author
Daniel Kroening
committed
further work on byte operator flattening
1 parent a7e932b commit 150e324

File tree

1 file changed

+35
-10
lines changed

1 file changed

+35
-10
lines changed

src/solvers/flattening/flatten_byte_operators.cpp

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,10 @@ exprt flatten_byte_update(
236236
src.id()==ID_byte_update_big_endian?ID_byte_extract_big_endian:
237237
throw "unexpected src.id() in flatten_byte_update",
238238
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+
241243
new_value=flatten_byte_extract(byte_extract_expr, ns);
242244
}
243245

@@ -256,27 +258,47 @@ exprt flatten_byte_update(
256258
}
257259
else // sub_size!=1
258260
{
259-
if(element_size==1) // byte-granularity update
261+
exprt result=src.op0();
262+
263+
for(mp_integer i=0; i<element_size; ++i)
260264
{
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+
261281
div_exprt div_offset(src.op1(), from_integer(sub_size, src.op1().type()));
262282
mod_exprt mod_offset(src.op1(), from_integer(sub_size, src.op1().type()));
263283

264284
index_exprt index_expr(src.op0(), div_offset, array_type.subtype());
265285

266286
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;
268290

269291
// Call recurisvely, the array is gone!
270292
exprt flattened_byte_update_expr=
271293
flatten_byte_update(byte_update_expr, ns);
272294

273295
with_exprt with_expr(
274-
src.op0(), div_offset, flattened_byte_update_expr);
296+
result, div_offset, flattened_byte_update_expr);
275297

276-
return with_expr;
298+
result=with_expr;
277299
}
278-
else
279-
throw "flatten_byte_update can only do byte updates of non-byte arrays right now";
300+
301+
return result;
280302
}
281303
}
282304
else
@@ -287,7 +309,9 @@ exprt flatten_byte_update(
287309
}
288310
else if(t.id()==ID_signedbv ||
289311
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)
291315
{
292316
// do a shift, mask and OR
293317
std::size_t width=to_bitvector_type(t).get_width();
@@ -324,7 +348,8 @@ exprt flatten_byte_update(
324348
}
325349
else
326350
{
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();
328353
}
329354
}
330355

0 commit comments

Comments
 (0)