From patchwork Thu Jul 7 13:26:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Thomas Schwinge X-Patchwork-Id: 55842 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0818C385C420 for ; Thu, 7 Jul 2022 13:26:34 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from esa3.mentor.iphmx.com (esa3.mentor.iphmx.com [68.232.137.180]) by sourceware.org (Postfix) with ESMTPS id E04EC3857BBB for ; Thu, 7 Jul 2022 13:26:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E04EC3857BBB Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="5.92,253,1650960000"; d="scan'208,223";a="78340383" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa3.mentor.iphmx.com with ESMTP; 07 Jul 2022 05:26:11 -0800 IronPort-SDR: l+XGrCg7vFM4ChdRpvOistlx4KAmGRoX8Iq/6/s2HQURIr1OnCR2YXj8LNMhsOxZw+cl4yGgC1 o9cQ5dHy5nNVqTcWtHtNXX9qs1nnBn6ALyZy2eIGmWQLgPyU+I8GLxQhp1L9VsWVXJOSgD1E6L hyzbosFzGcuz+EH97iG8r8c6QqLP5mcKSlsyMbykITreX38ccXLFX+5WoS8SXPmXqVtXaTQrkH yOajU02yhvbk2oU79ohdzEVOvXi7rIQorJxBnKedbiFYcfXxnSpwqQ9YFNOayA51DXyjJxXFJe WYE= From: Thomas Schwinge To: Tobias Burnus , Subject: Fix one issue in OpenMP 'requires' directive diagnostics (was: [Patch][v5] OpenMP: Move omp requires checks to libgomp) In-Reply-To: <4d42ab12-53bd-f564-25df-2e8c890f406a@codesourcery.com> References: <7f9c91c1-a479-f94f-ac14-1d6827ce671b@codesourcery.com> <5576fa00-0ddd-8046-17c1-d1cea82bdcf5@codesourcery.com> <77331328-4961-9dab-db58-b5b03daf218c@codesourcery.com> <16ca2aa4-7e73-cf9d-9482-dd59f5b0cdae@codesourcery.com> <4d42ab12-53bd-f564-25df-2e8c890f406a@codesourcery.com> User-Agent: Notmuch/0.29.3+94~g74c3f1b (https://notmuchmail.org) Emacs/27.1 (x86_64-pc-linux-gnu) Date: Thu, 7 Jul 2022 15:26:02 +0200 Message-ID: <87h73t3vh1.fsf@euler.schwinge.homeip.net> MIME-Version: 1.0 X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-14.mgc.mentorg.com (139.181.222.14) To svr-ies-mbx-10.mgc.mentorg.com (139.181.222.10) X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jakub Jelinek Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Hi! On 2022-07-01T23:08:16+0200, Tobias Burnus wrote: > Updated version attached – I hope I got everything right, but I start to > get tired, I am not 100% sure. ..., and so the obligatory copy'n'past-o ;-) crept in: > --- a/gcc/lto-cgraph.cc > +++ b/gcc/lto-cgraph.cc > @@ -1773,6 +1804,10 @@ input_offload_tables (bool do_force_output) > struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data (); > struct lto_file_decl_data *file_data; > unsigned int j = 0; > + const char *requires_fn = NULL; > + tree requires_decl = NULL_TREE; > + > + omp_requires_mask = (omp_requires) 0; > > while ((file_data = file_data_vec[j++])) > { > @@ -1784,6 +1819,7 @@ input_offload_tables (bool do_force_output) > if (!ib) > continue; > > + tree tmp_decl = NULL_TREE; > enum LTO_symtab_tags tag > = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag); > while (tag) > @@ -1799,6 +1835,7 @@ input_offload_tables (bool do_force_output) > LTO mode. */ > if (do_force_output) > cgraph_node::get (fn_decl)->mark_force_output (); > + tmp_decl = fn_decl; > } > else if (tag == LTO_symtab_variable) > { > @@ -1810,6 +1847,72 @@ input_offload_tables (bool do_force_output) > may be no refs to var_decl in offload LTO mode. */ > if (do_force_output) > varpool_node::get (var_decl)->force_output = 1; > + tmp_decl = var_decl; > + } > + else if (tag == LTO_symtab_edge) > + { > + static bool error_emitted = false; > + HOST_WIDE_INT val = streamer_read_hwi (ib); > + > + if (omp_requires_mask == 0) > + { > + omp_requires_mask = (omp_requires) val; > + requires_decl = tmp_decl; > + requires_fn = file_data->file_name; > + } > + else if (omp_requires_mask != val && !error_emitted) > + { > + const char *fn1 = requires_fn; > + if (requires_decl != NULL_TREE) > + { > + while (DECL_CONTEXT (requires_decl) != NULL_TREE > + && TREE_CODE (requires_decl) != TRANSLATION_UNIT_DECL) > + requires_decl = DECL_CONTEXT (requires_decl); > + if (requires_decl != NULL_TREE) > + fn1 = IDENTIFIER_POINTER (DECL_NAME (requires_decl)); > + } > + > + const char *fn2 = file_data->file_name; > + if (tmp_decl != NULL_TREE) > + { > + while (DECL_CONTEXT (tmp_decl) != NULL_TREE > + && TREE_CODE (tmp_decl) != TRANSLATION_UNIT_DECL) > + tmp_decl = DECL_CONTEXT (tmp_decl); > + if (tmp_decl != NULL_TREE) > + fn2 = IDENTIFIER_POINTER (DECL_NAME (requires_decl)); > + } ... here: tmp_decl' not 'requires_decl'. OK to push the attached "Fix one issue in OpenMP 'requires' directive diagnostics"? I'd even push that one "as obvious", but thought I'd ask whether you maybe have a quick idea about the XFAILs that I'm adding? (I'm otherwise not planning on resolving that issue at this time.) > + > + char buf1[sizeof ("unified_address, unified_shared_memory, " > + "reverse_offload")]; > + char buf2[sizeof ("unified_address, unified_shared_memory, " > + "reverse_offload")]; > + omp_requires_to_name (buf2, sizeof (buf2), > + val != OMP_REQUIRES_TARGET_USED > + ? val > + : (HOST_WIDE_INT) omp_requires_mask); > + if (val != OMP_REQUIRES_TARGET_USED > + && omp_requires_mask != OMP_REQUIRES_TARGET_USED) > + { > + omp_requires_to_name (buf1, sizeof (buf1), > + omp_requires_mask); > + error ("OpenMP % directive with non-identical " > + "clauses in multiple compilation units: %qs vs. " > + "%qs", buf1, buf2); > + inform (UNKNOWN_LOCATION, "%qs has %qs", fn1, buf1); > + inform (UNKNOWN_LOCATION, "%qs has %qs", fn2, buf2); > + } > + else > + { > + error ("OpenMP % directive with %qs specified " > + "only in some compilation units", buf2); > + inform (UNKNOWN_LOCATION, "%qs has %qs", > + val != OMP_REQUIRES_TARGET_USED ? fn2 : fn1, > + buf2); > + inform (UNKNOWN_LOCATION, "but %qs has not", > + val != OMP_REQUIRES_TARGET_USED ? fn1 : fn2); > + } > + error_emitted = true; > + } > } > else > fatal_error (input_location, Grüße Thomas ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955 From 2271282f127366e785601242a46d4aa668bd6660 Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Thu, 7 Jul 2022 15:11:03 +0200 Subject: [PATCH] Fix one issue in OpenMP 'requires' directive diagnostics Fix-up for recent commit 683f11843974f0bdf42f79cdcbb0c2b43c7b81b0 "OpenMP: Move omp requires checks to libgomp". gcc/ * lto-cgraph.cc (input_offload_tables) : Correct 'fn2' computation. libgomp/ * testsuite/libgomp.c-c++-common/requires-1.c: Add 'dg-note's. * testsuite/libgomp.c-c++-common/requires-2.c: Likewise. * testsuite/libgomp.c-c++-common/requires-3.c: Likewise. * testsuite/libgomp.c-c++-common/requires-7.c: Likewise. * testsuite/libgomp.fortran/requires-1.f90: Likewise. --- gcc/lto-cgraph.cc | 2 +- libgomp/testsuite/libgomp.c-c++-common/requires-1.c | 4 +++- libgomp/testsuite/libgomp.c-c++-common/requires-2.c | 4 +++- libgomp/testsuite/libgomp.c-c++-common/requires-3.c | 4 +++- libgomp/testsuite/libgomp.c-c++-common/requires-7.c | 7 ++++++- libgomp/testsuite/libgomp.fortran/requires-1.f90 | 5 +++++ 6 files changed, 21 insertions(+), 5 deletions(-) diff --git a/gcc/lto-cgraph.cc b/gcc/lto-cgraph.cc index 48629651e31..6d9c36ea8b6 100644 --- a/gcc/lto-cgraph.cc +++ b/gcc/lto-cgraph.cc @@ -1879,7 +1879,7 @@ input_offload_tables (bool do_force_output) && TREE_CODE (tmp_decl) != TRANSLATION_UNIT_DECL) tmp_decl = DECL_CONTEXT (tmp_decl); if (tmp_decl != NULL_TREE) - fn2 = IDENTIFIER_POINTER (DECL_NAME (requires_decl)); + fn2 = IDENTIFIER_POINTER (DECL_NAME (tmp_decl)); } char buf1[sizeof ("unified_address, unified_shared_memory, " diff --git a/libgomp/testsuite/libgomp.c-c++-common/requires-1.c b/libgomp/testsuite/libgomp.c-c++-common/requires-1.c index ab9a8ddfcde..31996f1ecf6 100644 --- a/libgomp/testsuite/libgomp.c-c++-common/requires-1.c +++ b/libgomp/testsuite/libgomp.c-c++-common/requires-1.c @@ -20,5 +20,7 @@ main (void) return 0; } -/* { dg-error "OpenMP 'requires' directive with non-identical clauses in multiple compilation units: 'unified_shared_memory' vs. 'unified_address'" "" { target *-*-* } 0 } */ +/* { dg-error "OpenMP 'requires' directive with non-identical clauses in multiple compilation units: 'unified_shared_memory' vs. 'unified_address'" "" { target *-*-* } 0 } + { dg-note {requires-1\.c' has 'unified_shared_memory'} {} { target *-*-* } 0 } + { dg-note {requires-1-aux\.c' has 'unified_address'} {} { target *-*-* } 0 } */ /* { dg-excess-errors "Ignore messages like: errors during merging of translation units|mkoffload returned 1 exit status" } */ diff --git a/libgomp/testsuite/libgomp.c-c++-common/requires-2.c b/libgomp/testsuite/libgomp.c-c++-common/requires-2.c index be1830d0c46..b20e154b0c7 100644 --- a/libgomp/testsuite/libgomp.c-c++-common/requires-2.c +++ b/libgomp/testsuite/libgomp.c-c++-common/requires-2.c @@ -21,5 +21,7 @@ main (void) return 0; } -/* { dg-error "OpenMP 'requires' directive with 'unified_shared_memory' specified only in some compilation units" "" { target *-*-* } 0 } */ +/* { dg-error "OpenMP 'requires' directive with 'unified_shared_memory' specified only in some compilation units" "" { target *-*-* } 0 } + { dg-note {requires-2\.c' has 'unified_shared_memory'} {} { target *-*-* } 0 } + { dg-note {but '[^']*requires-2-aux\.c' has not} {} { target *-*-* } 0 } */ /* { dg-excess-errors "Ignore messages like: errors during merging of translation units|mkoffload returned 1 exit status" } */ diff --git a/libgomp/testsuite/libgomp.c-c++-common/requires-3.c b/libgomp/testsuite/libgomp.c-c++-common/requires-3.c index 1c204c8a21e..a549a19ebbb 100644 --- a/libgomp/testsuite/libgomp.c-c++-common/requires-3.c +++ b/libgomp/testsuite/libgomp.c-c++-common/requires-3.c @@ -20,5 +20,7 @@ main (void) return 0; } -/* { dg-error "OpenMP 'requires' directive with non-identical clauses in multiple compilation units: 'unified_address, unified_shared_memory' vs. 'unified_address'" "" { target *-*-* } 0 } */ +/* { dg-error "OpenMP 'requires' directive with non-identical clauses in multiple compilation units: 'unified_address, unified_shared_memory' vs. 'unified_address'" "" { target *-*-* } 0 } + { dg-note {requires-3\.c' has 'unified_address, unified_shared_memory'} {} { target *-*-* } 0 } + { dg-note {requires-3-aux\.c' has 'unified_address'} {} { target *-*-* } 0 } */ /* { dg-excess-errors "Ignore messages like: errors during merging of translation units|mkoffload returned 1 exit status" } */ diff --git a/libgomp/testsuite/libgomp.c-c++-common/requires-7.c b/libgomp/testsuite/libgomp.c-c++-common/requires-7.c index 7473aa62e08..370ed338e4c 100644 --- a/libgomp/testsuite/libgomp.c-c++-common/requires-7.c +++ b/libgomp/testsuite/libgomp.c-c++-common/requires-7.c @@ -20,5 +20,10 @@ main (void) return 0; } -/* { dg-error "OpenMP 'requires' directive with non-identical clauses in multiple compilation units: 'unified_shared_memory' vs. 'unified_address'" "" { target *-*-* } 0 } */ +/* { dg-error "OpenMP 'requires' directive with non-identical clauses in multiple compilation units: 'unified_shared_memory' vs. 'unified_address'" "" { target *-*-* } 0 } + { dg-note {requires-7\.c' has 'unified_shared_memory'} {} { target *-*-* } 0 } + TODO There is some issue that we're not seeing the source file name here (but a temporary '*.o' instead): + { dg-note {requires-7-aux\.c' has 'unified_address'} {} { xfail *-*-* } 0 } + ..., so verify that at least the rest of the diagnostic is correct: + { dg-note {' has 'unified_address'} {} { target *-*-* } 0 } */ /* { dg-excess-errors "Ignore messages like: errors during merging of translation units|mkoffload returned 1 exit status" } */ diff --git a/libgomp/testsuite/libgomp.fortran/requires-1.f90 b/libgomp/testsuite/libgomp.fortran/requires-1.f90 index e957b1b5918..59211496c33 100644 --- a/libgomp/testsuite/libgomp.fortran/requires-1.f90 +++ b/libgomp/testsuite/libgomp.fortran/requires-1.f90 @@ -23,4 +23,9 @@ program main end ! { dg-error "OpenMP 'requires' directive with non-identical clauses in multiple compilation units: 'unified_shared_memory' vs. 'unified_address'" "" { target *-*-* } 0 } +! { dg-note {requires-1\.f90' has 'unified_shared_memory'} {} { target *-*-* } 0 } +! TODO There is some issue that we're not seeing the source file name here (but a temporary '*.o' instead): +! { dg-note {requires-1-aux\.f90' has 'unified_address'} {} { xfail *-*-* } 0 } +! ..., so verify that at least the rest of the diagnostic is correct: +! { dg-note {' has 'unified_address'} {} { target *-*-* } 0 } ! { dg-excess-errors "Ignore messages like: errors during merging of translation units|mkoffload returned 1 exit status" } -- 2.35.1