aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/dwarf2read.c19
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.dwarf2/staticvirtual.exp54
4 files changed, 83 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 9b6deb4..6d41940 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2015-03-23 Keith Seitz <keiths@redhat.com>
+
+ PR gdb/18021
+ * dwarf2read.c (dwarf2_add_member_fn): Issue a complaint
+ if we find a static method with DW_AT_vtable_elem_location.
+
2015-03-21 Eli Zaretskii <eliz@gnu.org>
* tui/tui-io.c (tui_expand_tabs): Reinitialize the column counter
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 898706f..4946b48 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -12918,7 +12918,24 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die,
dwarf2_complex_location_expr_complaint ();
if (!fnp->fcontext)
- fnp->fcontext = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (this_type, 0));
+ {
+ /* If there is no `this' field and no DW_AT_containing_type,
+ we cannot actually find a base class context for the
+ vtable! */
+ if (TYPE_NFIELDS (this_type) == 0
+ || !TYPE_FIELD_ARTIFICIAL (this_type, 0))
+ {
+ complaint (&symfile_complaints,
+ _("cannot determine context for virtual member "
+ "function \"%s\" (offset %d)"),
+ fieldname, die->offset.sect_off);
+ }
+ else
+ {
+ fnp->fcontext
+ = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (this_type, 0));
+ }
+ }
}
else if (attr_form_is_section_offset (attr))
{
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 43b4eb5..265c573 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-03-23 Keith Seitz <keiths@redhat.com>
+
+ PR gdb/18021
+ * gdb.dwarf2/staticvirtual.exp: New test.
+
2015-03-20 Jan Kratochvil <jan.kratochvil@redhat.com>
* Makefile.in (ALL_SUBDIRS): Remove gdb.hp.
diff --git a/gdb/testsuite/gdb.dwarf2/staticvirtual.exp b/gdb/testsuite/gdb.dwarf2/staticvirtual.exp
new file mode 100644
index 0000000..06d46e1
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/staticvirtual.exp
@@ -0,0 +1,54 @@
+# Copyright 2015 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/>.
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if {![dwarf2_support]} {
+ return 0
+}
+
+if { [skip_cplus_tests] } { continue }
+
+standard_testfile main.c staticvirtual-dw.S
+
+# Make DWARF for the test.
+set asm_file [standard_output_file $srcfile2]
+Dwarf::assemble $asm_file {
+ cu {} {
+ compile_unit {{language @DW_LANG_C_plus_plus}} {
+ structure_type {
+ {name S}
+ {byte_size 1 DW_FORM_sdata}
+ } {
+ subprogram {
+ {low_pc 0x1000 addr}
+ {high_pc 0x2000 addr}
+ {name ~S}
+ {external 1 flag}
+ {virtuality @DW_VIRTUALITY_virtual}
+ {vtable_elem_location {const1u 1} SPECIAL_expr}
+ }
+ }
+ }
+ }
+}
+
+if { [prepare_for_testing ${testfile}.exp ${testfile} \
+ [list $srcfile $asm_file] {nodebug}] } {
+ return -1
+}
+
+# gdb/18021: The test below would cause GDB to crash.
+gdb_test "p S::~S" "0x1000"