aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/dwarf2read.c48
2 files changed, 48 insertions, 6 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 98b39a1..7aec962 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2011-03-21 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.
+
2011-03-21 Ulrich Weigand <ulrich.weigand@linaro.org>
* arm-tdep.c (arm_analyze_prologue): Do not abort parsing when
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 810f66a..8807d27 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -6209,6 +6209,27 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block,
}
}
+/* Check for GCC PR debug/45124 fix which is not present in any G++ version up
+ to 4.5.any hwile 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 (const char *producer)
+{
+ int major, minor;
+
+ /* Whitespaces are ignored in both PRODUCER and the format string. */
+ if (sscanf (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 +6260,28 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
}
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->producer))
+ {
+ /* 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);