17
17
#include < util/replace_symbol.h>
18
18
#include < util/simplify_expr.h>
19
19
20
- #include " flatten_byte_operators .h"
20
+ #include " expr_lowering .h"
21
21
22
22
// / rewrite an object into its individual bytes
23
23
// / \par parameters: src object to unpack
@@ -144,9 +144,7 @@ static exprt unpack_rec(
144
144
145
145
// / rewrite byte extraction from an array to byte extraction from a
146
146
// / concatenation of array index expressions
147
- exprt flatten_byte_extract (
148
- const byte_extract_exprt &src,
149
- const namespacet &ns)
147
+ exprt lower_byte_extract (const byte_extract_exprt &src, const namespacet &ns)
150
148
{
151
149
// General notes about endianness and the bit-vector conversion:
152
150
// A single byte with value 0b10001000 is stored (in irept) as
@@ -244,7 +242,7 @@ exprt flatten_byte_extract(
244
242
tmp.type ()=subtype;
245
243
tmp.offset ()=new_offset;
246
244
247
- array.copy_to_operands (flatten_byte_extract (tmp, ns));
245
+ array.copy_to_operands (lower_byte_extract (tmp, ns));
248
246
}
249
247
250
248
return simplify_expr (array, ns);
@@ -337,7 +335,7 @@ exprt flatten_byte_extract(
337
335
}
338
336
}
339
337
340
- exprt flatten_byte_update (
338
+ static exprt lower_byte_update (
341
339
const byte_update_exprt &src,
342
340
const namespacet &ns,
343
341
bool negative_offset)
@@ -393,13 +391,13 @@ exprt flatten_byte_update(
393
391
ID_byte_extract_little_endian:
394
392
src.id ()==ID_byte_update_big_endian?
395
393
ID_byte_extract_big_endian:
396
- throw " unexpected src.id() in flatten_byte_update " ,
394
+ throw " unexpected src.id() in lower_byte_update " ,
397
395
subtype);
398
396
399
397
byte_extract_expr.op ()=src.op2 ();
400
398
byte_extract_expr.offset ()=i_expr;
401
399
402
- new_value=flatten_byte_extract (byte_extract_expr, ns);
400
+ new_value=lower_byte_extract (byte_extract_expr, ns);
403
401
}
404
402
405
403
const plus_exprt where (src.op1 (), i_expr);
@@ -462,15 +460,15 @@ exprt flatten_byte_update(
462
460
ID_byte_extract_little_endian :
463
461
src.id ()==ID_byte_update_big_endian ?
464
462
ID_byte_extract_big_endian :
465
- throw " unexpected src.id() in flatten_byte_update " ;
463
+ throw " unexpected src.id() in lower_byte_update " ;
466
464
byte_extract_exprt byte_extract_expr (
467
465
extract_opcode,
468
466
element_size<sub_size ? src.op2 ().type () : subtype);
469
467
470
468
byte_extract_expr.op ()=src.op2 ();
471
469
byte_extract_expr.offset ()=stored_value_offset;
472
470
473
- new_value=flatten_byte_extract (byte_extract_expr, ns);
471
+ new_value=lower_byte_extract (byte_extract_expr, ns);
474
472
}
475
473
476
474
// Where does the value we just extracted align in this cell?
@@ -501,7 +499,7 @@ exprt flatten_byte_update(
501
499
// Call recursively, the array is gone!
502
500
// The last parameter indicates that the
503
501
exprt flattened_byte_update_expr=
504
- flatten_byte_update (byte_update_expr, ns, is_last_cell);
502
+ lower_byte_update (byte_update_expr, ns, is_last_cell);
505
503
506
504
with_exprt with_expr (
507
505
result, cell_index, flattened_byte_update_expr);
@@ -515,7 +513,7 @@ exprt flatten_byte_update(
515
513
else
516
514
{
517
515
throw
518
- " flatten_byte_update can only do arrays of scalars right now, "
516
+ " lower_byte_update can only do arrays of scalars right now, "
519
517
" but got " +subtype.id_string ();
520
518
}
521
519
}
@@ -531,7 +529,7 @@ exprt flatten_byte_update(
531
529
std::size_t width=integer2size_t (type_width);
532
530
533
531
if (element_size*8 >width)
534
- throw " flatten_byte_update to update element that is too large" ;
532
+ throw " lower_byte_update to update element that is too large" ;
535
533
536
534
// build mask
537
535
exprt mask=
@@ -584,16 +582,16 @@ exprt flatten_byte_update(
584
582
}
585
583
else
586
584
{
587
- throw " flatten_byte_update can only do array and scalars "
585
+ throw " lower_byte_update can only do array and scalars "
588
586
" right now, but got " +t.id_string ();
589
587
}
590
588
}
591
589
592
- exprt flatten_byte_update (
590
+ static exprt lower_byte_update (
593
591
const byte_update_exprt &src,
594
592
const namespacet &ns)
595
593
{
596
- return flatten_byte_update (src, ns, false );
594
+ return lower_byte_update (src, ns, false );
597
595
}
598
596
599
597
bool has_byte_operator (const exprt &src)
@@ -611,25 +609,23 @@ bool has_byte_operator(const exprt &src)
611
609
return false ;
612
610
}
613
611
614
- exprt flatten_byte_operators (
615
- const exprt &src,
616
- const namespacet &ns)
612
+ exprt lower_byte_operators (const exprt &src, const namespacet &ns)
617
613
{
618
614
exprt tmp=src;
619
615
620
616
// destroys any sharing, should use hash table
621
617
Forall_operands (it, tmp)
622
618
{
623
- exprt tmp=flatten_byte_operators (*it, ns);
619
+ exprt tmp=lower_byte_operators (*it, ns);
624
620
it->swap (tmp);
625
621
}
626
622
627
623
if (src.id ()==ID_byte_update_little_endian ||
628
624
src.id ()==ID_byte_update_big_endian)
629
- return flatten_byte_update (to_byte_update_expr (tmp), ns);
625
+ return lower_byte_update (to_byte_update_expr (tmp), ns);
630
626
else if (src.id ()==ID_byte_extract_little_endian ||
631
627
src.id ()==ID_byte_extract_big_endian)
632
- return flatten_byte_extract (to_byte_extract_expr (tmp), ns);
628
+ return lower_byte_extract (to_byte_extract_expr (tmp), ns);
633
629
else
634
630
return tmp;
635
631
}
0 commit comments