FINAL subroutines

Jerry D jvdelisle2@gmail.com
Wed Jan 26 21:29:09 GMT 2022


Is there any reason these patches can not be applied and use this test 
as a test case?

Regards,

Jerry

On 1/24/22 8:11 AM, Salvatore Filippone via Fortran wrote:
> Thanks a lot
> (yes, I suspected both gfortran and intel were wrong, precisely because I
> could see why you'd need two FINAL calls, but not three).
>
> Salvatore
>
> On Mon, Jan 24, 2022 at 4:45 PM Andrew Benson <abenson@carnegiescience.edu>
> wrote:
>
>> Hi Salvatore,
>>
>> This looks like it's related to some of the missing finalization
>> functionality
>> (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=37336). Paul has some
>> patches
>> (e.g. https://gcc.gnu.org/pipermail/fortran/2022-January/057415.html)
>> which
>> implement most of the missing functionality. With those patches
>> incorporated
>> your code gives the following output with gfortran:
>>
>> $ ./testfinal
>>   Allocating wrapper
>>   Calling new_outer_type
>>   Assigning outer%test_item
>>   Called delete_test_type
>>   End of new_outer_type
>>   DeAllocating wrapper
>>   Called delete_test_type
>>
>> So there is one more call to the finalizer than you found - I haven't
>> checked
>> carefully but I would guess this is a deallocation of LHS on assignment.
>>
>> In testing these patches using the Intel compiler we found that it seems
>> to
>> call the finalization wrapper more than it should, sometimes on objects
>> that
>> have already been deallocated. Your code, compiled with the Intel compiler
>> and
>> then run under valgrind shows the following:
>>
>> $ valgrind ./testfinal
>> ==7340== Memcheck, a memory error detector
>> ==7340== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
>> ==7340== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
>> ==7340== Command: ./testfinal
>> ==7340==
>> ==7340== Conditional jump or move depends on uninitialised value(s)
>> ==7340==    at 0x493A51: __intel_sse2_strcpy (in /home/abensonca/Scratch/
>> ifortTests/testfinal)
>> ==7340==    by 0x45D70E: for__add_to_lf_table (in /home/abensonca/Scratch/
>> ifortTests/testfinal)
>> ==7340==    by 0x4410CB: for__open_proc (in /home/abensonca/Scratch/
>> ifortTests/testfinal)
>> ==7340==    by 0x423A64: for__open_default (in /home/abensonca/Scratch/
>> ifortTests/testfinal)
>> ==7340==    by 0x4305A9: for_write_seq_lis (in /home/abensonca/Scratch/
>> ifortTests/testfinal)
>> ==7340==    by 0x4047E1: MAIN__ (testfinal.f90:62)
>> ==7340==    by 0x403CE1: main (in /home/abensonca/Scratch/ifortTests/
>> testfinal)
>> ==7340==
>>   Allocating wrapper
>>   Calling new_outer_type
>>   Assigning outer%test_item
>>   Called delete_test_type
>> ==7340== Conditional jump or move depends on uninitialised value(s)
>> ==7340==    at 0x40572A: do_alloc_copy (in
>> /home/abensonca/Scratch/ifortTests/
>> testfinal)
>> ==7340==    by 0x406B9A: do_alloc_copy (in
>> /home/abensonca/Scratch/ifortTests/
>> testfinal)
>> ==7340==    by 0x4084ED: for_alloc_assign_v2 (in /home/abensonca/Scratch/
>> ifortTests/testfinal)
>> ==7340==    by 0x404474: target_mod_mp_new_outer_type_ (testfinal.f90:48)
>> ==7340==    by 0x40485E: MAIN__ (testfinal.f90:65)
>> ==7340==    by 0x403CE1: main (in /home/abensonca/Scratch/ifortTests/
>> testfinal)
>> ==7340==
>>   Called delete_test_type
>>   End of new_outer_type
>>   DeAllocating wrapper
>>   Called delete_test_type
>> ==7340==
>> ==7340== HEAP SUMMARY:
>> ==7340==     in use at exit: 48 bytes in 1 blocks
>> ==7340==   total heap usage: 14 allocs, 13 frees, 12,879 bytes allocated
>> ==7340==
>> ==7340== LEAK SUMMARY:
>> ==7340==    definitely lost: 48 bytes in 1 blocks
>> ==7340==    indirectly lost: 0 bytes in 0 blocks
>> ==7340==      possibly lost: 0 bytes in 0 blocks
>> ==7340==    still reachable: 0 bytes in 0 blocks
>> ==7340==         suppressed: 0 bytes in 0 blocks
>> ==7340== Rerun with --leak-check=full to see details of leaked memory
>> ==7340==
>> ==7340== For counts of detected and suppressed errors, rerun with: -v
>> ==7340== Use --track-origins=yes to see where uninitialised values come
>> from
>> ==7340== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
>>
>> so there are some cases of what look like incorrect accesses (and some
>> leaked
>> memory).
>>
>> Your code compiled  with gfortran (with Paul's patches in place) shows no
>> errors or leaks from valgrind.
>>
>> So, in summary, in this case I think the current gfortran is missing some
>> finalizations (which are fixed by Paul's patches), and ifort is likely
>> doing
>> something wrong and probably calling the finalizer more times than it
>> should.
>>
>> -Andrew
>>
>> On Monday, January 24, 2022 6:49:23 AM PST Salvatore Filippone via Fortran
>> wrote:
>>> And here is the code embedded as text............ sorry  about sending an
>>> attachment that was purged
>>> ------------------------- testfinal.f90 ---------------------
>>> module test_type_mod
>>>
>>>    type :: my_test_type
>>>      integer, allocatable :: i
>>>    contains
>>>      final :: delete_test_type
>>>    end type my_test_type
>>>
>>>    interface my_test_type
>>>      module procedure  new_test_type_object
>>>    end interface my_test_type
>>>
>>> contains
>>>
>>>    subroutine delete_test_type(this)
>>>      type(my_test_type) :: this
>>>
>>>      write(*,*) 'Called delete_test_type'
>>>      if (allocated(this%i)) deallocate(this%i)
>>>
>>>    end subroutine delete_test_type
>>>
>>>
>>>    function new_test_type_object(item) result(res)
>>>      type(my_test_type)  :: res
>>>      integer, intent(in) :: item
>>>      !Allocation on assignment
>>>      res%i=item
>>>    end function new_test_type_object
>>>
>>>
>>> end module test_type_mod
>>>
>>> module target_mod
>>>    use test_type_mod
>>>    type :: outer_type
>>>      type(my_test_type), allocatable  :: test_item
>>>    end type outer_type
>>>
>>> contains
>>>
>>>    subroutine new_outer_type(outer,item)
>>>      type(outer_type), intent(out) :: outer
>>>      integer :: item
>>>
>>>      allocate(outer%test_item)
>>>      write(*,*) 'Assigning outer%test_item'
>>>      outer%test_item = my_test_type(itemi)
>>>      write(*,*) 'End of new_outer_type'
>>>    end subroutine new_outer_type
>>>
>>> end module target_mod
>>>
>>> program testfinal
>>>    use target_mod
>>>
>>>    implicit none
>>>
>>>    integer :: i=10
>>>    type(outer_type), allocatable  :: wrapper
>>>
>>>    write(*,*) 'Allocating wrapper '
>>>    allocate(wrapper)
>>>    write(*,*) 'Calling new_outer_type '
>>>    call new_outer_type(wrapper,i)
>>>    write(*,*) 'DeAllocating wrapper '
>>>    deallocate(wrapper)
>>>
>>> end program testfinal
>>>
>>> On Mon, Jan 24, 2022 at 2:50 PM Salvatore Filippone <
>>>
>>> filippone.salvatore@gmail.com> wrote:
>>>> Hi all
>>>> The attached code compiles and runs fine under both GNU and Intel, but
>> it
>>>> produces different results, in particular the FINAL subroutine is
>> invoked
>>>> just once with GNU, three times with Intel.
>>>>
>>>> It seems to me that they cannot both be right; I am not sure what the
>>>> standard is mandating in this case.
>>>> Any ideas?
>>>> Salvatore
>>>> ---------------  Intel
>>>> [pr1eio03@login1: newstuff]$ ifort -v
>>>> ifort version 19.1.1.217
>>>> [pr1eio03@login1: newstuff]$ ifort -o testfinal testfinal.f90
>>>> [pr1eio03@login1: newstuff]$ ./testfinal
>>>>
>>>>   Allocating wrapper
>>>>   Calling new_outer_type
>>>>   Assigning outer%test_item
>>>>   Called delete_test_type
>>>>   Called delete_test_type
>>>>   End of new_outer_type
>>>>   DeAllocating wrapper
>>>>   Called delete_test_type
>>>>
>>>> ----------------------------- GNU
>>>> sfilippo@lagrange newstuff]$ gfortran -v
>>>> Using built-in specs.
>>>> COLLECT_GCC=gfortran
>>>> COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/11/lto-wrapper
>>>> OFFLOAD_TARGET_NAMES=nvptx-none
>>>> OFFLOAD_TARGET_DEFAULT=1
>>>> Target: x86_64-redhat-linux
>>>> Configured with: ../configure --enable-bootstrap
>>>> --enable-languages=c,c++,fortran,objc,obj-c++,ada,go,d,lto
>> --prefix=/usr
>>>> --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=
>>>> http://bugzilla.redhat.com/bugzilla --enable-shared
>>>> --enable-threads=posix --enable-checking=release --enable-multilib
>>>> --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions
>>>> --enable-gnu-unique-object --enable-linker-build-id
>>>> --with-gcc-major-version-only --with-linker-hash-style=gnu
>> --enable-plugin
>>>> --enable-initfini-array
>>>>
>> --with-isl=/builddir/build/BUILD/gcc-11.2.1-20210728/obj-x86_64-redhat-lin
>>>> ux/isl-install --enable-offload-targets=nvptx-none
>> --without-cuda-driver
>>>> --enable-gnu-indirect-function --enable-cet --with-tune=generic
>>>> --with-arch_32=i686 --build=x86_64-redhat-linux
>>>> Thread model: posix
>>>> Supported LTO compression algorithms: zlib zstd
>>>> gcc version 11.2.1 20210728 (Red Hat 11.2.1-1) (GCC)
>>>> [sfilippo@lagrange newstuff]$ gfortran -o testfinal testfinal.f90
>>>> [sfilippo@lagrange newstuff]$ ./testfinal
>>>>
>>>>   Allocating wrapper
>>>>   Calling new_outer_type
>>>>   Assigning outer%test_item
>>>>   End of new_outer_type
>>>>   DeAllocating wrapper
>>>>   Called delete_test_type
>>>>
>>>> ---------------------
>>
>> --
>>
>> * Andrew Benson: https://abensonca.github.io
>>
>> * Galacticus: https://github.com/galacticusorg/galacticus
>>
>>
>>
>>



More information about the Fortran mailing list