This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Add psymbols for nested types


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 ();
> +};
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]