@@ -100,15 +100,93 @@ mp_integer alignment(const typet &type, const namespacet &ns)
100100 return result;
101101}
102102
103- void add_padding (struct_typet &type, const namespacet &ns)
103+ struct_typet::componentst::iterator pad_bit_field (
104+ struct_typet::componentst &components,
105+ struct_typet::componentst::iterator where,
106+ std::size_t pad_bits)
107+ {
108+ c_bit_field_typet padding_type (
109+ unsignedbv_typet (pad_bits), pad_bits);
110+
111+ struct_typet::componentt component;
112+ component.type ()=padding_type;
113+ component.set_name (
114+ " $bit_field_pad" +std::to_string (where-components.begin ()));
115+ component.set_is_padding (true );
116+
117+ auto it=components.insert (where, component);
118+ it++;
119+ return it;
120+ }
121+
122+ void bit_field_padding (struct_typet &type, const namespacet &ns)
104123{
105124 struct_typet::componentst &components=type.components ();
106125
107- // First do padding for bit-fields to make them
108- // appear on byte boundaries.
126+ // bit-field padding depends greatly on compiler
127+ if (config.ansi_c .mode == configt::ansi_ct::flavourt::VISUAL_STUDIO)
128+ {
129+ std::size_t bit_field_bits=0 , underlying_bits=0 ;
130+
131+ for (struct_typet::componentst::iterator
132+ it=components.begin ();
133+ it!=components.end ();
134+ it++)
135+ {
136+ if (it->type ().id ()==ID_c_bit_field &&
137+ to_c_bit_field_type (it->type ()).get_width ()!=0 )
138+ {
139+ const auto &bit_field_type=to_c_bit_field_type (it->type ());
140+
141+ std::size_t new_underlying_bits=
142+ bit_field_type.subtype ().get_size_t (ID_width);
109143
144+ CHECK_RETURN (new_underlying_bits!=0 );
145+
146+ if (underlying_bits==0 )
147+ {
148+ underlying_bits=new_underlying_bits;
149+ bit_field_bits=0 ;
150+ }
151+ else if (new_underlying_bits!=underlying_bits)
152+ {
153+ // new underlying width, we pad up
154+ if ((bit_field_bits%underlying_bits)!=0 )
155+ {
156+ std::size_t pad=underlying_bits-(bit_field_bits%underlying_bits);
157+ it=pad_bit_field (components, it, pad);
158+ }
159+
160+ underlying_bits=new_underlying_bits;
161+ bit_field_bits=0 ;
162+ }
163+
164+ // count the bits
165+ std::size_t width=bit_field_type.get_width ();
166+ bit_field_bits+=width;
167+ }
168+ else
169+ {
170+ // pad up
171+ if (underlying_bits!=0 && (bit_field_bits%underlying_bits)!=0 )
172+ {
173+ std::size_t pad=underlying_bits-(bit_field_bits%underlying_bits);
174+ it=pad_bit_field (components, it, pad);
175+ underlying_bits=bit_field_bits=0 ;
176+ }
177+ }
178+ }
179+
180+ // Add padding at the end?
181+ if (underlying_bits!=0 && (bit_field_bits%underlying_bits)!=0 )
182+ {
183+ std::size_t pad=underlying_bits-(bit_field_bits%underlying_bits);
184+ pad_bit_field (components, components.end (), pad);
185+ }
186+ }
187+ else
110188 {
111- std:: size_t padding_counter= 0 ;
189+ // Make bit-fields appear on byte boundaries
112190 std::size_t bit_field_bits=0 ;
113191
114192 for (struct_typet::componentst::iterator
@@ -129,18 +207,7 @@ void add_padding(struct_typet &type, const namespacet &ns)
129207 if ((bit_field_bits%8 )!=0 )
130208 {
131209 std::size_t pad=8 -bit_field_bits%8 ;
132- c_bit_field_typet padding_type (unsignedbv_typet (pad), pad);
133-
134- struct_typet::componentt component;
135- component.type ()=padding_type;
136- component.set_name (
137- " $bit_field_pad" +std::to_string (padding_counter++));
138- component.set_is_padding (true );
139-
140- it=components.insert (it, component);
141- it++; // skip over
142-
143- bit_field_bits+=pad;
210+ it=pad_bit_field (components, it, pad);
144211 }
145212
146213 bit_field_bits=0 ;
@@ -151,16 +218,14 @@ void add_padding(struct_typet &type, const namespacet &ns)
151218 if ((bit_field_bits%8 )!=0 )
152219 {
153220 std::size_t pad=8 -bit_field_bits%8 ;
154- c_bit_field_typet padding_type (unsignedbv_typet (pad), pad);
155-
156- struct_typet::componentt component;
157- component.type ()=padding_type;
158- component.set_name (" $bit_field_pad" +std::to_string (padding_counter++));
159- component.set_is_padding (true );
160-
161- components.push_back (component);
221+ pad_bit_field (components, components.end (), pad);
162222 }
163223 }
224+ }
225+
226+ void add_padding (struct_typet &type, const namespacet &ns)
227+ {
228+ bit_field_padding (type, ns);
164229
165230 // Is the struct packed, without any alignment specification?
166231 if (type.get_bool (ID_C_packed) &&
@@ -172,6 +237,8 @@ void add_padding(struct_typet &type, const namespacet &ns)
172237 mp_integer max_alignment=0 ;
173238 std::size_t bit_field_bits=0 ;
174239
240+ struct_typet::componentst &components=type.components ();
241+
175242 for (struct_typet::componentst::iterator
176243 it=components.begin ();
177244 it!=components.end ();
0 commit comments