From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 98452 invoked by alias); 23 Mar 2018 18:22:29 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 98046 invoked by uid 89); 23 Mar 2018 18:22:28 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.3 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,KAM_SHORT,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-HELO: mx1.redhat.com Received: from mx3-rdu2.redhat.com (HELO mx1.redhat.com) (66.187.233.73) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 23 Mar 2018 18:22:26 +0000 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 22CC54022931 for ; Fri, 23 Mar 2018 18:22:25 +0000 (UTC) Received: from [127.0.0.1] (ovpn04.gateway.prod.ext.ams2.redhat.com [10.39.146.4]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8704C2023233; Fri, 23 Mar 2018 18:22:24 +0000 (UTC) Subject: Re: [PATCH] Add psymbols for nested types To: Keith Seitz , gdb-patches@sourceware.org References: <20180323180822.25737-1-keiths@redhat.com> From: Pedro Alves Message-ID: Date: Fri, 23 Mar 2018 18:22:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <20180323180822.25737-1-keiths@redhat.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-SW-Source: 2018-03/txt/msg00450.txt.bz2 Looks good, please push. Does this work with a gdb index instead of psymbols? I.e., does the test pass with --target_board=dwarf4-gdb-index ? Thanks, Pedro Alves On 03/23/2018 06:08 PM, Keith Seitz wrote: > c++/22968 involves the inability of ptype to find a type definition for > a type defined inside another type. I recently added some additional > support for nested type definitions, but I apparently overlooked psymbols. > > The user reports that using -readnow fixes the problem: > > $ gdb 22968 -ex "ptype Outer::Inner" > There is no field named Inner > > $ gdb -readnow 22968 -ex "ptype Outer::Inner" > type = struct Outer::Inner { > > } > > We clearly did not find a psymbol for Outer::Inner because it was located > in another CU. This patch addresses this problem by scanning structs > for additional psymbols. Rust is already doing this. > > With this patch, the identical result to "-readnow" is given (without > using `-readnow', of course). > > gdb/ChangeLog: > > PR c++/22968 > * dwarf2read.c (scan_partial_symbols): Scan structs/classes for > nested type definitions for C++, too. > > gdb/testsuite/ChangeLog: > > PR c++/22968 > * gdb.cp/subtypes.exp: New file. > * gdb.cp/subtypes.h: New file. > * gdb.cp/subtypes.cc: New file. > * gdb.cp/subtypes-2.cc: New file. > --- > gdb/ChangeLog | 6 +++++ > gdb/dwarf2read.c | 3 ++- > gdb/testsuite/ChangeLog | 8 ++++++ > gdb/testsuite/gdb.cp/subtypes-2.cc | 30 ++++++++++++++++++++++ > gdb/testsuite/gdb.cp/subtypes.cc | 42 ++++++++++++++++++++++++++++++ > gdb/testsuite/gdb.cp/subtypes.exp | 52 ++++++++++++++++++++++++++++++++++++++ > gdb/testsuite/gdb.cp/subtypes.h | 50 ++++++++++++++++++++++++++++++++++++ > 7 files changed, 190 insertions(+), 1 deletion(-) > create mode 100644 gdb/testsuite/gdb.cp/subtypes-2.cc > create mode 100644 gdb/testsuite/gdb.cp/subtypes.cc > create mode 100644 gdb/testsuite/gdb.cp/subtypes.exp > create mode 100644 gdb/testsuite/gdb.cp/subtypes.h > > diff --git a/gdb/ChangeLog b/gdb/ChangeLog > index 2226e42bc2..744c0b1bfc 100644 > --- a/gdb/ChangeLog > +++ b/gdb/ChangeLog > @@ -1,3 +1,9 @@ > +2018-MM-DD Keith Seitz > + > + PR c++/22968 > + * dwarf2read.c (scan_partial_symbols): Scan structs/classes for > + nested type definitions for C++, too. > + > 2018-03-23 Tom Tromey > > * machoread.c (struct oso_el): Add a constructor. Don't define as > diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c > index 6100438049..93ecf407e3 100644 > --- a/gdb/dwarf2read.c > +++ b/gdb/dwarf2read.c > @@ -9116,7 +9116,8 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc, > { > add_partial_symbol (pdi, cu); > } > - if (cu->language == language_rust && pdi->has_children) > + if ((cu->language == language_rust > + || cu->language == language_cplus) && pdi->has_children) > scan_partial_symbols (pdi->die_child, lowpc, highpc, > set_addrmap, cu); > break; > diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog > index 1412c689da..96624efe72 100644 > --- a/gdb/testsuite/ChangeLog > +++ b/gdb/testsuite/ChangeLog > @@ -1,3 +1,11 @@ > +2018-MM-DD Keith Seitz > + > + PR c++/22968 > + * gdb.cp/subtypes.exp: New file. > + * gdb.cp/subtypes.h: New file. > + * gdb.cp/subtypes.cc: New file. > + * gdb.cp/subtypes-2.cc: New file. > + > 2018-03-23 Andrew Burgess > > * gdb.arch/amd64-disp-step-avx.S: Add '_start' label. > diff --git a/gdb/testsuite/gdb.cp/subtypes-2.cc b/gdb/testsuite/gdb.cp/subtypes-2.cc > new file mode 100644 > index 0000000000..3426443a4d > --- /dev/null > +++ b/gdb/testsuite/gdb.cp/subtypes-2.cc > @@ -0,0 +1,30 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2018 Free Software Foundation, Inc. > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; either version 3 of the License, or > + (at your option) any later version. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program. If not, see . */ > + > +#include "subtypes.h" > + > +struct Outer::Inner > +{ > + int doit () { return 1; } > + struct InnerInner {} p; > + int a; > +}; > + > +Outer::Outer (): p (new Inner), e (Oenum::OC) > +{ > + p->a = p->doit (); > +} > diff --git a/gdb/testsuite/gdb.cp/subtypes.cc b/gdb/testsuite/gdb.cp/subtypes.cc > new file mode 100644 > index 0000000000..e95490c8b0 > --- /dev/null > +++ b/gdb/testsuite/gdb.cp/subtypes.cc > @@ -0,0 +1,42 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2018 Free Software Foundation, Inc. > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; either version 3 of the License, or > + (at your option) any later version. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program. If not, see . */ > + > +#include "subtypes.h" > + > +int > +main (int argc, char *argv[]) > +{ > + struct Foo > + { > + int doit (void) { return 1111; } > + } foo; > + > + struct Bar > + { > + int doit (void) { return 2222; } > + } bar; > + > + struct Baz > + { > + int doit (void) { return 3333; } > + } baz; > + Outer o; > + o.e = Outer::Oenum::OA; > + > + return foo.doit () + bar.doit () + baz.doit () + foobar (6) > + + foobar ('c'); > +} > diff --git a/gdb/testsuite/gdb.cp/subtypes.exp b/gdb/testsuite/gdb.cp/subtypes.exp > new file mode 100644 > index 0000000000..6c5f7f845c > --- /dev/null > +++ b/gdb/testsuite/gdb.cp/subtypes.exp > @@ -0,0 +1,52 @@ > +# Copyright 2018 Free Software Foundation, Inc. > + > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 3 of the License, or > +# (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program. If not, see . > + > +# Test for subtype definitions, i.e., types defined in classes, functions, > +# etc. > + > +if {[skip_cplus_tests]} { continue } > + > +load_lib "cp-support.exp" > + > +standard_testfile .cc subtypes-2.cc > + > +if {[prepare_for_testing "failed to prepare" $testfile \ > + [list $srcfile $srcfile2] {debug c++}]} { > + return -1 > +} > + > +gdb_test "ptype Outer::Inner::InnerInner" \ > + "type = struct Outer::Inner::InnerInner.*" > +gdb_test "ptype Outer::Inner" "type = struct Outer::Inner.*" > +gdb_test "ptype main::Foo" "type = struct Foo.*" > +gdb_test "ptype main::Bar" "type = struct Bar.*" > +gdb_test "ptype main::Baz" "type = struct Baz.*" > +gdb_test "ptype Outer::Oenum" "type = enum class Outer::Oenum.*" > +gdb_test "ptype foobar::Foo" "type = struct Foo.*" > +gdb_test "ptype foobar::Bar" "type = struct Bar.*" > +gdb_test "ptype foobar::Baz" "type = struct Baz.*" > +gdb_test "ptype foobar::Foo" "type = struct Foo.*" > +gdb_test "ptype foobar::Bar" "type = struct Bar.*" > +gdb_test "ptype foobar::Baz" "type = struct Baz.*" > +gdb_breakpoint "Outer::Inner::doit" message > +gdb_breakpoint "main::Foo::doit" message > +gdb_breakpoint "main::Bar::doit" message > +gdb_breakpoint "main::Baz::doit" message > +gdb_breakpoint "foobar(int)::Foo::doit" message > +gdb_breakpoint "foobar(int)::Bar::doit" message > +gdb_breakpoint "foobar(int)::Baz::doit" message > +gdb_breakpoint "foobar(int)::Foo::doit" message > +gdb_breakpoint "foobar(int)::Bar::doit" message > +gdb_breakpoint "foobar(int)::Baz::doit" message > diff --git a/gdb/testsuite/gdb.cp/subtypes.h b/gdb/testsuite/gdb.cp/subtypes.h > new file mode 100644 > index 0000000000..5f29c2674e > --- /dev/null > +++ b/gdb/testsuite/gdb.cp/subtypes.h > @@ -0,0 +1,50 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2018 Free Software Foundation, Inc. > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; either version 3 of the License, or > + (at your option) any later version. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program. If not, see . */ > + > +/* A template that defines subtypes. */ > + > +template > +T foobar (int arg) > +{ > + struct Foo > + { > + T doit (void) { return 1; } > + } foo; > + > + struct Bar > + { > + T doit (void) { return 2; } > + } bar; > + > + struct Baz > + { > + T doit (void) { return 3; } > + } baz; > + > + return arg - foo.doit () - bar.doit () - baz.doit (); > +} > + > +/* A structure that defines other types. */ > + > +struct Outer > +{ > + enum class Oenum { OA, OB, OC, OD }; > + struct Inner; > + Inner *p; > + Oenum e; > + Outer (); > +}; >