|
12 | 12 | #include "value_set.h"
|
13 | 13 |
|
14 | 14 | #include <util/arith_tools.h>
|
| 15 | +#include <util/bitvector_expr.h> |
15 | 16 | #include <util/byte_operators.h>
|
16 | 17 | #include <util/c_types.h>
|
17 | 18 | #include <util/expr_util.h>
|
@@ -589,8 +590,9 @@ void value_sett::get_value_set_rec(
|
589 | 590 | // pointer-to-pointer -- we just ignore these
|
590 | 591 | get_value_set_rec(op, dest, suffix, original_type, ns);
|
591 | 592 | }
|
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) |
594 | 596 | {
|
595 | 597 | // integer-to-pointer
|
596 | 598 |
|
@@ -1052,9 +1054,39 @@ void value_sett::get_value_set_rec(
|
1052 | 1054 | value_set_with_local_definition.get_value_set_rec(
|
1053 | 1055 | let_expr.where(), dest, suffix, original_type, ns);
|
1054 | 1056 | }
|
| 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 | + } |
1055 | 1072 | else
|
1056 | 1073 | {
|
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)); |
1058 | 1090 | }
|
1059 | 1091 |
|
1060 | 1092 | #ifdef DEBUG
|
|
0 commit comments