From patchwork Fri Jan 2 11:28:10 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tobias Burnus X-Patchwork-Id: 424979 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org 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 2D40314009B for ; Fri, 2 Jan 2015 22:28:42 +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 :message-id:date:from:mime-version:to:subject:content-type; q= dns; s=default; b=tb3cfKEPSESxRdWHfEtVEDhJ1AWB/wllAOlK9qE0WeLCUO gi61kgyY49Ci9cP1RjDgG/cyy2HxaewQTRfNmFgKZRp8SKk8SzyYkmyMpVHVkHcB 9PN6hzgBXwPDeOsgMyY8D8PaHWjMN8z9vvHA3+Ob955V6TfGqolaSJCc7KLow= 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 :message-id:date:from:mime-version:to:subject:content-type; s= default; bh=Q6XFNJZHNaq5RaiDyqrX8NHn6ZQ=; b=UsXSA3aW8U5VxvFRDu4D lLc21dbrooZu9iWf1mH8xHo6ecEzVkkfH/3pEvAJiYFCkFUIWZIOOUZcX5oK2DzD AjA6FMJoe3cKIuPxspxhy//rCzASzhGsq5X3bW6HSL8Y8Gr0rgZglsAO8fMUTPWT kIhMhQsk4z7zKGX8y5LVMfQ= Received: (qmail 23785 invoked by alias); 2 Jan 2015 11:28:30 -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 23765 invoked by uid 89); 2 Jan 2015 11:28:29 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.2 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mx01.qsc.de Received: from mx01.qsc.de (HELO mx01.qsc.de) (213.148.129.14) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Fri, 02 Jan 2015 11:28:27 +0000 Received: from tux.net-b.de (unknown [89.204.155.114]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx01.qsc.de (Postfix) with ESMTPSA id 1E6AC3CE29; Fri, 2 Jan 2015 12:28:17 +0100 (CET) Message-ID: <54A680CA.90509@net-b.de> Date: Fri, 02 Jan 2015 12:28:10 +0100 From: Tobias Burnus User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.3.0 MIME-Version: 1.0 To: gcc-patches , gfortran , Alessandro Fanfarillo , Mike Stump Subject: [Patch, Fortran + Testsuite] Fix coarray handling in modules As found by Alessandro: Statically allocated coarrays in declared in the specification part of a module didn't work (link-time failure). The reason was that the associated coarray token was wrongly mangled and not a public tree. I additionally propagated the dg-compile-aux-modules support to caf.dg (currently unused). That's fixed by the attached patch. OK for the trunk? Tobias 2015-01-02 Tobias Burnus * trans-decl.c (gfc_build_qualified_array): Fix coarray tokens for module coarrays with -fcoarray=lib. 2015-01-02 Tobias Burnus * gfortran.dg/coarray/caf.exp (dg-compile-aux-modules): Add. * gfortran.dg/coarray/codimension_2.f90: New. * gfortran.dg/coarray/codimension_2a.f90: New. * gfortran.dg/coarray_35.f90: New. * gfortran.dg/coarray_35a.f90: New. diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 75b84f1..9ef6bfc 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -819,10 +819,22 @@ gfc_build_qualified_array (tree decl, gfc_symbol * sym) && GFC_TYPE_ARRAY_CAF_TOKEN (type) == NULL_TREE) { tree token; + tree token_type = build_qualified_type (pvoid_type_node, + TYPE_QUAL_RESTRICT); + + if (sym->module && (sym->attr.use_assoc + || sym->ns->proc_name->attr.flavor == FL_MODULE)) + { + tree token_name + = get_identifier (gfc_get_string (GFC_PREFIX ("caf_token%s"), + IDENTIFIER_POINTER (gfc_sym_mangled_identifier (sym)))); + token = build_decl (DECL_SOURCE_LOCATION (decl), VAR_DECL, token_name, + token_type); + TREE_PUBLIC (token) = 1; + } + else + token = gfc_create_var_np (token_type, "caf_token"); - token = gfc_create_var_np (build_qualified_type (pvoid_type_node, - TYPE_QUAL_RESTRICT), - "caf_token"); GFC_TYPE_ARRAY_CAF_TOKEN (type) = token; DECL_ARTIFICIAL (token) = 1; TREE_STATIC (token) = 1; diff --git a/gcc/testsuite/gfortran.dg/coarray/caf.exp b/gcc/testsuite/gfortran.dg/coarray/caf.exp index 011b5c9..e4e3798 100644 --- a/gcc/testsuite/gfortran.dg/coarray/caf.exp +++ b/gcc/testsuite/gfortran.dg/coarray/caf.exp @@ -43,6 +43,21 @@ global DG_TORTURE_OPTIONS torture_with_loops torture-init set-torture-options $DG_TORTURE_OPTIONS +global gfortran_test_path +global gfortran_aux_module_flags +set gfortran_test_path $srcdir/$subdir +set gfortran_aux_module_flags $DEFAULT_FFLAGS +proc dg-compile-aux-modules { args } { + global gfortran_test_path + global gfortran_aux_module_flags + if { [llength $args] != 2 } { + error "dg-set-target-env-var: needs one argument" + return + } + dg-test $gfortran_test_path/[lindex $args 1] "" $gfortran_aux_module_flags + # cleanup-modules isn't intentionally invoked here. +} + # Main loop. foreach test [lsort [glob -nocomplain $srcdir/$subdir/*.\[fF\]{,90,95,03,08} ]] { # If we're only testing specific files and this isn't one of them, skip it. @@ -65,12 +80,14 @@ foreach test [lsort [glob -nocomplain $srcdir/$subdir/*.\[fF\]{,90,95,03,08} ]] foreach flags $option_list { verbose "Testing $nshort (single), $flags" 1 + set gfortran_aux_module_flags "-fcoarray=single $flags" dg-test $test "-fcoarray=single $flags" "" cleanup-modules "" } foreach flags $option_list { verbose "Testing $nshort (libcaf_single), $flags" 1 + set gfortran_aux_module_flags "-fcoarray=lib $flags -lcaf_single" dg-test $test "-fcoarray=lib $flags -lcaf_single" "" cleanup-modules "" } diff --git a/gcc/testsuite/gfortran.dg/coarray/codimension_2.f90 b/gcc/testsuite/gfortran.dg/coarray/codimension_2.f90 new file mode 100644 index 0000000..b211f9b --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray/codimension_2.f90 @@ -0,0 +1,14 @@ +! { dg-do link } +! { dg-additional-sources codimension_2a.f90 } +! +! To be used with codimension_2a.f90 +! Check that the coarray declared in the module is accessible +! by doing a link test +! +! Contributed by Alessandro Fanfarillo. +! +module global_coarrays + implicit none + integer,parameter :: n=10 + integer :: b(10)[*] +end module global_coarrays diff --git a/gcc/testsuite/gfortran.dg/coarray/codimension_2a.f90 b/gcc/testsuite/gfortran.dg/coarray/codimension_2a.f90 new file mode 100644 index 0000000..8eb472c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray/codimension_2a.f90 @@ -0,0 +1,26 @@ +! { dg-do compile { target { ! *-*-* } } } +! SKIP THIS FILE +! +! Used by codimension_2.f90 +! +! Check that the coarray declared in the module is accessible +! by doing a link test +! +! Contributed by Alessandro Fanfarillo. +! +program testmod + use global_coarrays + implicit none + + integer :: me + + me = this_image() + + b = me + + if(me==1) then + b(:) = b(:)[2] + write(*,*) b + end if + +end program testmod diff --git a/gcc/testsuite/gfortran.dg/coarray/collectives_4.f90 b/gcc/testsuite/gfortran.dg/coarray/collectives_4.f90 new file mode 100644 index 0000000..6e7be46 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray/collectives_4.f90 @@ -0,0 +1,24 @@ +! { dg-do run } +! +! CO_REDUCE +! +implicit none (type, external) +intrinsic :: co_reduce +integer :: stat +integer :: i4, i4_2, i + +i4 = 21 * this_image() +i4_2 = 21 +do i = 2, num_images() + i4_2 = i4_2 * 21 * i +end do +call co_reduce(i4, op_i4, stat=stat) +if (stat /= 0) call abort() +if (i4_2 /= i4) call abort() + +contains + pure integer function op_i4(a,b) + integer, value :: a, b + op_i4 = a * b + end function op_i4 +end diff --git a/gcc/testsuite/gfortran.dg/coarray_35.f90 b/gcc/testsuite/gfortran.dg/coarray_35.f90 new file mode 100644 index 0000000..e65f8fe --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray_35.f90 @@ -0,0 +1,17 @@ +! { dg-do compile } +! { dg-options "-fcoarray=lib" } +! +! To be used with coarray_35a.f90 +! Check that the coarray declared in the module is accessible +! by checking the assembler name +! +! Contributed by Alessandro Fanfarillo. +! +module global_coarrays + implicit none + integer,parameter :: n=10 + integer :: b(10)[*] +end module global_coarrays + +! Check for the symbol of the coarray token (w/o system-dependend prefix) +! { dg-final { scan-assembler "caf_token__global_coarrays_MOD_b" } } diff --git a/gcc/testsuite/gfortran.dg/coarray_35a.f90 b/gcc/testsuite/gfortran.dg/coarray_35a.f90 new file mode 100644 index 0000000..eeeb289 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray_35a.f90 @@ -0,0 +1,28 @@ +! { dg-do compile } +! { dg-options "-fcoarray=lib" } +! { dg-compile-aux-modules "coarray_35.f90" } +! +! Check that the coarray declared in the module is accessible +! by checking the assembler name +! +! Contributed by Alessandro Fanfarillo. +! +program testmod + use global_coarrays + implicit none + + integer :: me + + me = this_image() + + b = me + + if(me==1) then + b(:) = b(:)[2] + write(*,*) b + end if + +end program testmod + +! Check for the symbol of the coarray token (w/o system-dependend prefix) +! { dg-final { scan-assembler "caf_token__global_coarrays_MOD_b" } }