nvptx target: Global constructor, destructor support, via nvptx-tools 'ld'

The function attributes 'constructor', 'destructor', and 'init_priority' now
work, as do the C++ features making use of this.  Test cases with effective
target 'global_constructor' and 'init_priority' now generally work, and
'check-gcc-c++' test results greatly improve; no more
"sorry, unimplemented: global constructors not supported on this target".

For proper execution test results, this depends on
<96f8fc59a7>
"ld: Global constructor/destructor support".

	gcc/
	* config/nvptx/nvptx.h: Configure global constructor, destructor
	support.
	gcc/testsuite/
	* gcc.dg/no_profile_instrument_function-attr-1.c: GCC/nvptx is
	'NO_DOT_IN_LABEL' but not 'NO_DOLLAR_IN_LABEL', so '$' may apper
	in identifiers.
	* lib/target-supports.exp
	(check_effective_target_global_constructor): Enable for nvptx.
	libgcc/
	* config/nvptx/crt0.c (__gbl_ctors): New weak function.
	(__main): Invoke it.
	* config/nvptx/gbl-ctors.c: New.
	* config/nvptx/t-nvptx: Configure global constructor, destructor
	support.
This commit is contained in:
Thomas Schwinge 2024-05-28 23:20:29 +02:00
parent 65dbe0ab7c
commit d9c90c82d9
6 changed files with 109 additions and 5 deletions

View file

@ -356,7 +356,19 @@ struct GTY(()) machine_function
#define MOVE_MAX 8
#define MOVE_RATIO(SPEED) 4
#define FUNCTION_MODE QImode
#define HAS_INIT_SECTION 1
/* Implement global constructor, destructor support in a conceptually simpler
way than using 'collect2' (the program): implement the respective
functionality in the nvptx-tools 'ld'. This however still requires the
compiler-side effects corresponding to 'USE_COLLECT2': the global
constructor, destructor support functions need to have external linkage, and
therefore names that are "unique across the whole link". Use
'!targetm.have_ctors_dtors' to achieve this (..., and thus don't need to
provide 'targetm.asm_out.constructor', 'targetm.asm_out.destructor'). */
#define TARGET_HAVE_CTORS_DTORS false
/* See 'libgcc/config/nvptx/crt0.c' for wrapping of 'main'. */
#define HAS_INIT_SECTION
/* The C++ front end insists to link against libstdc++ -- which we don't build.
Tell it to instead link against the innocuous libgcc. */

View file

@ -18,7 +18,7 @@ int main ()
return foo ();
}
/* { dg-final { scan-tree-dump-times "__gcov0\[._\]main.* = PROF_edge_counter" 1 "optimized"} } */
/* { dg-final { scan-tree-dump-times "__gcov0\[$._\]main.* = PROF_edge_counter" 1 "optimized"} } */
/* { dg-final { scan-tree-dump-times "__gcov_indirect_call_profiler_v" 1 "optimized" } } */
/* { dg-final { scan-tree-dump-times "__gcov_time_profiler_counter = " 1 "optimized" } } */
/* { dg-final { scan-tree-dump-times "__gcov_init" 1 "optimized" } } */

View file

@ -942,8 +942,7 @@ proc check_effective_target_nonlocal_goto {} {
# Return 1 if global constructors are supported, 0 otherwise.
proc check_effective_target_global_constructor {} {
if { [istarget nvptx-*-*]
|| [istarget bpf-*-*] } {
if { [istarget bpf-*-*] } {
return 0
}
return 1

View file

@ -32,6 +32,16 @@ void *__nvptx_stacks[32] __attribute__((shared,nocommon));
/* Likewise for -muniform-simt. */
unsigned __nvptx_uni[32] __attribute__((shared,nocommon));
/* Global constructor/destructor support. Dummy; if necessary, overridden via
'gbl-ctors.c'. */
extern void __gbl_ctors (void);
void __attribute__((weak))
__gbl_ctors (void)
{
}
extern void __main (int *, int, void **) __attribute__((kernel));
void
@ -47,5 +57,7 @@ __main (int *rval_ptr, int argc, void **argv)
__nvptx_stacks[0] = stack + sizeof stack;
__nvptx_uni[0] = 0;
__gbl_ctors ();
exit (main (argc, argv));
}

View file

@ -0,0 +1,74 @@
/* Global constructor/destructor support
Copyright (C) 2024 Free Software Foundation, Inc.
This file 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.
This file 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/>. */
#include "auto-target.h"
#ifdef HAVE_STDLIB_H
# include <stdlib.h>
#endif
#include "gbl-ctors.h"
extern int atexit (void (*function) (void));
/* Handler functions ('static', in contrast to the 'gbl-ctors.h'
prototypes). */
static void __static_do_global_ctors (void);
static void
__static_do_global_ctors (void)
{
__SIZE_TYPE__ nptrs = (__SIZE_TYPE__) __CTOR_LIST__[0];
for (__SIZE_TYPE__ i = nptrs; i >= 1; --i)
__CTOR_LIST__[i] ();
}
static void __static_do_global_dtors (void);
static void
__static_do_global_dtors (void)
{
func_ptr *p = __DTOR_LIST__;
++p;
for (; *p; ++p)
(*p) ();
}
/* For nvptx target configurations, override the 'crt0.c' dummy. */
extern void __gbl_ctors (void);
void
__gbl_ctors (void)
{
__static_do_global_ctors ();
atexit (__static_do_global_dtors);
}
/* The following symbol just provides a means for the nvptx-tools 'ld' to
trigger linking in this file. */
int __trigger_gbl_ctors;

View file

@ -6,8 +6,10 @@ LIB2ADD=$(srcdir)/config/nvptx/reduction.c \
LIB2ADD += $(srcdir)/c++-minimal/guard.c
LIB2ADDEH=
LIB2FUNCS_EXCLUDE=__main
LIB2FUNCS_EXCLUDE=
# Wrapping of 'main'.
LIB2FUNCS_EXCLUDE += __main
crt0.o: $(srcdir)/config/nvptx/crt0.c
$(crt_compile) -c $<
@ -15,3 +17,8 @@ crt0.o: $(srcdir)/config/nvptx/crt0.c
# support it, and it may cause the build to fail, because of alloca usage, for
# example.
INHIBIT_LIBC_CFLAGS = -Dinhibit_libc
# Support for global constructors/destructors is implemented via the
# nvptx-tools 'ld' and the following helpers.
LIB2ADD += $(srcdir)/config/nvptx/gbl-ctors.c
LIB2FUNCS_EXCLUDE += _ctors