Hi! On 2023-12-21T13:58:23+0100, Jakub Jelinek <ja...@redhat.com> wrote: > On Thu, Dec 21, 2023 at 01:31:19PM +0100, Thomas Schwinge wrote: >> [...] the gimplification-level code re >> 'Static locals [...] need to be "omp declare target"' runs *after* >> 'omp_discover_implicit_declare_target'. Thus my "move" idea above. > > Can't we mark the static locals already during that discovery?
Well, that's precisely what I had tried to communicate, earlier on. ;-) I'll work on that, as a refactoring, after I've gotten the current implementation idea working. > The addition during gimplification was probably made when we didn't have > that at all. >> OK to push, for a start, the attached >> "GCN, nvptx: Basic '__cxa_guard_{acquire,abort,release}' for C++ static >> local variables support"? >> That's now in libgcc not libgomp, so that it's also usable for GCN, nvptx >> target testing, where we thus see a number of FAIL -> PASS progressions. > >> For now, for single-threaded GCN, nvptx target use only; extension for >> multi-threaded offloading use to follow later. >> >> libgcc/ >> * c++-minimal/README: New. >> * c++-minimal/guard.c: New. >> * config/gcn/t-amdgcn (LIB2ADD): Add it. >> * config/nvptx/t-nvptx (LIB2ADD): Likewise. > >> +/* 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*); > > When all this isn't inside a namespace, shouldn't it be indented by > 2 spaces less? > >> + >> +/* 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) > > And without a space after # here? Well, those were just un-edited copy'n'pastes from the original files; now indentation/space-corrected for viewing pleasure. > Otherwise LGTM, but hope that one day we'll get rid of it again. Yep. Pushed to master branch commit c0bf7ea189ecf252152fe15134f70f576bcd20b2 "GCN, nvptx: Basic '__cxa_guard_{acquire,abort,release}' for C++ static local variables support", see attached. Grüße Thomas ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
>From c0bf7ea189ecf252152fe15134f70f576bcd20b2 Mon Sep 17 00:00:00 2001 From: Thomas Schwinge <tho...@codesourcery.com> Date: Wed, 20 Dec 2023 12:27:48 +0100 Subject: [PATCH] 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. --- 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(+) create mode 100644 libgcc/c++-minimal/README create mode 100644 libgcc/c++-minimal/guard.c 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 -- 2.34.1