From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by sourceware.org (Postfix) with ESMTPS id 3DBFF385E009 for ; Fri, 27 Mar 2020 20:49:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 3DBFF385E009 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tdevries@suse.de X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 295BBADD3; Fri, 27 Mar 2020 20:49:52 +0000 (UTC) Date: Fri, 27 Mar 2020 21:49:50 +0100 From: Tom de Vries To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH][gdb] Fix missing symtab includes Message-ID: <20200327204948.GA23365@delia> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) X-Spam-Status: No, score=-34.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_DMARC_STATUS, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Mar 2020 20:49:55 -0000 Hi, Consider hello.h: ... inline static const char* foo (void) { return "foo"; } ... and hello.c: ... #include #include "hello.h" int main (void) { printf ("hello: %s\n", foo ()); return 0; } ... compiled with -g, and dwz-compressed: ... $ gcc -g hello.c $ dwz a.out ... When breaking on foo and printing the symbol tables, we have two includes for the hello.c compunit_symtab, representing two imported partial units: ... $ gdb -iex "set language c" -batch a.out -ex "b foo" -ex "maint info symtabs" Breakpoint 1 at 0x40050b: file hello.h, line 4. ... { ((struct compunit_symtab *) 0x38fa890) debugformat DWARF 2 producer GNU C11 7.5.0 -mtune=generic -march=x86-64 -g dirname /data/gdb_versions/devel blockvector ((struct blockvector *) 0x39af9f0) user ((struct compunit_symtab *) (null)) ( includes ((struct compunit_symtab *) 0x39afb10) ((struct compunit_symtab *) 0x39b00c0) ) { symtab hello.c ((struct symtab *) 0x38fa940) fullname (null) linetable ((struct linetable *) 0x39afa80) } ... But if we instead break on the same location using a linespec, the includes are gone: ... $ gdb -iex "set language c" -batch a.out -ex "b hello.h:4" -ex "maint info symtabs" Breakpoint 1 at 0x40050b: file hello.h, line 4. ... { ((struct compunit_symtab *) 0x2283500) debugformat DWARF 2 producer GNU C11 7.5.0 -mtune=generic -march=x86-64 -g dirname /data/gdb_versions/devel blockvector ((struct blockvector *) 0x23086c0) user ((struct compunit_symtab *) (null)) { symtab hello.c ((struct symtab *) 0x22835b0) fullname (null) linetable ((struct linetable *) 0x2308750) } ... The includes are calculated by process_cu_includes in gdb/dwarf2/read.c. In the case of "b foo": - the hello.c partial symtab is found to contain foo - the hello.c 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 "b hello.h:4": - the hello.h partial symtab is found to represent hello.h - the hello.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::read_dependencies - partial_symtab::read_dependencies calls dwarf2_psymtab::expand_psymtab for partial symtab hello.c - the hello.c partial symtab is expanded using dwarf2_psymtab::expand_psymtab - process_cu_includes is never called Fix this by making sure in dwarf2_include_psymtab::expand_psymtab that read_symtab rather than expand_symtab is called for the hello.c partial symtab. Tested on x86_64-linux, with native, and target board cc-with-dwz and cc-with-dwz-m. OK for trunk? Thanks, - Tom [gdb] Fix missing symtab includes gdb/ChangeLog: 2020-03-27 Tom de Vries PR symtab/25718 * dwarf2/read.c (dwarf2_include_psymtab::expand_psymtab): Call read_symtab instead of expand_symtab for dependency. --- gdb/dwarf2/read.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 2465ecebe3..fb90a04061 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -5840,7 +5840,14 @@ struct dwarf2_include_psymtab : public partial_symtab return; /* It's an include file, no symbols to read for it. Everything is in the parent symtab. */ - read_dependencies (objfile); + + /* Make sure that we call read_symtab rather than just expand_symtab, + otherwise process_cu_includes is never called, and the expanded symtab + will not have the correct value for the includes field (note: + confusingly, the mentioned includes field is related to imported units, + and has no relation to include as used in 'dwarf2_include_psymtab'). */ + if (!dependencies[0]->readin_p ()) + dependencies[0]->read_symtab (objfile); m_readin = true; }