|
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 |
|
@@ -1028,6 +1030,37 @@ void value_sett::get_value_set_rec(
|
1028 | 1030 | get_value_set_rec(
|
1029 | 1031 | byte_extract_expr.op(), dest, suffix, original_type, ns);
|
1030 | 1032 | }
|
| 1033 | + else if(auto eb = expr_try_dynamic_cast<extractbits_exprt>(expr)) |
| 1034 | + { |
| 1035 | + object_mapt pointer_expr_set; |
| 1036 | + get_value_set_rec(eb->src(), pointer_expr_set, "", eb->src().type(), ns); |
| 1037 | + |
| 1038 | + for(const auto &object_map_entry : pointer_expr_set.read()) |
| 1039 | + { |
| 1040 | + offsett offset = object_map_entry.second; |
| 1041 | + |
| 1042 | + // kill any offset |
| 1043 | + offset.reset(); |
| 1044 | + |
| 1045 | + insert(dest, object_map_entry.first, offset); |
| 1046 | + } |
| 1047 | + } |
| 1048 | + else if(expr.id() == ID_concatenation) |
| 1049 | + { |
| 1050 | + object_mapt pointer_expr_set; |
| 1051 | + for(const auto &op : expr.operands()) |
| 1052 | + get_value_set_rec(op, pointer_expr_set, "", original_type, ns); |
| 1053 | + |
| 1054 | + for(const auto &object_map_entry : pointer_expr_set.read()) |
| 1055 | + { |
| 1056 | + offsett offset = object_map_entry.second; |
| 1057 | + |
| 1058 | + // kill any offset |
| 1059 | + offset.reset(); |
| 1060 | + |
| 1061 | + insert(dest, object_map_entry.first, offset); |
| 1062 | + } |
| 1063 | + } |
1031 | 1064 | else if(expr.id()==ID_byte_update_little_endian ||
|
1032 | 1065 | expr.id()==ID_byte_update_big_endian)
|
1033 | 1066 | {
|
|
0 commit comments