
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>
73 lines
2 KiB
Fortran
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
|