From: Thomas Schwinge <thomas@codesourcery.com>
To: Kwok Cheung Yeung <kcy@codesourcery.com>,
Andrew Stubbs <ams@codesourcery.com>, <gcc-patches@gcc.gnu.org>
Cc: <fortran@gcc.gnu.org>, Julian Brown <julian@codesourcery.com>
Subject: GCN: Address undeclared 'NULL' usage in 'libgcc/config/gcn/gthr-gcn.h:__gthread_getspecific' (was: [PATCH 1/3] Create GCN-specific gthreads)
Date: Fri, 3 Nov 2023 15:54:34 +0100 [thread overview]
Message-ID: <87o7gavqdx.fsf@euler.schwinge.homeip.net> (raw)
In-Reply-To: <e12103b3-9dbd-0f84-c758-b325cd7cd562@codesourcery.com>
[-- Attachment #1: Type: text/plain, Size: 9785 bytes --]
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
[-- Attachment #2: 0001-GCN-Address-undeclared-NULL-usage-in-libgcc-config-g.patch --]
[-- Type: text/x-diff, Size: 1670 bytes --]
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
next prev parent reply other threads:[~2023-11-03 14:55 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-07 14:38 [PATCH 0/3] Enable full libgfortran for AMD GCN Andrew Stubbs
2019-06-07 14:39 ` [PATCH 1/3] Create GCN-specific gthreads Andrew Stubbs
2019-06-19 8:57 ` Andrew Stubbs
2019-06-19 16:04 ` Jeff Law
2019-06-19 16:56 ` Andrew Stubbs
2019-06-19 16:59 ` Jeff Law
2023-11-03 14:54 ` Thomas Schwinge [this message]
2019-06-07 14:40 ` [PATCH 2/3] Stub implementation of unwinding for AMD GCN Andrew Stubbs
2019-06-19 8:58 ` Andrew Stubbs
2019-06-19 16:05 ` Jeff Law
2019-06-19 16:57 ` Andrew Stubbs
2019-06-07 14:41 ` [PATCH 3/3] Enable full libgfortran library " Andrew Stubbs
2019-06-14 16:17 ` Janne Blomqvist
2019-06-19 16:05 ` Jeff Law
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87o7gavqdx.fsf@euler.schwinge.homeip.net \
--to=thomas@codesourcery.com \
--cc=ams@codesourcery.com \
--cc=fortran@gcc.gnu.org \
--cc=gcc-patches@gcc.gnu.org \
--cc=julian@codesourcery.com \
--cc=kcy@codesourcery.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).