[PATCHv2,4/8] gdb/fortran: better types for components of complex numbers

Message ID e63befa789944a27249c5893eb85ce36999c78e4.1554249182.git.andrew.burgess@embecosm.com
State New, archived
Headers

Commit Message

Andrew Burgess April 2, 2019, 11:58 p.m. UTC
  Currently when using $_creal and $_cimag to access the components of a
complex number the types of these components will have C type names
'float', 'double', etc.  This is because the components of a complex
number are not given type names in DWARF, so GDB has to pick some
suitable names, and currently we always use the C names.

This commit changes the type names used based on the language, so for
Fortran we will now use the Fortran float types, and so will get the
Fortran float type names 'real', 'real*8', etc.

gdb/ChangeLog:

	* dwarf2read.c (dwarf2_init_complex_target_type): Use different
	types for Fortran.

gdb/testsuite/ChangeLog:

	* gdb.fortran/complex.exp: Expand.
	* gdb.fortran/complex.f: Renamed to...
	* gdb.fortran/complex.f90: ...this, and extended to add more
	complex values.
---
 gdb/ChangeLog                         |  6 +++++
 gdb/dwarf2read.c                      | 35 +++++++++++++++++++++-------
 gdb/testsuite/ChangeLog               |  7 ++++++
 gdb/testsuite/gdb.fortran/complex.exp | 41 +++++++++++++++++++++++++-------
 gdb/testsuite/gdb.fortran/complex.f   | 24 -------------------
 gdb/testsuite/gdb.fortran/complex.f90 | 44 +++++++++++++++++++++++++++++++++++
 6 files changed, 116 insertions(+), 41 deletions(-)
 delete mode 100644 gdb/testsuite/gdb.fortran/complex.f
 create mode 100644 gdb/testsuite/gdb.fortran/complex.f90
  

Comments

Sergio Durigan Junior May 3, 2019, 12:21 a.m. UTC | #1
On Tuesday, April 02 2019, Andrew Burgess wrote:

> Currently when using $_creal and $_cimag to access the components of a
> complex number the types of these components will have C type names
> 'float', 'double', etc.  This is because the components of a complex
> number are not given type names in DWARF, so GDB has to pick some
> suitable names, and currently we always use the C names.
>
> This commit changes the type names used based on the language, so for
> Fortran we will now use the Fortran float types, and so will get the
> Fortran float type names 'real', 'real*8', etc.

Hi Andrew,

This patch has caused a regression when testing a 64-bit against a
unix/-m32 board:

  print c16
  $5 = (../../binutils-gdb/gdb/target-float.c:2228: internal-error: target_float_ops_kind get_target_float_ops_kind(const type*): unexpected type code
  A problem internal to GDB has been detected,
  further debugging may prove unreliable.
  Quit this debugging session? (y or n) KFAIL: gdb.fortran/complex.exp: print c16 (GDB internal error) (PRMS: gdb/18644)
  Resyncing due to internal error.
  n

  This is a bug, please report it.  For instructions, see:
  <http://www.gnu.org/software/gdb/bugs/>.

  ../../binutils-gdb/gdb/target-float.c:2228: internal-error: target_float_ops_kind get_target_float_ops_kind(const type*): unexpected type code
  A problem internal to GDB has been detected,
  further debugging may prove unreliable.
  Create a core file of GDB? (y or n) n
  Command aborted.

I haven't been able to investigate more, sorry.

Thanks,

> gdb/ChangeLog:
>
> 	* dwarf2read.c (dwarf2_init_complex_target_type): Use different
> 	types for Fortran.
>
> gdb/testsuite/ChangeLog:
>
> 	* gdb.fortran/complex.exp: Expand.
> 	* gdb.fortran/complex.f: Renamed to...
> 	* gdb.fortran/complex.f90: ...this, and extended to add more
> 	complex values.
> ---
>  gdb/ChangeLog                         |  6 +++++
>  gdb/dwarf2read.c                      | 35 +++++++++++++++++++++-------
>  gdb/testsuite/ChangeLog               |  7 ++++++
>  gdb/testsuite/gdb.fortran/complex.exp | 41 +++++++++++++++++++++++++-------
>  gdb/testsuite/gdb.fortran/complex.f   | 24 -------------------
>  gdb/testsuite/gdb.fortran/complex.f90 | 44 +++++++++++++++++++++++++++++++++++
>  6 files changed, 116 insertions(+), 41 deletions(-)
>  delete mode 100644 gdb/testsuite/gdb.fortran/complex.f
>  create mode 100644 gdb/testsuite/gdb.fortran/complex.f90
>
> diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
> index 8881a1e28a8..1277b8acb53 100644
> --- a/gdb/dwarf2read.c
> +++ b/gdb/dwarf2read.c
> @@ -17547,16 +17547,35 @@ dwarf2_init_complex_target_type (struct dwarf2_cu *cu,
>    gdbarch *gdbarch = get_objfile_arch (objfile);
>    struct type *tt = nullptr;
>  
> -  switch (bits)
> +  switch (cu->language)
>      {
> -    case 32:
> -      tt = builtin_type (gdbarch)->builtin_float;
> -      break;
> -    case 64:
> -      tt = builtin_type (gdbarch)->builtin_double;
> +    case language_fortran:
> +      switch (bits)
> +	{
> +	case 32:
> +	  tt = builtin_f_type (gdbarch)->builtin_real;
> +	  break;
> +	case 64:
> +	  tt = builtin_f_type (gdbarch)->builtin_real_s8;
> +	  break;
> +	case 128:
> +	  tt = builtin_f_type (gdbarch)->builtin_real_s16;
> +	  break;
> +	}
>        break;
> -    case 128:
> -      tt = builtin_type (gdbarch)->builtin_long_double;
> +    default:
> +      switch (bits)
> +	{
> +	case 32:
> +	  tt = builtin_type (gdbarch)->builtin_float;
> +	  break;
> +	case 64:
> +	  tt = builtin_type (gdbarch)->builtin_double;
> +	  break;
> +	case 128:
> +	  tt = builtin_type (gdbarch)->builtin_long_double;
> +	  break;
> +	}
>        break;
>      }
>  
> diff --git a/gdb/testsuite/gdb.fortran/complex.exp b/gdb/testsuite/gdb.fortran/complex.exp
> index 3fbbf7154d9..136f1c4df79 100644
> --- a/gdb/testsuite/gdb.fortran/complex.exp
> +++ b/gdb/testsuite/gdb.fortran/complex.exp
> @@ -13,7 +13,7 @@
>  # You should have received a copy of the GNU General Public License
>  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
>  
> -standard_testfile .f
> +standard_testfile .f90
>  
>  if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug f90 quiet}]} {
>      return -1
> @@ -24,13 +24,36 @@ if ![runto MAIN__] then {
>      continue
>  }
>  
> -set bp_location [gdb_get_line_number "stop"]
> -gdb_test "break $bp_location" \
> -    "Breakpoint.*at.* file .*$srcfile, line $bp_location\\." \
> -    "breakpoint at stop"
>  
> -gdb_test "continue" \
> -    "Continuing\\..*Breakpoint.*" \
> -    "continue to breakpoint"
> +gdb_breakpoint [gdb_get_line_number "stop"]
> +gdb_continue_to_breakpoint "continue"
> +
> +gdb_test "print c" " = \\(1000,-50\\)"
> +gdb_test "print c4" " = \\(1000,-50\\)"
> +gdb_test "print c8" " = \\(321,-22\\)"
> +gdb_test "print dc" " = \\(321,-22\\)"
> +
> +setup_kfail gdb/18644 "*-*-*"
> +gdb_test "print c16" " = \\(-874,19\\)"
> +
> +gdb_test "whatis c" "type = complex\\(kind=4\\)"
> +gdb_test "print \$_creal (c)" " = 1000"
> +gdb_test "whatis \$" " = real"
> +
> +gdb_test "whatis c4" "type = complex\\(kind=4\\)"
> +gdb_test "print \$_creal (c4)" " = 1000"
> +gdb_test "whatis \$" " = real"
> +
> +gdb_test "whatis c8" "type = complex\\(kind=8\\)"
> +gdb_test "print \$_creal (c8)" " = 321"
> +gdb_test "whatis \$" " = real\\*8"
> +
> +gdb_test "whatis dc" "type = complex\\(kind=8\\)"
> +gdb_test "print \$_creal (dc)" " = 321"
> +gdb_test "whatis \$" " = real\\*8"
> +
> +gdb_test "whatis c16" "type = complex\\(kind=16\\)"
> +setup_kfail gdb/18644 "*-*-*"
> +gdb_test "print \$_creal (c16)" " = -874"
> +gdb_test "whatis \$" " = real\\*16"
>  
> -gdb_test "print c" "\\\$$decimal = \\(1000,-50\\)"
> diff --git a/gdb/testsuite/gdb.fortran/complex.f b/gdb/testsuite/gdb.fortran/complex.f
> deleted file mode 100644
> index 2f1a7879f9e..00000000000
> --- a/gdb/testsuite/gdb.fortran/complex.f
> +++ /dev/null
> @@ -1,24 +0,0 @@
> -c Copyright 2007-2019 Free Software Foundation, Inc.
> -
> -c This program is free software; you can redistribute it and/or modify
> -c it under the terms of the GNU General Public License as published by
> -c the Free Software Foundation; either version 3 of the License, or
> -c (at your option) any later version.
> -c
> -c This program is distributed in the hope that it will be useful,
> -c but WITHOUT ANY WARRANTY; without even the implied warranty of
> -c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> -c GNU General Public License for more details.
> -c
> -c You should have received a copy of the GNU General Public License
> -c along with this program.  If not, see <http://www.gnu.org/licenses/>.
> -
> -      real*8 a,b
> -      complex*16 c
> -
> -      a = 1000
> -      b = -50
> -      c = cmplx(a,b)
> -      write(*,*) s
> -      stop
> -      end
> diff --git a/gdb/testsuite/gdb.fortran/complex.f90 b/gdb/testsuite/gdb.fortran/complex.f90
> new file mode 100644
> index 00000000000..2b88c1ee0bb
> --- /dev/null
> +++ b/gdb/testsuite/gdb.fortran/complex.f90
> @@ -0,0 +1,44 @@
> +! Copyright 2007-2019 Free Software Foundation, Inc.
> +!
> +! This program is free software; you can redistribute it and/or modify
> +! it under the terms of the GNU General Public License as published by
> +! the Free Software Foundation; either version 3 of the License, or
> +! (at your option) any later version.
> +!
> +! This program is distributed in the hope that it will be useful,
> +! but WITHOUT ANY WARRANTY; without even the implied warranty of
> +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +! GNU General Public License for more details.
> +!
> +! You should have received a copy of the GNU General Public License
> +! along with this program.  If not, see <http://www.gnu.org/licenses/>.
> +
> +program test_complex
> +  real*4 r4a, r4b
> +  real*8 r8a, r8b
> +  real*16 r16a, r16b
> +
> +  complex c
> +  complex(kind=4) c4
> +  complex(kind=8) c8
> +  double complex dc
> +  complex(kind=16) c16
> +
> +  r4a = 1000
> +  r4b = -50
> +  r8a = 321
> +  r8b = -22
> +  r16a = -874
> +  r16b = 19
> +
> +  c = cmplx(r4a,r4b)
> +  c4 = cmplx(r4a,r4b)
> +  c8 = cmplx(r8a, r8b)
> +  dc = cmplx(r8a, r8b)
> +  c16 = cmplx(r16a, r16b)
> +
> +  print *, c, c4, c8, dc, c16	! stop
> +  print *, r4a, r4b
> +  print *, r8a, r8b
> +  print *, r16a, r16b
> +end program test_complex
> -- 
> 2.14.5
  

Patch

diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 8881a1e28a8..1277b8acb53 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -17547,16 +17547,35 @@  dwarf2_init_complex_target_type (struct dwarf2_cu *cu,
   gdbarch *gdbarch = get_objfile_arch (objfile);
   struct type *tt = nullptr;
 
-  switch (bits)
+  switch (cu->language)
     {
-    case 32:
-      tt = builtin_type (gdbarch)->builtin_float;
-      break;
-    case 64:
-      tt = builtin_type (gdbarch)->builtin_double;
+    case language_fortran:
+      switch (bits)
+	{
+	case 32:
+	  tt = builtin_f_type (gdbarch)->builtin_real;
+	  break;
+	case 64:
+	  tt = builtin_f_type (gdbarch)->builtin_real_s8;
+	  break;
+	case 128:
+	  tt = builtin_f_type (gdbarch)->builtin_real_s16;
+	  break;
+	}
       break;
-    case 128:
-      tt = builtin_type (gdbarch)->builtin_long_double;
+    default:
+      switch (bits)
+	{
+	case 32:
+	  tt = builtin_type (gdbarch)->builtin_float;
+	  break;
+	case 64:
+	  tt = builtin_type (gdbarch)->builtin_double;
+	  break;
+	case 128:
+	  tt = builtin_type (gdbarch)->builtin_long_double;
+	  break;
+	}
       break;
     }
 
diff --git a/gdb/testsuite/gdb.fortran/complex.exp b/gdb/testsuite/gdb.fortran/complex.exp
index 3fbbf7154d9..136f1c4df79 100644
--- a/gdb/testsuite/gdb.fortran/complex.exp
+++ b/gdb/testsuite/gdb.fortran/complex.exp
@@ -13,7 +13,7 @@ 
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-standard_testfile .f
+standard_testfile .f90
 
 if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug f90 quiet}]} {
     return -1
@@ -24,13 +24,36 @@  if ![runto MAIN__] then {
     continue
 }
 
-set bp_location [gdb_get_line_number "stop"]
-gdb_test "break $bp_location" \
-    "Breakpoint.*at.* file .*$srcfile, line $bp_location\\." \
-    "breakpoint at stop"
 
-gdb_test "continue" \
-    "Continuing\\..*Breakpoint.*" \
-    "continue to breakpoint"
+gdb_breakpoint [gdb_get_line_number "stop"]
+gdb_continue_to_breakpoint "continue"
+
+gdb_test "print c" " = \\(1000,-50\\)"
+gdb_test "print c4" " = \\(1000,-50\\)"
+gdb_test "print c8" " = \\(321,-22\\)"
+gdb_test "print dc" " = \\(321,-22\\)"
+
+setup_kfail gdb/18644 "*-*-*"
+gdb_test "print c16" " = \\(-874,19\\)"
+
+gdb_test "whatis c" "type = complex\\(kind=4\\)"
+gdb_test "print \$_creal (c)" " = 1000"
+gdb_test "whatis \$" " = real"
+
+gdb_test "whatis c4" "type = complex\\(kind=4\\)"
+gdb_test "print \$_creal (c4)" " = 1000"
+gdb_test "whatis \$" " = real"
+
+gdb_test "whatis c8" "type = complex\\(kind=8\\)"
+gdb_test "print \$_creal (c8)" " = 321"
+gdb_test "whatis \$" " = real\\*8"
+
+gdb_test "whatis dc" "type = complex\\(kind=8\\)"
+gdb_test "print \$_creal (dc)" " = 321"
+gdb_test "whatis \$" " = real\\*8"
+
+gdb_test "whatis c16" "type = complex\\(kind=16\\)"
+setup_kfail gdb/18644 "*-*-*"
+gdb_test "print \$_creal (c16)" " = -874"
+gdb_test "whatis \$" " = real\\*16"
 
-gdb_test "print c" "\\\$$decimal = \\(1000,-50\\)"
diff --git a/gdb/testsuite/gdb.fortran/complex.f b/gdb/testsuite/gdb.fortran/complex.f
deleted file mode 100644
index 2f1a7879f9e..00000000000
--- a/gdb/testsuite/gdb.fortran/complex.f
+++ /dev/null
@@ -1,24 +0,0 @@ 
-c Copyright 2007-2019 Free Software Foundation, Inc.
-
-c This program is free software; you can redistribute it and/or modify
-c it under the terms of the GNU General Public License as published by
-c the Free Software Foundation; either version 3 of the License, or
-c (at your option) any later version.
-c
-c This program is distributed in the hope that it will be useful,
-c but WITHOUT ANY WARRANTY; without even the implied warranty of
-c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-c GNU General Public License for more details.
-c
-c You should have received a copy of the GNU General Public License
-c along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-      real*8 a,b
-      complex*16 c
-
-      a = 1000
-      b = -50
-      c = cmplx(a,b)
-      write(*,*) s
-      stop
-      end
diff --git a/gdb/testsuite/gdb.fortran/complex.f90 b/gdb/testsuite/gdb.fortran/complex.f90
new file mode 100644
index 00000000000..2b88c1ee0bb
--- /dev/null
+++ b/gdb/testsuite/gdb.fortran/complex.f90
@@ -0,0 +1,44 @@ 
+! Copyright 2007-2019 Free Software Foundation, Inc.
+!
+! This program is free software; you can redistribute it and/or modify
+! it under the terms of the GNU General Public License as published by
+! the Free Software Foundation; either version 3 of the License, or
+! (at your option) any later version.
+!
+! This program is distributed in the hope that it will be useful,
+! but WITHOUT ANY WARRANTY; without even the implied warranty of
+! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+! GNU General Public License for more details.
+!
+! You should have received a copy of the GNU General Public License
+! along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+program test_complex
+  real*4 r4a, r4b
+  real*8 r8a, r8b
+  real*16 r16a, r16b
+
+  complex c
+  complex(kind=4) c4
+  complex(kind=8) c8
+  double complex dc
+  complex(kind=16) c16
+
+  r4a = 1000
+  r4b = -50
+  r8a = 321
+  r8b = -22
+  r16a = -874
+  r16b = 19
+
+  c = cmplx(r4a,r4b)
+  c4 = cmplx(r4a,r4b)
+  c8 = cmplx(r8a, r8b)
+  dc = cmplx(r8a, r8b)
+  c16 = cmplx(r16a, r16b)
+
+  print *, c, c4, c8, dc, c16	! stop
+  print *, r4a, r4b
+  print *, r8a, r8b
+  print *, r16a, r16b
+end program test_complex