This isn’t a realistic/viable implementation, just a hacked up “can I make it produce the right output” kind of thing, but while I hammer out a few more details (like fixing MC to allow multiple sections with the same name but different comdat groups) I figured I’d throw it out there to have a bit of a chat about it.
I’ve tested simple cases of a single type and they seem to work OK. Multiple types from the same translation unit won’t work at the moment due to the MC issue.
The practical details are fairly simple. When CompileUnit goes to create a type, first it hands it off to DwarfDebug to decide whether it’s going to be in a type unit. If it is, DwarfDebug spins up a new CompileUnit that’s really a type unit, emits the type into that unit (creating all dependent types and other paraphernalia), attaches the signature (using the ODR hash as a stand-in for now) and offset to the CompileUnit and the signature to the DIE the original CompileUnit provided (along with any other DIEs that needed that signature and were discovered along the way).
Then emit it as normal - with a few special cases to add the necessary extra headers, offsets, etc.
A realistic implementation probably involves moving unit header handling down into CompileUnit, extracting most of the common functionality into a Unit type and having CompileUnit and TypeUnit types to handle the header differences. Sound about right?
I haven’t got to looking at how this is meant to (or currently does) interact with fission, but I suspect it might be pretty close ‘for free’.
type_units.diff (24 KB)