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(subtype.
id() == ID_bool)
115 subtype.
id() == ID_signedbv || subtype.
id() == ID_unsignedbv ||
116 subtype.
id() == ID_c_bool)
120 else if(subtype.
id() == ID_c_enum_tag)
127 if(!c_enum_type.is_incomplete())
138 struct_typet::componentst::iterator where,
139 std::size_t pad_bits)
150 return std::next(components.insert(where,
component));
153 static struct_typet::componentst::iterator
pad(
155 struct_typet::componentst::iterator where,
156 std::size_t pad_bits)
166 return std::next(components.insert(where,
component));
173 std::size_t bit_field_bits = 0, underlying_bits = 0;
176 bool is_packed = type.
get_bool(ID_C_packed);
178 for(struct_typet::componentst::iterator it = components.begin();
179 it != components.end();
186 it->type().id() == ID_c_bit_field &&
193 bit_field_bits += width;
203 if(underlying_bits != 0 && (bit_field_bits % underlying_bits) != 0)
205 const std::size_t pad_bits =
206 underlying_bits - (bit_field_bits % underlying_bits);
209 underlying_bits = bit_field_bits = 0;
214 underlying_bits = bit_field_bits = 0;
225 if(displacement != 0)
227 const mp_integer pad_bytes = a - displacement;
228 std::size_t pad_bits =
230 it =
pad(components, it, pad_bits);
237 if(it->type().id() == ID_c_bit_field)
242 bit_field_bits += width;
244 else if(it->type().id() == ID_bool)
253 if(size.has_value() && *size >= 1)
261 if(underlying_bits != 0 && (bit_field_bits % underlying_bits) != 0)
263 const std::size_t
pad =
264 underlying_bits - (bit_field_bits % underlying_bits);
276 if(displacement != 0)
278 const mp_integer pad_bytes = a - displacement;
279 const std::size_t pad_bits =
281 pad(components, components.end(), pad_bits);
292 std::size_t bit_field_bits=0;
294 for(struct_typet::componentst::iterator
295 it=components.begin();
296 it!=components.end();
299 if(it->type().id()==ID_c_bit_field &&
304 bit_field_bits+=width;
306 else if(it->type().id() == ID_bool)
310 else if(bit_field_bits!=0)
327 const std::size_t
pad =
340 std::size_t bit_field_bits=0;
342 for(struct_typet::componentst::iterator
343 it=components.begin();
344 it!=components.end();
347 const typet it_type=it->type();
350 const bool packed=it_type.
get_bool(ID_C_packed) ||
353 if(it_type.
id()==ID_c_bit_field)
376 else if(it_type.
id() == ID_bool)
379 if(max_alignment < a)
392 bit_field_bits == 0,
"padding ensures offset at byte boundaries");
408 const mp_integer pad_bytes = a - displacement;
409 const std::size_t pad_bits =
411 it =
pad(components, it, pad_bits);
424 static_cast<const exprt &
>(type.
find(ID_C_alignment));
431 if(tmp_i.has_value() && *tmp_i > max_alignment)
432 max_alignment = *tmp_i;
449 mp_integer pad_bytes = max_alignment - displacement;
450 std::size_t pad_bits =
452 pad(components, components.end(), pad_bits);
477 size_bits = std::max(size_bits, *s);
492 if(c.type().id() == ID_c_bit_field)
495 if(w.has_value() && w.value() > max_alignment_bits)
496 max_alignment_bits = w.value();
503 if(size_bits%max_alignment_bits!=0)
506 max_alignment_bits-(size_bits%max_alignment_bits);
509 numeric_cast_v<std::size_t>(size_bits + padding_bits));