[gcc/devel/omp/gcc-16] OpenMP: support for uses_allocators clause: Fix build and test case regressions

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

commit 508da7a60deacaa2b7c6280b418d73784eef9ef9
Author: Thomas Schwinge <[email protected]>
Date:   Tue Jun 30 14:42:21 2026 +0200

    OpenMP: support for uses_allocators clause: Fix build and test case regressions
    
    Fix-up for commit 7a8f98b48104ccf10c6dceccc51b70de69288eaa
    "OpenMP: support for uses_allocators clause".
    
    As was already pointed out, 'libgomp/config.h.in' was not regenerated.
    
    In a configuration with:
    
        checking whether the target supports __sync_*_compare_and_swap... (cached) no
    
    ..., I see:
    
        configure: error: offload hosts require __sync_val_compare_and_swap to build libgomp.
        make[1]: *** [Makefile:17208: configure-target-libgomp] Error 1
    
    Fixed the inverted condition.
    
    Next, I see:
    
        ../../../source-gcc/libgomp/config/linux/../../allocator.c: In function ‘omp_init_allocator’:
        ../../../source-gcc/libgomp/config/linux/../../allocator.c:619:28: error: passing argument 1 of ‘gomp_mutex_init’ makes pointer from integer without a cast [-Wint-conversion]
          619 |       gomp_mutex_init (data->lock);
              |                        ~~~~^~~~~~
              |                            |
              |                            gomp_mutex_t {aka int}
        ../../../source-gcc/libgomp/config/linux/../../allocator.c:619:28: note: possible fix: take the address with ‘&’
          619 |       gomp_mutex_init (data->lock);
              |                        ~~~~^~~~~~
              |                        &
        In file included from ../../../source-gcc/libgomp/libgomp.h:209,
                         from ../../../source-gcc/libgomp/config/linux/allocator.c:31:
        ../../../source-gcc/libgomp/config/linux/mutex.h:41:32: note: expected ‘gomp_mutex_t *’ {aka ‘int *’} but argument is of type ‘gomp_mutex_t’ {aka ‘int’}
           41 | gomp_mutex_init (gomp_mutex_t *mutex)
              |                  ~~~~~~~~~~~~~~^~~~~
        ../../../source-gcc/libgomp/config/linux/../../allocator.c: In function ‘gomp_map_omp_init_allocator’:
        ../../../source-gcc/libgomp/config/linux/../../allocator.c:1587:68: error: passing argument 1 of ‘gomp_mutex_init’ makes pointer from integer without a cast [-Wint-conversion]
         1587 |             (((struct omp_allocator_data *) allocator_data_devaddr)->lock);
              |              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
              |                                                                    |
              |                                                                    gomp_mutex_t {aka int}
        ../../../source-gcc/libgomp/config/linux/../../allocator.c:1587:68: note: possible fix: take the address with ‘&’
         1587 |             (((struct omp_allocator_data *) allocator_data_devaddr)->lock);
              |              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
              |              &
        ../../../source-gcc/libgomp/config/linux/mutex.h:41:32: note: expected ‘gomp_mutex_t *’ {aka ‘int *’} but argument is of type ‘gomp_mutex_t’ {aka ‘int’}
           41 | gomp_mutex_init (gomp_mutex_t *mutex)
              |                  ~~~~~~~~~~~~~~^~~~~
        make[4]: *** [Makefile:819: allocator.lo] Error 1
    
    Fixed.
    
    Testing (with as well as without 'HAVE_SYNC_BUILTINS'):
    
    I see:
    
        PASS: g++.dg/gomp/deprecate-2.C  -std=c++20  at line 31 (test for warnings, line 22)
        PASS: g++.dg/gomp/deprecate-2.C  -std=c++20  at line 43 (test for warnings, line 34)
        PASS: g++.dg/gomp/deprecate-2.C  -std=c++20  expected multiline pattern lines 24-27
        PASS: g++.dg/gomp/deprecate-2.C  -std=c++20  expected multiline pattern lines 36-39
        [-XFAIL:-]{+XPASS:+} g++.dg/gomp/deprecate-2.C  -std=c++20 (test for excess errors)
        [Etc.]
    
    ..., due to:
    
        { dg-excess-errors "sorry, unimplemented: 'uses_allocators' clause" }
    
    Removed.
    
    I see:
    
        {+PASS: libgomp.c++/../libgomp.c-c++-common/uses_allocators-2.c  (test for errors, line 9)+}
        {+FAIL: libgomp.c++/../libgomp.c-c++-common/uses_allocators-2.c (test for excess errors)+}
    
    ..., due to:
    
        [...]/libgomp.c++/../libgomp.c-c++-common/uses_allocators-2.c:7:34: error: invalid conversion from 'int' to 'omp_alloctrait_key_t' [-fpermissive]
        [...]/libgomp.c++/../libgomp.c-c++-common/uses_allocators-2.c:16:40: error: invalid conversion from 'int' to 'omp_alloctrait_key_t' [-fpermissive]
    
    Replaced '1' by 'omp_atk_sync_hint'.
    
    I see:
    
        {+FAIL: libgomp.c++/../libgomp.c-c++-common/uses_allocators-9.c (test for excess errors)+}
        {+UNRESOLVED: libgomp.c++/../libgomp.c-c++-common/uses_allocators-9.c compilation failed to produce executable+}
    
    ..., due to:
    
        [...]/libgomp.c++/../libgomp.c-c++-common/uses_allocators-9.c:11:24: error: invalid conversion from 'void*' to 'int*' [-fpermissive]
        [...]/libgomp.c++/../libgomp.c-c++-common/uses_allocators-9.c:21:24: error: invalid conversion from 'void*' to 'int*' [-fpermissive]
        [...]/libgomp.c++/../libgomp.c-c++-common/uses_allocators-9.c:33:32: error: invalid conversion from 'void*' to 'int*' [-fpermissive]
    
    Added type casts.
    
    I see:
    
        [-PASS:-]{+FAIL:+} libgomp.fortran/dep-uses-allocators.f90   -O   at line 12 (test for warnings, line 11)
        PASS: libgomp.fortran/dep-uses-allocators.f90   -O   at line 2 (test for warnings, line 11)
        PASS: libgomp.fortran/dep-uses-allocators.f90   -O  (test for excess errors)
    
    ..., due to:
    
        { dg-message "sorry, unimplemented: 'uses_allocators' clause [...]
    
    Removed.
    
    I see:
    
        PASS: libgomp.fortran/uses_allocators-7.f90   -O  (test for excess errors)
        {+PASS: libgomp.fortran/uses_allocators-7.f90   -O  execution test+}
        {+PASS: libgomp.fortran/uses_allocators-7.f90   -O   scan-tree-dump-times gimple "#pragma omp target .*uses_allocators\\(memspace\\(\\), traits\\(trait\\) : my_alloc\\)" 1+}
        {+PASS: libgomp.fortran/uses_allocators-7.f90   -O   scan-tree-dump-times gimple "#pragma omp target .*uses_allocators\\(memspace\\(\\), traits\\(\\) : my_alloc\\)" 1+}
        {+FAIL: libgomp.fortran/uses_allocators-7.f90   -O   scan-tree-dump-times original "#pragma omp target .*uses_allocators\\(memspace\\(1\\), traits\\(\\) : my4\\) uses_allocators\\(memspace\\(\\), traits\\(t2\\) : my3\\) uses_allocators\\(memspace\\(\\), traits\\(\\) : my2\\) uses_allocators\\(memspace\\(3\\), traits\\(t\\) : my\\)" 1+}
    
    XFAILed (for now.)
    
            gcc/testsuite/
            * g++.dg/gomp/deprecate-2.C: Remove obsolete 'dg-excess-errors'.
            libgomp/
            * config.h.in: Regenerate.
            * configure.ac [x$libgomp_cv_have_sync_builtins = xno]: Fix check.
            * configure: Regenerate.
            * allocator.c (omp_init_allocator, gomp_map_omp_init_allocator)
            [!HAVE_SYNC_BUILTINS]: Fix build.
            * testsuite/libgomp.c-c++-common/uses_allocators-2.c: Fix for C++ testing.
            * testsuite/libgomp.c-c++-common/uses_allocators-9.c: Likewise.
            * testsuite/libgomp.fortran/dep-uses-allocators.f90: Remove
            obsolete "sorry, unimplemented: [...]" diagnostic check.
            * testsuite/libgomp.fortran/uses_allocators-7.f90: XFAIL one
            'scan-tree-dump-times' check.
    
    (cherry picked from commit 803dfda7bed667c1993430138eab1c264b7d9528)

Diff:
---
 gcc/testsuite/g++.dg/gomp/deprecate-2.C                    | 3 ---
 libgomp/allocator.c                                        | 4 ++--
 libgomp/config.h.in                                        | 3 +++
 libgomp/configure                                          | 2 +-
 libgomp/configure.ac                                       | 2 +-
 libgomp/testsuite/libgomp.c-c++-common/uses_allocators-2.c | 4 ++--
 libgomp/testsuite/libgomp.c-c++-common/uses_allocators-9.c | 6 +++---
 libgomp/testsuite/libgomp.fortran/dep-uses-allocators.f90  | 1 -
 libgomp/testsuite/libgomp.fortran/uses_allocators-7.f90    | 2 +-
 9 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/gcc/testsuite/g++.dg/gomp/deprecate-2.C b/gcc/testsuite/g++.dg/gomp/deprecate-2.C
index 46d286141ef2..b7689dd1554d 100644
--- a/gcc/testsuite/g++.dg/gomp/deprecate-2.C
+++ b/gcc/testsuite/g++.dg/gomp/deprecate-2.C
@@ -42,6 +42,3 @@ void f()
 
 // { dg-warning "42: the specification of arguments to 'uses_allocators' where each item is of the form 'allocator\\(traits\\)' is deprecated since OpenMP 5.2 \\\[-Wdeprecated-openmp\\\]" "" { target *-*-* }  34 }
 }
-
-// { dg-excess-errors "sorry, unimplemented: 'uses_allocators' clause" }
-// { dg-excess-errors "sorry, unimplemented: 'uses_allocators' clause" }
diff --git a/libgomp/allocator.c b/libgomp/allocator.c
index 5576d92e21d2..dc1b79d9b83a 100644
--- a/libgomp/allocator.c
+++ b/libgomp/allocator.c
@@ -616,7 +616,7 @@ omp_init_allocator (omp_memspace_handle_t memspace, int ntraits,
   else
     {
 #ifndef HAVE_SYNC_BUILTINS
-      gomp_mutex_init (data->lock);
+      gomp_mutex_init (&data->lock);
 #endif
     }
 
@@ -1584,7 +1584,7 @@ gomp_map_omp_init_allocator (struct gomp_device_descr *devicep,
 		  sizeof (struct omp_allocator_data));
 #ifndef HAVE_SYNC_BUILTINS
 	  gomp_mutex_init
-	    (((struct omp_allocator_data *) allocator_data_devaddr)->lock);
+	    (&((struct omp_allocator_data *) allocator_data_devaddr)->lock);
 #endif
 	}
       ret = (omp_allocator_handle_t) allocator_data_devaddr;
diff --git a/libgomp/config.h.in b/libgomp/config.h.in
index 46d3eac1e610..0522c50d34a4 100644
--- a/libgomp/config.h.in
+++ b/libgomp/config.h.in
@@ -133,6 +133,9 @@
 /* Define to 1 if building libgomp for an accelerator-only target. */
 #undef LIBGOMP_OFFLOADED_ONLY
 
+/* Define to 1 if building libgomp for a offload host */
+#undef LIBGOMP_OFFLOAD_HOST
+
 /* Define to 1 if libgomp should use POSIX threads. */
 #undef LIBGOMP_USE_PTHREADS
 
diff --git a/libgomp/configure b/libgomp/configure
index 88467462d0fb..6f17047f8210 100755
--- a/libgomp/configure
+++ b/libgomp/configure
@@ -17134,7 +17134,7 @@ if test x$libgomp_cv_have_sync_builtins = xno; then
     as_fn_error $? "accelerator targets require __sync_val_compare_and_swap to build libgomp." "$LINENO" 5
   fi
   # Same for offload hosts.
-  if test x"$offload_plugins" = x; then
+  if test x"$offload_plugins" != x; then
     as_fn_error $? "offload hosts require __sync_val_compare_and_swap to build libgomp." "$LINENO" 5
   fi
 fi
diff --git a/libgomp/configure.ac b/libgomp/configure.ac
index d5c8a2151754..df43ce1959c8 100644
--- a/libgomp/configure.ac
+++ b/libgomp/configure.ac
@@ -378,7 +378,7 @@ if test x$libgomp_cv_have_sync_builtins = xno; then
     AC_MSG_ERROR([accelerator targets require __sync_val_compare_and_swap to build libgomp.])
   fi
   # Same for offload hosts.
-  if test x"$offload_plugins" = x; then
+  if test x"$offload_plugins" != x; then
     AC_MSG_ERROR([offload hosts require __sync_val_compare_and_swap to build libgomp.])
   fi
 fi
diff --git a/libgomp/testsuite/libgomp.c-c++-common/uses_allocators-2.c b/libgomp/testsuite/libgomp.c-c++-common/uses_allocators-2.c
index 2babb11018e2..30fae752a33a 100644
--- a/libgomp/testsuite/libgomp.c-c++-common/uses_allocators-2.c
+++ b/libgomp/testsuite/libgomp.c-c++-common/uses_allocators-2.c
@@ -4,7 +4,7 @@
 void
 f ()
 {
-   omp_alloctrait_t trait[1] = {{1,1}};
+   omp_alloctrait_t trait[1] = {{omp_atk_sync_hint, 1}};
    omp_allocator_handle_t my_alloc;
    #pragma omp target uses_allocators(traits(trait) : my_alloc)  /* { dg-error "traits array 'trait' must be of 'const omp_alloctrait_t \\\[\\\]' type" } */
      ;
@@ -13,7 +13,7 @@ f ()
 void
 g ()
 {
-   const omp_alloctrait_t trait[1] = {{1,1}};
+   const omp_alloctrait_t trait[1] = {{omp_atk_sync_hint, 1}};
    omp_allocator_handle_t my_alloc;
    #pragma omp target uses_allocators(traits(trait) : my_alloc)
      ;
diff --git a/libgomp/testsuite/libgomp.c-c++-common/uses_allocators-9.c b/libgomp/testsuite/libgomp.c-c++-common/uses_allocators-9.c
index 258dba10ebd8..00f01fc71496 100644
--- a/libgomp/testsuite/libgomp.c-c++-common/uses_allocators-9.c
+++ b/libgomp/testsuite/libgomp.c-c++-common/uses_allocators-9.c
@@ -8,7 +8,7 @@ int main (void)
 
   #pragma omp target uses_allocators (traits (trait): my_alloc)
   {
-    int *x = omp_alloc (sizeof (int), my_alloc);
+    int *x = (int *) omp_alloc (sizeof (int), my_alloc);
     if ((uintptr_t) x % 128 != 0)
       __builtin_abort ();
     omp_free (x, my_alloc);
@@ -18,7 +18,7 @@ int main (void)
 
   #pragma omp target uses_allocators (traits (trait): my_alloc)
   {
-    int *x = omp_alloc (sizeof (int), my_alloc);
+    int *x = (int *) omp_alloc (sizeof (int), my_alloc);
     if ((uintptr_t) x % 128 != 0)
       __builtin_abort ();
     omp_free (x, my_alloc);
@@ -30,7 +30,7 @@ int main (void)
   /* The following creates an allocator with empty traits + default mem space. */
   #pragma omp target uses_allocators (my_alloc)
   {
-    int *x = omp_aligned_alloc (128, sizeof (int), my_alloc);
+    int *x = (int *) omp_aligned_alloc (128, sizeof (int), my_alloc);
     if ((uintptr_t) x % 128 != 0)
       __builtin_abort ();
     omp_free (x, my_alloc);
diff --git a/libgomp/testsuite/libgomp.fortran/dep-uses-allocators.f90 b/libgomp/testsuite/libgomp.fortran/dep-uses-allocators.f90
index ab81ffb910d9..2c0b8af7337d 100644
--- a/libgomp/testsuite/libgomp.fortran/dep-uses-allocators.f90
+++ b/libgomp/testsuite/libgomp.fortran/dep-uses-allocators.f90
@@ -9,6 +9,5 @@ program test
   type(omp_alloctrait), parameter :: trait(0) = [omp_alloctrait :: ]
 
   !$omp target uses_allocators(omp_default_mem_alloc, a1(trait))
-  ! { dg-message "sorry, unimplemented: 'uses_allocators' clause with traits and memory spaces" "" { target *-*-* } .-1 }
   block; end block
 end program
diff --git a/libgomp/testsuite/libgomp.fortran/uses_allocators-7.f90 b/libgomp/testsuite/libgomp.fortran/uses_allocators-7.f90
index 64ac5ca189e4..d0a603b5ced1 100644
--- a/libgomp/testsuite/libgomp.fortran/uses_allocators-7.f90
+++ b/libgomp/testsuite/libgomp.fortran/uses_allocators-7.f90
@@ -55,4 +55,4 @@ end
 
 ! { dg-final { scan-tree-dump-times "#pragma omp target .*uses_allocators\\(memspace\\(\\), traits\\(trait\\) : my_alloc\\)" 1 "gimple" } }
 ! { dg-final { scan-tree-dump-times "#pragma omp target .*uses_allocators\\(memspace\\(\\), traits\\(\\) : my_alloc\\)" 1 "gimple" } }
-! { dg-final { scan-tree-dump-times "#pragma omp target .*uses_allocators\\(memspace\\(1\\), traits\\(\\) : my4\\) uses_allocators\\(memspace\\(\\), traits\\(t2\\) : my3\\) uses_allocators\\(memspace\\(\\), traits\\(\\) : my2\\) uses_allocators\\(memspace\\(3\\), traits\\(t\\) : my\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "#pragma omp target .*uses_allocators\\(memspace\\(1\\), traits\\(\\) : my4\\) uses_allocators\\(memspace\\(\\), traits\\(t2\\) : my3\\) uses_allocators\\(memspace\\(\\), traits\\(\\) : my2\\) uses_allocators\\(memspace\\(3\\), traits\\(t\\) : my\\)" 1 "original" { xfail *-*-* }  } }
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.