35 const exprt &given_alignment=
36 static_cast<const exprt &
>(type.
find(ID_C_alignment));
43 const auto a = numeric_cast<mp_integer>(given_alignment);
49 if(a_int>0 && !type.
get_bool(ID_C_packed))
52 else if(a_int==0 && type.
get_bool(ID_C_packed))
58 if(type.
id()==ID_array)
60 else if(type.
id()==ID_struct || type.
id()==ID_union)
67 result = std::max(result,
alignment(c.type(), ns));
69 else if(type.
id()==ID_unsignedbv ||
70 type.
id()==ID_signedbv ||
71 type.
id()==ID_fixedbv ||
72 type.
id()==ID_floatbv ||
73 type.
id()==ID_c_bool ||
74 type.
id()==ID_pointer)
78 else if(type.
id()==ID_c_enum)
80 else if(type.
id()==ID_c_enum_tag)
82 else if(type.
id() == ID_struct_tag)
84 else if(type.
id() == ID_union_tag)
86 else if(type.
id()==ID_c_bit_field)
96 if(a_int>0 && a_int<result)
107 if(subtype.
id() == ID_bool)
113 subtype.
id() == ID_signedbv || subtype.
id() == ID_unsignedbv ||
114 subtype.
id() == ID_c_bool)
118 else if(subtype.
id() == ID_c_enum_tag)
125 if(c_enum_type.
id() == ID_c_enum)
136 struct_typet::componentst::iterator where,
137 std::size_t pad_bits)
148 return std::next(components.insert(where,
component));
151 static struct_typet::componentst::iterator
pad(
153 struct_typet::componentst::iterator where,
154 std::size_t pad_bits)
164 return std::next(components.insert(where,
component));
171 std::size_t bit_field_bits = 0, underlying_bits = 0;
174 bool is_packed = type.
get_bool(ID_C_packed);
176 for(struct_typet::componentst::iterator it = components.begin();
177 it != components.end();
184 it->type().id() == ID_c_bit_field &&
191 bit_field_bits += width;
196 if(underlying_bits != 0 && (bit_field_bits % underlying_bits) != 0)
198 const std::size_t pad_bits =
199 underlying_bits - (bit_field_bits % underlying_bits);
202 underlying_bits = bit_field_bits = 0;
213 if(displacement != 0)
215 const mp_integer pad_bytes = a - displacement;
216 std::size_t pad_bits =
218 it =
pad(components, it, pad_bits);
225 if(it->type().id() == ID_c_bit_field)
230 bit_field_bits += width;
232 else if(it->type().id() == ID_bool)
240 if(size.has_value() && *size >= 1)
248 if(underlying_bits != 0 && (bit_field_bits % underlying_bits) != 0)
250 const std::size_t
pad =
251 underlying_bits - (bit_field_bits % underlying_bits);
261 if(displacement != 0)
263 const mp_integer pad_bytes = a - displacement;
264 const std::size_t pad_bits =
266 pad(components, components.end(), pad_bits);
277 std::size_t bit_field_bits=0;
279 for(struct_typet::componentst::iterator
280 it=components.begin();
281 it!=components.end();
284 if(it->type().id()==ID_c_bit_field &&
289 bit_field_bits+=width;
291 else if(it->type().id() == ID_bool)
295 else if(bit_field_bits!=0)
312 const std::size_t
pad =
325 std::size_t bit_field_bits=0;
327 for(struct_typet::componentst::iterator
328 it=components.begin();
329 it!=components.end();
332 const typet it_type=it->type();
335 const bool packed=it_type.
get_bool(ID_C_packed) ||
338 if(it_type.
id()==ID_c_bit_field)
361 else if(it_type.
id() == ID_bool)
364 if(max_alignment < a)
377 bit_field_bits == 0,
"padding ensures offset at byte boundaries");
393 const mp_integer pad_bytes = a - displacement;
394 const std::size_t pad_bits =
396 it =
pad(components, it, pad_bits);
409 static_cast<const exprt &
>(type.
find(ID_C_alignment));
416 if(tmp_i.has_value() && *tmp_i > max_alignment)
417 max_alignment = *tmp_i;
434 mp_integer pad_bytes = max_alignment - displacement;
435 std::size_t pad_bits =
437 pad(components, components.end(), pad_bits);
462 size_bits = std::max(size_bits, *s);
477 if(c.type().id() == ID_c_bit_field)
480 if(w.has_value() && w.value() > max_alignment_bits)
481 max_alignment_bits = w.value();
488 if(size_bits%max_alignment_bits!=0)
491 max_alignment_bits-(size_bits%max_alignment_bits);
494 numeric_cast_v<std::size_t>(size_bits + padding_bits));