Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Jan Kratochvil <jan.kratochvil@redhat.com>
To: gdb-patches@sourceware.org
Subject: revert+new [patch]: Re: [patch] DWARF-3+ DW_AT_accessibility defaults #2 (GCC PR debug/45124)
Date: Tue, 22 Mar 2011 10:06:00 -0000	[thread overview]
Message-ID: <20110322095904.GA29625@host1.jankratochvil.net> (raw)
In-Reply-To: <20110321154428.GA3761@host1.jankratochvil.net>

Hi,

there has been a crash regression for: gdb.dwarf2/dw4-sig-types.exp

The patch has been reverted:
	http://sourceware.org/ml/gdb-cvs/2011-03/msg00264.html

Filed now GCC PR debug/48229:
	DW_TAG_type_unit has no DW_AT_producer
	http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48229

The problem is gcc-4.5.x has wrong DWARF output (GCC PR debug/45124) and it
does not provide any DW_AT_producer.  Therefore proposing GDB would assume
gcc-4.5.x when it sees no DW_AT_producer.  Hopefully GCC is the only DWARF-4
DW_TAG_type_unit producer out there (is it?) and finally hopefully it is the
only DW_TAG_type_unit producer forgetting to output DW_AT_producer.  It would
be probably worth to wait on the resolution of GCC PR debug/48229 before
assuming its implications.

Not sure how I missed the regression, the baseline is a bit floating with
various recent regressions.


Sorry,
Jan


gdb/
2011-03-22  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* dwarf2read.c (producer_is_gxx_lt_4_6): New function.
	(dwarf2_add_field): Fix new_field->accessibility for
	cu->header.version >= 3 while verifying also producer_is_gxx_lt_4_6.

--- gdb/dwarf2read.c	22 Mar 2011 09:50:42 -0000	1.512
+++ gdb/dwarf2read.c	22 Mar 2011 09:52:44 -0000
@@ -6209,6 +6209,45 @@ dwarf2_record_block_ranges (struct die_i
     }
 }
 
+/* Check for GCC PR debug/45124 fix which is not present in any G++ version up
+   to 4.5.any while it is present already in G++ 4.6.0 - the PR has been fixed
+   during 4.6.0 experimental.  */
+
+static int
+producer_is_gxx_lt_4_6 (struct dwarf2_cu *cu)
+{
+  int major, minor;
+
+  if (cu->producer == NULL)
+    {
+      if (cu->per_cu->from_debug_types)
+	{
+	  /* Workaround GCC PR debug/48229 where DW_TAG_type_unit had no
+	     DW_AT_producer in G++ 4.5.x.  G++ 4.4.any could not produce
+	     DWARF-4 (and its DW_TAG_type_unit).  G++ 4.6.0 already provides
+	     DW_AT_producer for DW_TAG_type_unit.  */
+
+	  return 1;
+	}
+
+      /* For unknown compilers expect their behavior is DWARF version
+         compliant.  */
+
+      return 0;
+    }
+
+  /* Whitespaces are ignored in both PRODUCER and the format string.  */
+  if (sscanf (cu->producer, "GNU C++ %d.%d", &major, &minor) != 2)
+    {
+      /* For non-GCC compilers expect their behavior is DWARF version
+	 compliant.  */
+
+      return 0;
+    }
+
+  return major < 4 || (major == 4 && minor < 6);
+}
+
 /* Add an aggregate field to the field list.  */
 
 static void
@@ -6239,13 +6278,28 @@ dwarf2_add_field (struct field_info *fip
     }
   fip->nfields++;
 
-  /* Handle accessibility and virtuality of field.
-     The default accessibility for members is public, the default
-     accessibility for inheritance is private.  */
-  if (die->tag != DW_TAG_inheritance)
-    new_field->accessibility = DW_ACCESS_public;
+  if (cu->header.version < 3 || producer_is_gxx_lt_4_6 (cu))
+    {
+      /* The default DWARF 2 accessibility for members is public, the default
+	 accessibility for inheritance is private.  */
+
+      if (die->tag != DW_TAG_inheritance)
+	new_field->accessibility = DW_ACCESS_public;
+      else
+	new_field->accessibility = DW_ACCESS_private;
+    }
   else
-    new_field->accessibility = DW_ACCESS_private;
+    {
+      /* DWARF 3+ defines the default accessibility a different way - see
+	 below - than DWARF 2 has defined.  The same rules apply now for
+	 DW_TAG_inheritance as for the members and it only depends on the
+	 container kind.  */
+
+      if (die->parent->tag == DW_TAG_class_type)
+	new_field->accessibility = DW_ACCESS_private;
+      else
+	new_field->accessibility = DW_ACCESS_public;
+    }
   new_field->virtuality = DW_VIRTUALITY_none;
 
   attr = dwarf2_attr (die, DW_AT_accessibility, cu);



  parent reply	other threads:[~2011-03-22  9:59 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-21 15:47 Jan Kratochvil
2011-03-21 17:29 ` Tom Tromey
2011-03-21 20:15   ` Jan Kratochvil
2011-03-21 20:41     ` Tom Tromey
2011-03-22 10:06 ` Jan Kratochvil [this message]
2011-03-22 18:16   ` revert+new [patch]: " Tom Tromey
2011-03-22 18:32     ` Jan Kratochvil
2011-03-23  2:12       ` Dodji Seketeli
2011-03-28 12:35       ` Jan Kratochvil
2011-04-01 21:03         ` [patch] DWARF-3+ DW_AT_accessibility defaults #3 " Jan Kratochvil
2011-04-03 16:28           ` Jan Kratochvil
2011-04-09 11:21           ` [commit]+[brach commit] " Jan Kratochvil

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=20110322095904.GA29625@host1.jankratochvil.net \
    --to=jan.kratochvil@redhat.com \
    --cc=gdb-patches@sourceware.org \
    /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