PING – [Patch] Fortran: Fix Bind(C) Array-Descriptor Conversion (Move to Front-End Code)

Tobias Burnus tobias@codesourcery.com
Fri Sep 10 18:48:59 GMT 2021


Early PING for that patch.

On 06.09.21 12:52, Tobias Burnus wrote:
> Hi all,
>
> gfortran's internal array descriptor (xgfc descriptor) and
> the descriptor used with BIND(C) (CFI descriptor, ISO_Fortran_binding.h
> of TS29113 / Fortran 2018) are different. Thus, when calling a BIND(C)
> procedure the gfc descriptor has to be converted to cfi – and when a
> BIND(C) procedure is implemented in Fortran, the argument has to be
> converted back from CFI to gfc.
>
> The current implementation handles part in the FE and part in
> libgfortran,
> but there were several issues, e.g. PR101635 failed due to alias issues,
> debugging wasn't working well, uninitialized memory was used in some
> cases
> etc.
>
> This patch now moves descriptor conversion handling to the FE – which
> also
> can make use of compile-time knowledge, useful both for diagnostic and to
> optimize the code.
>
> Additionally:
> - Some cases where TS29113 mandates that the array descriptor should be
>   used now use the array descriptor, in particular character scalars with
>   'len=*' and allocatable/pointer scalars.
> - While debugging the alias issue, I simplified 'select rank'. While some
>   special case is needed for assumed-shape arrays, those cannot appear
> when
>   the argument has the pointer or allocatable attribute. That's not
> only a
>   missed optimization, pointer/allocatable arrays can also be NULL - such
>   that accessing desc->dim.ubound[rank-1] can be uninitialized memory ...
>
> OK?  Comments? Suggestions?
>
>  * * *
>
> For some more dumps, see the discussion about the alias issue at:
> https://gcc.gnu.org/pipermail/gcc-patches/2021-August/578364.html
> ("[RFH] ME optimizes variable assignment away / Fortran bind(C)
> descriptor conversion")
> plus the original emails:
> - https://gcc.gnu.org/pipermail/gcc-patches/2021-August/578271.html
> - and (correct dump)
> https://gcc.gnu.org/pipermail/gcc-patches/2021-August/578274.html
>
> Debugging - not ideal but not too bad either. For
>   subroutine f(x) bind(C)
>     integer :: x(:)
> with an uninitialized size-4 array as argument:
>
> m::f (_x=...) at foo4.f90:3
> 3       subroutine f(x) bind(C)
> (gdb) p x
> Cannot access memory at address 0x38
> (gdb) p _x
> $6 = ( base_addr = 0x7fffffffe2c0, elem_len = 4, version = 1, rank = 1
> '\001', attribute = 2 '\002', type = 1025, dim = (( lower_bound = 0,
> extent = 5, sm = 4 )) )
> (gdb) s
> 5         x(1) = 5
> (gdb) p x
> $7 = (0, 0, 0, -670762413, 0)
>
>
> Tobias
>
> PS: This patch fixes but not necessarily fully the following PRs:
> PR fortran/102086 - [F2008][TS29113] Accepts invalid scalar TYPE(*) as
> actual argument to assumed-rank
> PR fortran/92189 - Fortran-written bind(C) function with allocatable
> argument does not update C descriptor on exit
> PR fortran/92621 - Problems with memory handling with allocatable
> intent(out) arrays with bind(c)
> PR fortran/101308 - Bind(C): gfortran does not create C descriptors
> for scalar pointer/allocatable arguments
> PR fortran/101635 - FAIL: gfortran.dg/PR93963.f90 – alias-handling
> issue with BIND(C)'s _gfortran_cfi_desc_to_gfc_desc
> PR fortran/92482 - BIND(C) with array-descriptor mishandled for type
> character
> and possibly some more.
>
> PPS: I should add some additional testcases – I try to do this as Part
> 2 of this patch.
>
> PPPS: Once the patch is in, some audit needs to be done which parts of
> those PRs remain
> as follow-up work. I think some still existing issues are covered by
> José's pending
> patches + for those which are now fixed, the testcase might still be
> added.
>
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955


More information about the Fortran mailing list