diff options
author | Nils-Christian Kempke <nils-christian.kempke@intel.com> | 2022-05-20 17:15:44 +0200 |
---|---|---|
committer | Ijaz, Abdul B <abdul.b.ijaz@intel.com> | 2023-09-08 00:35:18 +0200 |
commit | 6fe8aea3c0b848cfca8a9dbeb6df42d51af2b18c (patch) | |
tree | 29698c188159b69f0d7a35a154f7b2aa8fbbe38d /gdb | |
parent | 85832a8c3c91c8ac39b8c6ef50a4894a55b17ab2 (diff) | |
download | gdb-6fe8aea3c0b848cfca8a9dbeb6df42d51af2b18c.zip gdb-6fe8aea3c0b848cfca8a9dbeb6df42d51af2b18c.tar.gz gdb-6fe8aea3c0b848cfca8a9dbeb6df42d51af2b18c.tar.bz2 |
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>
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/testsuite/gdb.fortran/library-module-lib.f90 | 2 | ||||
-rw-r--r-- | gdb/testsuite/gdb.fortran/library-module-main.f90 | 2 | ||||
-rw-r--r-- | gdb/testsuite/gdb.fortran/module.f90 | 11 |
3 files changed, 8 insertions, 7 deletions
diff --git a/gdb/testsuite/gdb.fortran/library-module-lib.f90 b/gdb/testsuite/gdb.fortran/library-module-lib.f90 index 89e5f3f..24a7a8f 100644 --- a/gdb/testsuite/gdb.fortran/library-module-lib.f90 +++ b/gdb/testsuite/gdb.fortran/library-module-lib.f90 @@ -19,7 +19,7 @@ contains subroutine lib_func if (var_i .ne. 1) call abort var_i = 2 - var_i = var_i ! i-is-2-in-lib + var_i = 2 ! i-is-2-in-lib end subroutine lib_func end module lib diff --git a/gdb/testsuite/gdb.fortran/library-module-main.f90 b/gdb/testsuite/gdb.fortran/library-module-main.f90 index 6b5fe87..85f9e6f 100644 --- a/gdb/testsuite/gdb.fortran/library-module-main.f90 +++ b/gdb/testsuite/gdb.fortran/library-module-main.f90 @@ -19,5 +19,5 @@ call lib_func if (var_i .ne. 2) call abort if (var_j .ne. 3) call abort - var_i = var_i ! i-is-2-in-main + var_i = 7 ! i-is-2-in-main end diff --git a/gdb/testsuite/gdb.fortran/module.f90 b/gdb/testsuite/gdb.fortran/module.f90 index 4aaf224..fba899b 100644 --- a/gdb/testsuite/gdb.fortran/module.f90 +++ b/gdb/testsuite/gdb.fortran/module.f90 @@ -40,18 +40,19 @@ end module moduse subroutine sub1 use mod1 if (var_i .ne. 1) call abort - var_i = var_i ! i-is-1 + var_i = 1 ! i-is-1 end subroutine sub2 use mod2 if (var_i .ne. 2) call abort - var_i = var_i ! i-is-2 + var_i = 2 ! i-is-2 end subroutine sub3 - USE mod3 - var_i = var_i ! i-is-3 + use mod3 + if (var_i .ne. 3) call abort + var_i = 3 ! i-is-3 END program module @@ -68,5 +69,5 @@ end module moduse if (var_i .ne. 14) call abort if (var_x .ne. 30) call abort if (var_z .ne. 31) call abort - var_b = var_b ! a-b-c-d + var_b = 11 ! a-b-c-d end |