aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Schwinge <thomas@codesourcery.com>2023-12-20 12:27:48 +0100
committerThomas Schwinge <thomas@codesourcery.com>2023-12-23 10:10:02 +0100
commitc0bf7ea189ecf252152fe15134f70f576bcd20b2 (patch)
tree628addb358d1ce94e1b2aea777648ae8fc3e1369
parent079455458e5665330abc9c8b0726b0b11e7016ee (diff)
downloadgcc-c0bf7ea189ecf252152fe15134f70f576bcd20b2.zip
gcc-c0bf7ea189ecf252152fe15134f70f576bcd20b2.tar.gz
gcc-c0bf7ea189ecf252152fe15134f70f576bcd20b2.tar.bz2
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.
-rw-r--r--libgcc/c++-minimal/README2
-rw-r--r--libgcc/c++-minimal/guard.c97
-rw-r--r--libgcc/config/gcn/t-amdgcn3
-rw-r--r--libgcc/config/nvptx/t-nvptx3
4 files changed, 105 insertions, 0 deletions
diff --git a/libgcc/c++-minimal/README b/libgcc/c++-minimal/README
new file mode 100644
index 0000000..832f126
--- /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 0000000..e9937b0
--- /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
+<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);
+}
diff --git a/libgcc/config/gcn/t-amdgcn b/libgcc/config/gcn/t-amdgcn
index d1d9a4f..b00adc7 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 ede0bf0..49fdb55 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