From patchwork Wed Jul 6 11:04:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Thomas Schwinge X-Patchwork-Id: 1652929 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=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LdGss6smXz9s1l for ; Wed, 6 Jul 2022 21:05:20 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 80F6C3853563 for ; Wed, 6 Jul 2022 11:05:17 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from esa1.mentor.iphmx.com (esa1.mentor.iphmx.com [68.232.129.153]) by sourceware.org (Postfix) with ESMTPS id 5F48B3858404 for ; Wed, 6 Jul 2022 11:05:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5F48B3858404 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,249,1650960000"; d="scan'208,223";a="81044691" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa1.mentor.iphmx.com with ESMTP; 06 Jul 2022 03:05:00 -0800 IronPort-SDR: sx3V4CZ36DpTsL7VXal8Z7bEc/pBo5zNXTdWr1r0lE+aCK6KjvYTCGMT0e42Jl4bVjiDOKzevj zqVq8VA+M8EFgYI8KrVlFuiiZWod8SfPr1kMhFlhd01dJQRgLW4gVOwfYOo4LHwd7dDsSGHfq7 PqgVt2ahPzvMM53MPofEIGN7JhsfaPOwu2E4bgMh1oKgpXzIACvj4tZ8v+Nzmy/SksfmlhAA92 yXFHNsRR63nFER5pNYwi2ZJUOvH9gSVD1tB/YfN1ziQtoQ3DjWe5a0DIAkpYiU5Vpj92xwvYXs Fjw= From: Thomas Schwinge To: Tobias Burnus , Subject: Fix Intel MIC 'mkoffload' for OpenMP 'requires' (was: [Patch] OpenMP: Move omp requires checks to libgomp) In-Reply-To: <07fec82a-41cf-fdc5-6307-c068dd95ef1a@mentor.com> References: <07fec82a-41cf-fdc5-6307-c068dd95ef1a@mentor.com> User-Agent: Notmuch/0.29.3+94~g74c3f1b (https://notmuchmail.org) Emacs/27.1 (x86_64-pc-linux-gnu) Date: Wed, 6 Jul 2022 13:04:53 +0200 Message-ID: <87r12y4i3u.fsf@euler.schwinge.homeip.net> MIME-Version: 1.0 X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-06.mgc.mentorg.com (139.181.222.6) 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, KAM_SHORT, 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+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" Hi! On 2022-06-08T05:56:02+0200, Tobias Burnus wrote: > This is based on Chung-Lin's patch at https://gcc.gnu.org/pipermail/gcc-patches/2021-January/563393.html > PS: I have not fully tested the intelmic version. As part of my standard testing, I'm reporting that it got completely broken. ;'-) Your commit 683f11843974f0bdf42f79cdcbb0c2b43c7b81b0 "OpenMP: Move omp requires checks to libgomp" states: "When the device lto1 runs, it extracts the data for mkoffload. The latter than passes the value on to GOMP_offload_register_ver." That's not implemented for Intel MIC 'mkoffload', so we always run into 'gcc/lto-cgraph.cc:input_offload_tables': +#ifdef ACCEL_COMPILER + char *omp_requires_file = getenv ("GCC_OFFLOAD_OMP_REQUIRES_FILE"); + if (omp_requires_file == NULL || omp_requires_file[0] == '\0') + fatal_error (input_location, "GCC_OFFLOAD_OMP_REQUIRES_FILE unset"); ..., and all offloading compilation fail with that 'fatal_error'. OK to push the attached "Fix Intel MIC 'mkoffload' for OpenMP 'requires'"? (Currently testing.) 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 afd77646d7ced9f58fb49667e37ee4e21dd6fc53 Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Tue, 5 Jul 2022 12:21:33 +0200 Subject: [PATCH] Fix Intel MIC 'mkoffload' for OpenMP 'requires' Similar to how the other 'mkoffload's got changed in recent commit 683f11843974f0bdf42f79cdcbb0c2b43c7b81b0 "OpenMP: Move omp requires checks to libgomp". This also means finally switching Intel MIC 'mkoffload' to 'GOMP_offload_register_ver', 'GOMP_offload_unregister_ver', making 'GOMP_offload_register', 'GOMP_offload_unregister' legacy entry points. gcc/ * config/i386/intelmic-mkoffload.cc (generate_host_descr_file) (prepare_target_image, main): Handle OpenMP 'requires'. (generate_host_descr_file): Switch to 'GOMP_offload_register_ver', 'GOMP_offload_unregister_ver'. libgomp/ * target.c (GOMP_offload_register, GOMP_offload_unregister): Denote as legacy entry points. * testsuite/libgomp.c-c++-common/requires-1.c: Enable for all 'target offloading_enabled'. * testsuite/libgomp.c-c++-common/requires-5.c: Likewise. * testsuite/libgomp.c-c++-common/requires-7.c: Likewise. * testsuite/libgomp.fortran/requires-1.f90: Likewise. --- gcc/config/i386/intelmic-mkoffload.cc | 56 +++++++++++++++---- libgomp/target.c | 4 ++ .../libgomp.c-c++-common/requires-1.c | 2 +- .../libgomp.c-c++-common/requires-5.c | 2 +- .../libgomp.c-c++-common/requires-7.c | 2 +- .../testsuite/libgomp.fortran/requires-1.f90 | 2 +- 6 files changed, 52 insertions(+), 16 deletions(-) diff --git a/gcc/config/i386/intelmic-mkoffload.cc b/gcc/config/i386/intelmic-mkoffload.cc index c683d6f473e..596f6f107b8 100644 --- a/gcc/config/i386/intelmic-mkoffload.cc +++ b/gcc/config/i386/intelmic-mkoffload.cc @@ -370,7 +370,7 @@ generate_target_offloadend_file (const char *target_compiler) /* Generates object file with the host side descriptor. */ static const char * -generate_host_descr_file (const char *host_compiler) +generate_host_descr_file (const char *host_compiler, uint32_t omp_requires) { char *dump_filename = concat (dumppfx, "_host_descr.c", NULL); const char *src_filename = save_temps @@ -386,39 +386,50 @@ generate_host_descr_file (const char *host_compiler) if (!src_file) fatal_error (input_location, "cannot open '%s'", src_filename); + fprintf (src_file, "#include \n\n"); + fprintf (src_file, "extern const void *const __OFFLOAD_TABLE__;\n" "extern const void *const __offload_image_intelmic_start;\n" "extern const void *const __offload_image_intelmic_end;\n\n" - "static const void *const __offload_target_data[] = {\n" + "static const struct intelmic_data {\n" + " uintptr_t omp_requires_mask;\n" + " const void *const image_start;\n" + " const void *const image_end;\n" + "} intelmic_data = {\n" + " %d,\n" " &__offload_image_intelmic_start, &__offload_image_intelmic_end\n" - "};\n\n"); + "};\n\n", omp_requires); fprintf (src_file, "#ifdef __cplusplus\n" "extern \"C\"\n" "#endif\n" - "void GOMP_offload_register (const void *, int, const void *);\n" + "void GOMP_offload_register_ver (unsigned, const void *, int, const void *);\n" "#ifdef __cplusplus\n" "extern \"C\"\n" "#endif\n" - "void GOMP_offload_unregister (const void *, int, const void *);\n\n" + "void GOMP_offload_unregister_ver (unsigned, const void *, int, const void *);\n\n" "__attribute__((constructor))\n" "static void\n" "init (void)\n" "{\n" - " GOMP_offload_register (&__OFFLOAD_TABLE__, %d, __offload_target_data);\n" - "}\n\n", GOMP_DEVICE_INTEL_MIC); + " GOMP_offload_register_ver (%#x, &__OFFLOAD_TABLE__, %d, &intelmic_data);\n" + "}\n\n", + GOMP_VERSION_PACK (GOMP_VERSION, GOMP_VERSION_INTEL_MIC), + GOMP_DEVICE_INTEL_MIC); fprintf (src_file, "__attribute__((destructor))\n" "static void\n" "fini (void)\n" "{\n" - " GOMP_offload_unregister (&__OFFLOAD_TABLE__, %d, __offload_target_data);\n" - "}\n", GOMP_DEVICE_INTEL_MIC); + " GOMP_offload_unregister_ver (%#x, &__OFFLOAD_TABLE__, %d, &intelmic_data);\n" + "}\n", + GOMP_VERSION_PACK (GOMP_VERSION, GOMP_VERSION_INTEL_MIC), + GOMP_DEVICE_INTEL_MIC); fclose (src_file); @@ -462,7 +473,7 @@ generate_host_descr_file (const char *host_compiler) } static const char * -prepare_target_image (const char *target_compiler, int argc, char **argv) +prepare_target_image (const char *target_compiler, int argc, char **argv, uint32_t *omp_requires) { const char *target_descr_filename = generate_target_descr_file (target_compiler); @@ -509,8 +520,26 @@ prepare_target_image (const char *target_compiler, int argc, char **argv) obstack_ptr_grow (&argv_obstack, ""); obstack_ptr_grow (&argv_obstack, "-o"); obstack_ptr_grow (&argv_obstack, target_so_filename); + + char *omp_requires_file; + if (save_temps) + omp_requires_file = concat (dumppfx, ".mkoffload.omp_requires", NULL); + else + omp_requires_file = make_temp_file (".mkoffload.omp_requires"); + xputenv (concat ("GCC_OFFLOAD_OMP_REQUIRES_FILE=", omp_requires_file, NULL)); + compile_for_target (&argv_obstack); + unsetenv("GCC_OFFLOAD_OMP_REQUIRES_FILE"); + FILE *in = fopen (omp_requires_file, "rb"); + if (!in) + fatal_error (input_location, "cannot open omp_requires file %qs", + omp_requires_file); + if (fread (omp_requires, sizeof (*omp_requires), 1, in) != 1) + fatal_error (input_location, "cannot read omp_requires file %qs", + omp_requires_file); + fclose (in); + /* Run objcopy. */ char *rename_section_opt = XALLOCAVEC (char, sizeof (".data=") + strlen (image_section_name)); @@ -643,10 +672,13 @@ main (int argc, char **argv) if (!dumppfx) dumppfx = out_obj_filename; + uint32_t omp_requires; + const char *target_so_filename - = prepare_target_image (target_compiler, argc, argv); + = prepare_target_image (target_compiler, argc, argv, &omp_requires); - const char *host_descr_filename = generate_host_descr_file (host_compiler); + const char *host_descr_filename + = generate_host_descr_file (host_compiler, omp_requires); /* Perform partial linking for the target image and host side descriptor. As a result we'll get a finalized object file with all offload data. */ diff --git a/libgomp/target.c b/libgomp/target.c index 288b748b9e8..18c5f6e27db 100644 --- a/libgomp/target.c +++ b/libgomp/target.c @@ -2410,6 +2410,8 @@ GOMP_offload_register_ver (unsigned version, const void *host_table, gomp_mutex_unlock (®ister_lock); } +/* Legacy entry point. */ + void GOMP_offload_register (const void *host_table, int target_type, const void *target_data) @@ -2465,6 +2467,8 @@ GOMP_offload_unregister_ver (unsigned version, const void *host_table, gomp_mutex_unlock (®ister_lock); } +/* Legacy entry point. */ + void GOMP_offload_unregister (const void *host_table, int target_type, const void *target_data) diff --git a/libgomp/testsuite/libgomp.c-c++-common/requires-1.c b/libgomp/testsuite/libgomp.c-c++-common/requires-1.c index fedf9779769..8eaac54e187 100644 --- a/libgomp/testsuite/libgomp.c-c++-common/requires-1.c +++ b/libgomp/testsuite/libgomp.c-c++-common/requires-1.c @@ -1,4 +1,4 @@ -/* { dg-do link { target { offload_target_nvptx || offload_target_amdgcn } } } */ +/* { dg-do link { target offloading_enabled } } */ /* { dg-additional-sources requires-1-aux.c } */ /* Check diagnostic by device-compiler's lto1. diff --git a/libgomp/testsuite/libgomp.c-c++-common/requires-5.c b/libgomp/testsuite/libgomp.c-c++-common/requires-5.c index c1e5540cfc5..5aa04a5a604 100644 --- a/libgomp/testsuite/libgomp.c-c++-common/requires-5.c +++ b/libgomp/testsuite/libgomp.c-c++-common/requires-5.c @@ -1,4 +1,4 @@ -/* { dg-do run { target { offload_target_nvptx || offload_target_amdgcn } } } */ +/* { dg-do run { target offloading_enabled } } */ /* { dg-additional-sources requires-5-aux.c } */ #pragma omp requires unified_shared_memory, unified_address, reverse_offload diff --git a/libgomp/testsuite/libgomp.c-c++-common/requires-7.c b/libgomp/testsuite/libgomp.c-c++-common/requires-7.c index c94a4c10846..31c6f73c6da 100644 --- a/libgomp/testsuite/libgomp.c-c++-common/requires-7.c +++ b/libgomp/testsuite/libgomp.c-c++-common/requires-7.c @@ -1,4 +1,4 @@ -/* { dg-do link { target { offload_target_nvptx || offload_target_amdgcn } } } */ +/* { dg-do link { target offloading_enabled } } */ /* { dg-additional-sources requires-7-aux.c } */ /* Check diagnostic by device-compiler's lto1. diff --git a/libgomp/testsuite/libgomp.fortran/requires-1.f90 b/libgomp/testsuite/libgomp.fortran/requires-1.f90 index 33741af15f1..1020ebb4277 100644 --- a/libgomp/testsuite/libgomp.fortran/requires-1.f90 +++ b/libgomp/testsuite/libgomp.fortran/requires-1.f90 @@ -1,4 +1,4 @@ -! { dg-do link { target { offload_target_nvptx || offload_target_amdgcn } } } +! { dg-do link { target offloading_enabled } } ! { dg-additional-sources requires-1-aux.f90 } ! Check diagnostic by device-compiler's lto1. -- 2.35.1