public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Paul Richard Thomas <paul.richard.thomas@gmail.com>
To: "fortran@gcc.gnu.org" <fortran@gcc.gnu.org>,
	gcc-patches <gcc-patches@gcc.gnu.org>
Cc: jerry DeLisle <jvdelisle@charter.net>,
	Damian Rouson <damian@sourceryinstitute.org>,
		Ian Chivers <ian.chivers@chiversandbryan.co.uk>,
		Jane Sleightholme <jane@fortranplus.co.uk>
Subject: Re: Ping : [Patch, fortran] PR48298 - [F03] User-Defined Derived-Type IO (DTIO)
Date: Tue, 30 Aug 2016 10:58:00 -0000	[thread overview]
Message-ID: <CAGkQGiKei+bpy69xwL0idyGW4ZvPeod-u6a7RT=s3NV4_wEx3w@mail.gmail.com> (raw)
In-Reply-To: <CAGkQGiKvbLD8azLWWaxMSSpSXWb_qHWFFA3=MwG8VFK+-mZ+wg@mail.gmail.com>

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

      parent reply	other threads:[~2016-08-30 10:58 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-27 18:50 Paul Richard Thomas
2016-08-27 20:15 ` Janne Blomqvist
2016-08-28 20:39   ` Damian Rouson
2016-08-29  8:16   ` Andre Vehreschild
2016-08-29  8:47     ` Janne Blomqvist
2016-08-29 10:15       ` Paul Richard Thomas
2016-08-30 15:01         ` Janne Blomqvist
2016-08-30 17:28           ` Jerry DeLisle
2016-08-29 18:15   ` Toon Moene
2016-08-30 10:58 ` Paul Richard Thomas [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAGkQGiKei+bpy69xwL0idyGW4ZvPeod-u6a7RT=s3NV4_wEx3w@mail.gmail.com' \
    --to=paul.richard.thomas@gmail.com \
    --cc=damian@sourceryinstitute.org \
    --cc=fortran@gcc.gnu.org \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=ian.chivers@chiversandbryan.co.uk \
    --cc=jane@fortranplus.co.uk \
    --cc=jvdelisle@charter.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).