From patchwork Fri Dec 6 00:16:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 1204888 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-515316-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="uwesTW6M"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="fa4FoV8C"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47TY6p02Qnz9sPL for ; Fri, 6 Dec 2019 11:16:48 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:reply-to:mime-version:content-type :content-transfer-encoding; q=dns; s=default; b=YZ2rHrWo9QzZ7asL fn2gAQukB8vbPYhO7vIms+IwOJ3f62ghZSJRK1FKDr8znlbCJkb6Fxx3abKXTjKN B00ByaU5aom71HGZ7bY/8iTJYH+U1b6vjab6sKYFrH8P6rU828/wL/cGarGA/ECf nRh5kZszXY3+nP9UFp60pkVBxX4= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:reply-to:mime-version:content-type :content-transfer-encoding; s=default; bh=bdm1Rs+AT+FaHNmk4Bv76a QPEtI=; b=uwesTW6MC3GI/XcKd16i2zmU6m18qjtHuwxN+k65g1wKk9T5Mk5l7A Z3vEQaRdGh2UkopDCmtxlUE5gv4E1DrUHftbx0tV52jGMwxorjCwY2heQEHnva58 sRJu2zwsNOdohhRmXWQTSiBxZlixCiUu993zGXAUtyn6ZwyZF8+E4= Received: (qmail 3850 invoked by alias); 6 Dec 2019 00:16:34 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 3678 invoked by uid 89); 6 Dec 2019 00:16:22 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-7.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.1 spammy=DW_OP_addr, DW_OP_mul, 20190827, dw_op_addr X-HELO: us-smtp-1.mimecast.com Received: from us-smtp-delivery-1.mimecast.com (HELO us-smtp-1.mimecast.com) (207.211.31.120) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 06 Dec 2019 00:16:17 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1575591368; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=2N7bIJqD7wVNfxGa9M71dRjDl7GkFFF4JsPeCSNLxoA=; b=fa4FoV8CUifmaEsdpoO+f6bk+ZmeMO66rGHS3IKjjDyHi3KC43LcERdeU39sYPvMOHbhLw haRzGSTB2hDxGlX5I/W18BTp4KIg9nsQw7+IFwSi08Jec4nvRiYUbXpsh7NYZK/tuUes12 QXBVqGF42P7Id+FuLLDwG2vyGvlaMSc= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-253-qc7wGZgqMbWxcDSr2WcsuA-1; Thu, 05 Dec 2019 19:16:05 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 49105107ACC7; Fri, 6 Dec 2019 00:16:04 +0000 (UTC) Received: from tucnak.zalov.cz (ovpn-117-59.ams2.redhat.com [10.36.117.59]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D6ADC5D9C9; Fri, 6 Dec 2019 00:16:03 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.15.2/8.15.2) with ESMTP id xB60G108003544; Fri, 6 Dec 2019 01:16:01 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.15.2/8.15.2/Submit) id xB60G0F3003543; Fri, 6 Dec 2019 01:16:00 +0100 Date: Fri, 6 Dec 2019 01:16:00 +0100 From: Jakub Jelinek To: gcc-patches@gcc.gnu.org, fortran@gcc.gnu.org Subject: [PATCH] Fix up Fortran debug info for arrays with descriptors (PR fortran/92775) Message-ID: <20191206001600.GY10088@tucnak> Reply-To: Jakub Jelinek MIME-Version: 1.0 User-Agent: Mutt/1.11.3 (2019-02-01) X-Mimecast-Spam-Score: 0 Content-Disposition: inline X-IsSubscribed: yes Hi! Before r251949 the debug info for Fortran array descriptors looked correct, for arrays that had GFC_TYPE_ARRAY_SPAN NULL would use for DW_AT_byte_stride DW_OP_push_object_address DW_OP_plus_uconst offsetof (, dim[0].__stride) DW_OP_deref DW_OP_litN DW_OP_mul (where N is the element size in bytes constant), and if GFC_TYPE_ARRAY_SPAN is non-NULL, some span.NN variable, then DW_OP_push_object_address DW_OP_plus_uconst offsetof (, dim[0].__stride) DW_OP_deref DW_OP_addr span.NN DW_OP_deref DW_OP_mul Thus, e.g. first dimension's stride in bytes was computed as descr->dim[0].__stride * element_size or descr->dim[0].__stride * span.NN With that change, the span field has been added to descriptors, but now we always emit the DW_OP_push_object_address DW_OP_plus_uconst offsetof (, dim[0].__stride) DW_OP_deref DW_OP_litN DW_OP_mul (where N is the element size in bytes constant), aka descr->dim[0].__stride * element_size which is incorrect for arrays where descr->span is different from element_size. I unfortunately don't see in TYPE_LANG_SPECIFIC anything left that would record whether the compiler knows the type will certainly have descr->span equal to element_size, or when it might not, so the following patch always uses DW_OP_push_object_address DW_OP_plus_uconst offsetof (, dim[0].__stride) DW_OP_deref DW_OP_push_object_address DW_OP_plus_uconst offsetof (, span) DW_OP_deref DW_OP_mul aka descr->dim[0].__stride * descr->span which should be always? correct, but in the common case is 3 bytes longer than really needed. Unfortunately, I don't know Fortran enough to find out when exactly the compiler knows that descr->span will be always equal to element_size, if somebody could add a bool or unsigned : 1 field into struct lang_type, corresponding macro and make sure it is set correctly, should be trivial to tweak the patch so that if the compiler knows for sure it is a waste to look up descr->span as it must be equal to elem_size to just compute elem_size = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (etype)); the way it used to be before. Just it needs to be something stored on the TYPE_LANG_SPECIFIC, as the type is all this hook is called with. In the meantime, I think it is better to go for correct debug info over saving the 3 bytes in .debug_info per dimension. The patch also removes fields/macros that aren't ever used since r251949 and just waste compile time memory. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2019-12-06 Jakub Jelinek PR fortran/92775 * trans.h (struct lang_type, struct lang_decl): Remove span member. (GFC_DECL_SPAN, GFC_TYPE_ARRAY_SPAN): Remove macros. * trans-array.h (gfc_get_descriptor_offsets_for_info): Add another argument. * trans-array.c (gfc_get_descriptor_offsets_for_info): Add SPAN_OFF argument and initialize *SPAN_OFF to the offset of span field. * trans-types.c (gfc_get_array_descr_info): Adjust gfc_get_descriptor_offsets_for_info caller. Compute elem_size as base->span instead of TYPE_SIZE_UNIT (etype) constant. Jakub --- gcc/fortran/trans.h.jj 2019-11-11 21:04:05.210259346 +0100 +++ gcc/fortran/trans.h 2019-12-05 11:23:55.935237355 +0100 @@ -981,7 +981,6 @@ struct GTY(()) lang_type { tree offset; tree dtype; tree dataptr_type; - tree span; tree base_decl[2]; tree nonrestricted_type; tree caf_token; @@ -997,7 +996,6 @@ struct GTY(()) lang_decl { address of target label. */ tree stringlen; tree addr; - tree span; /* For assumed-shape coarrays. */ tree token, caf_offset; unsigned int scalar_allocatable : 1; @@ -1008,7 +1006,6 @@ struct GTY(()) lang_decl { #define GFC_DECL_ASSIGN_ADDR(node) DECL_LANG_SPECIFIC(node)->addr #define GFC_DECL_STRING_LEN(node) DECL_LANG_SPECIFIC(node)->stringlen -#define GFC_DECL_SPAN(node) DECL_LANG_SPECIFIC(node)->span #define GFC_DECL_TOKEN(node) DECL_LANG_SPECIFIC(node)->token #define GFC_DECL_CAF_OFFSET(node) DECL_LANG_SPECIFIC(node)->caf_offset #define GFC_DECL_SAVED_DESCRIPTOR(node) \ @@ -1059,7 +1056,6 @@ struct GTY(()) lang_decl { #define GFC_TYPE_ARRAY_DTYPE(node) (TYPE_LANG_SPECIFIC(node)->dtype) #define GFC_TYPE_ARRAY_DATAPTR_TYPE(node) \ (TYPE_LANG_SPECIFIC(node)->dataptr_type) -#define GFC_TYPE_ARRAY_SPAN(node) (TYPE_LANG_SPECIFIC(node)->span) #define GFC_TYPE_ARRAY_BASE_DECL(node, internal) \ (TYPE_LANG_SPECIFIC(node)->base_decl[(internal)]) --- gcc/fortran/trans-array.h.jj 2019-09-26 22:02:40.236457478 +0200 +++ gcc/fortran/trans-array.h 2019-12-05 11:07:52.255125510 +0100 @@ -163,7 +163,7 @@ void gfc_trans_array_cobounds (tree, stm /* Build expressions for accessing components of an array descriptor. */ void gfc_get_descriptor_offsets_for_info (const_tree, tree *, tree *, tree *, tree *, - tree *, tree *, tree *); + tree *, tree *, tree *, tree *); tree gfc_conv_descriptor_data_get (tree); tree gfc_conv_descriptor_data_addr (tree); --- gcc/fortran/trans-array.c.jj 2019-11-01 09:01:50.111998535 +0100 +++ gcc/fortran/trans-array.c 2019-12-05 11:09:38.545483494 +0100 @@ -540,9 +540,10 @@ gfc_conv_shift_descriptor_lbound (stmtbl void gfc_get_descriptor_offsets_for_info (const_tree desc_type, tree *data_off, - tree *dtype_off, tree *dim_off, - tree *dim_size, tree *stride_suboff, - tree *lower_suboff, tree *upper_suboff) + tree *dtype_off, tree *span_off, + tree *dim_off, tree *dim_size, + tree *stride_suboff, tree *lower_suboff, + tree *upper_suboff) { tree field; tree type; @@ -552,6 +553,8 @@ gfc_get_descriptor_offsets_for_info (con *data_off = byte_position (field); field = gfc_advance_chain (TYPE_FIELDS (type), DTYPE_FIELD); *dtype_off = byte_position (field); + field = gfc_advance_chain (TYPE_FIELDS (type), SPAN_FIELD); + *span_off = byte_position (field); field = gfc_advance_chain (TYPE_FIELDS (type), DIMENSION_FIELD); *dim_off = byte_position (field); type = TREE_TYPE (TREE_TYPE (field)); --- gcc/fortran/trans-types.c.jj 2019-08-27 12:27:05.678497543 +0200 +++ gcc/fortran/trans-types.c 2019-12-05 11:39:33.868747876 +0100 @@ -3266,7 +3266,7 @@ gfc_get_array_descr_info (const_tree typ int rank, dim; bool indirect = false; tree etype, ptype, t, base_decl; - tree data_off, dim_off, dtype_off, dim_size, elem_size; + tree data_off, span_off, dim_off, dtype_off, dim_size, elem_size; tree lower_suboff, upper_suboff, stride_suboff; tree dtype, field, rank_off; @@ -3323,12 +3323,13 @@ gfc_get_array_descr_info (const_tree typ if (indirect) base_decl = build1 (INDIRECT_REF, ptype, base_decl); - elem_size = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (etype)); - - gfc_get_descriptor_offsets_for_info (type, &data_off, &dtype_off, &dim_off, - &dim_size, &stride_suboff, + gfc_get_descriptor_offsets_for_info (type, &data_off, &dtype_off, &span_off, + &dim_off, &dim_size, &stride_suboff, &lower_suboff, &upper_suboff); + t = fold_build_pointer_plus (base_decl, span_off); + elem_size = build1 (INDIRECT_REF, gfc_array_index_type, t); + t = base_decl; if (!integer_zerop (data_off)) t = fold_build_pointer_plus (t, data_off);