[gcc r14-6813] GCN, nvptx: Basic '__cxa_guard_{acquire, abort, release}' for C++ static local variables support

Thomas Schwinge tschwinge@gcc.gnu.org
Sat Dec 23 09:11:00 GMT 2023


https://gcc.gnu.org/g:c0bf7ea189ecf252152fe15134f70f576bcd20b2

commit r14-6813-gc0bf7ea189ecf252152fe15134f70f576bcd20b2
Author: Thomas Schwinge <thomas@codesourcery.com>
Date:   Wed Dec 20 12:27:48 2023 +0100

    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.

Diff:
---
 libgcc/c++-minimal/README   |  2 +
 libgcc/c++-minimal/guard.c  | 97 +++++++++++++++++++++++++++++++++++++++++++++
 libgcc/config/gcn/t-amdgcn  |  3 ++
 libgcc/config/nvptx/t-nvptx |  3 ++
 4 files changed, 105 insertions(+)

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
+<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 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


More information about the Gcc-cvs mailing list