This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Regression on gdb.fortran/complex.exp on unix/-m32 (was: Re: [PATCHv2 4/8] gdb/fortran: better types for components of complex numbers)
- From: Sergio Durigan Junior <sergiodj at redhat dot com>
- To: Andrew Burgess <andrew dot burgess at embecosm dot com>
- Cc: gdb-patches at sourceware dot org, Richard Bunt <Richard dot Bunt at arm dot com>
- Date: Thu, 02 May 2019 20:21:49 -0400
- Subject: Regression on gdb.fortran/complex.exp on unix/-m32 (was: Re: [PATCHv2 4/8] gdb/fortran: better types for components of complex numbers)
- References: <cover.1554249182.git.andrew.burgess@embecosm.com> <e63befa789944a27249c5893eb85ce36999c78e4.1554249182.git.andrew.burgess@embecosm.com>
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
--
Sergio
GPG key ID: 237A 54B1 0287 28BF 00EF 31F4 D0EB 7628 65FC 5E36
Please send encrypted e-mail if possible
http://sergiodj.net/