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]

[2/2] RFC: fix PR c++/14998


PR 14998 concerns the handling of DW_TAG_ptr_to_member_type when used as
a pointer-to-method.  clang correctly emits this now, whereas g++ still
uses its own idiosyncratic output; see
quirk_gcc_member_function_pointer.

The gdb bug here is that read_tag_pointer_type doesn't handle
TYPE_CODE_FUNC properly.  This patch fixes the problem.

Built and regtested on x86-64 Fedora 16.
New test case included.  This also serves as an example of how to use
the DWARF assembler.

Tom

	PR c++/14998:
	* dwarf2read.c (read_tag_ptr_to_member_type): Handle
	TYPE_CODE_FUNC.

	* gdb.dwarf2/method-ptr.cc: New file.
	* gdb.dwarf2/method-ptr.exp: New file.
---
 gdb/dwarf2read.c                        |    9 +++
 gdb/testsuite/gdb.dwarf2/method-ptr.cc  |   21 +++++++
 gdb/testsuite/gdb.dwarf2/method-ptr.exp |   97 +++++++++++++++++++++++++++++++
 3 files changed, 127 insertions(+), 0 deletions(-)
 create mode 100644 gdb/testsuite/gdb.dwarf2/method-ptr.cc
 create mode 100644 gdb/testsuite/gdb.dwarf2/method-ptr.exp

diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 5a061f5..4c01592 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -12197,6 +12197,15 @@ read_tag_ptr_to_member_type (struct die_info *die, struct dwarf2_cu *cu)
 
   if (TYPE_CODE (check_typedef (to_type)) == TYPE_CODE_METHOD)
     type = lookup_methodptr_type (to_type);
+  else if (TYPE_CODE (check_typedef (to_type)) == TYPE_CODE_FUNC)
+    {
+      struct type *new_type = alloc_type (cu->objfile);
+
+      smash_to_method_type (new_type, domain, TYPE_TARGET_TYPE (to_type),
+			    TYPE_FIELDS (to_type), TYPE_NFIELDS (to_type),
+			    TYPE_VARARGS (to_type));
+      type = lookup_methodptr_type (new_type);
+    }
   else
     type = lookup_memberptr_type (to_type, domain);
 
diff --git a/gdb/testsuite/gdb.dwarf2/method-ptr.cc b/gdb/testsuite/gdb.dwarf2/method-ptr.cc
new file mode 100644
index 0000000..563c443
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/method-ptr.cc
@@ -0,0 +1,21 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2013 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/>.  */
+
+int main ()
+{
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.dwarf2/method-ptr.exp b/gdb/testsuite/gdb.dwarf2/method-ptr.exp
new file mode 100644
index 0000000..fcd1d69
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/method-ptr.exp
@@ -0,0 +1,97 @@
+# Copyright 2013 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 .cc method-ptr-dw.S
+
+# Make some DWARF for the test.
+set asm_file [standard_output_file $srcfile2]
+Dwarf::assemble $asm_file {
+    declare_labels int_label float_label struct_label
+    declare_labels ptr_label subr_label memptr_label
+
+    cu 0 2 8 {
+	compile_unit {{language @DW_LANG_C_plus_plus}} {
+	    int_label: base_type {
+		{name int}
+		{encoding @DW_ATE_signed}
+		{byte_size 4}
+	    }
+
+	    float_label: base_type {
+		{name float}
+		{encoding @DW_ATE_float}
+		{byte_size 4}
+	    }
+
+	    struct_label: structure_type {
+		{name S}
+		{byte_size 1}
+	    }
+
+	    ptr_label: pointer_type {
+		{type :$struct_label}
+	    }
+
+	    subr_label: subroutine_type {
+		{type :$int_label}
+	    } {
+		formal_parameter {
+		    {type :$ptr_label}
+		    {artificial 1}
+		}
+		formal_parameter {
+		    {type :$float_label}
+		}
+	    }
+
+	    memptr_label: ptr_to_member_type {
+		{type :$subr_label}
+		{containing_type :$struct_label}
+	    }
+
+	    typedef {
+		{name the_typedef}
+		{type :$memptr_label}
+	    }
+	}
+    }
+}
+
+if  {[gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile}1.o \
+	  object {nodebug}] != ""} {
+    return -1
+}
+
+if  {[gdb_compile $asm_file ${binfile}2.o object {nodebug}] != ""} {
+    return -1
+}
+
+if  {[gdb_compile [list ${binfile}1.o ${binfile}2.o] \
+	  "${binfile}" executable {}] != ""} {
+    return -1
+}
+
+clean_restart ${testfile}
+
+gdb_test "ptype the_typedef" \
+    "type = int \\(S::\\*\\)\\(S \\* const, float\\)"
-- 
1.7.7.6


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