Hi Richard.
Thanks for looking at this :)
[Today I sent a V4 of the series containing a couple of fixes to the BTF
code. It doesn't contain big changes so the discussion below still
applies.]
>> In turn, debug_format_do_cu traverses the tree of DIEs passed to it calling
>> ctf_do_die on them.
>>
>> This conforms the debug format API:
>>
>> FOO_debug_init ()
>> Initialize the debug format FOO.
>>
>> FOO_debug_finalize (FILENAME)
>> Possibly write out, cleanup and finalization for debug format FOO.
>>
>> FOO_do_die (DIE)
>> Process the given DIE.
>>
>> Note how the emission of DWARF is interrupted after that point, if no
>> DWARF was requested by the user.
>
> I suppose since we're now supposed to write C++ the above fits
> a RAII style
>
> if (ctf_debug_info_level > ...)
> {
> ctf_debug ctf (filename);
> ctf.do_cu (comp_unit_die ());
> for (...)
> ctf.do_cu (node->die);
> }
>
> but then I have no strong feelings about this.
We could turn it into a class, sure.
>> dwarf2out - dwarf2ctf
>> =====================
>>
>> The functions ctf_debug_init, ctf_do_die and ctf_debug_finalize, that
>> implement the API described above, are all in gcc/dwarf2ctf.c.
>>
>> Obviously, these routines need access to the dwarf DIE data
>> structures, and several functions which are defined in dwarf2out.[ch],
>> many (most?) of which are private to that file: dw_die_ref, get_AT,
>> etc.
>>
>> Therefore, in this implementation we opted by writing dwarf2ctf.c in a
>> way it can just be #included in dwarf2ctf.c.
>>
>> A question remains: would it be better to abstract these types and
>> functions in an API in dwarf2out.h?
>
> I think that refactoring the big dwarf2out.c would be indeed interesting.
> Not only exposing more details from dwarf2out.h (though we could start
> there). One of the reason it's all private to dwarf2out.c is likely
> optimization (somewhat moot when you LTO GCC nowadays).
>
> So one interesting question is what's the API details CTF/BTF need?
In dwarf2ctf we use the following stuff defined in dwarf2out.c, which
are functions providing access to the DIE attributes:
- get_AT
- get_AT_ref
- get_AT_string
- AT_class
- AT_unsigned
So what if we start by adding non-static version of these functions and
export them in dwarf2out.h:
- dw_die_get_AT
- dw_die_get_AT_ref
- dw_die_get_AT_string
- dw_die_AT_class
- dw_die_AT_unsigned
?
> We might move data structures and basic accessors to
> dwarf2impl.{c,h} (as opposed to the already existing dwarf2.h).
> Or some better name (or as said, simply keep it in dwarf2out.c for now).
>
> Including dwarf2ctf.c is a bit ugly.
It is definitely ugly yes, but we didn't want to jump factoring an API
for dwarf2out without discussing it here first :)
>> Command line options for debug formats
>> ======================================
>>
>> This implementation adds the following command-line options to select the
>> emission of CTF and BTF:
>>
>> -gctf[123]
>> -gbtf[123]
>>
>> These options mimic the -g[123...] options for DWARF.
>
> Do -gcft and -gdwarf mix? That is, can I have both in the same ELF
> file? Since that doesn't work for -gdwarf -gstabs for example I wonder
> if we need to make this somehow different?
The idea is for them to mix, yes.
>> This involved adding new entries for debug_info_type:
>>
>> CTF_DEBUG - Write CTF debug info.
>> BTF_DEBUG - Write BTF debug info.
>> CTF_AND_DWARF2_DEBUG - Write both CTF and DWARF info.
>>
>> Doing this, we just followed the trend initiated by vmsdbgout.c, which
>> added VMS_DEBUG and VMS_AND_DWARF2_DEBUG.
>>
>> This approach is not very good, because debug_info_type was designed
>> to cover different debug hook implementations; debug formats, in
>> contrast, are a different thing.
>>
>> This translates to problems and fragile behavior:
>>
>> - Everywhere write_symbols is checked we have to expand the logic to
>> take the CTF values into account. You can see that is the case in
>> this patch series. This is very fragile and doesn't scale well: we
>> are most probably missing some checks.
>
> Would be nice to abstract most of the checks. Like if the check
> is for "do I need to generate DWARF DIEs" then use
> need_dwarf_dies (), if it is for "do I want to output DWARF2 debug" then
> check output_dwarf (). I see 64 places that check write_symbols,
> most in vmsdbgout.c ...
>
> Inventing predicates for the existing uses with your new uses in mind
> could make future changes easier at least.
Makes sense, we will look into abstracting these checks in suitable
predicates. That certainly will improve things :)
>> - Backends select what debug hooks to use by defining constants like
>> DWARF2_DEBUGGING_INFO. Since the new debug formats are based on the
>> DWARF debug hooks, that is the constant to define by the backends
>> wanting to support DWARF + debug infos.
>>
>> However, some backends may want to use one of the debug formats by
>> default, i.e. for -g. This is the case of the BPF backend, that
>> needs to generate BTF instead of DWARF. Currently, there is no way
>> to specify this.
>
> It probably should define BTF_DEBUGGING_INFO and that should
> enable parts guarded with DWARF2_DEBUGGING_INFO as well.
Ok, so from a backend perspective there won't be any difference between
formats based on the DWARF debug hooks and (to deprecate) formats using
their own set of debug hooks...