GCN, nvptx: Basic '__cxa_guard_{acquire,abort,release}' for C++ static local variables support
For now, for single-threaded GCN, nvptx target use only; extension for multi-threaded offloading use is to follow later. Eventually switch to libstdc++-v3/libsupc++ proper. libgcc/ * c++-minimal/README: New. * c++-minimal/guard.c: New. * config/gcn/t-amdgcn (LIB2ADD): Add it. * config/nvptx/t-nvptx (LIB2ADD): Likewise.
This commit is contained in:
parent
079455458e
commit
c0bf7ea189
4 changed files with 105 additions and 0 deletions
2
libgcc/c++-minimal/README
Normal file
2
libgcc/c++-minimal/README
Normal file
|
@ -0,0 +1,2 @@
|
|||
Minimal hacked-up version of some C++ support for offload devices, until we
|
||||
have libstdc++-v3/libsupc++ proper.
|
97
libgcc/c++-minimal/guard.c
Normal file
97
libgcc/c++-minimal/guard.c
Normal file
|
@ -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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#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);
|
||||
}
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue