Eric Blake <ebl...@redhat.com> writes: > On 01/22/2016 05:18 AM, Markus Armbruster wrote: [...] >> Crazy thought: unboxing the implicit struct should make this interface >> wart go away. If we commit to do that later, we can "solve" our >> documentation problem the same way as for visit_start_union(): FIXME >> should not be needed. > > I _want_ to get rid of the boxing. But as it is not in my current queue > of pending patches, it will have to wait until the current queue is > flushed; so I'm going for documenting it with FIXMEs for now. > > Basically, our current flat union representation is: > > struct Union { > Type tag; > union { > Subtype1 *one; > Subtype2 *two; > } u; > }; > > which requires two malloc's to completely populate the struct, and where > we access union->u.one->member, or pass union->u.one to a function > taking Subtype1*. But it _should_ be: > > struct Union { > Type tag; > union { > Subtype1 one; > Subtype2 two; > } u; > }; > > where a single malloc is sufficient, and where we access > union->u.one.member, or pass &union->u.one to a function taking Subtype1*. > > It's a tree-wide conversion; and may be easier if done in stages (fix > the generator to take a temporary boolean flag on whether a particular > structure uses inline or boxing, then a series of patches adding that > flag to a few QMP commands at a time, then a final patch to clear out > the temporary flag support) rather than all at once. I'm not sure how > much Coccinelle will help, because I specifically haven't started the > conversion work until after we can get the current backlog flushed.
I hope the use of unions in C code is localized enough to do it in one step.