[gcc/devel/omp/gcc-16] libgomp: Fix ipr_vendor for OpenMP's interop

Sandra Loosemore via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:4b50515c9b4b9ff697bf802ac3d3155ffb8fd266

commit 4b50515c9b4b9ff697bf802ac3d3155ffb8fd266
Author: Tobias Burnus <[email protected]>
Date:   Wed May 27 16:16:05 2026 +0200

    libgomp: Fix ipr_vendor for OpenMP's interop
    
    omp_ipr_vendor and omp_ipr_vendor_name denote the vendor of the
    implementation (GCC / GNU compiler) and not the vendor of the
    foreign runtime (like Nvidia for CUDA or AMD for ROCm/HSA/HIP).
    
    Thus, use 5 / "gnu" per "Additional Definitions" document
    ("1.2 Supported vendor-name Values"), cf.
    https://www.openmp.org/specifications/
    
    [See also OpenMP Spec Issue #4766.]
    
    libgomp/ChangeLog:
    
            * libgomp.texi (Foreign-runtime support for AMD GPUs,
            Foreign-runtime support for Nvdia GPUs): Fix vendor
            value to match compiler not GPU vendor.
            * plugin/plugin-gcn.c (GOMP_OFFLOAD_get_interop_int,
            GOMP_OFFLOAD_get_interop_str): Return 5/"gnu" as ipr_vendor.
            * plugin/plugin-nvptx.c (GOMP_OFFLOAD_get_interop_int,
            GOMP_OFFLOAD_get_interop_str): Likewise.
            * testsuite/libgomp.c/append-args-fr.h: Updated expected
            value.
            * testsuite/libgomp.c/interop-cuda-full.c: Likewise.
            * testsuite/libgomp.c/interop-fr-1.c: Likewise.
            * testsuite/libgomp.c/interop-hip.h: Likewise.
            * testsuite/libgomp.fortran/interop-hip.h: Likewise.
    
    (cherry picked from commit e81952eaad17afd579c6b81667f1828df74db6ed)

Diff:
---
 libgomp/libgomp.texi                            | 20 ++++++++++----------
 libgomp/plugin/plugin-gcn.c                     |  4 ++--
 libgomp/plugin/plugin-nvptx.c                   |  4 ++--
 libgomp/testsuite/libgomp.c/append-args-fr.h    |  8 ++++----
 libgomp/testsuite/libgomp.c/interop-cuda-full.c |  4 ++--
 libgomp/testsuite/libgomp.c/interop-fr-1.c      |  8 ++++----
 libgomp/testsuite/libgomp.c/interop-hip.h       | 11 +++++------
 libgomp/testsuite/libgomp.fortran/interop-hip.h | 13 ++++---------
 8 files changed, 33 insertions(+), 39 deletions(-)

diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi
index ab937e77b479..7bc313a6fabf 100644
--- a/libgomp/libgomp.texi
+++ b/libgomp/libgomp.texi
@@ -7329,8 +7329,8 @@ Available properties for an HIP interop object:
 @headitem Property          @tab C data type             @tab API routine @tab value (if constant)
 @item @code{fr_id}          @tab @code{omp_interop_fr_t} @tab int         @tab @code{omp_fr_hip}
 @item @code{fr_name}        @tab @code{const char *}     @tab str         @tab @code{"hip"}
-@item @code{vendor}         @tab @code{int}              @tab int         @tab @code{1}
-@item @code{vendor_name}    @tab @code{const char *}     @tab str         @tab @code{"amd"}
+@item @code{vendor}         @tab @code{int}              @tab int         @tab @code{5}
+@item @code{vendor_name}    @tab @code{const char *}     @tab str         @tab @code{"gnu"}
 @item @code{device_num}     @tab @code{int}              @tab int         @tab
 @item @code{platform}       @tab N/A                     @tab             @tab
 @item @code{device}         @tab @code{hipDevice_t}      @tab int         @tab
@@ -7345,8 +7345,8 @@ Available properties for an HSA interop object:
 @headitem Property          @tab C data type             @tab API routine @tab value (if constant)
 @item @code{fr_id}          @tab @code{omp_interop_fr_t} @tab int         @tab @code{omp_fr_hsa}
 @item @code{fr_name}        @tab @code{const char *}     @tab str         @tab @code{"hsa"}
-@item @code{vendor}         @tab @code{int}              @tab int         @tab @code{1}
-@item @code{vendor_name}    @tab @code{const char *}     @tab str         @tab @code{"amd"}
+@item @code{vendor}         @tab @code{int}              @tab int         @tab @code{5}
+@item @code{vendor_name}    @tab @code{const char *}     @tab str         @tab @code{"gnu"}
 @item @code{device_num}     @tab @code{int}              @tab int         @tab
 @item @code{platform}       @tab N/A                     @tab             @tab
 @item @code{device}         @tab @code{hsa_agent *}      @tab ptr         @tab
@@ -7514,8 +7514,8 @@ Available properties for a CUDA runtime API interop object:
 @headitem Property          @tab C data type             @tab API routine @tab value (if constant)
 @item @code{fr_id}          @tab @code{omp_interop_fr_t} @tab int         @tab @code{omp_fr_cuda}
 @item @code{fr_name}        @tab @code{const char *}     @tab str         @tab @code{"cuda"}
-@item @code{vendor}         @tab @code{int}              @tab int         @tab @code{11}
-@item @code{vendor_name}    @tab @code{const char *}     @tab str         @tab @code{"nvidia"}
+@item @code{vendor}         @tab @code{int}              @tab int         @tab @code{5}
+@item @code{vendor_name}    @tab @code{const char *}     @tab str         @tab @code{"gnu"}
 @item @code{device_num}     @tab @code{int}              @tab int         @tab
 @item @code{platform}       @tab N/A                     @tab             @tab
 @item @code{device}         @tab @code{int}              @tab int         @tab
@@ -7530,8 +7530,8 @@ Available properties for a CUDA driver API interop object:
 @headitem Property          @tab C data type             @tab API routine @tab value (if constant)
 @item @code{fr_id}          @tab @code{omp_interop_fr_t} @tab int         @tab @code{omp_fr_cuda_driver}
 @item @code{fr_name}        @tab @code{const char *}     @tab str         @tab @code{"cuda_driver"}
-@item @code{vendor}         @tab @code{int}              @tab int         @tab @code{11}
-@item @code{vendor_name}    @tab @code{const char *}     @tab str         @tab @code{"nvidia"}
+@item @code{vendor}         @tab @code{int}              @tab int         @tab @code{5}
+@item @code{vendor_name}    @tab @code{const char *}     @tab str         @tab @code{"gnu"}
 @item @code{device_num}     @tab @code{int}              @tab int         @tab
 @item @code{platform}       @tab N/A                     @tab             @tab
 @item @code{device}         @tab @code{CUdevice}         @tab int         @tab
@@ -7546,8 +7546,8 @@ Available properties for an HIP interop object:
 @headitem Property          @tab C data type             @tab API routine @tab value (if constant)
 @item @code{fr_id}          @tab @code{omp_interop_fr_t} @tab int         @tab @code{omp_fr_hip}
 @item @code{fr_name}        @tab @code{const char *}     @tab str         @tab @code{"hip"}
-@item @code{vendor}         @tab @code{int}              @tab int         @tab @code{11}
-@item @code{vendor_name}    @tab @code{const char *}     @tab str         @tab @code{"nvidia"}
+@item @code{vendor}         @tab @code{int}              @tab int         @tab @code{5}
+@item @code{vendor_name}    @tab @code{const char *}     @tab str         @tab @code{"gnu"}
 @item @code{device_num}     @tab @code{int}              @tab int         @tab
 @item @code{platform}       @tab N/A                     @tab             @tab
 @item @code{device}         @tab @code{hipDevice_t}      @tab int         @tab
diff --git a/libgomp/plugin/plugin-gcn.c b/libgomp/plugin/plugin-gcn.c
index 32f573f1b7f6..e47d8b2253b8 100644
--- a/libgomp/plugin/plugin-gcn.c
+++ b/libgomp/plugin/plugin-gcn.c
@@ -4998,7 +4998,7 @@ GOMP_OFFLOAD_get_interop_int (struct interop_obj_t *obj,
     case omp_ipr_vendor:
       if (ret_code)
 	*ret_code = omp_irc_success;
-      return 1; /* amd */
+      return 5; /* gnu */
     case omp_ipr_vendor_name:
       if (ret_code)
 	*ret_code = omp_irc_type_str;
@@ -5166,7 +5166,7 @@ GOMP_OFFLOAD_get_interop_str (struct interop_obj_t *obj,
     case omp_ipr_vendor_name:
       if (ret_code)
 	*ret_code = omp_irc_success;
-      return "amd";
+      return "gnu";
     case omp_ipr_device_num:
       if (ret_code)
 	*ret_code = omp_irc_type_int;
diff --git a/libgomp/plugin/plugin-nvptx.c b/libgomp/plugin/plugin-nvptx.c
index a540e9d4cce8..e1c97a5fa2ed 100644
--- a/libgomp/plugin/plugin-nvptx.c
+++ b/libgomp/plugin/plugin-nvptx.c
@@ -2748,7 +2748,7 @@ GOMP_OFFLOAD_get_interop_int (struct interop_obj_t *obj,
     case omp_ipr_vendor:
       if (ret_code)
 	*ret_code = omp_irc_success;
-      return 11; /* nvidia */
+      return 5; /* gnu */
     case omp_ipr_vendor_name:
       if (ret_code)
 	*ret_code = omp_irc_type_str;
@@ -2895,7 +2895,7 @@ GOMP_OFFLOAD_get_interop_str (struct interop_obj_t *obj,
     case omp_ipr_vendor_name:
       if (ret_code)
 	*ret_code = omp_irc_success;
-      return "nvidia";
+      return "gnu";
     case omp_ipr_device_num:
       if (ret_code)
 	*ret_code = omp_irc_type_int;
diff --git a/libgomp/testsuite/libgomp.c/append-args-fr.h b/libgomp/testsuite/libgomp.c/append-args-fr.h
index 9f6ca04bbe9e..9c8c9d409f36 100644
--- a/libgomp/testsuite/libgomp.c/append-args-fr.h
+++ b/libgomp/testsuite/libgomp.c/append-args-fr.h
@@ -102,12 +102,12 @@ check_nvptx (omp_interop_t obj, int dev, omp_interop_fr_t expected_fr, _Bool is_
   ret_code = omp_irc_no_value;
   int vendor = (int) omp_get_interop_int (obj, omp_ipr_vendor, &ret_code);
   assert (ret_code == omp_irc_success);
-  assert (vendor == 11);  /* Nvidia */
+  assert (vendor == 5);  /* gnu (= compiler vendor) */
 
   ret_code = omp_irc_no_value;
   const char *vendor_name = omp_get_interop_str (obj, omp_ipr_vendor_name, &ret_code);
   assert (ret_code == omp_irc_success);
-  assert (strcmp (vendor_name, "nvidia") == 0);
+  assert (strcmp (vendor_name, "gnu") == 0);
 
   ret_code = omp_irc_no_value;
   int dev_num = (int) omp_get_interop_int (obj, omp_ipr_device_num, &ret_code);
@@ -216,12 +216,12 @@ check_gcn (omp_interop_t obj, int dev, omp_interop_fr_t expected_fr, _Bool is_ta
   ret_code = omp_irc_no_value;
   int vendor = (int) omp_get_interop_int (obj, omp_ipr_vendor, &ret_code);
   assert (ret_code == omp_irc_success);
-  assert (vendor == 1);  /* Amd */
+  assert (vendor == 5);  /* gnu (= compiler vendor) */
 
   ret_code = omp_irc_no_value;
   const char *vendor_name = omp_get_interop_str (obj, omp_ipr_vendor_name, &ret_code);
   assert (ret_code == omp_irc_success);
-  assert (strcmp (vendor_name, "amd") == 0);
+  assert (strcmp (vendor_name, "gnu") == 0);
 
   ret_code = omp_irc_no_value;
   int dev_num = (int) omp_get_interop_int (obj, omp_ipr_device_num, &ret_code);
diff --git a/libgomp/testsuite/libgomp.c/interop-cuda-full.c b/libgomp/testsuite/libgomp.c/interop-cuda-full.c
index c48a934978d9..6d3c12b602a7 100644
--- a/libgomp/testsuite/libgomp.c/interop-cuda-full.c
+++ b/libgomp/testsuite/libgomp.c/interop-cuda-full.c
@@ -74,11 +74,11 @@ main ()
 
   ivar = (int) omp_get_interop_int (obj_cuda, omp_ipr_vendor, &res);
   assert (res == omp_irc_success);
-  assert (ivar == 11);
+  assert (ivar == 5);  /* gnu (= compiler vendor) */
 
   ivar = (int) omp_get_interop_int (obj_cuda_driver, omp_ipr_vendor, &res);
   assert (res == omp_irc_success);
-  assert (ivar == 11);
+  assert (ivar == 5);  /* gnu (= compiler vendor) */
 
 
   /* Check whether the omp_ipr_device -> cudaDevice_t yields a valid device.  */
diff --git a/libgomp/testsuite/libgomp.c/interop-fr-1.c b/libgomp/testsuite/libgomp.c/interop-fr-1.c
index 9310c95644ef..5a139ac2a8af 100644
--- a/libgomp/testsuite/libgomp.c/interop-fr-1.c
+++ b/libgomp/testsuite/libgomp.c/interop-fr-1.c
@@ -271,12 +271,12 @@ check_nvptx (int dev)
       ret_code = omp_irc_no_value;
       int vendor = (int) omp_get_interop_int (obj, omp_ipr_vendor, &ret_code);
       assert (ret_code == omp_irc_success);
-      assert (vendor == 11);  /* Nvidia */
+      assert (vendor == 5);  /* gnu (= compiler vendor) */
 
       ret_code = omp_irc_no_value;
       const char *vendor_name = omp_get_interop_str (obj, omp_ipr_vendor_name, &ret_code);
       assert (ret_code == omp_irc_success);
-      assert (strcmp (vendor_name, "nvidia") == 0);
+      assert (strcmp (vendor_name, "gnu") == 0);
 
       ret_code = omp_irc_no_value;
       int dev_num = (int) omp_get_interop_int (obj, omp_ipr_device_num, &ret_code);
@@ -464,12 +464,12 @@ check_gcn (int dev)
       ret_code = omp_irc_no_value;
       int vendor = (int) omp_get_interop_int (obj, omp_ipr_vendor, &ret_code);
       assert (ret_code == omp_irc_success);
-      assert (vendor == 1);  /* Amd */
+      assert (vendor == 5);  /* gnu (= compiler vendor) */
 
       ret_code = omp_irc_no_value;
       const char *vendor_name = omp_get_interop_str (obj, omp_ipr_vendor_name, &ret_code);
       assert (ret_code == omp_irc_success);
-      assert (strcmp (vendor_name, "amd") == 0);
+      assert (strcmp (vendor_name, "gnu") == 0);
 
       ret_code = omp_irc_no_value;
       int dev_num = (int) omp_get_interop_int (obj, omp_ipr_device_num, &ret_code);
diff --git a/libgomp/testsuite/libgomp.c/interop-hip.h b/libgomp/testsuite/libgomp.c/interop-hip.h
index 20a1ccb78fb2..a35bd1af67e6 100644
--- a/libgomp/testsuite/libgomp.c/interop-hip.h
+++ b/libgomp/testsuite/libgomp.c/interop-hip.h
@@ -169,16 +169,15 @@ main ()
 
   ivar = (int) omp_get_interop_int (obj, omp_ipr_vendor, &res);
   assert (res == omp_irc_success);
-  int vendor_is_amd = ivar == 1;
+  assert (ivar == 5);  /* gnu (= compiler vendor) */
   #if defined(__HIP_PLATFORM_AMD__)
-    assert (ivar == 1);
+    bool device_vendor_is_amd = true;
   #elif defined(__HIP_PLATFORM_NVIDIA__)
-    assert (ivar == 11);
+    bool device_vendor_is_amd = false;
   #else
-    assert (0);
+    #error "Missing valid __HIP_PLATFORM_..."
   #endif
 
-
   /* Check whether the omp_ipr_device -> hipDevice_t yields a valid device.  */
 
   hipDevice_t hip_dev = (int) omp_get_interop_int (obj, omp_ipr_device, &res);
@@ -207,7 +206,7 @@ main ()
     hip_err = hipCtxGetApiVersion (hip_ctx, &ivar);
   #pragma GCC diagnostic pop
 
-  if (vendor_is_amd)
+  if (device_vendor_is_amd)
     assert (hip_err == hipErrorNotSupported && ivar == -99);
   else
     {
diff --git a/libgomp/testsuite/libgomp.fortran/interop-hip.h b/libgomp/testsuite/libgomp.fortran/interop-hip.h
index 753ccce5fd7d..b22c7dec4962 100644
--- a/libgomp/testsuite/libgomp.fortran/interop-hip.h
+++ b/libgomp/testsuite/libgomp.fortran/interop-hip.h
@@ -120,17 +120,12 @@ program main
   if (fr /= omp_ifr_hip) error stop 1
 
   ivar = omp_get_interop_int (obj, omp_ipr_vendor, res)
-  if (ivar == 1) then  ! AMD
-    vendor_is_amd = .true.
-  else if (ivar == 11) then  ! Nvidia
-    vendor_is_amd = .false.
-  else
-    error stop 1  ! Unknown
-  endif
+  if (res /= omp_irc_success) error stop 1
+  if (ivar /= 5) error stop 1  ! gnu (= compiler vendor)
 #if USE_CUDA_NAMES
-  if (vendor_is_amd) error stop 1
+    vendor_is_amd = .false.
 #else
-  if (.not. vendor_is_amd) error stop 1
+    vendor_is_amd = .true.
 #endif
 
   ! Check whether the omp_ipr_device -> hipDevice_t yields a valid device.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.