@@ -12,6 +12,7 @@ Author: Daniel Kroening, kroening@kroening.com
1212#include " value_set.h"
1313
1414#include < util/arith_tools.h>
15+ #include < util/bitvector_expr.h>
1516#include < util/byte_operators.h>
1617#include < util/c_types.h>
1718#include < util/expr_util.h>
@@ -589,8 +590,9 @@ void value_sett::get_value_set_rec(
589590 // pointer-to-pointer -- we just ignore these
590591 get_value_set_rec (op, dest, suffix, original_type, ns);
591592 }
592- else if (op_type.id ()==ID_unsignedbv ||
593- op_type.id ()==ID_signedbv)
593+ else if (
594+ op_type.id () == ID_unsignedbv || op_type.id () == ID_signedbv ||
595+ op_type.id () == ID_bv)
594596 {
595597 // integer-to-pointer
596598
@@ -1052,9 +1054,39 @@ void value_sett::get_value_set_rec(
10521054 value_set_with_local_definition.get_value_set_rec (
10531055 let_expr.where (), dest, suffix, original_type, ns);
10541056 }
1057+ else if (auto eb = expr_try_dynamic_cast<extractbits_exprt>(expr))
1058+ {
1059+ object_mapt pointer_expr_set;
1060+ get_value_set_rec (eb->src (), pointer_expr_set, " " , eb->src ().type (), ns);
1061+
1062+ for (const auto &object_map_entry : pointer_expr_set.read ())
1063+ {
1064+ offsett offset = object_map_entry.second ;
1065+
1066+ // kill any offset
1067+ offset.reset ();
1068+
1069+ insert (dest, object_map_entry.first , offset);
1070+ }
1071+ }
10551072 else
10561073 {
1057- insert (dest, exprt (ID_unknown, original_type));
1074+ object_mapt pointer_expr_set;
1075+ for (const auto &op : expr.operands ())
1076+ get_value_set_rec (op, pointer_expr_set, " " , original_type, ns);
1077+
1078+ for (const auto &object_map_entry : pointer_expr_set.read ())
1079+ {
1080+ offsett offset = object_map_entry.second ;
1081+
1082+ // kill any offset
1083+ offset.reset ();
1084+
1085+ insert (dest, object_map_entry.first , offset);
1086+ }
1087+
1088+ if (pointer_expr_set.read ().empty ())
1089+ insert (dest, exprt (ID_unknown, original_type));
10581090 }
10591091
10601092 #ifdef DEBUG
0 commit comments