]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
GCN, nvptx: Basic '__cxa_guard_{acquire,abort,release}' for C++ static local variable...
authorThomas Schwinge <thomas@codesourcery.com>
Wed, 20 Dec 2023 11:27:48 +0000 (12:27 +0100)
committerThomas Schwinge <thomas@codesourcery.com>
Sat, 23 Dec 2023 09:10:02 +0000 (10:10 +0100)
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.

libgcc/c++-minimal/README [new file with mode: 0644]
libgcc/c++-minimal/guard.c [new file with mode: 0644]
libgcc/config/gcn/t-amdgcn
libgcc/config/nvptx/t-nvptx

diff --git a/libgcc/c++-minimal/README b/libgcc/c++-minimal/README
new file mode 100644 (file)
index 0000000..832f126
--- /dev/null
@@ -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 (file)
index 0000000..e9937b0
--- /dev/null
@@ -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);
+}
index d1d9a4f92b52e0612eeff1ded44e236d2f50a979..b00adc72bad7f2e9ed212582651bb8b6cde0ea59 100644 (file)
@@ -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
 
index ede0bf0f87dd35ab7221af3c5ca92f6e6e1a2b4b..49fdb557b56725bd07445a08971b6e2214f3eeaa 100644 (file)
@@ -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