This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
revert+new [patch]: Re: [patch] DWARF-3+ DW_AT_accessibility defaults #2 (GCC PR debug/45124)
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Tue, 22 Mar 2011 10:59:04 +0100
- Subject: revert+new [patch]: Re: [patch] DWARF-3+ DW_AT_accessibility defaults #2 (GCC PR debug/45124)
- References: <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);