Ping : [Patch, fortran] PR48298 - [F03] User-Defined Derived-Type IO (DTIO)

Paul Richard Thomas paul.richard.thomas@gmail.com
Tue Aug 30 10:58:00 GMT 2016


Dear All,

Janne's proposed change to namelist transfer has been implemented.
This avoids ABI brekage.

Please find the ChangeLogs below and the new patch attached.

Bootstraps and regtests on FC21/x86_64.

I will commit tomorrow morning if there are no objections in the meantime.

Best regards

Paul

2016-08-23  Paul Thomas  <pault@gcc.gnu.org>
    Jerry DeLisle  <jvdelisle@gcc.gnu.org>

    PR fortran/48298

    * decl.c (access_attr_decl): Include case INTERFACE_DTIO as
    appropriate.
    * gfortran.h : Add INTRINSIC_FORMATTED and
    INTRINSIC_UNFORMATTED to gfc_intrinsic_op. Add INTERFACE_DTIO
    to interface type. Add new enum 'dtio_codes'. Add bitfield
    'has_dtio_procs' to symbol_attr. Add prototypes
    'gfc_check_dtio_interfaces' and 'gfc_find_specific_dtio_proc'.
    * interface.c (dtio_op): New function.
    (gfc_match_generic_spec): Match generic DTIO interfaces.
    (gfc_match_interface): Treat DTIO interfaces in the same way as
    (gfc_current_interface_head): Add INTERFACE_DTIO appropriately.
    (check_dtio_arg_TKR_intent): New function.
    (check_dtio_interface1): New function.
    (gfc_check_dtio_interfaces): New function.
    (gfc_find_specific_dtio_proc): New function.
    * io.c : Add FMT_DT to format_token.
    (format_lex): Handle DTIO formatting.
    * match.c (gfc_op2string): Add DTIO operators.
    * resolve.c (derived_inaccessible): Ignore pointer components
    to enclosing derived type.
    (resolve_transfer): Resolve transfers that involve DTIO.
    procedures. Find the specific subroutine for the transfer and
    use its existence to over-ride some of the constraints on
    derived types. If the transfer is recursive, require that the
    subroutine be so qualified.
    (dtio_procs_present): New function.
    (resolve_fl_namelist): Remove inhibition of polymorphic objects
    in namelists if DTIO read and write subroutines exist. Likewise
    for derived types.
    (resolve_types): Invoke 'gfc_verify_dtio_procedures'.
    * symbol.c : Set 'dtio_procs' using 'minit'.
    * trans-decl.c (gfc_finish_var_decl): If a derived-type/class
    object is associated with DTIO procedures, make it TREE_STATIC.
    * trans-expr.c (gfc_get_vptr_from_expr): If the expression
    drills down to a PARM_DECL, extract the vptr correctly.
    (gfc_conv_derived_to_class): Check 'info' in the test for
    'useflags'. If the se expression exists and is a pointer, use
    it as the class _data.
    * trans-io.c : Add IOCALL_X_DERIVED to iocall and the function
    prototype. Likewise for IOCALL_SET_NML_DTIO_VAL.
    (set_parameter_tree): Renamed from 'set_parameter_const', now
    returns void and has new tree argument. Calls modified to match
    new interface.
    (transfer_namelist_element): Transfer DTIO procedure pointer
    and vpointer using the new function IOCALL_SET_NML_DTIO_VAL.
    (get_dtio_proc): New function.
    (transfer_expr): Add new argument for the vptr field of class
    objects. Add the code to call the specific DTIO proc, convert
    derived types to class and call IOCALL_X_DERIVED.
    (trans_transfer): Add BT_CLASS to structures for treatment by
    the scalarizer. Obtain the vptr for the dynamic type, both for
    scalar and array transfer.

2016-08-23  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
    Paul Thomas  <pault@gcc.gnu.org>

    PR libgfortran/48298
    * gfortran.map : Flag _st_set_nml_dtio_var and
    _gfortran_transfer_derived.
    * io/format.c (format_lex): Detect DTIO formatting.
    (parse_format_list): Parse the DTIO format.
    (next_format): Include FMT_DT.
    * io/format.h : Likewise. Add structure 'udf' to structure
    'fnode' to carry the IOTYPE string and the 'vlist'.
    * io/io.h : Add prototypes for the two types of DTIO subroutine
    and a typedef for gfc_class. Also, add to 'namelist_type'
    fields for the pointer to the DTIO procedure and the vtable.
    Add fields to struct st_parameter_dt for pointers to the two
    types of DTIO subroutine. Add to gfc_unit DTIO specific fields.
    (internal_proto): Add prototype for 'read_user_defined' and
    'write_user_defined'.
    * io/list_read.c (check_buffers): Use the 'current_unit' field.
    (unget_char): Likewise.
    (eat_spaces): Likewise.
    (list_formatted_read_scalar): For case BT_CLASS, call the DTIO
    procedure.
    (nml_get_obj_data): Likewise when DTIO procedure is present,.
    * io/transfer.c : Export prototypes for 'transfer_derived' and
    'transfer_derived_write'.
    (unformatted_read): For case BT_CLASS, call the DTIO procedure.
    (unformatted_write): Likewise.
    (formatted_transfer_scalar_read): Likewise.
    (formatted_transfer_scalar_write: Likewise.
    (transfer_derived): New function.
    (data_transfer_init): Set last_char if no child_dtio.
    (finalize_transfer): Return if child_dtio set.
    (st_write_done): Add condition for child_dtio not set.
    Add extra arguments for st_set_nml_var prototype.
    (set_nml_var): New function that contains the contents of the
    old version of st_set_nml_var. Also sets the 'dtio_sub' and
    'vtable' fields of the 'nml' structure.
    (st_set_nml_var): Now just calls set_nml_var with 'dtio_sub'
    and 'vtable' NULL.
    (st_set_nml_dtio_var): New function that calls set_nml_var.
    * io/unit.c (get_external_unit): If the found unit child_dtio
    is non zero, don't do any mutex locking/unlocking.  Just
    return the unit.
    * io/unix.c (tempfile_open): Revert to C style comment.
    * io/write.c (list_formatted_write_scalar): Do the DTIO call.
    (nml_write_obj): Add BT_CLASS and do the DTIO call.

2016-08-23  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
    Paul Thomas  <pault@gcc.gnu.org>

    PR fortran/48298
    * gfortran.dg/dtio_1.f90: New test.
    * gfortran.dg/dtio_2.f90: New test.
    * gfortran.dg/dtio_3.f90: New test.
    * gfortran.dg/dtio_4.f90: New test.
    * gfortran.dg/dtio_5.f90: New test.
    * gfortran.dg/dtio_6.f90: New test.
    * gfortran.dg/dtio_7.f90: New test.
    * gfortran.dg/dtio_8.f90: New test.
    * gfortran.dg/dtio_9.f90: New test.
    * gfortran.dg/dtio_10.f90: New test.

On 27 August 2016 at 20:50, Paul Richard Thomas
<paul.richard.thomas@gmail.com> wrote:
> Dear All,
>
> Please find attached the complete patch for DTIO, including the fix
> for the mutex_lock problem and all the testcases.
>
> Although we have said that we would commit on Monday if no review is
> forthcoming, we would very much prefer that somebody takes a look. We
> understand perfectly that a 4052 line patch is rather daunting.
> However, even a cursory scan of the patch would be helpful.
>
> Many thanks to Dominique for giving the patch a whirl. This almost
> certainly helped keep our blood pressure more or less level :-)
>
> Best regards
>
> Paul and Jerry
>
>
> On 22 August 2016 at 14:32, Paul Richard Thomas
> <paul.richard.thomas@gmail.com> wrote:
>> Dear All,
>>
>> The attached patch implements the above DTIO feature. This is the
>> penultimate F2003 feature to be implemented in gfortran. (The last is
>> Parameterized Derived-Types, which look to be difficult to judge by
>> the remarks coming from other vendors).
>>
>> Although fairly long, the patch is straightforward. It includes some
>> whitespace corrections, which are not remarked upon in the ChangeLogs.
>>
>> There are four known issues, for which PRs will be raised:
>> 1) DTIO to internal units is not implemented;
>> 2) Inquire length is not implemented;
>> 3) Size = in READ statements is not implemented; and
>> 4) There is a mystery optimization bug, at all levels of optimization,
>> which causes IF statements to disappear in some of the testcases. This
>> has been masked by the chunk in trans-decl.c that forces derived-type
>> and class objects with associated DTIO procedures to be TREE_STATIC.
>>
>> The testcases dtio_[3,4].f90 are on their way. We had set ourselves
>> the target of today to submit but the issue #4 derailed the
>> preparation of these testcases. These will be posted as soon as
>> possible.
>>
>> Bootstrapped and regtested on FC21/x86_64 - OK for trunk?
>>
>> Given that DTIO is only triggered by the specific typebound or generic
>> interfaces, we intend to commit the patch in one week from today if no
>> review is forthcoming.
>>
>> Paul and Jerry
>>
>> 2016-08-22  Paul Thomas  <pault@gcc.gnu.org>
>>     Jerry DeLisle  <jvdelisle@gcc.gnu.org>
>>
>>     PR fortran/48298
>>
>>     * decl.c (access_attr_decl): Include case INTERFACE_DTIO as
>>     appropriate.
>>     * gfortran.h : Add INTRINSIC_FORMATTED and
>>     INTRINSIC_UNFORMATTED to gfc_intrinsic_op. Add INTERFACE_DTIO
>>     to interface type. Add new enum 'dtio_codes'. Add bitfield
>>     'has_dtio_procs' to symbol_attr. Add prototypes
>>     'gfc_check_dtio_interfaces' and 'gfc_find_specific_dtio_proc'.
>>     * interface.c (dtio_op): New function.
>>     (gfc_match_generic_spec): Match generic DTIO interfaces.
>>     (gfc_match_interface): Treat DTIO interfaces in the same way as
>>     (gfc_current_interface_head): Add INTERFACE_DTIO appropriately.
>>     (check_dtio_arg_TKR_intent): New function.
>>     (check_dtio_interface1): New function.
>>     (gfc_check_dtio_interfaces): New function.
>>     (gfc_find_specific_dtio_proc): New function.
>>     * io.c : Add FMT_DT to format_token.
>>     (format_lex): Handle DTIO formatting.
>>     * match.c (gfc_op2string): Add DTIO operators.
>>     * resolve.c (derived_inaccessible): Ignore pointer components
>>     to enclosing derived type.
>>     (resolve_transfer): Resolve transfers that involve DTIO.
>>     procedures. Find the specific subroutine for the transfer and
>>     use its existence to over-ride some of the constraints on
>>     derived types.
>>     (dtio_procs_present): New function.
>>     (resolve_fl_namelist): Remove inhibition of polymorphic objects
>>     in namelists if DTIO read and write subroutines exist. Likewise
>>     for derived types.
>>     (resolve_types): Invoke 'gfc_verify_dtio_procedures'.
>>     * symbol.c : Set 'dtio_procs' using 'minit'.
>>     * trans-decl.c (gfc_finish_var_decl): If a derived-type/class
>>     object is associated with DTIO procedures, make it TREE_STATIC.
>>     * trans-expr.c (gfc_conv_derived_to_class): Check 'info' in the
>>     test for 'useflags'. If the se expression exists and is a
>>     pointer, use it as the class _data.
>>     * trans-io.c : Add IOCALL_X_DERIVED to iocall and the function
>>     prototype. Add two new arguments to IOCALL_SET_NML_VAL.
>>     (set_parameter_tree): Renamed from 'set_parameter_const', now
>>     returns void and has new tree argument. Calls modified to match
>>     new interface.
>>     (transfer_namelist_element): Transfer DTIO procedure pointer
>>     and the table to the vpointer, using the two new arguments of
>>     IOCALL_SET_NML_VAL.
>>     (get_dtio_proc): New function.
>>     (transfer_expr): Add new argument for the vptr field of class
>>     objects. Add the code to call the specific DTIO proc, convert
>>     derived types to class and call IOCALL_X_DERIVED.
>>     (trans_transfer): Add BT_CLASS to structures for treatment by
>>     the scalarizer. Obtain the vptr for the dynamic type, both for
>>     scalar and array transfer.
>>
>> 2016-08-22  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
>>     Paul Thomas  <pault@gcc.gnu.org>
>>
>>     PR libgfortran/48298
>>     * gfortran.map : Flag _gfortran_transfer_derived.
>>     * io/format.c (format_lex): Detect DTIO formatting.
>>     (parse_format_list): Parse the DTIO format.
>>     (next_format): Include FMT_DT.
>>     * io/format.h : Likewise. Add structure 'udf' to structure
>>     'fnode' to carry the IOTYPE string and the 'vlist'.
>>     * io/io.h : Add prototypes for the two types of DTIO subroutine
>>     and a typedef for gfc_class. Also, add to 'namelist_type'
>>     fields for the pointer to the DTIO procedure and the vtable.
>>     Add fields to struct st_parameter_dt for pointers to the two
>>     types of DTIO subroutine. Add to gfc_unit DTIO specific fields.
>>     (internal_proto): Add prototype for 'read_user_defined' and
>>     'write_user_defined'.
>>     * io/list_read.c (check_buffers): Use the 'current_unit' field.
>>     (unget_char): Likewise.
>>     (eat_spaces): Likewise.
>>     (list_formatted_read_scalar): For case BT_CLASS, call the DTIO
>>     procedure.
>>     (nml_get_obj_data): Likewise when DTIO procedure is present.
>>     * io/transfer.c : Export prototypes for 'transfer_derived' and
>>     'transfer_derived_write'.
>>     (unformatted_read): For case BT_CLASS, call the DTIO procedure.
>>     (unformatted_write): Likewise.
>>     (formatted_transfer_scalar_read): Likewise.
>>     (formatted_transfer_scalar_write: Likewise.
>>     (transfer_derived): New function.
>>     (data_transfer_init): Set last_char if no child_dtio.
>>     (finalize_transfer): Return if child_dtio set.
>>     (st_write_done): Add condition for child_dtio not set.
>>     Add extra arguments for st_set_nml_var prototype.
>>     (st_set_nml_var): Set the 'dtio_sub' and 'vtable' fields of the
>>     'nml' structure.
>>     * io/unix.c (tempfile_open): Revert to C style comment.
>>     * io/write.c (list_formatted_write_scalar): Do the DTIO call.
>>     (nml_write_obj): Add BT_CLASS and do the DTIO call.
>>
>> 2016-08-22  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
>>     Paul Thomas  <pault@gcc.gnu.org>
>>
>>     PR fortran/48298
>>     * gfortran.dg/dtio_1.f90: New test.
>>     * gfortran.dg/dtio_2.f90: New test.
>>     * gfortran.dg/dtio_5.f90: New test.
>>     * gfortran.dg/dtio_6.f90: New test.
>>     * gfortran.dg/dtio_7.f90: New test.
>>     * gfortran.dg/dtio_8.f90: New test.
>>     * gfortran.dg/dtio_9.f90: New test.
>>     * gfortran.dg/dtio_10.f90: New test.
>
>
>
> --
> The difference between genius and stupidity is; genius has its limits.
>
> Albert Einstein



-- 
The difference between genius and stupidity is; genius has its limits.

Albert Einstein



More information about the Fortran mailing list