From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3259 invoked by alias); 29 Sep 2010 22:33:46 -0000 Received: (qmail 3243 invoked by uid 22791); 29 Sep 2010 22:33:44 -0000 X-SWARE-Spam-Status: No, hits=-6.1 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 29 Sep 2010 22:33:36 +0000 Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o8TMXZYV028872 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 29 Sep 2010 18:33:35 -0400 Received: from host1.dyn.jankratochvil.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o8TMXWZ5019492 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 29 Sep 2010 18:33:34 -0400 Received: from host1.dyn.jankratochvil.net (localhost [127.0.0.1]) by host1.dyn.jankratochvil.net (8.14.4/8.14.4) with ESMTP id o8TMXWNx011526; Thu, 30 Sep 2010 00:33:32 +0200 Received: (from jkratoch@localhost) by host1.dyn.jankratochvil.net (8.14.4/8.14.4/Submit) id o8TMXWgo011525; Thu, 30 Sep 2010 00:33:32 +0200 Date: Thu, 30 Sep 2010 09:11:00 -0000 From: Jan Kratochvil To: Tom Tromey Cc: gdb-patches@sourceware.org Subject: Re: [patch] Fix infinite loop crash on self-referencing class Message-ID: <20100929223332.GA5015@host1.dyn.jankratochvil.net> References: <20100924230028.GA24736@host1.dyn.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-09/txt/msg00500.txt.bz2 On Mon, 27 Sep 2010 20:02:37 +0200, Tom Tromey wrote: > This seems reasonable to me. > > Jan> + if (TYPE_FIELD_LOC_KIND (type, fieldnum) == FIELD_LOC_KIND_BITPOS > > There is a field_is_static convenience function you can use here. Changed. Checked-in. Thanks, Jan http://sourceware.org/ml/gdb-cvs/2010-09/msg00177.html --- src/gdb/ChangeLog 2010/09/29 16:41:20 1.12213 +++ src/gdb/ChangeLog 2010/09/29 22:32:48 1.12214 @@ -1,3 +1,9 @@ +2010-09-29 Jan Kratochvil + + 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 Workaround for gcc/45682. --- src/gdb/testsuite/ChangeLog 2010/09/24 18:35:28 1.2457 +++ src/gdb/testsuite/ChangeLog 2010/09/29 22:32:51 1.2458 @@ -1,3 +1,10 @@ +2010-09-29 Jan Kratochvil + + 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 Fix lost siginfo_t for inferior calls. --- src/gdb/gnu-v3-abi.c 2010/09/08 18:53:34 1.61 +++ src/gdb/gnu-v3-abi.c 2010/09/29 22:32:51 1.62 @@ -835,9 +835,10 @@ 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++) - 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; --- src/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static-main.c +++ src/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static-main.c 2010-09-29 22:33:07.175090000 +0000 @@ -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 . */ + +/* 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:"); --- src/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.S +++ src/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.S 2010-09-29 22:33:07.681097000 +0000 @@ -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 . */ + +/* 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 */ --- src/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.exp +++ src/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.exp 2010-09-29 22:33:08.191315000 +0000 @@ -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 . + +# 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 . +gdb_test "p f()" { = {static s = }}