37 const exprt &given_alignment=
38 static_cast<const exprt &
>(type.
find(ID_C_alignment));
45 const auto a = numeric_cast<mp_integer>(given_alignment);
51 if(a_int>0 && !type.
get_bool(ID_C_packed))
54 else if(a_int==0 && type.
get_bool(ID_C_packed))
60 if(type.
id()==ID_array)
62 else if(type.
id()==ID_struct || type.
id()==ID_union)
69 result = std::max(result,
alignment(c.type(), ns));
71 else if(type.
id()==ID_unsignedbv ||
72 type.
id()==ID_signedbv ||
73 type.
id()==ID_fixedbv ||
74 type.
id()==ID_floatbv ||
75 type.
id()==ID_c_bool ||
76 type.
id()==ID_pointer)
80 else if(type.
id()==ID_c_enum)
82 else if(type.
id()==ID_c_enum_tag)
84 else if(type.
id() == ID_struct_tag)
86 else if(type.
id() == ID_union_tag)
88 else if(type.
id()==ID_c_bit_field)
98 if(a_int>0 && a_int<result)
109 if(underlying_type.
id() == ID_bool)
115 underlying_type.
id() == ID_signedbv ||
116 underlying_type.
id() == ID_unsignedbv || underlying_type.
id() == ID_c_bool)
120 else if(underlying_type.
id() == ID_c_enum_tag)
125 const auto &c_enum_type =
128 if(!c_enum_type.is_incomplete())
139 struct_typet::componentst::iterator where,
140 std::size_t pad_bits)
151 return std::next(components.insert(where,
component));
154 static struct_typet::componentst::iterator
pad(
156 struct_typet::componentst::iterator where,
157 std::size_t pad_bits)
167 return std::next(components.insert(where,
component));
174 std::size_t bit_field_bits = 0, underlying_bits = 0;
177 bool is_packed = type.
get_bool(ID_C_packed);
179 for(struct_typet::componentst::iterator it = components.begin();
180 it != components.end();
187 it->type().id() == ID_c_bit_field &&
194 bit_field_bits += width;
204 if(underlying_bits != 0 && (bit_field_bits % underlying_bits) != 0)
206 const std::size_t pad_bits =
207 underlying_bits - (bit_field_bits % underlying_bits);
210 underlying_bits = bit_field_bits = 0;
215 underlying_bits = bit_field_bits = 0;
226 if(displacement != 0)
228 const mp_integer pad_bytes = a - displacement;
229 std::size_t pad_bits =
231 it =
pad(components, it, pad_bits);
238 if(it->type().id() == ID_c_bit_field)
243 bit_field_bits += width;
245 else if(it->type().id() == ID_bool)
254 if(size.has_value() && *size >= 1)
262 if(underlying_bits != 0 && (bit_field_bits % underlying_bits) != 0)
264 const std::size_t
pad =
265 underlying_bits - (bit_field_bits % underlying_bits);
277 if(displacement != 0)
279 const mp_integer pad_bytes = a - displacement;
280 const std::size_t pad_bits =
282 pad(components, components.end(), pad_bits);
293 std::size_t bit_field_bits=0;
295 for(struct_typet::componentst::iterator
296 it=components.begin();
297 it!=components.end();
300 if(it->type().id()==ID_c_bit_field &&
305 bit_field_bits+=width;
307 else if(it->type().id() == ID_bool)
311 else if(bit_field_bits!=0)
328 const std::size_t
pad =
341 std::size_t bit_field_bits=0;
343 for(struct_typet::componentst::iterator
344 it=components.begin();
345 it!=components.end();
348 const typet it_type=it->type();
351 const bool packed=it_type.
get_bool(ID_C_packed) ||
354 if(it_type.
id()==ID_c_bit_field)
377 else if(it_type.
id() == ID_bool)
380 if(max_alignment < a)
393 bit_field_bits == 0,
"padding ensures offset at byte boundaries");
409 const mp_integer pad_bytes = a - displacement;
410 const std::size_t pad_bits =
412 it =
pad(components, it, pad_bits);
425 static_cast<const exprt &
>(type.
find(ID_C_alignment));
432 if(tmp_i.has_value() && *tmp_i > max_alignment)
433 max_alignment = *tmp_i;
450 mp_integer pad_bytes = max_alignment - displacement;
451 std::size_t pad_bits =
453 pad(components, components.end(), pad_bits);
478 size_bits = std::max(size_bits, *s);
493 if(c.type().id() == ID_c_bit_field)
496 if(w.has_value() && w.value() > max_alignment_bits)
497 max_alignment_bits = w.value();
504 if(size_bits%max_alignment_bits!=0)
507 max_alignment_bits-(size_bits%max_alignment_bits);
510 numeric_cast_v<std::size_t>(size_bits + padding_bits));