public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Pedro Alves <palves@redhat.com>
To: Keith Seitz <keiths@redhat.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH] Add psymbols for nested types
Date: Fri, 23 Mar 2018 18:22:00 -0000	[thread overview]
Message-ID: <a8f87610-66a4-af1e-3211-4c5495d6a5b8@redhat.com> (raw)
In-Reply-To: <20180323180822.25737-1-keiths@redhat.com>

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 {
>   <no data field>
> }
> 
> 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  <keiths@redhat.com>
> +
> +	PR c++/22968
> +	* dwarf2read.c (scan_partial_symbols): Scan structs/classes for
> +	nested type definitions for C++, too.
> +
>  2018-03-23  Tom Tromey  <tom@tromey.com>
>  
>  	* 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  <keiths@redhat.com>
> +
> +	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  <andrew.burgess@embecosm.com>
>  
>  	* 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 <http://www.gnu.org/licenses/>.  */
> +
> +#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 <http://www.gnu.org/licenses/>.  */
> +
> +#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<int> (6)
> +    + foobar<char> ('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 <http://www.gnu.org/licenses/>.
> +
> +# 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<int>::Foo" "type = struct Foo.*"
> +gdb_test "ptype foobar<int>::Bar" "type = struct Bar.*"
> +gdb_test "ptype foobar<int>::Baz" "type = struct Baz.*"
> +gdb_test "ptype foobar<char>::Foo" "type = struct Foo.*"
> +gdb_test "ptype foobar<char>::Bar" "type = struct Bar.*"
> +gdb_test "ptype foobar<char>::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>(int)::Foo::doit" message
> +gdb_breakpoint "foobar<int>(int)::Bar::doit" message
> +gdb_breakpoint "foobar<int>(int)::Baz::doit" message
> +gdb_breakpoint "foobar<char>(int)::Foo::doit" message
> +gdb_breakpoint "foobar<char>(int)::Bar::doit" message
> +gdb_breakpoint "foobar<char>(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 <http://www.gnu.org/licenses/>.  */
> +
> +/* A template that defines subtypes.  */
> +
> +template <typename T>
> +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 ();
> +};
> 

  reply	other threads:[~2018-03-23 18:22 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-23 18:08 Keith Seitz
2018-03-23 18:22 ` Pedro Alves [this message]
2018-03-23 18:59   ` Keith Seitz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a8f87610-66a4-af1e-3211-4c5495d6a5b8@redhat.com \
    --to=palves@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=keiths@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).