diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 19 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/staticvirtual.exp | 54 |
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" |