GCN: Address undeclared 'NULL' usage in 'libgcc/config/gcn/gthr-gcn.h:__gthread_getspecific' (was: [PATCH 1/3] Create GCN-specific gthreads)
Checks
Commit Message
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
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(-)
@@ -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