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  <walfred.tedeschi@intel.com>

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.
This commit is contained in:
Walfred Tedeschi 2016-07-07 17:33:05 +02:00
parent 3a5ce9503e
commit 4f19a0e6b4
5 changed files with 57 additions and 4 deletions

View file

@ -1,3 +1,9 @@
2016-07-07 Walfred Tedeschi <walfred.tedeschi@intel.com>
* cp-namespace.c (cp_lookup_bare_symbol): Use language passed as
parameter to look for the symbol "this".
2016-07-06 John Baldwin <jhb@FreeBSD.org> 2016-07-06 John Baldwin <jhb@FreeBSD.org>
* h8300-tdep.c (h8300_print_register): Remove extraneous parentheses. * h8300-tdep.c (h8300_print_register): Remove extraneous parentheses.

View file

@ -206,10 +206,13 @@ cp_lookup_bare_symbol (const struct language_defn *langdef,
struct block_symbol lang_this; struct block_symbol lang_this;
struct type *type; 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) if (lang_this.symbol == NULL)
return null_block_symbol; return null_block_symbol;
type = check_typedef (TYPE_TARGET_TYPE (SYMBOL_TYPE (lang_this.symbol))); type = check_typedef (TYPE_TARGET_TYPE (SYMBOL_TYPE (lang_this.symbol)));
/* If TYPE_NAME is NULL, abandon trying to find this symbol. /* If TYPE_NAME is NULL, abandon trying to find this symbol.
This can happen for lambda functions compiled with clang++, This can happen for lambda functions compiled with clang++,

View file

@ -1,3 +1,11 @@
2016-07-07 Walfred Tedeschi <walfred.tedeschi@intel.com>
* 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 <simon.marchi@ericsson.com> 2016-07-06 Simon Marchi <simon.marchi@ericsson.com>
* gdb.ada/arraydim.exp: Remove extra directory level in build * gdb.ada/arraydim.exp: Remove extra directory level in build

View file

@ -73,14 +73,45 @@ gdb_test_multiple $test $test {
gdb_test "print q%x%c" "\\$\[0-9\]+ = 1" gdb_test "print q%x%c" "\\$\[0-9\]+ = 1"
gdb_test "print q%x%d" "\\$\[0-9\]+ = 2\\.375" 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" set test "print q"
gdb_test_multiple $test $test { 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 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. # Compiler should produce string, not an array of characters.
setup_xfail "*-*-*" setup_xfail "*-*-*"
fail $test 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
}
}

View file

@ -29,12 +29,17 @@ program main
end type foo end type foo
type(foo) :: q type(foo) :: q
type(bar) :: p type(bar) :: p
type(foo) :: this
p = bar(1, 2.375) p = bar(1, 2.375)
q%a = 3.125 q%a = 3.125
q%b = "abcdefg" q%b = "abcdefg"
q%x%c = 1 q%x%c = 1
q%x%d = 2.375 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 end program main