Skip to content

Commit 8209c9a

Browse files
committed
Use byte_update lowering in SMT2 conversion
The locally implemented lowering was very incomplete.
1 parent 996c1a2 commit 8209c9a

File tree

24 files changed

+31
-116
lines changed

24 files changed

+31
-116
lines changed

regression/cbmc/Endianness4/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33

44
^EXIT=0$

regression/cbmc/Endianness6/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33
--big-endian
44
^EXIT=0$

regression/cbmc/Pointer_byte_extract5/no-simplify.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.i
33
--bounds-check --32 --no-simplify
44
^EXIT=10$

regression/cbmc/Pointer_byte_extract5/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.i
33
--bounds-check --32
44
^EXIT=10$

regression/cbmc/Pointer_byte_extract9/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33

44
^EXIT=10$

regression/cbmc/Promotion3/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE
1+
CORE broken-smt-backend
22
main.c
33

44
^EXIT=0$

regression/cbmc/array_constraints1/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33
--unwind 2 --pointer-check
44
^EXIT=10$

regression/cbmc/byte_update2/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33
--little-endian
44
^EXIT=0$

regression/cbmc/byte_update3/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33
--little-endian
44
^EXIT=0$

regression/cbmc/byte_update4/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33
--little-endian
44
^EXIT=0$

regression/cbmc/byte_update5/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33
--little-endian
44
^EXIT=0$

regression/cbmc/byte_update6/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33
--little-endian
44
^EXIT=0$

regression/cbmc/byte_update7/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33
--little-endian
44
^EXIT=0$

regression/cbmc/byte_update8/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33
--little-endian
44
^EXIT=0$

regression/cbmc/byte_update9/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33
--big-endian
44
^EXIT=0$

regression/cbmc/gcc_c99-bool-1/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE
1+
CORE broken-smt-backend
22
c99-bool-1.c
33

44
^EXIT=0$

regression/cbmc/memory_allocation1/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33
--pointer-check
44
^EXIT=10$

regression/cbmc/scanf1/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.i
33
--little-endian
44
^EXIT=10$

regression/cbmc/struct6/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33
--bounds-check --pointer-check
44
^EXIT=0$

regression/cbmc/union12/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33
--pointer-check
44
^EXIT=10$

regression/cbmc/union6/test.desc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
CORE
1+
CORE broken-smt-backend
22
main.c
33
--little-endian
44
^EXIT=0$
55
^SIGNAL=0$
66
^VERIFICATION SUCCESSFUL$
77
--
88
^warning: ignoring
9+
--
10+
This test reports a VERIFICATION ERROR when running with the SMT2 solver on
11+
Windows only.

regression/cbmc/union7/test.desc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,6 @@ main.c
66
^VERIFICATION SUCCESSFUL$
77
--
88
^warning: ignoring
9+
--
10+
This test reports a VERIFICATION ERROR when running with the SMT2 solver on
11+
Windows only.

regression/cbmc/union9/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
main.c
33

44
^EXIT=0$

src/solvers/smt2/smt2_conv.cpp

Lines changed: 3 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -622,102 +622,11 @@ void smt2_convt::convert_byte_extract(const byte_extract_exprt &expr)
622622

623623
void smt2_convt::convert_byte_update(const byte_update_exprt &expr)
624624
{
625-
#if 0
626-
// The situation: expr.op0 needs to be split in 3 parts
627-
// |<--- L --->|<--- M --->|<--- R --->|
628-
// where M is the expr.op1'th byte
629-
// We need to output L expr.op2 R
630-
631-
mp_integer i = numeric_cast_v<mp_integer>(expr.op());
632-
633-
std::size_t total_width=boolbv_width(expr.op().type());
634-
CHECK_RETURN_WITH_DIAGNOSTICS(
635-
total_width != 0,
636-
"failed to get width of byte_update");
637-
638-
std::size_t value_width=boolbv_width(expr.value().type());
639-
640-
mp_integer upper, lower; // of the byte
641-
mp_integer max=total_width-1;
642-
643-
if(expr.id()==ID_byte_update_little_endian)
644-
{
645-
lower = i*8;
646-
upper = lower+value_width-1;
647-
}
648-
else if(expr.id()==ID_byte_update_big_endian)
649-
{
650-
upper = max-(i*8);
651-
lower = max-((i+1)*8-1);
652-
}
653-
else
654-
UNEXPECTEDCASE("byte update neither big nor little endian");
655-
656-
unflatten(BEGIN, expr.type());
657-
658-
if(upper==max)
659-
{
660-
if(lower==0) // the update expression is expr.value()
661-
{
662-
flatten2bv(expr.value());
663-
}
664-
else // uppermost byte selected, only R needed
665-
{
666-
out << "(concat ";
667-
flatten2bv(expr.value());
668-
out << " ((_ extract " << lower-1 << " 0) ";
669-
flatten2bv(expr.op());
670-
out << "))";
671-
}
672-
}
673-
else
674-
{
675-
if(lower==0) // lowermost byte selected, only L needed
676-
{
677-
out << "(concat ";
678-
out << "((_ extract " << max << " " << (upper+1) << ") ";
679-
flatten2bv(expr.op());
680-
out << ") ";
681-
flatten2bv(expr.value());
682-
out << ")";
683-
}
684-
else // byte in the middle selected, L & R needed
685-
{
686-
out << "(concat (concat ";
687-
out << "((_ extract " << max << " " << (upper+1) << ") ";
688-
flatten2bv(expr.op());
689-
out << ") ";
690-
flatten2bv(expr.value());
691-
out << ") ((_ extract " << (lower-1) << " 0) ";
692-
flatten2bv(expr.op());
693-
out << "))";
694-
}
695-
}
696-
697-
unflatten(END, expr.type());
698-
699-
#else
700-
701-
// We'll do an AND-mask for op(), and then OR-in
702-
// the value() shifted by the offset * 8.
703-
704-
std::size_t total_width=boolbv_width(expr.op().type());
705-
std::size_t value_width=boolbv_width(expr.value().type());
706-
707-
mp_integer mask=power(2, value_width)-1;
708-
exprt one_mask=from_integer(mask, unsignedbv_typet(total_width));
709-
710-
const mult_exprt distance(
711-
expr.offset(), from_integer(8, expr.offset().type()));
712-
713-
const bitand_exprt and_expr(expr.op(), bitnot_exprt(one_mask));
714-
const typecast_exprt ext_value(expr.value(), one_mask.type());
715-
const bitor_exprt or_expr(and_expr, shl_exprt(ext_value, distance));
716-
625+
// we just run the flattener
626+
exprt flattened_expr = lower_byte_update(expr, ns);
717627
unflatten(wheret::BEGIN, expr.type());
718-
flatten2bv(or_expr);
628+
convert_expr(flattened_expr);
719629
unflatten(wheret::END, expr.type());
720-
#endif
721630
}
722631

723632
literalt smt2_convt::convert(const exprt &expr)

0 commit comments

Comments
 (0)