[binutils-gdb] testsuite, fortran: Remove self assignment non-statements

Abdul Basit Ijaz abijaz@sourceware.org
Thu Sep 7 22:37:27 GMT 2023


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=6fe8aea3c0b848cfca8a9dbeb6df42d51af2b18c

commit 6fe8aea3c0b848cfca8a9dbeb6df42d51af2b18c
Author: Nils-Christian Kempke <nils-christian.kempke@intel.com>
Date:   Fri May 20 17:15:44 2022 +0200

    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>

Diff:
---
 gdb/testsuite/gdb.fortran/library-module-lib.f90  |  2 +-
 gdb/testsuite/gdb.fortran/library-module-main.f90 |  2 +-
 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 89e5f3fc6f4..24a7a8f6287 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 6b5fe87d0ea..85f9e6f119e 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 4aaf22441d0..fba899bbd38 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


More information about the Gdb-cvs mailing list