Go to file
Tom de Vries 15cd93d05e [gdb/symtab] Handle struct decl with DW_AT_signature
Consider a test-case with sources 36.c:
...
struct s { int i; };
extern void f (void);
int main (void) {
  struct s a;
  f ();
  return 0;
}
...
and 36b.c:
...
struct s { int j; };
void f (void) {
  struct s b;
}
...
compiled like this:
...
$ gcc 36.c 36b.c -g
...

It contains DWARF like this:
...
 <0><d2>: Abbrev Number: 1 (DW_TAG_compile_unit)
    <d8>   DW_AT_name        : 36.c
 <1><f4>: Abbrev Number: 2 (DW_TAG_structure_type)
    <f5>   DW_AT_name        : s
 <2><fe>: Abbrev Number: 3 (DW_TAG_member)
    <ff>   DW_AT_name        : i
 <1><110>: Abbrev Number: 5 (DW_TAG_subprogram)
    <111>   DW_AT_name        : main
 <2><12d>: Abbrev Number: 6 (DW_TAG_variable)
    <12e>   DW_AT_name        : a
    <132>   DW_AT_type        : <0xf4>
 <0><146>: Abbrev Number: 1 (DW_TAG_compile_unit)
    <14c>   DW_AT_name        : 36b.c
 <1><168>: Abbrev Number: 2 (DW_TAG_structure_type)
    <169>   DW_AT_name        : s
 <2><172>: Abbrev Number: 3 (DW_TAG_member)
    <173>   DW_AT_name        : j
 <1><184>: Abbrev Number: 5 (DW_TAG_subprogram)
    <185>   DW_AT_name        : f
 <2><19b>: Abbrev Number: 6 (DW_TAG_variable)
    <19c>   DW_AT_name        : b
    <1a0>   DW_AT_type        : <0x168>
...

And when printing "struct s", we get first a random one (with int j), and then
context-specific ones (with int i in main, and int j in f):
...
$ gdb -batch a.out \
  -ex "ptype struct s" \
  -ex start \
  -ex "ptype struct s" \
  -ex "break f" -ex continue \
  -ex "ptype struct s" \
  | grep "int [ij];"
    int j;
    int i;
    int j;
...
Same for -readnow.

However, if we use -fdebug-types-section:
...
$ gcc 36.c 36b.c -g -fdebug-types-section
...
we get:
...
$ gdb ... | grep "int [ij];"
    int j;
    int i;
    int i;
$ gdb -readnow ... | grep "int [ij];"
    int j;
    int j;
    int j;
...

This is due to the fact that both "struct s" DIEs have been moved to the
.debug_types section:
...
  Compilation Unit @ offset 0x0:
   Signature:     0xfd1462823bb6f7b7
 <0><17>: Abbrev Number: 1 (DW_TAG_type_unit)
 <1><1d>: Abbrev Number: 2 (DW_TAG_structure_type)
    <1e>   DW_AT_name        : s
 <2><27>: Abbrev Number: 3 (DW_TAG_member)
    <28>   DW_AT_name        : i
  Compilation Unit @ offset 0x3a:
   Signature:     0x534310fbefba324d
 <0><51>: Abbrev Number: 1 (DW_TAG_type_unit)
 <1><57>: Abbrev Number: 2 (DW_TAG_structure_type)
    <58>   DW_AT_name        : s
 <2><61>: Abbrev Number: 3 (DW_TAG_member)
    <62>   DW_AT_name        : j
...
and there's no longer a "struct s" DIE in the 36.c and
and 36b.c CUs to specify which "struct s" belongs in the CU.  This is gcc
PR90232.

However, using a tentative patch for gcc that adds these DIEs (according to
DWARF standard: If the complete declaration of a type has been placed in a
separate type unit, an incomplete declaration of that type in the compilation
unit may provide the unique 64-bit signature of the type using a
DW_AT_signature attribute):
...
  <0><d2>: Abbrev Number: 5 (DW_TAG_compile_unit)
     <d8>   DW_AT_name        : 36.c
+ <1><f4>: Abbrev Number: 6 (DW_TAG_structure_type)
+    <f5>   DW_AT_name        : s
+    <f7>   DW_AT_signature   : signature: 0xfd1462823bb6f7b7
+    <ff>   DW_AT_declaration : 1
  <0><13c>: Abbrev Number: 5 (DW_TAG_compile_unit)
     <142>   DW_AT_name        : 36b.c
+ <1><15e>: Abbrev Number: 6 (DW_TAG_structure_type)
+    <15f>   DW_AT_name        : s
+    <161>   DW_AT_signature   : signature: 0x534310fbefba324d
+    <169>   DW_AT_declaration : 1
...
still does not help, because they're declarations, so new_symbol is not called
for them in process_structure_scope.

Fix this by calling new_symbol for these decls.

Build and tested on x86_64-linux.

Also tested with target board enabling by default -fdebug-types-section
-gdwarf-4, and with gcc with aforementioned tentative patch.  In this
configuration, the patch reduces number of FAILs from 2888 to 238.

gdb/ChangeLog:

2020-04-28  Tom de Vries  <tdevries@suse.de>

	* dwarf2/read.c (process_structure_scope): Add symbol for struct decl
	with DW_AT_signature.

gdb/testsuite/ChangeLog:

2020-04-28  Tom de Vries  <tdevries@suse.de>

	* gdb.dwarf2/main-foo.c: New test.
	* gdb.dwarf2/struct-with-sig.exp: New file.
2020-04-28 06:12:35 +02:00
bfd Automatic date update in version.in 2020-04-28 00:00:10 +00:00
binutils readelf: NULL dereference 2020-04-26 23:50:18 +09:30
config Merge changes from GCC for the config/ directory 2020-02-19 17:51:24 +00:00
contrib
cpu cpu,gas,opcodes: support for eBPF JMP32 instruction class 2020-04-16 09:52:57 +02:00
elfcpp Add markers for 2.34 branch to the NEWS files and ChangeLogs. 2020-01-18 13:50:25 +00:00
etc texi2pod.pl: import support for @t{...} from gcc 2020-01-15 12:58:09 -05:00
gas x86: Add i386 PE big-object support 2020-04-27 17:41:39 +01:00
gdb [gdb/symtab] Handle struct decl with DW_AT_signature 2020-04-28 06:12:35 +02:00
gdbserver gdb, gdbserver: remove configure check for fs_base/gs_base in user_regs_struct 2020-04-27 10:47:50 -04:00
gdbsupport gdbsupport: include cstdlib in common-defs.h 2020-04-27 09:28:03 -04:00
gnulib gdb: update gnulib import 2020-02-22 20:37:18 -05:00
gold Add support for --no-rosegment option. 2020-03-19 15:54:38 -07:00
gprof Updated Serbian translation for the gprof subdirectory 2020-04-01 14:37:02 +01:00
include arc: Add support for ARC HS extra registers in core files 2020-04-23 11:09:09 +03:00
intl Regen with blessed automake-1.15.1 2020-02-20 13:02:24 +10:30
ld x86: Add i386 PE big-object support 2020-04-27 17:41:39 +01:00
libctf libctf: Mark bswap_identity_64 inline function as static. 2020-03-11 17:48:49 +10:30
libdecnumber
libiberty Import latest fixes to libiberty from GCC 2020-03-02 03:56:36 -08:00
opcodes Disallow PC relative for CMPI on MC68000/10 2020-04-21 16:53:36 +02:00
readline
sim sim: ppc: netbsd: Sync signal names with NetBSD 9.99.49 2020-03-12 16:07:37 +01:00
texinfo
zlib Merge changes from GCC for the config/ directory 2020-02-19 17:51:24 +00:00
.cvsignore
.gitattributes
.gitignore Add profiling outputs to .gitignore 2019-12-26 06:54:58 +01:00
ar-lib
ChangeLog Since the pdp11-aout target does not support gdb, gdbserver or gprof these should be excluded in configure. 2020-04-21 10:27:50 +01:00
compile
config-ml.in
config.guess Update top level config files with copies from the official repository. 2020-01-18 13:43:19 +00:00
config.rpath
config.sub Update top level config files with copies from the official repository. 2020-01-18 13:43:19 +00:00
configure Since the pdp11-aout target does not support gdb, gdbserver or gprof these should be excluded in configure. 2020-04-21 10:27:50 +01:00
configure.ac Since the pdp11-aout target does not support gdb, gdbserver or gprof these should be excluded in configure. 2020-04-21 10:27:50 +01:00
COPYING
COPYING3
COPYING3.LIB
COPYING.LIB
COPYING.LIBGLOSS
COPYING.NEWLIB
depcomp
djunpack.bat
install-sh
libtool.m4
lt~obsolete.m4
ltgcc.m4
ltmain.sh
ltoptions.m4
ltsugar.m4
ltversion.m4
MAINTAINERS Move gdbserver to top level 2020-02-07 08:42:25 -07:00
Makefile.def Change gdbserver to use existing gdbsupport 2020-03-12 13:32:16 -06:00
Makefile.in Change gdbserver to use existing gdbsupport 2020-03-12 13:32:16 -06:00
Makefile.tpl
makefile.vms
missing
mkdep
mkinstalldirs
move-if-change
multilib.am
README
README-maintainer-mode
setup.com
src-release.sh Move gdbserver to top level 2020-02-07 08:42:25 -07:00
symlink-tree
test-driver
ylwrap

		   README for GNU development tools

This directory contains various GNU compilers, assemblers, linkers, 
debuggers, etc., plus their support routines, definitions, and documentation.

If you are receiving this as part of a GDB release, see the file gdb/README.
If with a binutils release, see binutils/README;  if with a libg++ release,
see libg++/README, etc.  That'll give you info about this
package -- supported targets, how to use it, how to report bugs, etc.

It is now possible to automatically configure and build a variety of
tools with one command.  To build all of the tools contained herein,
run the ``configure'' script here, e.g.:

	./configure 
	make

To install them (by default in /usr/local/bin, /usr/local/lib, etc),
then do:
	make install

(If the configure script can't determine your type of computer, give it
the name as an argument, for instance ``./configure sun4''.  You can
use the script ``config.sub'' to test whether a name is recognized; if
it is, config.sub translates it to a triplet specifying CPU, vendor,
and OS.)

If you have more than one compiler on your system, it is often best to
explicitly set CC in the environment before running configure, and to
also set CC when running make.  For example (assuming sh/bash/ksh):

	CC=gcc ./configure
	make

A similar example using csh:

	setenv CC gcc
	./configure
	make

Much of the code and documentation enclosed is copyright by
the Free Software Foundation, Inc.  See the file COPYING or
COPYING.LIB in the various directories, for a description of the
GNU General Public License terms under which you can copy the files.

REPORTING BUGS: Again, see gdb/README, binutils/README, etc., for info
on where and how to report problems.