From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 63087 invoked by alias); 28 Jun 2016 12:52:09 -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 63067 invoked by uid 89); 28 Jun 2016 12:52:08 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.4 required=5.0 tests=AWL,BAYES_00,KAM_LAZY_DOMAIN_SECURITY,KAM_STOCKGEN,RP_MATCHES_RCVD autolearn=no version=3.3.2 spammy=Hx-languages-length:4540, 2375, observed, evaluating X-HELO: mga14.intel.com Received: from mga14.intel.com (HELO mga14.intel.com) (192.55.52.115) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 28 Jun 2016 12:51:58 +0000 Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga103.fm.intel.com with ESMTP; 28 Jun 2016 05:51:54 -0700 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by orsmga001.jf.intel.com with ESMTP; 28 Jun 2016 05:51:53 -0700 Received: from ulvlx001.iul.intel.com (ulvlx001.iul.intel.com [172.28.207.17]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id u5SCpqYW018009; Tue, 28 Jun 2016 13:51:52 +0100 Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id u5SCpp2f031670; Tue, 28 Jun 2016 14:51:51 +0200 Received: (from wtedesch@localhost) by ulvlx001.iul.intel.com with œ id u5SCpp2P031666; Tue, 28 Jun 2016 14:51:51 +0200 From: Walfred Tedeschi To: palves@redhat.com, qiyaoltc@gmail.com Cc: gdb-patches@sourceware.org, Walfred Tedeschi Subject: [PATCH V2 1/1] Fix of default lookup for "this" symbol. Date: Tue, 28 Jun 2016 12:52:00 -0000 Message-Id: <1467118304-31635-1-git-send-email-walfred.tedeschi@intel.com> X-IsSubscribed: yes X-SW-Source: 2016-06/txt/msg00459.txt.bz2 Using the default lookup for the symbol "this" might lead to segmentation fault in GDB. Some languages, e.g. Fortran, use as default lookup routine the C++ routines. For those languages "this" can be the instance of a class or even the definition of a class. When an instance of a class having the name "this" is evaluated in GDB a segmentation fault was observed. As example of the issue take into consideration the Fortran code: type foo real :: a type(bar) :: x character*7 :: b end type foo type(foo) :: this Issue appears when evaluating the variable "this" in GDB. Within the language definition structure there is a field that represents the name of the special symbol used for the C++ "this" for the language being described. The fix presented here takes into account the aforementioned field. In the case the aforementioned field is NULL "this" is not represented in the language described and the lookup should return a null_block_symbol. Tests: Performed tests with gfortran and ifort. Reviewed: https://sourceware.org/ml/gdb-patches/2016-04/msg00068.html After the commited patch: https://sourceware.org/ml/gdb-patches/2016-06/msg00364.html Patch can be applied. 2016-06-16 Walfred Tedeschi gdb/ChangeLog: * cp-namespace.c (cp_lookup_bare_symbol): Add check for the name_of_this in order to return a null symbol when looking up for "this". gdb/testsuite/ChangeLog: * gdb.fortran/derived-types.exp (result_line, result_line_2): New variables. (print this%a, print this%b, print this): New tests. * gdb.fortran/derived-types.f90 (this): New object and initialization. --- gdb/cp-namespace.c | 5 ++++- gdb/testsuite/gdb.fortran/derived-type.exp | 35 ++++++++++++++++++++++++++++-- gdb/testsuite/gdb.fortran/derived-type.f90 | 7 +++++- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c index 016a42f..f34e383 100644 --- a/gdb/cp-namespace.c +++ b/gdb/cp-namespace.c @@ -206,10 +206,13 @@ cp_lookup_bare_symbol (const struct language_defn *langdef, struct block_symbol lang_this; struct type *type; - lang_this = lookup_language_this (language_def (language_cplus), block); + if (langdef != NULL) + lang_this = lookup_language_this (langdef, block); + if (lang_this.symbol == NULL) return null_block_symbol; + type = check_typedef (TYPE_TARGET_TYPE (SYMBOL_TYPE (lang_this.symbol))); /* If TYPE_NAME is NULL, abandon trying to find this symbol. This can happen for lambda functions compiled with clang++, diff --git a/gdb/testsuite/gdb.fortran/derived-type.exp b/gdb/testsuite/gdb.fortran/derived-type.exp index 32431bc..2781850 100644 --- a/gdb/testsuite/gdb.fortran/derived-type.exp +++ b/gdb/testsuite/gdb.fortran/derived-type.exp @@ -73,14 +73,45 @@ gdb_test_multiple $test $test { gdb_test "print q%x%c" "\\$\[0-9\]+ = 1" gdb_test "print q%x%d" "\\$\[0-9\]+ = 2\\.375" +set result_line "= \\( a = 3.125, x = \\( c = 1, d = 2\\.375 \\),\ +b = 'abcdefg' \\)\r\n$gdb_prompt $" + +# Used in case compiler generates an array of characters. +set result_line_2 " = \\( a = 3.125, x = \\( 1, 2\\.375 \\),\ +b = \\('abcdefg'\\) \\)\r\n$gdb_prompt $" + set test "print q" gdb_test_multiple $test $test { - -re "\\$\[0-9\]+ = \\( a = 3.125, x = \\( c = 1, d = 2\\.375 \\), b = 'abcdefg' \\)\r\n$gdb_prompt $" { + -re $result_line { pass $test } - -re "\\$\[0-9\]+ = \\( a = 3.125, x = \\( 1, 2\\.375 \\), b = \\('abcdefg'\\) \\)\r\n$gdb_prompt $" { + -re $result_line_2 { # Compiler should produce string, not an array of characters. setup_xfail "*-*-*" fail $test } } + +gdb_test "print this%a" " = 3\\.125" + +set test "print this%b" +gdb_test_multiple $test $test { + -re " = 'abcdefg'\r\n$gdb_prompt $" { + pass $test + } + -re $result_line_2 { + setup_xfail "*-*-*" + fail $test + } +} + +set test "print this" +gdb_test_multiple $test $test { + -re $result_line { + pass $test + } + -re $result_line_2 { + setup_xfail "*-*-*" + fail $test + } +} diff --git a/gdb/testsuite/gdb.fortran/derived-type.f90 b/gdb/testsuite/gdb.fortran/derived-type.f90 index 2cb2339..aad1553 100644 --- a/gdb/testsuite/gdb.fortran/derived-type.f90 +++ b/gdb/testsuite/gdb.fortran/derived-type.f90 @@ -29,12 +29,17 @@ program main end type foo type(foo) :: q type(bar) :: p + type(foo) :: this p = bar(1, 2.375) q%a = 3.125 q%b = "abcdefg" q%x%c = 1 q%x%d = 2.375 - print *,p,q + this%a = 3.125 + this%b = "abcdefg" + this%x%c = 1 + this%x%d = 2.375 + print *,p,q,this end program main -- 2.7.4