Skip to content

Commit 238edf4

Browse files
committed
byte operator lowering now preserves underlying type of c_bit_field_typet
c_bit_field_typet types have an underlying type, which should be preserved by the adjustments that the byte operator lowering does.
1 parent 325a51a commit 238edf4

File tree

1 file changed

+43
-12
lines changed

1 file changed

+43
-12
lines changed

src/solvers/lowering/byte_operators.cpp

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,35 @@ static boundst map_bounds(
5656
return result;
5757
}
5858

59+
/// determines the underlying type of a given bitvector type
60+
typet underlying_type(const typet &src)
61+
{
62+
if(src.id() == ID_c_enum)
63+
return to_c_enum_type(src).underlying_type();
64+
else if(src.id() == ID_c_bit_field)
65+
return to_c_bit_field_type(src).underlying_type();
66+
else
67+
return src;
68+
}
69+
70+
/// changes the width of the given bitvector type
71+
bitvector_typet adjust_width(const typet &src, std::size_t new_width)
72+
{
73+
if(src.id() == ID_unsignedbv)
74+
return unsignedbv_typet(new_width);
75+
else if(src.id() == ID_signedbv)
76+
return signedbv_typet(new_width);
77+
else if(src.id() == ID_bv)
78+
return bv_typet(new_width);
79+
else if(src.id() == ID_c_enum) // we use the underlying type
80+
return adjust_width(to_c_enum_type(src).underlying_type(), new_width);
81+
else if(src.id() == ID_c_bit_field)
82+
return c_bit_field_typet(
83+
to_c_bit_field_type(src).underlying_type(), new_width);
84+
else
85+
PRECONDITION(false);
86+
}
87+
5988
/// Convert a bitvector-typed expression \p bitvector_expr to a struct-typed
6089
/// expression. See \ref bv_to_expr for an overview.
6190
static struct_exprt bv_to_struct_expr(
@@ -89,7 +118,7 @@ static struct_exprt bv_to_struct_expr(
89118
endianness_map,
90119
member_offset_bits,
91120
member_offset_bits + component_bits - 1);
92-
bitvector_typet type{bitvector_expr.type().id(), component_bits};
121+
bitvector_typet type = adjust_width(bitvector_expr.type(), component_bits);
93122
operands.push_back(bv_to_expr(
94123
extractbits_exprt{bitvector_expr, bounds.ub, bounds.lb, std::move(type)},
95124
comp.type(),
@@ -133,7 +162,7 @@ static union_exprt bv_to_union_expr(
133162
}
134163

135164
const auto bounds = map_bounds(endianness_map, 0, component_bits - 1);
136-
bitvector_typet type{bitvector_expr.type().id(), component_bits};
165+
bitvector_typet type = adjust_width(bitvector_expr.type(), component_bits);
137166
const irep_idt &component_name = widest_member.has_value()
138167
? widest_member->first.get_name()
139168
: components.front().get_name();
@@ -185,7 +214,8 @@ static array_exprt bv_to_array_expr(
185214
numeric_cast_v<std::size_t>(*subtype_bits);
186215
const auto bounds = map_bounds(
187216
endianness_map, i * subtype_bits_int, ((i + 1) * subtype_bits_int) - 1);
188-
bitvector_typet type{bitvector_expr.type().id(), subtype_bits_int};
217+
bitvector_typet type =
218+
adjust_width(bitvector_expr.type(), subtype_bits_int);
189219
operands.push_back(bv_to_expr(
190220
extractbits_exprt{
191221
bitvector_expr, bounds.ub, bounds.lb, std::move(type)},
@@ -230,7 +260,8 @@ static vector_exprt bv_to_vector_expr(
230260
numeric_cast_v<std::size_t>(*subtype_bits);
231261
const auto bounds = map_bounds(
232262
endianness_map, i * subtype_bits_int, ((i + 1) * subtype_bits_int) - 1);
233-
bitvector_typet type{bitvector_expr.type().id(), subtype_bits_int};
263+
bitvector_typet type =
264+
adjust_width(bitvector_expr.type(), subtype_bits_int);
234265
operands.push_back(bv_to_expr(
235266
extractbits_exprt{
236267
bitvector_expr, bounds.ub, bounds.lb, std::move(type)},
@@ -274,7 +305,8 @@ static complex_exprt bv_to_complex_expr(
274305
const auto bounds_imag =
275306
map_bounds(endianness_map, subtype_bits, subtype_bits * 2 - 1);
276307

277-
const bitvector_typet type{bitvector_expr.type().id(), subtype_bits};
308+
const bitvector_typet type =
309+
adjust_width(bitvector_expr.type(), subtype_bits);
278310

279311
return complex_exprt{
280312
bv_to_expr(
@@ -1293,7 +1325,7 @@ exprt lower_byte_extract(const byte_extract_exprt &src, const namespacet &ns)
12931325
else // width_bytes>=2
12941326
{
12951327
concatenation_exprt concatenation(
1296-
std::move(op), bitvector_typet(subtype->id(), width_bytes * 8));
1328+
std::move(op), adjust_width(*subtype, width_bytes * 8));
12971329

12981330
endianness_mapt map(concatenation.type(), little_endian, ns);
12991331
return bv_to_expr(concatenation, src.type(), map, ns);
@@ -2304,12 +2336,11 @@ exprt lower_byte_update(const byte_update_exprt &src, const namespacet &ns)
23042336
extractbits_exprt extra_bits{
23052337
src.op(), bounds.ub, bounds.lb, bv_typet{n_extra_bits}};
23062338

2307-
update_value =
2308-
concatenation_exprt{typecast_exprt::conditional_cast(
2309-
update_value, bv_typet{update_bits_int}),
2310-
extra_bits,
2311-
bitvector_typet{update_value.type().id(),
2312-
update_bits_int + n_extra_bits}};
2339+
update_value = concatenation_exprt{
2340+
typecast_exprt::conditional_cast(
2341+
update_value, bv_typet{update_bits_int}),
2342+
extra_bits,
2343+
adjust_width(update_value.type(), update_bits_int + n_extra_bits)};
23132344
}
23142345
else
23152346
{

0 commit comments

Comments
 (0)