From 4f19a0e6b45c63c0b4afe27a19d144cca412d4ae Mon Sep 17 00:00:00 2001 From: Walfred Tedeschi Date: Thu, 7 Jul 2016 17:33:05 +0200 Subject: [PATCH] Fix of default lookup for "this" symbol. 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): Use language passed as parameter to look for the symbol "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/ChangeLog | 6 ++++ gdb/cp-namespace.c | 5 +++- gdb/testsuite/ChangeLog | 8 +++++ gdb/testsuite/gdb.fortran/derived-type.exp | 35 ++++++++++++++++++++-- gdb/testsuite/gdb.fortran/derived-type.f90 | 7 ++++- 5 files changed, 57 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6a9ebbddfe..2d3e5ed71f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2016-07-07 Walfred Tedeschi + + * cp-namespace.c (cp_lookup_bare_symbol): Use language passed as + parameter to look for the symbol "this". + + 2016-07-06 John Baldwin * h8300-tdep.c (h8300_print_register): Remove extraneous parentheses. diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c index 016a42f588..f34e383bd3 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/ChangeLog b/gdb/testsuite/ChangeLog index b0e6c2a2ef..b6f21d766c 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2016-07-07 Walfred Tedeschi + + * 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. + 2016-07-06 Simon Marchi * gdb.ada/arraydim.exp: Remove extra directory level in build diff --git a/gdb/testsuite/gdb.fortran/derived-type.exp b/gdb/testsuite/gdb.fortran/derived-type.exp index 32431bc8ba..278185068d 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 2cb2339c81..aad1553279 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.34.1