From patchwork Thu Jan 12 11:45:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Vehreschild X-Patchwork-Id: 91126 Delivered-To: patch@linaro.org Received: by 10.140.20.99 with SMTP id 90csp1578289qgi; Thu, 12 Jan 2017 03:46:30 -0800 (PST) X-Received: by 10.84.194.37 with SMTP id g34mr20832984pld.105.1484221590381; Thu, 12 Jan 2017 03:46:30 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id 72si4188938pfj.150.2017.01.12.03.46.30 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 12 Jan 2017 03:46:30 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-return-445953-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org; spf=pass (google.com: domain of gcc-patches-return-445953-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-445953-patch=linaro.org@gcc.gnu.org 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:mime-version:content-type; q=dns; s= default; b=wjAKGKe2rH8ZvqMWgNLYw/Ae1J5E+upf2v3KZFvg8QISCPBrlMlEK ks7DuuXX/2kUDZmO7EbAG1ryjz0l5WxofhsdSFW9p8SvNqBCRHrV/Ur6BvskMkGh iY1mm97pwN0mIJwFOVpKuQm8WFrcBj0Ht5EaA3jwYu2wvPIbbaU7cs= 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:mime-version:content-type; s= default; bh=ppNPFv836FrELw4xFYlcmunugvk=; b=du9bbdlmOrAKCvxcgNxB mCX6O9uOiXoFi4zjqg1L4r5IKeiY6S5V6xJQNAUwT6oKlpoM8sMSstz90lSWyiX/ VOrwXKAimHntb+/qnVBQ8RHOw/voFrHcYEkqgBQQRHyVwF1z9ZOcNfb6KfA6FwXf HZzxRBJuMw+hf/at6k4LoF0= Received: (qmail 100510 invoked by alias); 12 Jan 2017 11:46:17 -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 100457 invoked by uid 89); 12 Jan 2017 11:46:14 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy=caf, 1419, Hx-languages-length:3155, 70696 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mout.gmx.net Received: from mout.gmx.net (HELO mout.gmx.net) (212.227.15.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 12 Jan 2017 11:46:04 +0000 Received: from vepi2 ([92.76.205.227]) by mail.gmx.com (mrgmx002 [212.227.17.190]) with ESMTPSA (Nemesis) id 0MRo6b-1c33ao3neD-00T0NH; Thu, 12 Jan 2017 12:46:00 +0100 Date: Thu, 12 Jan 2017 12:45:58 +0100 From: Andre Vehreschild To: GCC-Patches-ML , GCC-Fortran-ML Subject: [PATCH, Fortran, pr70696, v1] [Coarray] ICE on EVENT POST of host-associated EVENT_TYPE coarray Message-ID: <20170112124558.6f8de516@vepi2> MIME-Version: 1.0 X-UI-Out-Filterresults: notjunk:1; V01:K0:Fvuev/6Ua2Q=:mc1+wtZLNz6bBfIODx81nE 61BdNaUMJVSGQqRVfG/JDYgNj60NcvF+Jus1InK5a6MTdBsIOvZGFgZltF7Fg/D5xPnYgm040 KKk1XtogAAM5OFQxQLyMh00lw6HdU1TyGXG5DpOjOgDOfGcBP2IKGJiXiXiP5leHXiWp2fGfO SJXQ3USTR0tPxRO6qGT911y9DCrYZqWVBnq2gzOP4xIZCHrNlTC6x4yPZ1rVSK8Kjc33VTDMw S3B8rT7CLKIqhigoDu9ZgcAuXKoh97v908wqbDCbOcMnBBfDTiIxLMUiHsDGT+6qD3to4cFrS UW6w4pdygV+bJ2kp+qoBW9VoI9f9My4ALfdApqnLlDB/GvPXBsbX/9VONK0CApR3pETcKH4n/ 79ztSYD24v3Y0NNPed7z/ltxDE/3xGSdoMxJixvjt7yaf31/d252GfWrAoc0W8n93+h8jcbwk 39KWSBCGGeukosNEtAB9LU2dnWwYiqyK5JeJW1Am5DVBGJY2NulchtO2RwgEyOhnSf/kPTih3 MFthY2vAJlvrdR9PsGFf6Ipi/uqQWvn2XIfFh0VkMkBhFULAHo7RnIekAqKskOsbDowVI7H27 WeVSDuMPRpF1Zwmf9ynqPpScIddvrDI14xoMXx+0Q+k+qtff9f6L3FYLYT1oBhKOwJJnM7enz /gkxM8ZCVgSJdPu4vprTxqWDXUkpWMoyd8z5yCH3hxYIYV2MG0KF9vPpA0q4PuvQpGtDKTvpp faw2JIKnq5BAxqm7XAnE9Vzo5S7MGy47xoxZLrK4sfPwRGJ/uLdNW3hHcIU= Hi all, attached patch fixes the ICE when using an event in a subroutine. The reason for the ICE was that the backend_decl of the symbol to event on was not set when accessed. The patch ensures this. Furthermore did I fix a invalid memory access in the caf_single lib, where to less memory was allocated in the registration of the event. Bootstraps and regtests ok on x86_64-linux/F25. Ok for trunk? Regards, Andre -- Andre Vehreschild * Email: vehre ad gmx dot de gcc/testsuite/ChangeLog: 2017-01-12 Andre Vehreschild PR fortran/70696 * gfortran.dg/coarray/event_3.f08: New test. gcc/fortran/ChangeLog: 2017-01-12 Andre Vehreschild PR fortran/70696 * trans-expr.c (gfc_get_tree_for_caf_expr): Ensure the backend_decl is valid before accessing it. libgfortran/ChangeLog: 2017-01-12 Andre Vehreschild PR fortran/70696 * caf/single.c (_gfortran_caf_register): Allocate enough memory for the event counter. diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index caaee6b..01b7dd2 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -1838,6 +1838,10 @@ gfc_get_tree_for_caf_expr (gfc_expr *expr) "component at %L is not supported", &expr->where); } + /* Make sure the backend_decl is present before accessing it. */ + if (expr->symtree->n.sym->backend_decl == NULL_TREE) + expr->symtree->n.sym->backend_decl + = gfc_get_symbol_decl (expr->symtree->n.sym); caf_decl = expr->symtree->n.sym->backend_decl; gcc_assert (caf_decl); if (expr->symtree->n.sym->ts.type == BT_CLASS) diff --git a/gcc/testsuite/gfortran.dg/coarray/event_3.f08 b/gcc/testsuite/gfortran.dg/coarray/event_3.f08 new file mode 100644 index 0000000..f6e28b7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray/event_3.f08 @@ -0,0 +1,20 @@ +! { dg-do run } +! +! Check PR fortran/70696 is fixed. + +program global_event + use iso_fortran_env , only : event_type + implicit none + type(event_type) :: x[*] + + call exchange + contains + subroutine exchange + integer :: cnt + event post(x[1]) + event post(x[1]) + call event_query(x, cnt) + if (cnt /= 2) error stop 1 + event wait(x, until_count=2) + end subroutine +end diff --git a/libgfortran/caf/single.c b/libgfortran/caf/single.c index cf78a1a..8d3bcbf 100644 --- a/libgfortran/caf/single.c +++ b/libgfortran/caf/single.c @@ -141,9 +141,12 @@ _gfortran_caf_register (size_t size, caf_register_t type, caf_token_t *token, caf_single_token_t single_token; if (type == CAF_REGTYPE_LOCK_STATIC || type == CAF_REGTYPE_LOCK_ALLOC - || type == CAF_REGTYPE_CRITICAL || type == CAF_REGTYPE_EVENT_STATIC - || type == CAF_REGTYPE_EVENT_ALLOC) + || type == CAF_REGTYPE_CRITICAL) local = calloc (size, sizeof (bool)); + else if (type == CAF_REGTYPE_EVENT_STATIC || type == CAF_REGTYPE_EVENT_ALLOC) + /* In the event_(wait|post) function the counter for events is a uint32, + so better allocate enough memory here. */ + local = calloc (size, sizeof (uint32_t)); else if (type == CAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY) local = NULL; else