The DWARF part contains all the logic for dealing with DITypes.
The split isn't very clean, there are a large number of places where
DISubprogram generation calls into type info generation. All of these
places currently have protected virtual methods to allow calling into
the dwarf specific code without changing it too heavily. Later these
call sites will be cleaned up to behave appropriately for CV and DWARF.
Why does this need to be virtual?