public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [rfc] Work around buggy GCC 4.1 namespace dwarf info (GCC PR c++/28460)
@ 2010-03-19 12:37 Ulrich Weigand
  2010-03-19 12:59 ` Daniel Jacobowitz
  2010-03-19 19:20 ` [patch-testcase] " Jan Kratochvil
  0 siblings, 2 replies; 8+ messages in thread
From: Ulrich Weigand @ 2010-03-19 12:37 UTC (permalink / raw)
  To: gdb-patches

Hello,

since recent patches to improve C++ namespace support went in, I'm seeing
large numbers (>150) of C++ test case failures.  It turns out that these
were caused by a bug in G++ 4.1 (GCC PR c++/28460) that generates bogus
DW_TAG_namespace DIEs for the global namespace.

With current GDB these bogus DIEs have the effect that the debugger will
no longer have debug info for any global variable.  This seriously affects
debugging capabilities ...

While the bug is indeed in GCC rather than GDB (and has long since been
fixed), I'm wondering whether it would still make sense for us to work
around the problem, because:
- GCC 4.1 is still in widespread use (e.g. as system compiler in RHEL 5.x
  and SLES 10).
- The impact of the bug seriously affects debugging with current
  mainline GDB.

Note that there is precendent for working around buggy GCC debug info
generation in serious cases already ...

The following patch works around the problem for me.
Tested on powerpc-linux, fixes (most) C++ test case failures.

Any comments?  Does anybody see a simpler way to work around the problem?

Bye,
Ulrich

  
ChangeLog:

	* dwarf2read.c (partial_die_parent_scope): Work around buggy
	GCC 4.1 debug info generation (GCC PR c++/28460).
	(determine_prefix): Likewise.


Index: gdb/dwarf2read.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
retrieving revision 1.370
diff -u -p -r1.370 dwarf2read.c
--- gdb/dwarf2read.c	17 Mar 2010 19:16:02 -0000	1.370
+++ gdb/dwarf2read.c	18 Mar 2010 19:26:51 -0000
@@ -2307,6 +2307,19 @@ partial_die_parent_scope (struct partial
 
   grandparent_scope = partial_die_parent_scope (parent, cu);
 
+  /* GCC 4.0 and 4.1 had a bug (PR c++/28460) where they generated bogus
+     DW_TAG_namespace DIEs with a name of "::" for the global namespace.
+     Work around this problem here.  */
+  if (cu->language == language_cplus
+      && parent->tag == DW_TAG_namespace 
+      && strcmp (parent->name, "::") == 0
+      && grandparent_scope == NULL)
+    {
+      parent->scope = NULL;
+      parent->scope_set = 1;
+      return NULL;
+    }
+
   if (parent->tag == DW_TAG_namespace
       || parent->tag == DW_TAG_structure_type
       || parent->tag == DW_TAG_class_type
@@ -9012,6 +9025,12 @@ determine_prefix (struct die_info *die, 
       {
       case DW_TAG_namespace:
 	parent_type = read_type_die (parent, cu);
+	/* GCC 4.0 and 4.1 had a bug (PR c++/28460) where they generated bogus
+	   DW_TAG_namespace DIEs with a name of "::" for the global namespace.
+	   Work around this problem here.  */
+	if (cu->language == language_cplus
+	    && strcmp (TYPE_TAG_NAME (parent_type), "::") == 0)
+	  return "";
 	/* We give a name to even anonymous namespaces.  */
 	return TYPE_TAG_NAME (parent_type);
       case DW_TAG_class_type:
-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand@de.ibm.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [rfc] Work around buggy GCC 4.1 namespace dwarf info (GCC PR  c++/28460)
  2010-03-19 12:37 [rfc] Work around buggy GCC 4.1 namespace dwarf info (GCC PR c++/28460) Ulrich Weigand
@ 2010-03-19 12:59 ` Daniel Jacobowitz
  2010-03-19 19:20 ` [patch-testcase] " Jan Kratochvil
  1 sibling, 0 replies; 8+ messages in thread
From: Daniel Jacobowitz @ 2010-03-19 12:59 UTC (permalink / raw)
  To: Ulrich Weigand; +Cc: gdb-patches

On Fri, Mar 19, 2010 at 01:37:11PM +0100, Ulrich Weigand wrote:
> Note that there is precendent for working around buggy GCC debug info
> generation in serious cases already ...

My position is that we should work around broken debug info in any
compiler that someone cares enough to submit a maintainable workaround
for.  The goal of GDB is to help people debug, not to process DWARF.

> 
> The following patch works around the problem for me.
> Tested on powerpc-linux, fixes (most) C++ test case failures.
> 
> Any comments?  Does anybody see a simpler way to work around the problem?

This looks pretty simple (and OK) to me.

-- 
Daniel Jacobowitz
CodeSourcery

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [patch-testcase] Re: [rfc] Work around buggy GCC 4.1 namespace dwarf  info (GCC PR c++/28460)
  2010-03-19 12:37 [rfc] Work around buggy GCC 4.1 namespace dwarf info (GCC PR c++/28460) Ulrich Weigand
  2010-03-19 12:59 ` Daniel Jacobowitz
@ 2010-03-19 19:20 ` Jan Kratochvil
  2010-03-19 20:21   ` Daniel Jacobowitz
                     ` (2 more replies)
  1 sibling, 3 replies; 8+ messages in thread
From: Jan Kratochvil @ 2010-03-19 19:20 UTC (permalink / raw)
  To: Ulrich Weigand; +Cc: gdb-patches

Hi,

this problem was fixed before at:
	[expr-cumulative] Fix namespace regression for G++-4.1
	http://sourceware.org/ml/archer/2009-q4/msg00124.html
(and before at
	[patch by Michael Matz] Re: archer gdb and gcc 4.1 globalnamespace DIE
	http://sourceware.org/ml/archer/2009-q2/msg00089.html
)

but at least reposting the testcase from it here.

OK to apply with Ulrich Weigand's patch?


Thanks,
Jan


gdb/testsuite/
2009-12-20  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* gdb.dwarf2/dw2-empty-namespace.exp, gdb.dwarf2/dw2-empty-namespace.S:
	New.

--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.S
@@ -0,0 +1,108 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2010 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 G++ 4.1 producing DW_TAG_namespace with DW_AT_name "::".  */
+
+	.data
+var:	.4byte	1
+
+	.section .debug_info
+.Lcu1_begin:
+	/* CU header */
+	.4byte	.Lcu1_end - .Lcu1_start		/* Length of Compilation Unit */
+.Lcu1_start:
+	.2byte	2				/* DWARF Version */
+	.4byte	.Labbrev1_begin			/* Offset into abbrev section */
+	.byte	4				/* Pointer size */
+
+	/* CU die */
+	.uleb128 1				/* Abbrev: DW_TAG_compile_unit */
+	.ascii	"file1.txt\0"			/* DW_AT_name */
+	.ascii	"GNU C 3.3.3\0"			/* DW_AT_producer */
+	.byte	4				/* DW_LANG_C_plus_plus (C++) */
+
+.Ltype_int:
+	.uleb128	2			/* Abbrev: DW_TAG_base_type */
+	.ascii		"int\0"			/* DW_AT_name */
+	.byte		4			/* DW_AT_byte_size */
+	.byte		5			/* DW_AT_encoding */
+
+	.uleb128	3			/* Abbrev: DW_TAG_namespace */
+	.ascii		"::\0"			/* DW_AT_name */
+
+	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
+	.ascii		"var\0"			/* DW_AT_name */
+	.byte		2f - 1f			/* DW_AT_location */
+1:	.byte		3			/*   DW_OP_addr */
+	.4byte		var			/*   <addr> */
+2:	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
+
+	.byte		0			/* End of children of DW_TAG_namespace */
+
+	.byte		0			/* End of children of CU */
+
+.Lcu1_end:
+
+/* Abbrev table */
+	.section .debug_abbrev
+.Labbrev1_begin:
+	.uleb128	1			/* Abbrev code */
+	.uleb128	0x11			/* DW_TAG_compile_unit */
+	.byte		1			/* has_children */
+	.uleb128	0x3			/* DW_AT_name */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0x25			/* DW_AT_producer */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0x13			/* DW_AT_language */
+	.uleb128	0xb			/* DW_FORM_data1 */
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+	.uleb128	2			/* Abbrev code */
+	.uleb128	0x24			/* DW_TAG_base_type */
+	.byte		0			/* has_children */
+	.uleb128	0x3			/* DW_AT_name */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0xb			/* DW_AT_byte_size */
+	.uleb128	0xb			/* DW_FORM_data1 */
+	.uleb128	0x3e			/* DW_AT_encoding */
+	.uleb128	0xb			/* DW_FORM_data1 */
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+	.uleb128	3			/* Abbrev code */
+	.uleb128	0x39			/* DW_TAG_namespace */
+	.byte		1			/* has_children */
+	.uleb128	0x3			/* DW_AT_name */
+	.uleb128	0x8			/* DW_FORM_string */
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+	.uleb128	7			/* Abbrev code (location) */
+	.uleb128	0x34			/* DW_TAG_variable */
+	.byte		0			/* has_children */
+	.uleb128	0x3			/* DW_AT_name */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0x2			/* DW_AT_location */
+	.uleb128	0xa			/* DW_FORM_block1 */
+	.uleb128	0x49			/* DW_AT_type */
+	.uleb128	0x13			/* DW_FORM_ref4 */
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.exp
@@ -0,0 +1,43 @@
+# Copyright 2010 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 G++ 4.1 producing DW_TAG_namespace with DW_AT_name "::".
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+# For now pick a sampling of likely targets.
+if {![istarget *-*-linux*]
+    && ![istarget *-*-gnu*]
+    && ![istarget *-*-elf*]
+    && ![istarget *-*-openbsd*]
+    && ![istarget arm-*-eabi*]
+    && ![istarget powerpc-*-eabi*]} {
+    return 0  
+}
+
+set testfile "dw2-empty-namespace"
+set srcfile ${testfile}.S
+set executable ${testfile}.x
+
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objdir}/${subdir}/${executable}" object {nodebug}] != "" } {
+    return -1
+}
+
+clean_restart $executable
+
+# `p var' below can work without identified DWARF DIE just based on its ELF symbol.
+# Catch it here as `type = <data variable, no debug info>'.
+gdb_test "ptype var" "type = int"
+
+gdb_test "p var" " = 1"

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [patch-testcase] Re: [rfc] Work around buggy GCC 4.1 namespace  dwarf  info (GCC PR c++/28460)
  2010-03-19 19:20 ` [patch-testcase] " Jan Kratochvil
@ 2010-03-19 20:21   ` Daniel Jacobowitz
  2010-03-20  1:30   ` Tom Tromey
  2010-03-22 13:23   ` Ulrich Weigand
  2 siblings, 0 replies; 8+ messages in thread
From: Daniel Jacobowitz @ 2010-03-19 20:21 UTC (permalink / raw)
  To: Jan Kratochvil; +Cc: Ulrich Weigand, gdb-patches

On Fri, Mar 19, 2010 at 08:20:08PM +0100, Jan Kratochvil wrote:
> Hi,
> 
> this problem was fixed before at:
> 	[expr-cumulative] Fix namespace regression for G++-4.1
> 	http://sourceware.org/ml/archer/2009-q4/msg00124.html
> (and before at
> 	[patch by Michael Matz] Re: archer gdb and gcc 4.1 globalnamespace DIE
> 	http://sourceware.org/ml/archer/2009-q2/msg00089.html
> )
> 
> but at least reposting the testcase from it here.
> 
> OK to apply with Ulrich Weigand's patch?

OK.

-- 
Daniel Jacobowitz
CodeSourcery

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [patch-testcase] Re: [rfc] Work around buggy GCC 4.1 namespace dwarf  info (GCC PR c++/28460)
  2010-03-19 19:20 ` [patch-testcase] " Jan Kratochvil
  2010-03-19 20:21   ` Daniel Jacobowitz
@ 2010-03-20  1:30   ` Tom Tromey
  2010-03-21 19:42     ` Jan Kratochvil
  2010-03-22 13:23   ` Ulrich Weigand
  2 siblings, 1 reply; 8+ messages in thread
From: Tom Tromey @ 2010-03-20  1:30 UTC (permalink / raw)
  To: Jan Kratochvil; +Cc: Ulrich Weigand, gdb-patches

>>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:

Jan> this problem was fixed before at:
Jan> 	[expr-cumulative] Fix namespace regression for G++-4.1
Jan> 	http://sourceware.org/ml/archer/2009-q4/msg00124.html

If you have other patches on expr-cumulative, it would be good to submit
them.

I think all my patches from that branch are in, and I know Sami is
working on his.

Tom

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [patch-testcase] Re: [rfc] Work around buggy GCC 4.1 namespace  dwarf  info (GCC PR c++/28460)
  2010-03-20  1:30   ` Tom Tromey
@ 2010-03-21 19:42     ` Jan Kratochvil
  0 siblings, 0 replies; 8+ messages in thread
From: Jan Kratochvil @ 2010-03-21 19:42 UTC (permalink / raw)
  To: Tom Tromey; +Cc: Ulrich Weigand, gdb-patches

On Sat, 20 Mar 2010 02:30:39 +0100, Tom Tromey wrote:
> >>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:
> 
> Jan> this problem was fixed before at:
> Jan> 	[expr-cumulative] Fix namespace regression for G++-4.1
> Jan> 	http://sourceware.org/ml/archer/2009-q4/msg00124.html
> 
> If you have other patches on expr-cumulative, it would be good to submit
> them.

No, I have found any others now.


Thanks,
Jan

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [patch-testcase] Re: [rfc] Work around buggy GCC 4.1 namespace dwarf  info (GCC PR c++/28460)
  2010-03-19 19:20 ` [patch-testcase] " Jan Kratochvil
  2010-03-19 20:21   ` Daniel Jacobowitz
  2010-03-20  1:30   ` Tom Tromey
@ 2010-03-22 13:23   ` Ulrich Weigand
  2010-03-22 16:55     ` Jan Kratochvil
  2 siblings, 1 reply; 8+ messages in thread
From: Ulrich Weigand @ 2010-03-22 13:23 UTC (permalink / raw)
  To: Jan Kratochvil; +Cc: gdb-patches

Jan Kratochvil wrote:

> this problem was fixed before at:
> 	[expr-cumulative] Fix namespace regression for G++-4.1
> 	http://sourceware.org/ml/archer/2009-q4/msg00124.html
> (and before at
> 	[patch by Michael Matz] Re: archer gdb and gcc 4.1 globalnamespace DIE
> 	http://sourceware.org/ml/archer/2009-q2/msg00089.html
> )
> 
> but at least reposting the testcase from it here.

Huh, I missed that -- sorry ...

> OK to apply with Ulrich Weigand's patch?

I've now checked in the patch; please go ahead and commit your testcase.

Thanks,
Ulrich

-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand@de.ibm.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [patch-testcase] Re: [rfc] Work around buggy GCC 4.1 namespace  dwarf  info (GCC PR c++/28460)
  2010-03-22 13:23   ` Ulrich Weigand
@ 2010-03-22 16:55     ` Jan Kratochvil
  0 siblings, 0 replies; 8+ messages in thread
From: Jan Kratochvil @ 2010-03-22 16:55 UTC (permalink / raw)
  To: Ulrich Weigand; +Cc: gdb-patches

On Mon, 22 Mar 2010 14:23:11 +0100, Ulrich Weigand wrote:
> Jan Kratochvil wrote:
> > this problem was fixed before at:
> > (and before at
> 
> Huh, I missed that -- sorry ...

It was more my misunderstanding/Archer/problem, just sorry for the regression.


> > OK to apply with Ulrich Weigand's patch?
> 
> I've now checked in the patch; please go ahead and commit your testcase.

Checked-in:
	http://sourceware.org/ml/gdb-cvs/2010-03/msg00201.html


Thanks,
Jan

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-03-22 16:55 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-03-19 12:37 [rfc] Work around buggy GCC 4.1 namespace dwarf info (GCC PR c++/28460) Ulrich Weigand
2010-03-19 12:59 ` Daniel Jacobowitz
2010-03-19 19:20 ` [patch-testcase] " Jan Kratochvil
2010-03-19 20:21   ` Daniel Jacobowitz
2010-03-20  1:30   ` Tom Tromey
2010-03-21 19:42     ` Jan Kratochvil
2010-03-22 13:23   ` Ulrich Weigand
2010-03-22 16:55     ` Jan Kratochvil

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).