binutils-gdb/gdb/testsuite/gdb.fortran/module.f90
Nils-Christian Kempke 6fe8aea3c0 testsuite, fortran: Remove self assignment non-statements
There were a couple of places in the testsuite where instructions like

  var = var

were written in the source code of tests.  These were usually dummy
statements meant to generate a line table entry at that line on which
to break later on.

This worked fine for gfortran and ifx, but it seems that, when compiled
with ifort (2021.6.0) these statements do not actually create any
assmbler instructions and especially no line table entries.  Consider
the program

  program test
    Integer var :: var = 1
    var = var
  end program

compiled with gfortran (13.0.0, -O0 -g).  The linetable as emitted by
'objdump --dwarf=decodedline ./a.out' looks like

  test.f90:
  File name   Line number    Starting address    View    Stmt
  test.f90              1            0x401172               x
  test.f90              3            0x401176               x
  test.f90              4            0x401182               x
  test.f90              4            0x401185               x
  test.f90              4            0x401194               x
  test.f90              -            0x4011c0

actually containing line table info for line 3.  Running gdb, breaking
at 3 and checking the assembly we see

   0x0000000000401172 <+0>:     push   %rbp
   0x0000000000401173 <+1>:     mov    %rsp,%rbp
=> 0x0000000000401176 <+4>:     mov    0x2ebc(%rip),%eax   # 0x404038 <var.1>
   0x000000000040117c <+10>:    mov    %eax,0x2eb6(%rip)   # 0x404038 <var.1>
   0x0000000000401182 <+16>:    nop
   0x0000000000401183 <+17>:    pop    %rbp
   0x0000000000401184 <+18>:    ret

so two mov instructions are being issued for this assignment one copying
the value into a register and one writing it back to the same memory.
Ifort (2021.6.0, -O0 -g) on the other hand does not emit anything here
and also has no line table entry:

  test.f90:
  File name   Line number    Starting address    View    Stmt
  test.f90              1            0x4040f8               x
  test.f90              4            0x404109               x
  test.f90              4            0x40410e               x
  test.f90              -            0x404110

As I do not think that this is really a bug (on either side, gfortran/ifx or
ifort), and as I don't think this behavior is covered in the Fortran
standard, I changed these lines to become actual value assignments.

This removes a few FAILs in the testsuite when ran with ifort.

Approved-by: Tom Tromey <tom@tromey.com>
2023-09-08 00:35:18 +02:00

73 lines
2 KiB
Fortran

! Copyright 2009-2023 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/>.
module mod1
integer :: var_i = 1
integer :: var_const
parameter (var_const = 20)
end module mod1
module mod2
integer :: var_i = 2
end module mod2
module mod3
integer :: mod2 = 3
integer :: mod1 = 3
integer :: var_i = 3
end module mod3
module modmany
integer :: var_a = 10, var_b = 11, var_c = 12, var_i = 14
end module modmany
module moduse
integer :: var_x = 30, var_y = 31
end module moduse
subroutine sub1
use mod1
if (var_i .ne. 1) call abort
var_i = 1 ! i-is-1
end
subroutine sub2
use mod2
if (var_i .ne. 2) call abort
var_i = 2 ! i-is-2
end
subroutine sub3
use mod3
if (var_i .ne. 3) call abort
var_i = 3 ! i-is-3
END
program module
use modmany, only: var_b, var_d => var_c, var_i
use moduse, var_z => var_y
call sub1
call sub2
call sub3
if (var_b .ne. 11) call abort
if (var_d .ne. 12) call abort
if (var_i .ne. 14) call abort
if (var_x .ne. 30) call abort
if (var_z .ne. 31) call abort
var_b = 11 ! a-b-c-d
end