From 76d463310787c8c7fd0c55cf88031b240311ab68 Mon Sep 17 00:00:00 2001 From: Kwok Cheung Yeung Date: Tue, 25 Jun 2019 11:41:29 +0000 Subject: [PATCH] Create GCN-specific gthreads 2019-06-25 Kwok Cheung Yeung Andrew Stubbs 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. Co-Authored-By: Andrew Stubbs From-SVN: r272647 --- config/ChangeLog | 5 ++ config/gthr.m4 | 1 + gcc/ChangeLog | 7 ++ gcc/config.gcc | 1 + gcc/config/gcn/gcn.c | 12 ++++ libgcc/ChangeLog | 6 ++ libgcc/config/gcn/gthr-gcn.h | 163 +++++++++++++++++++++++++++++++++++++++++++ libgcc/configure | 1 + 8 files changed, 196 insertions(+) create mode 100644 libgcc/config/gcn/gthr-gcn.h diff --git a/config/ChangeLog b/config/ChangeLog index c323fc4..63f4325 100644 --- a/config/ChangeLog +++ b/config/ChangeLog @@ -1,3 +1,8 @@ +2019-06-25 Kwok Cheung Yeung + Andrew Stubbs + + * gthr.m4 (GCC_AC_THREAD_HEADER): Add case for gcn. + 2019-05-30 Rainer Orth * ax_count_cpus.m4: New file. diff --git a/config/gthr.m4 b/config/gthr.m4 index 7b29f1f..4b93730 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/ChangeLog b/gcc/ChangeLog index fee1f55..94b5c49 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2019-06-25 Kwok Cheung Yeung + Andrew Stubbs + + * 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. + 2019-06-25 Martin Jambor PR ipa/90939 diff --git a/gcc/config.gcc b/gcc/config.gcc index 8488ab6..bfe27ad 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -1462,6 +1462,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 71f4b4c..e528b64 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/ChangeLog b/libgcc/ChangeLog index 53acb8b..c6c1b1f 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,9 @@ +2019-06-25 Kwok Cheung Yeung + Andrew Stubbs + + * configure: Regenerate. + * config/gcn/gthr-gcn.h: New. + 2019-06-18 Tom de Vries * config/nvptx/crt0.c (__main): Declare. diff --git a/libgcc/config/gcn/gthr-gcn.h b/libgcc/config/gcn/gthr-gcn.h new file mode 100644 index 0000000..4227b51 --- /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 +. */ + +/* 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 b2914de..af910b6 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 ;; -- 2.7.4