From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20978 invoked by alias); 12 Feb 2018 19:42:06 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 20960 invoked by uid 89); 12 Feb 2018 19:42:05 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-11.1 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_2,GIT_PATCH_3,KAM_ASCII_DIVIDERS,RCVD_IN_DNSWL_LOW,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=08022018, 08.02.2018, 29967, 2678 X-Spam-User: qpsmtpd, 2 recipients X-HELO: cc-smtpout3.netcologne.de Received: from cc-smtpout3.netcologne.de (HELO cc-smtpout3.netcologne.de) (89.1.8.213) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 12 Feb 2018 19:42:02 +0000 Received: from cc-smtpin1.netcologne.de (cc-smtpin1.netcologne.de [89.1.8.201]) by cc-smtpout3.netcologne.de (Postfix) with ESMTP id 371B61284B; Mon, 12 Feb 2018 20:42:00 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by cc-smtpin1.netcologne.de (Postfix) with ESMTP id 2874B11DDF; Mon, 12 Feb 2018 20:42:00 +0100 (CET) Received: from [78.35.153.101] (helo=cc-smtpin1.netcologne.de) by localhost with ESMTP (eXpurgate 4.1.9) (envelope-from ) id 5a81ee08-029d-7f0000012729-7f000001ba3d-1 for ; Mon, 12 Feb 2018 20:42:00 +0100 Received: from [192.168.178.20] (xdsl-78-35-153-101.netcologne.de [78.35.153.101]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by cc-smtpin1.netcologne.de (Postfix) with ESMTPSA; Mon, 12 Feb 2018 20:41:56 +0100 (CET) Subject: Re: [patch, libfortran] Use flexible array members for array descriptor To: Richard Biener , Janne Blomqvist Cc: "fortran@gcc.gnu.org" , gcc-patches References: From: Thomas Koenig Message-ID: <633fa818-05fb-a2e8-3ac1-c74a59df3233@netcologne.de> Date: Mon, 12 Feb 2018 19:42:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------9276A0DF78014820096C4F15" X-SW-Source: 2018-02/txt/msg00668.txt.bz2 This is a multi-part message in MIME format. --------------9276A0DF78014820096C4F15 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1681 Am 08.02.2018 um 12:27 schrieb Richard Biener: > If the effect of the patch is (it doesn't include generated files) that the > function arguments now have pointers to array descriptor types with > the flexible array then yes, that's what will be needed anyways, no need > for any dust to settle here. All right. I have attached the patch updated with Janne's comments. Regression-tested. OK for trunk then? Regards Thomas 2018-02-12 Thomas Koenig * libgfortran.h (GFC_ARRAY_DESCRIPTOR): Remove dimension of descriptor to use vaiable members for dim. Change usage of GFC_ARRAY_DESCRIPTOR accordingly. (GFC_FILL_ARRAY_DESCRIPTOR): New macro. (gfc_full_array_i4): New type. * intrinsics/date_and_time.c (secnds): Use sizeof (gfc_array_i4) + sizeof (descriptor_dimension) for memory allocation. * intrinsics/reshape_generic.c: Use GFC_FULL_ARRAY_DESCRIPTOR. * io/format.c: Use sizeof (gfc_array_i4) + sizeof (descriptor_dimension) for memoy allocation. * io/list_read.c (list_formatted_read_scalar): Use gfc_full_array_i4 for variable. (nml_read_obj): Likewise. * io/write.c (list_formatted_write_scalar): Likewise. (nml_write_obj): Likewise. * m4/reshape.m4: Use GFC_FULL_ARRAY_DESCRIPTOR. * generated/reshape_c10.c: Regenerated. * generated/reshape_c16.c: Regenerated. * generated/reshape_c4.c: Regenerated. * generated/reshape_c8.c: Regenerated. * generated/reshape_i16.c: Regenerated. * generated/reshape_i4.c: Regenerated. * generated/reshape_i8.c: Regenerated. * generated/reshape_r10.c: Regenerated. * generated/reshape_r16.c: Regenerated. * generated/reshape_r4.c: Regenerated. * generated/reshape_r8.c: Regenerated. --------------9276A0DF78014820096C4F15 Content-Type: text/x-patch; name="p-lib-2.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="p-lib-2.diff" Content-length: 13718 Index: generated/reshape_c10.c =================================================================== --- generated/reshape_c10.c (Revision 257347) +++ generated/reshape_c10.c (Arbeitskopie) @@ -28,7 +28,7 @@ see the files COPYING3 and COPYING.RUNTIME respect #if defined (HAVE_GFC_COMPLEX_10) -typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; +typedef GFC_FULL_ARRAY_DESCRIPTOR(1, index_type) shape_type; extern void reshape_c10 (gfc_array_c10 * const restrict, Index: generated/reshape_c16.c =================================================================== --- generated/reshape_c16.c (Revision 257347) +++ generated/reshape_c16.c (Arbeitskopie) @@ -28,7 +28,7 @@ see the files COPYING3 and COPYING.RUNTIME respect #if defined (HAVE_GFC_COMPLEX_16) -typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; +typedef GFC_FULL_ARRAY_DESCRIPTOR(1, index_type) shape_type; extern void reshape_c16 (gfc_array_c16 * const restrict, Index: generated/reshape_c4.c =================================================================== --- generated/reshape_c4.c (Revision 257347) +++ generated/reshape_c4.c (Arbeitskopie) @@ -28,7 +28,7 @@ see the files COPYING3 and COPYING.RUNTIME respect #if defined (HAVE_GFC_COMPLEX_4) -typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; +typedef GFC_FULL_ARRAY_DESCRIPTOR(1, index_type) shape_type; extern void reshape_c4 (gfc_array_c4 * const restrict, Index: generated/reshape_c8.c =================================================================== --- generated/reshape_c8.c (Revision 257347) +++ generated/reshape_c8.c (Arbeitskopie) @@ -28,7 +28,7 @@ see the files COPYING3 and COPYING.RUNTIME respect #if defined (HAVE_GFC_COMPLEX_8) -typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; +typedef GFC_FULL_ARRAY_DESCRIPTOR(1, index_type) shape_type; extern void reshape_c8 (gfc_array_c8 * const restrict, Index: generated/reshape_i16.c =================================================================== --- generated/reshape_i16.c (Revision 257347) +++ generated/reshape_i16.c (Arbeitskopie) @@ -28,7 +28,7 @@ see the files COPYING3 and COPYING.RUNTIME respect #if defined (HAVE_GFC_INTEGER_16) -typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; +typedef GFC_FULL_ARRAY_DESCRIPTOR(1, index_type) shape_type; extern void reshape_16 (gfc_array_i16 * const restrict, Index: generated/reshape_i4.c =================================================================== --- generated/reshape_i4.c (Revision 257347) +++ generated/reshape_i4.c (Arbeitskopie) @@ -28,7 +28,7 @@ see the files COPYING3 and COPYING.RUNTIME respect #if defined (HAVE_GFC_INTEGER_4) -typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; +typedef GFC_FULL_ARRAY_DESCRIPTOR(1, index_type) shape_type; extern void reshape_4 (gfc_array_i4 * const restrict, Index: generated/reshape_i8.c =================================================================== --- generated/reshape_i8.c (Revision 257347) +++ generated/reshape_i8.c (Arbeitskopie) @@ -28,7 +28,7 @@ see the files COPYING3 and COPYING.RUNTIME respect #if defined (HAVE_GFC_INTEGER_8) -typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; +typedef GFC_FULL_ARRAY_DESCRIPTOR(1, index_type) shape_type; extern void reshape_8 (gfc_array_i8 * const restrict, Index: generated/reshape_r10.c =================================================================== --- generated/reshape_r10.c (Revision 257347) +++ generated/reshape_r10.c (Arbeitskopie) @@ -28,7 +28,7 @@ see the files COPYING3 and COPYING.RUNTIME respect #if defined (HAVE_GFC_REAL_10) -typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; +typedef GFC_FULL_ARRAY_DESCRIPTOR(1, index_type) shape_type; extern void reshape_r10 (gfc_array_r10 * const restrict, Index: generated/reshape_r16.c =================================================================== --- generated/reshape_r16.c (Revision 257347) +++ generated/reshape_r16.c (Arbeitskopie) @@ -28,7 +28,7 @@ see the files COPYING3 and COPYING.RUNTIME respect #if defined (HAVE_GFC_REAL_16) -typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; +typedef GFC_FULL_ARRAY_DESCRIPTOR(1, index_type) shape_type; extern void reshape_r16 (gfc_array_r16 * const restrict, Index: generated/reshape_r4.c =================================================================== --- generated/reshape_r4.c (Revision 257347) +++ generated/reshape_r4.c (Arbeitskopie) @@ -28,7 +28,7 @@ see the files COPYING3 and COPYING.RUNTIME respect #if defined (HAVE_GFC_REAL_4) -typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; +typedef GFC_FULL_ARRAY_DESCRIPTOR(1, index_type) shape_type; extern void reshape_r4 (gfc_array_r4 * const restrict, Index: generated/reshape_r8.c =================================================================== --- generated/reshape_r8.c (Revision 257347) +++ generated/reshape_r8.c (Arbeitskopie) @@ -28,7 +28,7 @@ see the files COPYING3 and COPYING.RUNTIME respect #if defined (HAVE_GFC_REAL_8) -typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; +typedef GFC_FULL_ARRAY_DESCRIPTOR(1, index_type) shape_type; extern void reshape_r8 (gfc_array_r8 * const restrict, Index: intrinsics/date_and_time.c =================================================================== --- intrinsics/date_and_time.c (Revision 257347) +++ intrinsics/date_and_time.c (Arbeitskopie) @@ -267,8 +267,10 @@ secnds (GFC_REAL_4 *x) GFC_INTEGER_4 values[VALUES_SIZE]; GFC_REAL_4 temp1, temp2; - /* Make the INTEGER*4 array for passing to date_and_time. */ - gfc_array_i4 *avalues = xmalloc (sizeof (gfc_array_i4)); + /* Make the INTEGER*4 array for passing to date_and_time, with enough space + for a rank-one array. */ + gfc_array_i4 *avalues = xmalloc (sizeof (gfc_array_i4) + + sizeof (descriptor_dimension)); avalues->base_addr = &values[0]; GFC_DESCRIPTOR_DTYPE (avalues).type = BT_REAL; GFC_DESCRIPTOR_DTYPE (avalues).elem_len = 4; Index: intrinsics/reshape_generic.c =================================================================== --- intrinsics/reshape_generic.c (Revision 257347) +++ intrinsics/reshape_generic.c (Arbeitskopie) @@ -26,8 +26,8 @@ see the files COPYING3 and COPYING.RUNTIME respect #include "libgfortran.h" #include -typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; -typedef GFC_ARRAY_DESCRIPTOR(GFC_MAX_DIMENSIONS, char) parray; +typedef GFC_FULL_ARRAY_DESCRIPTOR(1, index_type) shape_type; +typedef GFC_FULL_ARRAY_DESCRIPTOR(GFC_MAX_DIMENSIONS, char) parray; static void reshape_internal (parray *ret, parray *source, shape_type *shape, Index: io/format.c =================================================================== --- io/format.c (Revision 257347) +++ io/format.c (Arbeitskopie) @@ -1024,8 +1024,9 @@ parse_format_list (st_parameter_dt *dtp, bool *see t = format_lex (fmt); - /* Initialize the vlist to a zero size array. */ - tail->u.udf.vlist= xmalloc (sizeof(gfc_array_i4)); + /* Initialize the vlist to a zero size, rank-one array. */ + tail->u.udf.vlist= xmalloc (sizeof(gfc_array_i4) + + sizeof (descriptor_dimension)); GFC_DESCRIPTOR_DATA(tail->u.udf.vlist) = NULL; GFC_DIMENSION_SET(tail->u.udf.vlist->dim[0],1, 0, 0); Index: io/list_read.c =================================================================== --- io/list_read.c (Revision 257347) +++ io/list_read.c (Arbeitskopie) @@ -2198,7 +2198,7 @@ list_formatted_read_scalar (st_parameter_dt *dtp, gfc_charlen_type child_iomsg_len; int noiostat; int *child_iostat = NULL; - gfc_array_i4 vlist; + gfc_full_array_i4 vlist; GFC_DESCRIPTOR_DATA(&vlist) = NULL; GFC_DIMENSION_SET(vlist.dim[0],1, 0, 0); @@ -2996,7 +2996,7 @@ nml_read_obj (st_parameter_dt *dtp, namelist_info gfc_charlen_type child_iomsg_len; int noiostat; int *child_iostat = NULL; - gfc_array_i4 vlist; + gfc_full_array_i4 vlist; formatted_dtio dtio_ptr = (formatted_dtio)nl->dtio_sub; GFC_DESCRIPTOR_DATA(&vlist) = NULL; Index: io/write.c =================================================================== --- io/write.c (Revision 257347) +++ io/write.c (Arbeitskopie) @@ -1886,7 +1886,7 @@ list_formatted_write_scalar (st_parameter_dt *dtp, gfc_charlen_type child_iomsg_len; int noiostat; int *child_iostat = NULL; - gfc_array_i4 vlist; + gfc_full_array_i4 vlist; GFC_DESCRIPTOR_DATA(&vlist) = NULL; GFC_DIMENSION_SET(vlist.dim[0],1, 0, 0); @@ -2211,7 +2211,7 @@ nml_write_obj (st_parameter_dt *dtp, namelist_info gfc_charlen_type child_iomsg_len; int noiostat; int *child_iostat = NULL; - gfc_array_i4 vlist; + gfc_full_array_i4 vlist; formatted_dtio dtio_ptr = (formatted_dtio)obj->dtio_sub; GFC_DIMENSION_SET(vlist.dim[0],1, 0, 0); Index: libgfortran.h =================================================================== --- libgfortran.h (Revision 257347) +++ libgfortran.h (Arbeitskopie) @@ -339,51 +339,65 @@ typedef struct dtype_type } dtype_type; -#define GFC_ARRAY_DESCRIPTOR(r, type) \ +#define GFC_ARRAY_DESCRIPTOR(type) \ struct {\ type *base_addr;\ size_t offset;\ dtype_type dtype;\ index_type span;\ - descriptor_dimension dim[r];\ + descriptor_dimension dim[];\ } /* Commonly used array descriptor types. */ -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, void) gfc_array_void; -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, char) gfc_array_char; -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_1) gfc_array_i1; -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_2) gfc_array_i2; -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_4) gfc_array_i4; -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_8) gfc_array_i8; +typedef GFC_ARRAY_DESCRIPTOR (void) gfc_array_void; +typedef GFC_ARRAY_DESCRIPTOR (char) gfc_array_char; +typedef GFC_ARRAY_DESCRIPTOR (GFC_INTEGER_1) gfc_array_i1; +typedef GFC_ARRAY_DESCRIPTOR (GFC_INTEGER_2) gfc_array_i2; +typedef GFC_ARRAY_DESCRIPTOR (GFC_INTEGER_4) gfc_array_i4; +typedef GFC_ARRAY_DESCRIPTOR (GFC_INTEGER_8) gfc_array_i8; #ifdef HAVE_GFC_INTEGER_16 -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_16) gfc_array_i16; +typedef GFC_ARRAY_DESCRIPTOR (GFC_INTEGER_16) gfc_array_i16; #endif -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_REAL_4) gfc_array_r4; -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_REAL_8) gfc_array_r8; +typedef GFC_ARRAY_DESCRIPTOR (GFC_REAL_4) gfc_array_r4; +typedef GFC_ARRAY_DESCRIPTOR (GFC_REAL_8) gfc_array_r8; #ifdef HAVE_GFC_REAL_10 -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_REAL_10) gfc_array_r10; +typedef GFC_ARRAY_DESCRIPTOR (GFC_REAL_10) gfc_array_r10; #endif #ifdef HAVE_GFC_REAL_16 -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_REAL_16) gfc_array_r16; +typedef GFC_ARRAY_DESCRIPTOR (GFC_REAL_16) gfc_array_r16; #endif -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_COMPLEX_4) gfc_array_c4; -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_COMPLEX_8) gfc_array_c8; +typedef GFC_ARRAY_DESCRIPTOR (GFC_COMPLEX_4) gfc_array_c4; +typedef GFC_ARRAY_DESCRIPTOR (GFC_COMPLEX_8) gfc_array_c8; #ifdef HAVE_GFC_COMPLEX_10 -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_COMPLEX_10) gfc_array_c10; +typedef GFC_ARRAY_DESCRIPTOR (GFC_COMPLEX_10) gfc_array_c10; #endif #ifdef HAVE_GFC_COMPLEX_16 -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_COMPLEX_16) gfc_array_c16; +typedef GFC_ARRAY_DESCRIPTOR (GFC_COMPLEX_16) gfc_array_c16; #endif -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_LOGICAL_1) gfc_array_l1; -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_LOGICAL_2) gfc_array_l2; -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_LOGICAL_4) gfc_array_l4; -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_LOGICAL_8) gfc_array_l8; +typedef GFC_ARRAY_DESCRIPTOR (GFC_LOGICAL_1) gfc_array_l1; +typedef GFC_ARRAY_DESCRIPTOR (GFC_LOGICAL_2) gfc_array_l2; +typedef GFC_ARRAY_DESCRIPTOR (GFC_LOGICAL_4) gfc_array_l4; +typedef GFC_ARRAY_DESCRIPTOR (GFC_LOGICAL_8) gfc_array_l8; #ifdef HAVE_GFC_LOGICAL_16 -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_LOGICAL_16) gfc_array_l16; +typedef GFC_ARRAY_DESCRIPTOR (GFC_LOGICAL_16) gfc_array_l16; #endif typedef gfc_array_i1 gfc_array_s1; typedef gfc_array_i4 gfc_array_s4; +/* These are for when you actually want to declare a descriptor, as + opposed to a pointer to it. */ + +#define GFC_FULL_ARRAY_DESCRIPTOR(r, type) \ +struct {\ + type *base_addr;\ + size_t offset;\ + dtype_type dtype;\ + index_type span;\ + descriptor_dimension dim[r];\ +} + +typedef GFC_FULL_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_4) gfc_full_array_i4; + #define GFC_DESCRIPTOR_RANK(desc) ((desc)->dtype.rank) #define GFC_DESCRIPTOR_TYPE(desc) ((desc)->dtype.type) #define GFC_DESCRIPTOR_SIZE(desc) ((desc)->dtype.elem_len) @@ -1345,7 +1359,7 @@ iexport_proto(random_seed_i8); /* size.c */ -typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, void) array_t; +typedef GFC_ARRAY_DESCRIPTOR (void) array_t; extern index_type size0 (const array_t * array); iexport_proto(size0); Index: m4/reshape.m4 =================================================================== --- m4/reshape.m4 (Revision 257347) +++ m4/reshape.m4 (Arbeitskopie) @@ -29,7 +29,7 @@ include(iparm.m4)dnl `#if defined (HAVE_'rtype_name`) -typedef GFC_ARRAY_DESCRIPTOR(1, 'index_type`) 'shape_type`;' +typedef GFC_FULL_ARRAY_DESCRIPTOR(1, 'index_type`) 'shape_type`;' dnl For integer routines, only the kind (ie size) is used to name the dnl function. The same function will be used for integer and logical --------------9276A0DF78014820096C4F15--