GCN: Address undeclared 'NULL' usage in 'libgcc/config/gcn/gthr-gcn.h:__gthread_getspecific' (was: [PATCH 1/3] Create GCN-specific gthreads)

Message ID 87o7gavqdx.fsf@euler.schwinge.homeip.net
State Accepted
Headers
Series GCN: Address undeclared 'NULL' usage in 'libgcc/config/gcn/gthr-gcn.h:__gthread_getspecific' (was: [PATCH 1/3] Create GCN-specific gthreads) |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Thomas Schwinge Nov. 3, 2023, 2:54 p.m. UTC
  Hi!

On 2019-06-07T15:39:36+0100, Andrew Stubbs <ams@codesourcery.com> wrote:
> This patch creates a new gthread model for AMD GCN devices.
>
> For now, there's just enough support for libgfortran to use mutexes in
> its I/O routines. The rest can be added at a later time, if at all.

Hmm, interestingly we don't have that for nvptx -- and I didn't run into
the need when early this year I was working on Fortran I/O support for
nvptx corresponding to that of GCN.  (That's the pending
"nvptx, libgfortran: Switch out of "minimal" mode" and prerequisite
patches.)

Anyway, not resolving that mystery today, but just a simple technicality:
pushed to master branch commit 5926f30a8dcee9142360fdae445ebfdee4a528f9
"GCN: Address undeclared 'NULL' usage in 'libgcc/config/gcn/gthr-gcn.h:__gthread_getspecific'",
see attached.


Grüße
 Thomas


> Notes:
>
>   * GCN GPUs do not support dynamic creation and deletion of threads, so
>     there can be no implementation for those functions. (There may be
>     many threads, of course, but they are hardware managed and must be
>     launched all at once.)
>
>   * It would be possible to implement support for EMUTLS, but I have no
>     wish to do so at this time, and it isn't likely to be needed by
>     OpenMP or OpenACC offload kernels, so those functions are also stub
>     implementations.
>
> OK to commit?
>
> --
> Andrew Stubbs
> Mentor Graphics / CodeSourcery
> Create GCN-specific gthreads
>
> 2019-06-05  Kwok Cheung Yeung  <kcy@codesourcery.com>
>             Andrew Stubbs  <ams@codesourcery.com>
>
>         gcc/
>       * config.gcc (thread_file): Set to gcn for AMD GCN.
>       * config/gcn/gcn.c (gcn_emutls_var_init): New function.
>       (TARGET_EMUTLS_VAR_INIT): New hook.
>
>       config/
>       * gthr.m4 (GCC_AC_THREAD_HEADER): Add case for gcn.
>
>       libgcc/
>       * configure: Regenerate.
>       * config/gcn/gthr-gcn.h: New.
>
> diff --git a/config/gthr.m4 b/config/gthr.m4
> index 7b29f1f3327..4b937306ad0 100644
> --- a/config/gthr.m4
> +++ b/config/gthr.m4
> @@ -13,6 +13,7 @@ AC_DEFUN([GCC_AC_THREAD_HEADER],
>  case $1 in
>      aix)     thread_header=config/rs6000/gthr-aix.h ;;
>      dce)     thread_header=config/pa/gthr-dce.h ;;
> +    gcn)     thread_header=config/gcn/gthr-gcn.h ;;
>      lynx)    thread_header=config/gthr-lynx.h ;;
>      mipssde) thread_header=config/mips/gthr-mipssde.h ;;
>      posix)   thread_header=gthr-posix.h ;;
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index 6b00c387247..b450098aa09 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -1428,6 +1428,7 @@ amdgcn-*-amdhsa)
>       fi
>       # Force .init_array support.
>       gcc_cv_initfini_array=yes
> +     thread_file=gcn
>       ;;
>  moxie-*-elf)
>       gas=yes
> diff --git a/gcc/config/gcn/gcn.c b/gcc/config/gcn/gcn.c
> index 71f4b4ce35a..e528b649cce 100644
> --- a/gcc/config/gcn/gcn.c
> +++ b/gcc/config/gcn/gcn.c
> @@ -3163,6 +3163,16 @@ gcn_valid_cvt_p (machine_mode from, machine_mode to, enum gcn_cvt_t op)
>         || (to == DFmode && (from == SImode || from == SFmode)));
>  }
>
> +/* Implement TARGET_EMUTLS_VAR_INIT.
> +
> +   Disable emutls (gthr-gcn.h does not support it, yet).  */
> +
> +tree
> +gcn_emutls_var_init (tree, tree decl, tree)
> +{
> +  sorry_at (DECL_SOURCE_LOCATION (decl), "TLS is not implemented for GCN.");
> +}
> +
>  /* }}}  */
>  /* {{{ Costs.  */
>
> @@ -6007,6 +6017,8 @@ print_operand (FILE *file, rtx x, int code)
>  #define TARGET_CONSTANT_ALIGNMENT gcn_constant_alignment
>  #undef  TARGET_DEBUG_UNWIND_INFO
>  #define TARGET_DEBUG_UNWIND_INFO gcn_debug_unwind_info
> +#undef  TARGET_EMUTLS_VAR_INIT
> +#define TARGET_EMUTLS_VAR_INIT gcn_emutls_var_init
>  #undef  TARGET_EXPAND_BUILTIN
>  #define TARGET_EXPAND_BUILTIN gcn_expand_builtin
>  #undef  TARGET_FUNCTION_ARG
> diff --git a/libgcc/config/gcn/gthr-gcn.h b/libgcc/config/gcn/gthr-gcn.h
> new file mode 100644
> index 00000000000..4227b515f01
> --- /dev/null
> +++ b/libgcc/config/gcn/gthr-gcn.h
> @@ -0,0 +1,163 @@
> +/* Threads compatibility routines for libgcc2 and libobjc.  */
> +/* Compile this one with gcc.  */
> +/* Copyright (C) 2019 Free Software Foundation, Inc.
> +
> +This file is part of GCC.
> +
> +GCC is free software; you can redistribute it and/or modify it under
> +the terms of the GNU General Public License as published by the Free
> +Software Foundation; either version 3, or (at your option) any later
> +version.
> +
> +GCC is distributed in the hope that it will be useful, but WITHOUT ANY
> +WARRANTY; without even the implied warranty of MERCHANTABILITY or
> +FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
> +for more details.
> +
> +Under Section 7 of GPL version 3, you are granted additional
> +permissions described in the GCC Runtime Library Exception, version
> +3.1, as published by the Free Software Foundation.
> +
> +You should have received a copy of the GNU General Public License and
> +a copy of the GCC Runtime Library Exception along with this program;
> +see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> +<http://www.gnu.org/licenses/>.  */
> +
> +/* AMD GCN does not support dynamic creation of threads.  There may be many
> +   hardware threads, but they're all created simultaneously at launch time.
> +
> +   This implementation is intended to provide mutexes for libgfortran, etc.
> +   It is not intended to provide a TLS implementation at this time,
> +   although that may be added later if needed.
> +
> +   __gthread_active_p returns "1" to ensure that mutexes are used, and that
> +   programs attempting to use emutls will fail with the appropriate abort.
> +   It is expected that the TLS tests will fail.  */
> +
> +#ifndef GCC_GTHR_GCN_H
> +#define GCC_GTHR_GCN_H
> +
> +#define __GTHREADS 1
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#ifdef _LIBOBJC
> +#error "Objective C is not supported on AMD GCN"
> +#else
> +
> +static inline int
> +__gthread_active_p (void)
> +{
> +  return 1;
> +}
> +
> +typedef int __gthread_key_t;
> +typedef int __gthread_once_t;
> +typedef int __gthread_mutex_t;
> +typedef int __gthread_recursive_mutex_t;
> +
> +#define __GTHREAD_ONCE_INIT 0
> +#define __GTHREAD_MUTEX_INIT 0
> +#define __GTHREAD_RECURSIVE_MUTEX_INIT 0
> +
> +static inline int
> +__gthread_once (__gthread_once_t *__once __attribute__((unused)),
> +             void (*__func) (void) __attribute__((unused)))
> +{
> +  return 0;
> +}
> +
> +static inline int
> +__gthread_key_create (__gthread_key_t *__key __attribute__((unused)),
> +                   void (*__dtor) (void *) __attribute__((unused)))
> +{
> +  /* Operation is not supported.  */
> +  return -1;
> +}
> +
> +static inline int
> +__gthread_key_delete (__gthread_key_t __key __attribute__ ((__unused__)))
> +{
> +  /* Operation is not supported.  */
> +  return -1;
> +}
> +
> +static inline void *
> +__gthread_getspecific (__gthread_key_t __key __attribute__((unused)))
> +{
> +  return NULL;
> +}
> +
> +static inline int
> +__gthread_setspecific (__gthread_key_t __key __attribute__((unused)),
> +                    const void *__ptr __attribute__((unused)))
> +{
> +  /* Operation is not supported.  */
> +  return -1;
> +}
> +
> +static inline int
> +__gthread_mutex_destroy (__gthread_mutex_t *__mutex __attribute__((unused)))
> +{
> +  return 0;
> +}
> +
> +static inline int
> +__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
> +{
> +  return 0;
> +}
> +
> +
> +static inline int
> +__gthread_mutex_lock (__gthread_mutex_t *__mutex)
> +{
> +  while (__sync_lock_test_and_set (__mutex, 1))
> +    asm volatile ("s_sleep\t1" ::: "memory");
> +
> +  return 0;
> +}
> +
> +static inline int
> +__gthread_mutex_trylock (__gthread_mutex_t *__mutex)
> +{
> +  return __sync_lock_test_and_set (__mutex, 1);
> +}
> +
> +static inline int
> +__gthread_mutex_unlock (__gthread_mutex_t *__mutex)
> +{
> +  __sync_lock_release (__mutex);
> +
> +  return 0;
> +}
> +
> +static inline int
> +__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
> +{
> +  /* Operation is not supported.  */
> +  return -1;
> +}
> +
> +static inline int
> +__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
> +{
> +  /* Operation is not supported.  */
> +  return -1;
> +}
> +
> +static inline int
> +__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
> +{
> +  /* Operation is not supported.  */
> +  return -1;
> +}
> +#endif /* _LIBOBJC */
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* ! GCC_GTHR_GCN_H */
> diff --git a/libgcc/configure b/libgcc/configure
> index b2914de0629..af910b62931 100644
> --- a/libgcc/configure
> +++ b/libgcc/configure
> @@ -5542,6 +5542,7 @@ tm_file="${tm_file_}"
>  case $target_thread_file in
>      aix)     thread_header=config/rs6000/gthr-aix.h ;;
>      dce)     thread_header=config/pa/gthr-dce.h ;;
> +    gcn)     thread_header=config/gcn/gthr-gcn.h ;;
>      lynx)    thread_header=config/gthr-lynx.h ;;
>      mipssde) thread_header=config/mips/gthr-mipssde.h ;;
>      posix)   thread_header=gthr-posix.h ;;


-----------------
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
  

Patch

From 5926f30a8dcee9142360fdae445ebfdee4a528f9 Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <thomas@codesourcery.com>
Date: Wed, 13 Jul 2022 18:17:30 +0200
Subject: [PATCH] GCN: Address undeclared 'NULL' usage in
 'libgcc/config/gcn/gthr-gcn.h:__gthread_getspecific'
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

For 'libgcc/config/gcn/gthr-gcn.h' used in libstdc++ context (WIP), we have:

    [...]/build-gcc-offload-amdgcn-amdhsa/amdgcn-amdhsa/libstdc++-v3/include/amdgcn-amdhsa/bits/gthr-default.h: In function ‘void* __gthread_getspecific(__gthread_key_t)’:
    [...]/build-gcc-offload-amdgcn-amdhsa/amdgcn-amdhsa/libstdc++-v3/include/amdgcn-amdhsa/bits/gthr-default.h:90:10: error: ‘NULL’ was not declared in this scope
       90 |   return NULL;
          |          ^~~~

Resolve this with 's%NULL%0', as is used in
'libgcc/gthr-single.h:__gthread_getspecific', for example.

Follow-up to commit 76d463310787c8c7fd0c55cf88031b240311ab68
"Create GCN-specific gthreads".

	libgcc/
	* config/gcn/gthr-gcn.h (__gthread_getspecific): 's%NULL%0'.
---
 libgcc/config/gcn/gthr-gcn.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libgcc/config/gcn/gthr-gcn.h b/libgcc/config/gcn/gthr-gcn.h
index a0bfde2023a..d81b27db933 100644
--- a/libgcc/config/gcn/gthr-gcn.h
+++ b/libgcc/config/gcn/gthr-gcn.h
@@ -87,7 +87,7 @@  __gthread_key_delete (__gthread_key_t __key __attribute__ ((__unused__)))
 static inline void *
 __gthread_getspecific (__gthread_key_t __key __attribute__((unused)))
 {
-  return NULL;
+  return 0;
 }
 
 static inline int
-- 
2.34.1