Re-sent with gzipped attachment as gcc-patches@ did reject it as being too large. Alternatively, you can find it at https://gcc.gnu.org/pipermail/fortran/attachments/20211009/dc26f92d/attachment-0001.bin as fortran@ contrary to gcc-patches@ did accept the patch ...
Tobias On 09.10.21 23:48, Tobias Burnus wrote:
Hi all, attached is the updated version. Changes: * Handle noncontiguous arrays – with BIND(C), (g)Fortran needs to make it contiguous in the caller but also handle noncontiguous in the callee. * Fixes/handle 'character(len=*)' with BIND(C); those always use an array descriptor - also with explicit-size and assumed-size arrays * Fixed a bunch of bugs, found when writing extensive testcases. * Fixed type(*) handling - those now pass properly type and elem_len on when calling a new function (bind(C) or not). Besides adding the type itself (which is rather straight forward), this patch only had minor modifications – and then the two big conversion functions. While it looks intimidating, it should be comparably simple to review as everything is on one place and hopefully sufficiently well documented. OK – for mainline? Other comments? More PRs which are fixed? Issues not yet fixed (which are inside the scope of this patch)? (If this patch is too long, I also have a nine-day old pending patch at https://gcc.gnu.org/pipermail/gcc-patches/2021-October/580624.html ) Tobias PS: The following still applies. On 06.09.21 12:52, Tobias Burnus wrote: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
----------------- 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
omp-descriptor-conv-v6.diff.gz
Description: application/gzip