diff --git a/libgcc/c++-minimal/README b/libgcc/c++-minimal/README new file mode 100644 index 00000000000..832f1265f7e --- /dev/null +++ b/libgcc/c++-minimal/README @@ -0,0 +1,2 @@ +Minimal hacked-up version of some C++ support for offload devices, until we +have libstdc++-v3/libsupc++ proper. diff --git a/libgcc/c++-minimal/guard.c b/libgcc/c++-minimal/guard.c new file mode 100644 index 00000000000..e9937b07a62 --- /dev/null +++ b/libgcc/c++-minimal/guard.c @@ -0,0 +1,97 @@ +/* 'libstdc++-v3/libsupc++/guard.cc' for offload devices, until we have + libstdc++-v3/libsupc++ proper. + + Copyright (C) 2002-2023 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 +. */ + +#if defined __AMDGCN__ +#elif defined __nvptx__ +#else +# error not ported +#endif + +#include "../../libstdc++-v3/config/cpu/generic/cxxabi_tweaks.h" + +/* Copy'n'paste/edit from 'libstdc++-v3/libsupc++/cxxabi.h'. */ + +int +__cxa_guard_acquire(__guard*); + +void +__cxa_guard_release(__guard*); + +void +__cxa_guard_abort(__guard*); + +/* Copy'n'paste/edit from 'libstdc++-v3/libsupc++/guard.cc'. */ + +#undef _GLIBCXX_GUARD_TEST_AND_ACQUIRE +#undef _GLIBCXX_GUARD_SET_AND_RELEASE +#define _GLIBCXX_GUARD_SET_AND_RELEASE(G) _GLIBCXX_GUARD_SET (G) + +static inline int +init_in_progress_flag(__guard* g) +{ return ((char *)g)[1]; } + +static inline void +set_init_in_progress_flag(__guard* g, int v) +{ ((char *)g)[1] = v; } + +static inline void +throw_recursive_init_exception(void) +{ + // Use __builtin_trap so we don't require abort(). + __builtin_trap(); +} + +// acquire() is a helper function used to acquire guard if thread support is +// not compiled in or is compiled in but not enabled at run-time. +static int +acquire(__guard *g) +{ + // Quit if the object is already initialized. + if (_GLIBCXX_GUARD_TEST(g)) + return 0; + + if (init_in_progress_flag(g)) + throw_recursive_init_exception(); + + set_init_in_progress_flag(g, 1); + return 1; +} + +int __cxa_guard_acquire (__guard *g) +{ + return acquire (g); +} + +void __cxa_guard_abort (__guard *g) +{ + set_init_in_progress_flag(g, 0); +} + +void __cxa_guard_release (__guard *g) +{ + set_init_in_progress_flag(g, 0); + _GLIBCXX_GUARD_SET_AND_RELEASE (g); +} diff --git a/libgcc/config/gcn/t-amdgcn b/libgcc/config/gcn/t-amdgcn index d1d9a4f92b5..b00adc72bad 100644 --- a/libgcc/config/gcn/t-amdgcn +++ b/libgcc/config/gcn/t-amdgcn @@ -8,6 +8,9 @@ LIB2ADD += $(srcdir)/config/gcn/atomic.c \ $(srcdir)/config/gcn/lib2-bswapti2.c \ $(srcdir)/config/gcn/unwind-gcn.c +# Until we have libstdc++-v3/libsupc++ proper. +LIB2ADD += $(srcdir)/c++-minimal/guard.c + LIB2ADDEH= LIB2FUNCS_EXCLUDE=__main diff --git a/libgcc/config/nvptx/t-nvptx b/libgcc/config/nvptx/t-nvptx index ede0bf0f87d..49fdb557b56 100644 --- a/libgcc/config/nvptx/t-nvptx +++ b/libgcc/config/nvptx/t-nvptx @@ -2,6 +2,9 @@ LIB2ADD=$(srcdir)/config/nvptx/reduction.c \ $(srcdir)/config/nvptx/mgomp.c \ $(srcdir)/config/nvptx/atomic.c +# Until we have libstdc++-v3/libsupc++ proper. +LIB2ADD += $(srcdir)/c++-minimal/guard.c + LIB2ADDEH= LIB2FUNCS_EXCLUDE=__main