Bug 30863 - [gdb/symtab] PU without import ignored in cooked index
Summary: [gdb/symtab] PU without import ignored in cooked index
Status: NEW
Alias: None
Product: gdb
Classification: Unclassified
Component: symtab (show other bugs)
Version: HEAD
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-09-17 07:13 UTC by Tom de Vries
Modified: 2023-11-30 17:07 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Tom de Vries 2023-09-17 07:13:18 UTC
[ This is with an updated version of the patch series submitted here ( https://sourceware.org/pipermail/gdb-patches/2023-August/201887.html ). ]

Consider the exec of test-case gdb.dwarf2/imported-unit-runto-main.exp, before adding the .gdb_index section.  It has a backward inter-cu intra-shard reference:
...
$ gdb -q -batch -iex "maint set worker-threads 0" imported-unit-runto-main
handle_deferred_entries, intra-shard case
parent map
  0x00000000000000fb 0x2935500 (deferred)
  0x00000000000000fc 0x0
parent valid map
  0x000000000000002e 0x1
  0x0000000000000045 0x0
  0x0000000000000062 0x1
  0x0000000000000084 0x0
  0x00000000000000fb 0x1
  0x0000000000000111 0x0
  0x0000000000000149 0x1
  0x00000000000002d4 0x0
handle_deferred_entries, inter-shard case
  0x00000000000000fb 0x2935500 (deferred)
  0x00000000000000fc 0x0
Resolve deferred: 0xfb -> 0xd5: no parent
...

The dependency is resolved in the inter-shard case, which assumes that all CUs have been processed, and consequently doesn't check the parent valid map.

But if we look at the parent valid map, we don't find 0xd5.  So the "no parent" is not a case of, we've processed 0xd5 and found that is has no parent, but we've not processed the PU containing 0xd5.

The problem is that we have a PU without import, and consequently no CU wins the race to read it.

This doesn't cause a problem with the current implementation (because "not processed" and "no parent" look the same), but we can reproduce the same problem with test-case forward-spec-inter-cu.exp. By changing one of the cus into a pu:
...
--- a/gdb/testsuite/gdb.dwarf2/forward-spec-inter-cu.exp
+++ b/gdb/testsuite/gdb.dwarf2/forward-spec-inter-cu.exp
@@ -48,7 +48,7 @@ Dwarf::assemble $asm_file {
     }
 
     cu {} {
-	DW_TAG_compile_unit {
+	DW_TAG_partial_unit {
 	    {DW_AT_language @DW_LANG_C_plus_plus}
 	} {
 	    declare_labels myint
...
we get:
...
FAIL: gdb.dwarf2/forward-spec-inter-cu.exp: v has a parent
...
Comment 1 Tom de Vries 2023-09-17 07:16:08 UTC
Note that readnow has no problem with the dwarf, we simply get:
...
(gdb) p ns::v
$1 = 23
...
but with the cooked index:
...
(gdb) p ns::v
No symbol "ns" in current context.
...
Comment 2 Tom de Vries 2023-09-17 08:53:22 UTC
(In reply to Tom de Vries from comment #1)
> Note that readnow has no problem with the dwarf, we simply get:
> ...
> (gdb) p ns::v
> $1 = 23
> ...
> but with the cooked index:
> ...
> (gdb) p ns::v
> No symbol "ns" in current context.
> ...

Same problem with gdb-12-branch.
Comment 3 Tom de Vries 2023-09-17 09:57:38 UTC
I have a hard time reasoning about how this dwarf should be interpreted.  

Perhaps this PR should be about unsupporting it for -readnow.
Comment 4 Tom Tromey 2023-09-17 12:27:11 UTC
I tend to think a PU that is not included just indicates a bad
DWARF writer.  Maybe gdb could issue a complaint, if it's easy.
Really a job for (the mythical) dwarflint.
Comment 5 Tom Tromey 2023-11-30 17:07:25 UTC
The DWARF spec says:

• A partial compilation unit describes a part of a compilation (generally
corresponding to an imported module) which is imported into one or more
related full compilation units.

So I think that a non-imported PU can safely be ignored.
The full reader could be changed to do this as well.