This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Fix of default lookup for "this" symbol.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4f19a0e6b45c63c0b4afe27a19d144cca412d4ae

commit 4f19a0e6b45c63c0b4afe27a19d144cca412d4ae
Author: Walfred Tedeschi <walfred.tedeschi@intel.com>
Date:   Thu Jul 7 17:33:05 2016 +0200

    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.

Diff:
---
 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 6a9ebbd..2d3e5ed 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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>
 
 	* h8300-tdep.c (h8300_print_register): Remove extraneous parentheses.
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/ChangeLog b/gdb/testsuite/ChangeLog
index b0e6c2a..b6f21d7 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -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>
 
 	* 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 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]