On 23/04/2025 20:49, Thomas Schwinge wrote:
'__dso_handle' for '__cxa_atexit', '__cxa_finalize'. See <https://itanium-cxx-abi.github.io/cxx-abi/abi.html#dso-dtor>.PR target/119853 PR target/119854 libgcc/ * config/gcn/crt0.c (_fini_array): Call '__GCC_offload___cxa_finalize'. * config/nvptx/gbl-ctors.c (__static_do_global_dtors): Likewise. libgomp/ * target-cxa-dso-dtor.c: New. * config/accel/target-cxa-dso-dtor.c: Likewise. * Makefile.am (libgomp_la_SOURCES): Add it. * Makefile.in: Regenerate. * testsuite/libgomp.c++/target-cdtor-1.C: New. * testsuite/libgomp.c++/target-cdtor-2.C: Likewise. --- libgcc/config/gcn/crt0.c | 32 ++++ libgcc/config/nvptx/gbl-ctors.c | 16 ++ libgomp/Makefile.am | 2 +- libgomp/Makefile.in | 7 +- libgomp/config/accel/target-cxa-dso-dtor.c | 62 ++++++++ libgomp/target-cxa-dso-dtor.c | 3 + .../testsuite/libgomp.c++/target-cdtor-1.C | 104 +++++++++++++ .../testsuite/libgomp.c++/target-cdtor-2.C | 138 ++++++++++++++++++ 8 files changed, 361 insertions(+), 3 deletions(-) create mode 100644 libgomp/config/accel/target-cxa-dso-dtor.c create mode 100644 libgomp/target-cxa-dso-dtor.c create mode 100644 libgomp/testsuite/libgomp.c++/target-cdtor-1.C create mode 100644 libgomp/testsuite/libgomp.c++/target-cdtor-2.C diff --git a/libgcc/config/gcn/crt0.c b/libgcc/config/gcn/crt0.c index dbd6749a47f..cc23e214cf9 100644 --- a/libgcc/config/gcn/crt0.c +++ b/libgcc/config/gcn/crt0.c @@ -24,6 +24,28 @@ typedef long long size_t; /* Provide an entry point symbol to silence a linker warning. */ void _start() {}++#define PR119369_fixed 0 + + +/* Host/device compatibility: '__cxa_finalize'. Dummy; if necessary, + overridden via libgomp 'target-cxa-dso-dtor.c'. */ + +#if PR119369_fixed +extern void __GCC_offload___cxa_finalize (void *) __attribute__((weak)); +#else +void __GCC_offload___cxa_finalize (void *) __attribute__((weak)); + +void __attribute__((weak)) +__GCC_offload___cxa_finalize (void *dso_handle __attribute__((unused))) +{ +} +#endif + +/* There are no DSOs; this is the main program. */ +static void * const __dso_handle = 0; + + #ifdef USE_NEWLIB_INITFINIextern void __libc_init_array (void) __attribute__((weak));@@ -38,6 +60,11 @@ void _init_array() __attribute__((amdgpu_hsa_kernel ())) void _fini_array() { +#if PR119369_fixed + if (__GCC_offload___cxa_finalize) +#endif + __GCC_offload___cxa_finalize (__dso_handle); + __libc_fini_array (); }@@ -70,6 +97,11 @@ void _init_array()__attribute__((amdgpu_hsa_kernel ())) void _fini_array() { +#if PR119369_fixed + if (__GCC_offload___cxa_finalize) +#endif + __GCC_offload___cxa_finalize (__dso_handle); + size_t count; size_t i;
The GCN part seems OK, albeit the conditionals are confusing. Andrew
