Summary: | [ada] symbol in imported unit not found | ||
---|---|---|---|
Product: | gdb | Reporter: | Tom de Vries <vries> |
Component: | symtab | Assignee: | Not yet assigned to anyone <unassigned> |
Status: | RESOLVED FIXED | ||
Severity: | normal | ||
Priority: | P2 | ||
Version: | HEAD | ||
Target Milestone: | --- | ||
Host: | Target: | ||
Build: | Last reconfirmed: | ||
Attachments: |
a.out
b.out |
Description
Tom de Vries
2020-03-24 14:14:50 UTC
Another way to see the same issue using the exec from gdb.dwarf2/imported-unit.exp: ... $ gdb -batch outputs/gdb.dwarf2/imported-unit/imported-unit -ex "maint expand-symtabs" -ex "maint info psymtabs" ... We have: ... { psymtab imported_unit.c ((struct partial_symtab *) 0x2ab06d0) readin yes fullname (null) text addresses 0x0 -- 0x0 psymtabs_addrmap_supported yes globals (none) statics (* (struct partial_symbol **) 0x2a62310 @ 1) dependencies (none) } ... and: ... { psymtab imported_unit.c ((struct partial_symtab *) 0x2a7f8b0) readin no fullname (null) text addresses 0x0 -- 0x0 psymtabs_addrmap_supported yes globals (none) statics (* (struct partial_symbol **) 0x2a62308 @ 1) user <artificial>@0xc7 ((struct partial_symtab *) 0x2ab1c30) dependencies (none) } ... The expansion for the second unit has failed (readin no). Patch submitted at https://sourceware.org/pipermail/gdb-patches/2020-March/167076.html Created attachment 12411 [details]
a.out
Executable belonging to test-case described in submitted patch:
...
$ gcc -g hello.c -o a.out
...
Created attachment 12413 [details]
b.out
Dwz-ed executable belonging to test-case described in submitted patch:
...
$ dwz a.out -o b.out
...
The master branch has been updated by Tom de Vries <vries@sourceware.org>: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=194d088fb1fa6c3c341994ca247d172c3f08c2da commit 194d088fb1fa6c3c341994ca247d172c3f08c2da Author: Tom de Vries <tdevries@suse.de> Date: Tue Apr 14 15:30:50 2020 +0200 [gdb] Fix missing symtab includes [ The test-case requires commit c1a66c0629 "[gdb] Expand symbolless symtabs using maint expand-symtabs". ] Consider the debug info for the test-case included in this patch. It consists of a PU: ... <0><d2>: Abbrev Number: 2 (DW_TAG_partial_unit) <1><d3>: Abbrev Number: 0 ... imported by a CU: ... <0><df>: Abbrev Number: 2 (DW_TAG_compile_unit) <e0> DW_AT_language : 2 (non-ANSI C) <e1> DW_AT_stmt_list : 0xe9 <1><e5>: Abbrev Number: 3 (DW_TAG_imported_unit) <e6> DW_AT_import : <0xd2> [Abbrev Number: 2] <1><ea>: Abbrev Number: 0 ... and the CU has a dw2-symtab-includes.h file in the .debug_line file name table: ... The Directory Table (offset 0x101): 1 /data/gdb_versions/devel/src/gdb/testsuite/gdb.dwarf2 The File Name Table (offset 0x138): Entry Dir Time Size Name 1 1 0 0 dw2-symtab-includes.h ... After expanding all symtabs, we can see the CU listed in the user field of the PU, and vice-versa the PU listed in the includes of the CU: ... $ gdb.sh -batch \ -iex "set language c" \ outputs/gdb.dwarf2/dw2-symtab-includes/dw2-symtab-includes \ -ex "maint expand-symtabs" \ -ex "maint info symtabs" ... { ((struct compunit_symtab *) 0x394dd60) debugformat DWARF 2 producer (null) dirname (null) blockvector ((struct blockvector *) 0x394dea0) user ((struct compunit_symtab *) 0x394dba0) } { ((struct compunit_symtab *) 0x394dba0) debugformat DWARF 2 producer (null) dirname (null) blockvector ((struct blockvector *) 0x394dd10) user ((struct compunit_symtab *) (null)) ( includes ((struct compunit_symtab *) 0x394dd60) ) } ... But if we instead only expand the symtab for the dw2-symtab-includes.h file, the includes and user links are gone: ... $ gdb -batch \ -iex "set language c" \ outputs/gdb.dwarf2/dw2-symtab-includes/dw2-symtab-includes \ -ex "maint expand-symtabs dw2-symtab-includes.h" \ -ex "maint info symtabs" ... { ((struct compunit_symtab *) 0x2728210) debugformat DWARF 2 producer (null) dirname (null) blockvector ((struct blockvector *) 0x2728350) user ((struct compunit_symtab *) (null)) } { ((struct compunit_symtab *) 0x2728050) debugformat DWARF 2 producer (null) dirname (null) blockvector ((struct blockvector *) 0x27281c0) user ((struct compunit_symtab *) (null)) } ... The includes are calculated by process_cu_includes in gdb/dwarf2/read.c. In the case of expanding all symtabs: - the CU partial symtab is expanded using psymtab_to_symtab - psymtab_to_symtab calls dwarf2_psymtab::read_symtab - dwarf2_psymtab::read_symtab calls dwarf2_psymtab::expand_psymtab - dwarf2_psymtab::read_symtab calls process_cu_includes, and we have the includes In the case of expanding the symtab for dw2-symtab-includes.h: - the dw2-symtab-includes.h partial symtab is expanded using psymtab_to_symtab - psymtab_to_symtab calls dwarf2_include_psymtab::read_symtab - dwarf2_include_psymtab::read_symtab calls dwarf2_include_psymtab::expand_psymtab - dwarf2_include_psymtab::expand_psymtab calls partial_symtab::expand_dependencies - partial_symtab::expand_dependencies calls dwarf2_psymtab::expand_psymtab for the CU partial symtab - the CU partial symtab is expanded using dwarf2_psymtab::expand_psymtab - process_cu_includes is never called Fix this by making sure in dwarf2_include_psymtab::read_symtab that read_symtab is called for the CU partial symtab. Tested on x86_64-linux, with native, and target board cc-with-dwz and cc-with-dwz-m. In addition, tested test-case with target boards cc-with-gdb-index.exp, cc-with-debug-names.exp and readnow.exp. gdb/ChangeLog: 2020-04-14 Simon Marchi <simon.marchi@polymtl.ca> Tom de Vries <tdevries@suse.de> PR symtab/25718 * psympriv.h (struct partial_symtab::read_symtab) (struct partial_symtab::expand_psymtab) (struct partial_symtab::read_dependencies): Update comments. * dwarf2/read.c (struct dwarf2_include_psymtab::read_symtab): Call read_symtab for includer. (struct dwarf2_include_psymtab::expand_psymtab): Assert false. (struct dwarf2_include_psymtab::readin_p): Call readin_p () for includer. (struct dwarf2_include_psymtab::m_readin): Remove. (struct dwarf2_include_psymtab::includer): New member function. (dwarf2_psymtab::expand_psymtab): Assert !readin. gdb/testsuite/ChangeLog: 2020-04-14 Tom de Vries <tdevries@suse.de> PR symtab/25718 * gdb.dwarf2/dw2-symtab-includes.exp: New file. Patch with test-case committed, marking resolved-fixed. |