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]

revert+new [patch]: Re: [patch] DWARF-3+ DW_AT_accessibility defaults #2 (GCC PR debug/45124)


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



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