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]>
---
 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