gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Wed, 29 Sep 2010 22:32:52 +0000 (22:32 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Wed, 29 Sep 2010 22:32:52 +0000 (22:32 +0000)
Fix GDB crash on inferior calls with self-referencing classes.
* gnu-v3-abi.c (gnuv3_pass_by_reference): Do not call itself on static
member fields.

gdb/testsuite/
Fix GDB crash on inferior calls with self-referencing classes.
* gdb.dwarf2/dw2-cp-infcall-ref-static.exp: New file.
* gdb.dwarf2/dw2-cp-infcall-ref-static-main.c: New file.
* gdb.dwarf2/dw2-cp-infcall-ref-static.S: New file.

gdb/ChangeLog
gdb/gnu-v3-abi.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static-main.c [new file with mode: 0644]
gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.S [new file with mode: 0644]
gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.exp [new file with mode: 0644]

index c9c4524..fc02717 100644 (file)
@@ -1,3 +1,9 @@
+2010-09-29  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix GDB crash on inferior calls with self-referencing classes.
+       * gnu-v3-abi.c (gnuv3_pass_by_reference): Do not call itself on static
+       member fields.
+
 2010-09-29  Doug Evans  <dje@google.com>
 
        Workaround for gcc/45682.
 2010-09-29  Doug Evans  <dje@google.com>
 
        Workaround for gcc/45682.
index f9d4f49..b1ddf02 100644 (file)
@@ -835,9 +835,10 @@ gnuv3_pass_by_reference (struct type *type)
      by reference, so does this class.  Similarly for members, which
      are constructed whenever this class is.  We do not need to worry
      about recursive loops here, since we are only looking at members
      by reference, so does this class.  Similarly for members, which
      are constructed whenever this class is.  We do not need to worry
      about recursive loops here, since we are only looking at members
-     of complete class type.  */
+     of complete class type.  Also ignore any static members.  */
   for (fieldnum = 0; fieldnum < TYPE_NFIELDS (type); fieldnum++)
   for (fieldnum = 0; fieldnum < TYPE_NFIELDS (type); fieldnum++)
-    if (gnuv3_pass_by_reference (TYPE_FIELD_TYPE (type, fieldnum)))
+    if (! field_is_static (&TYPE_FIELD (type, fieldnum))
+        && gnuv3_pass_by_reference (TYPE_FIELD_TYPE (type, fieldnum)))
       return 1;
 
   return 0;
       return 1;
 
   return 0;
index 3ae8411..a8a27fb 100644 (file)
@@ -1,3 +1,10 @@
+2010-09-29  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix GDB crash on inferior calls with self-referencing classes.
+       * gdb.dwarf2/dw2-cp-infcall-ref-static.exp: New file.
+       * gdb.dwarf2/dw2-cp-infcall-ref-static-main.c: New file.
+       * gdb.dwarf2/dw2-cp-infcall-ref-static.S: New file.
+
 2010-09-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Fix lost siginfo_t for inferior calls.
 2010-09-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Fix lost siginfo_t for inferior calls.
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static-main.c b/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static-main.c
new file mode 100644 (file)
index 0000000..492beb9
--- /dev/null
@@ -0,0 +1,51 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2010 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/>.  */
+
+/* class C
+     {
+     public:
+       static C s;
+     };
+   C C::s;
+   C f()
+   {
+     return C::s;
+   }  */
+
+asm (".globl cu_text_start");
+asm ("cu_text_start:");
+
+asm (".globl f_start");
+asm ("f_start:");
+
+void
+f (void)
+{
+}
+
+asm (".globl f_end");
+asm ("f_end:");
+
+int
+main (void)
+{
+  f ();
+  return 0;
+}
+
+asm (".globl cu_text_end");
+asm ("cu_text_end:");
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.S b/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.S
new file mode 100644 (file)
index 0000000..cb73349
--- /dev/null
@@ -0,0 +1,115 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2010 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/>.  */
+
+/* Debug information */
+
+       .section .debug_info
+.Lcu1_begin:
+       /* CU header */
+       .4byte  .Lcu1_end - .Lcu1_start         /* Length of Compilation Unit */
+.Lcu1_start:
+       .2byte  2                               /* DWARF Version */
+       .4byte  .Labbrev1_begin                 /* Offset into abbrev section */
+       .byte   4                               /* Pointer size */
+
+       /* CU die */
+       .uleb128 1                              /* Abbrev: DW_TAG_compile_unit */
+       .4byte  cu_text_start                   /* DW_AT_low_pc */
+       .4byte  cu_text_end                     /* DW_AT_high_pc */
+       .ascii  "file1.txt\0"                   /* DW_AT_name */
+       .ascii  "GNU C 3.3.3\0"                 /* DW_AT_producer */
+       .byte   4                               /* DW_AT_language (DW_LANG_C_plus_plus) */
+
+.Ltype_class:
+       .uleb128        3                       /* Abbrev: DW_TAG_class_type */
+       .ascii          "C\0"                   /* DW_AT_name */
+
+       .uleb128        4                       /* Abbrev: DW_TAG_member */
+       .ascii          "s\0"                   /* DW_AT_name */
+       .4byte          .Ltype_class-.Lcu1_begin /* DW_AT_type */
+       .byte           1                       /* DW_AT_declaration */
+       .byte           1                       /* DW_AT_external */
+
+       .byte           0                       /* End of children of DW_TAG_class_type */
+
+       .uleb128        5                       /* Abbrev: DW_TAG_subprogram */
+       .ascii          "f\0"                   /* DW_AT_name */
+       .4byte          .Ltype_class-.Lcu1_begin /* DW_AT_type */
+       .4byte          f_start                 /* DW_AT_low_pc */
+       .4byte          f_end                   /* DW_AT_high_pc */
+
+       .byte           0                       /* End of children of CU */
+
+.Lcu1_end:
+
+/* Abbrev table */
+       .section .debug_abbrev
+.Labbrev1_begin:
+       .uleb128        1                       /* Abbrev code */
+       .uleb128        0x11                    /* DW_TAG_compile_unit */
+       .byte           1                       /* has_children */
+       .uleb128        0x11                    /* DW_AT_low_pc */
+       .uleb128        0x1                     /* DW_FORM_addr */
+       .uleb128        0x12                    /* DW_AT_high_pc */
+       .uleb128        0x1                     /* DW_FORM_addr */
+       .uleb128        0x3                     /* DW_AT_name */
+       .uleb128        0x8                     /* DW_FORM_string */
+       .uleb128        0x25                    /* DW_AT_producer */
+       .uleb128        0x8                     /* DW_FORM_string */
+       .uleb128        0x13                    /* DW_AT_language */
+       .uleb128        0xb                     /* DW_FORM_data1 */
+       .byte           0x0                     /* Terminator */
+       .byte           0x0                     /* Terminator */
+
+       .uleb128        3                       /* Abbrev code */
+       .uleb128        0x2                     /* DW_TAG_class_type */
+       .byte           1                       /* has_children */
+       .uleb128        0x3                     /* DW_AT_name */
+       .uleb128        0x8                     /* DW_FORM_string */
+       .byte           0x0                     /* Terminator */
+       .byte           0x0                     /* Terminator */
+
+       .uleb128        4                       /* Abbrev code */
+       .uleb128        0xd                     /* DW_TAG_member */
+       .byte           0                       /* has_children */
+       .uleb128        0x3                     /* DW_AT_name */
+       .uleb128        0x8                     /* DW_FORM_string */
+       .uleb128        0x49                    /* DW_AT_type */
+       .uleb128        0x13                    /* DW_FORM_ref4 */
+       .uleb128        0x3c                    /* DW_AT_declaration */
+       .uleb128        0xc                     /* DW_FORM_flag */
+       .uleb128        0x3f                    /* DW_AT_external */
+       .uleb128        0xc                     /* DW_FORM_flag */
+       .byte           0x0                     /* Terminator */
+       .byte           0x0                     /* Terminator */
+
+       .uleb128        5                       /* Abbrev code */
+       .uleb128        0x2e                    /* DW_TAG_subprogram */
+       .byte           0                       /* has_children */
+       .uleb128        0x3                     /* DW_AT_name */
+       .uleb128        0x8                     /* DW_FORM_string */
+       .uleb128        0x49                    /* DW_AT_type */
+       .uleb128        0x13                    /* DW_FORM_ref4 */
+       .uleb128        0x11                    /* DW_AT_low_pc */
+       .uleb128        0x1                     /* DW_FORM_addr */
+       .uleb128        0x12                    /* DW_AT_high_pc */
+       .uleb128        0x1                     /* DW_FORM_addr */
+       .byte           0x0                     /* Terminator */
+       .byte           0x0                     /* Terminator */
+
+       .byte           0x0                     /* Terminator */
+       .byte           0x0                     /* Terminator */
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.exp b/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.exp
new file mode 100644 (file)
index 0000000..08ef528
--- /dev/null
@@ -0,0 +1,49 @@
+# Copyright 2010 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/>.
+
+# Check that GDB can call C++ functions whose parameters or return values have
+# type containing a static member of the same type.
+
+# Still no C++ compiler is used.
+if { [skip_cplus_tests] } { continue }
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+# For now pick a sampling of likely targets.
+if {![istarget *-*-linux*]
+    && ![istarget *-*-gnu*]
+    && ![istarget *-*-elf*]
+    && ![istarget *-*-openbsd*]
+    && ![istarget arm-*-eabi*]
+    && ![istarget powerpc-*-eabi*]} {
+    return 0  
+}
+
+set testfile "dw2-cp-infcall-ref-static"
+if { [prepare_for_testing ${testfile}.exp ${testfile} [list ${testfile}-main.c ${testfile}.S] {}] } {
+    return -1
+}
+
+if ![runto_main] then {
+    return -1
+}
+
+# main is not provided by DWARF.
+gdb_test_no_output "set language c++"
+
+# There are no mangled names in DWARF to suggest the v3 ABI.
+gdb_test_no_output "set cp-abi gnu-v3"
+
+# GDB could crash.  There is no DW_AT_location so it is <optimized out>.
+gdb_test "p f()" { = {static s = <optimized out>}}