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:
parent
65dbe0ab7c
commit
d9c90c82d9
6 changed files with 109 additions and 5 deletions
|
@ -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. */
|
||||
|
|
|
@ -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" } } */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
74
libgcc/config/nvptx/gbl-ctors.c
Normal file
74
libgcc/config/nvptx/gbl-ctors.c
Normal 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;
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue