Hi Mark,

On Tue, Sep 22, 2026 at 7:46 AM Mark Wielaard <[email protected]> wrote:
>
> If the main CU file doesn't contain any references to the file table
> it wouldn't show up in the src files list (except if --cu-only was
> given). This is because file entry "zero" is special. It cannot be
> referred to by DW_AT file attributes (because zero means, no
> file). But technically it should be equal to (implicitly before
> DWARF5) the DW_AT_name of the main CU DIE (using a zero directory
> entry, equal to DW_AT_comp_dir). collect_sourcefiles skipped this
> implicit zero entry unless --cu-only was given.
>
> Fix this by always handling the zero file table entry. And for
> --cu-only to just exit the loop early, so no other entries are handled
> This is also an optimization, before --cu-only would go through all
> indexes, but always added the CU name. Which worked, because
> duplicates were removed, but was somewhat inefficient.
>
>            * src/srcfiles.cxx (collect_sourcefiles): Go from index
>            zero, exit after zero index for CU_only, always handle
>            index zero specially.
>
> https://sourceware.org/bugzilla/show_bug.cgi?id=34666
>
> Signed-off-by: Mark Wielaard <[email protected]>

LGTM.

Aaron

> ---
>  src/srcfiles.cxx | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/src/srcfiles.cxx b/src/srcfiles.cxx
> index 9bbb6ef10473..e2fc0f128d71 100644
> --- a/src/srcfiles.cxx
> +++ b/src/srcfiles.cxx
> @@ -273,10 +273,14 @@ collect_sourcefiles (Dwfl_Module *dwflmod,
>              clog << "skipping cu=" << cuname << " due to empty comp_dir" << 
> endl;
>            continue;
>          }
> -      for (size_t f = 1; f < nfiles; ++f)
> +      for (size_t f = 0; f < nfiles; ++f)
>          {
> +         /* For --cu-only we are only interested in the "zero" entry.  */
> +         if (CU_only && f != 0)
> +           break;
> +
>            const char *hat;
> -          if (CU_only)
> +          if (f == 0)
>            {
>              if (strcmp(cuname, "<unknown>") == 0 || strcmp(cuname, 
> "<artificial>") == 0 )
>                continue;
> --
> 2.55.0
>

Reply via email to