From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28963 invoked by alias); 22 Mar 2018 20:47:24 -0000 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 Received: (qmail 28946 invoked by uid 89); 22 Mar 2018 20:47:23 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-HELO: userp2120.oracle.com Received: from userp2120.oracle.com (HELO userp2120.oracle.com) (156.151.31.85) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 22 Mar 2018 20:47:22 +0000 Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.22/8.16.0.22) with SMTP id w2MKg3nX094711; Thu, 22 Mar 2018 20:47:18 GMT Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp2120.oracle.com with ESMTP id 2gvkrjg0kr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 22 Mar 2018 20:47:17 +0000 Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id w2MKl7NQ020701 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 22 Mar 2018 20:47:07 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id w2MKl6pU001236; Thu, 22 Mar 2018 20:47:06 GMT Received: from [10.159.239.184] (/10.159.239.184) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 22 Mar 2018 13:47:06 -0700 Subject: Re: [PATCH 2 PR gdb/16959] gdb hangs in infinite recursion To: Simon Marchi , gdb-patches@sourceware.org References: <1521740517-56879-1-git-send-email-weimin.pan@oracle.com> <5e33d0dc-8810-ff04-6bed-106ace62621c@ericsson.com> From: Wei-min Pan Message-ID: <1837498c-6e9e-512a-b2a9-8e731886ccb3@oracle.com> Date: Thu, 22 Mar 2018 20:47:00 -0000 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <5e33d0dc-8810-ff04-6bed-106ace62621c@ericsson.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=8840 signatures=668695 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1711220000 definitions=main-1803200127 X-SW-Source: 2018-03/txt/msg00432.txt.bz2 On 3/22/2018 1:27 PM, Simon Marchi wrote: > On 2018-03-22 01:41 PM, Weimin Pan wrote: >> The original problem was fixed (see related PR 22242). But using a typedef >> as the declared type for a static member variable, as commented in this PR, >> is still causing gdb to get into infinite loop when printing the static >> member's value. This problem can be reproduced as follows: >> >> % cat t.cc >> class A { >> typedef A type; >> public: >> bool operator==(const type& other) { return true; } >> >> static const type INSTANCE; >> }; >> >> const A A::INSTANCE; >> >> int main() { >> A a; >> if (a == A::INSTANCE) { >> return -1; >> } >> return 0; >> } >> % g++ -g t.cc >> % gdb -ex "start" -ex "p a" a.out >> >> The fix is rather trivial - in cp_print_static_field(), should call >> check_typedef() to get the static member's real type and use it to >> check whether it's a struct or an array. >> >> Added a new test case to the testsuite as Simon suggested. >> >> Tested on both aarch64-linux-gnu and amd64-linux-gnu. No regressions. >> --- >> --- >> gdb/ChangeLog | 7 ++++ >> gdb/cp-valprint.c | 2 +- >> gdb/testsuite/ChangeLog | 5 +++ >> gdb/testsuite/gdb.cp/static-typedef-print.cc | 35 +++++++++++++++++++++ >> gdb/testsuite/gdb.cp/static-typedef-print.exp | 40 +++++++++++++++++++++++++ >> 5 files changed, 88 insertions(+), 1 deletions(-) >> create mode 100644 gdb/testsuite/gdb.cp/static-typedef-print.cc >> create mode 100644 gdb/testsuite/gdb.cp/static-typedef-print.exp >> >> diff --git a/gdb/ChangeLog b/gdb/ChangeLog >> index d0a8dfd..6fd43de 100644 >> --- a/gdb/ChangeLog >> +++ b/gdb/ChangeLog >> @@ -1,3 +1,10 @@ >> +2018-02-07 Weimin Pan >> + >> + PR gdb/16959 >> + * cp-valprint.c: (cp_print_static_field) Use check_typedef() to get >> + static member's real type for TYPE_CODE_STRUCT and TYPE_CODE_ARRAY >> + comparisons. >> + >> 2018-01-24 Pedro Alves >> >> GCC PR libstdc++/83906 >> diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c >> index 486653f..0370b56 100644 >> --- a/gdb/cp-valprint.c >> +++ b/gdb/cp-valprint.c >> @@ -633,6 +633,7 @@ cp_print_static_field (struct type *type, >> return; >> } >> >> + type = check_typedef (type); >> if (TYPE_CODE (type) == TYPE_CODE_STRUCT) >> { >> CORE_ADDR *first_dont_print; >> @@ -658,7 +659,6 @@ cp_print_static_field (struct type *type, >> addr = value_address (val); >> obstack_grow (&dont_print_statmem_obstack, (char *) &addr, >> sizeof (CORE_ADDR)); >> - type = check_typedef (type); >> cp_print_value_fields (type, value_enclosing_type (val), >> value_embedded_offset (val), addr, >> stream, recurse, val, > I pointed this out in my previous mail: > > type is passed below to val_print. I think it would be better to continue > passing the original type to that function instead of the resolved type. It > could affect how things are printed (if the type name is printed somewhere, > or if pretty printers are involved). Many functions use a variable "real_type" > to hold the result from check_typedef, you could follow that pattern. > > Did you have a chance to take a look? > > Simon Sorry, I missed it. Will take a look. Thanks, Weimin