36 const exprt &given_alignment=
37 static_cast<const exprt &
>(type.
find(ID_C_alignment));
44 const auto a = numeric_cast<mp_integer>(given_alignment);
50 if(a_int>0 && !type.
get_bool(ID_C_packed))
53 else if(a_int==0 && type.
get_bool(ID_C_packed))
59 if(type.
id()==ID_array)
61 else if(type.
id()==ID_struct || type.
id()==ID_union)
68 result = std::max(result,
alignment(c.type(), ns));
70 else if(type.
id()==ID_unsignedbv ||
71 type.
id()==ID_signedbv ||
72 type.
id()==ID_fixedbv ||
73 type.
id()==ID_floatbv ||
74 type.
id()==ID_c_bool ||
75 type.
id()==ID_pointer)
79 else if(type.
id()==ID_c_enum)
81 else if(type.
id()==ID_c_enum_tag)
83 else if(type.
id() == ID_struct_tag)
85 else if(type.
id() == ID_union_tag)
87 else if(type.
id()==ID_c_bit_field)
97 if(a_int>0 && a_int<result)
108 if(subtype.
id() == ID_bool)
114 subtype.
id() == ID_signedbv || subtype.
id() == ID_unsignedbv ||
115 subtype.
id() == ID_c_bool)
119 else if(subtype.
id() == ID_c_enum_tag)
126 if(!c_enum_type.is_incomplete())
137 struct_typet::componentst::iterator where,
138 std::size_t pad_bits)
149 return std::next(components.insert(where,
component));
152 static struct_typet::componentst::iterator
pad(
154 struct_typet::componentst::iterator where,
155 std::size_t pad_bits)
165 return std::next(components.insert(where,
component));
172 std::size_t bit_field_bits = 0, underlying_bits = 0;
175 bool is_packed = type.
get_bool(ID_C_packed);
177 for(struct_typet::componentst::iterator it = components.begin();
178 it != components.end();
185 it->type().id() == ID_c_bit_field &&
192 bit_field_bits += width;
202 if(underlying_bits != 0 && (bit_field_bits % underlying_bits) != 0)
204 const std::size_t pad_bits =
205 underlying_bits - (bit_field_bits % underlying_bits);
208 underlying_bits = bit_field_bits = 0;
213 underlying_bits = bit_field_bits = 0;
224 if(displacement != 0)
226 const mp_integer pad_bytes = a - displacement;
227 std::size_t pad_bits =
229 it =
pad(components, it, pad_bits);
236 if(it->type().id() == ID_c_bit_field)
241 bit_field_bits += width;
243 else if(it->type().id() == ID_bool)
252 if(size.has_value() && *size >= 1)
260 if(underlying_bits != 0 && (bit_field_bits % underlying_bits) != 0)
262 const std::size_t
pad =
263 underlying_bits - (bit_field_bits % underlying_bits);
275 if(displacement != 0)
277 const mp_integer pad_bytes = a - displacement;
278 const std::size_t pad_bits =
280 pad(components, components.end(), pad_bits);
291 std::size_t bit_field_bits=0;
293 for(struct_typet::componentst::iterator
294 it=components.begin();
295 it!=components.end();
298 if(it->type().id()==ID_c_bit_field &&
303 bit_field_bits+=width;
305 else if(it->type().id() == ID_bool)
309 else if(bit_field_bits!=0)
326 const std::size_t
pad =
339 std::size_t bit_field_bits=0;
341 for(struct_typet::componentst::iterator
342 it=components.begin();
343 it!=components.end();
346 const typet it_type=it->type();
349 const bool packed=it_type.
get_bool(ID_C_packed) ||
352 if(it_type.
id()==ID_c_bit_field)
375 else if(it_type.
id() == ID_bool)
378 if(max_alignment < a)
391 bit_field_bits == 0,
"padding ensures offset at byte boundaries");
407 const mp_integer pad_bytes = a - displacement;
408 const std::size_t pad_bits =
410 it =
pad(components, it, pad_bits);
423 static_cast<const exprt &
>(type.
find(ID_C_alignment));
430 if(tmp_i.has_value() && *tmp_i > max_alignment)
431 max_alignment = *tmp_i;
448 mp_integer pad_bytes = max_alignment - displacement;
449 std::size_t pad_bits =
451 pad(components, components.end(), pad_bits);
476 size_bits = std::max(size_bits, *s);
491 if(c.type().id() == ID_c_bit_field)
494 if(w.has_value() && w.value() > max_alignment_bits)
495 max_alignment_bits = w.value();
502 if(size_bits%max_alignment_bits!=0)
505 max_alignment_bits-(size_bits%max_alignment_bits);
508 numeric_cast_v<std::size_t>(size_bits + padding_bits));