aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorKwok Cheung Yeung <kcy@codesourcery.com>2019-05-22 22:14:08 +0000
committerAndrew Stubbs <ams@gcc.gnu.org>2019-05-22 22:14:08 +0000
commit7039cebfa8da3e6309bf1792ca063497257edcd8 (patch)
tree5cf5bd2cb8526d45d1b2f4443db781788fdac5f0 /libgcc
parentb7c28a47c2d57bc21daab4dd586139e87fe701f9 (diff)
downloadgcc-7039cebfa8da3e6309bf1792ca063497257edcd8.zip
gcc-7039cebfa8da3e6309bf1792ca063497257edcd8.tar.gz
gcc-7039cebfa8da3e6309bf1792ca063497257edcd8.tar.bz2
Add support for constructors and destuctors on GCN
2019-05-22 Kwok Cheung Yeung <kcy@codesourcery.com> Andrew Stubbs <amd@codesourcery.com> gcc/ * config.gcc (gcc_cv_initfini_array): Set for AMD GCN. * config/gcn/gcn-run.c (init_array_kernel, fini_array_kernel): New. (kernel): Rename to... (main_kernel): ... this. (load_image): Load _init_array and _fini_array kernels. (run): Add argument for kernel to run. (main): Run init_array_kernel before main_kernel, and fini_array_kernel after. * config/gcn/gcn.c (gcn_handle_amdgpu_hsa_kernel_attribute): Allow amdgpu_hsa_kernel attribute on functions. (gcn_disable_constructors): Delete. (TARGET_ASM_CONSTRUCTOR, TARGET_ASM_DESTRUCTOR): Delete. * config/gcn/crt0.c (size_t): Define. (_init_array, _fini_array): New. (__preinit_array_start, __preinit_array_end, __init_array_start, __init_array_end, __fini_array_start, __fini_array_end): Declare weak references. Co-Authored-By: Andrew Stubbs <ams@codesourcery.com> From-SVN: r271526
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/config/gcn/crt0.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/libgcc/config/gcn/crt0.c b/libgcc/config/gcn/crt0.c
index c0b9353..9b58029 100644
--- a/libgcc/config/gcn/crt0.c
+++ b/libgcc/config/gcn/crt0.c
@@ -19,5 +19,61 @@
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
+typedef long long size_t;
+
/* Provide an entry point symbol to silence a linker warning. */
void _start() {}
+
+#ifdef USE_NEWLIB_INITFINI
+
+extern void __libc_init_array (void) __attribute__((weak));
+extern void __libc_fini_array (void) __attribute__((weak));
+
+__attribute__((amdgpu_hsa_kernel ()))
+void _init_array()
+{
+ __libc_init_array ();
+}
+
+__attribute__((amdgpu_hsa_kernel ()))
+void _fini_array()
+{
+ __libc_fini_array ();
+}
+
+#endif
+
+/* These magic symbols are provided by the linker. */
+extern void (*__preinit_array_start []) (void) __attribute__((weak));
+extern void (*__preinit_array_end []) (void) __attribute__((weak));
+extern void (*__init_array_start []) (void) __attribute__((weak));
+extern void (*__init_array_end []) (void) __attribute__((weak));
+extern void (*__fini_array_start []) (void) __attribute__((weak));
+extern void (*__fini_array_end []) (void) __attribute__((weak));
+
+__attribute__((amdgpu_hsa_kernel ()))
+void _init_array()
+{
+ /* Iterate over all the init routines. */
+ size_t count;
+ size_t i;
+
+ count = __preinit_array_end - __preinit_array_start;
+ for (i = 0; i < count; i++)
+ __preinit_array_start[i] ();
+
+ count = __init_array_end - __init_array_start;
+ for (i = 0; i < count; i++)
+ __init_array_start[i] ();
+}
+
+__attribute__((amdgpu_hsa_kernel ()))
+void _fini_array()
+{
+ size_t count;
+ size_t i;
+
+ count = __fini_array_end - __fini_array_start;
+ for (i = count; i > 0; i--)
+ __fini_array_start[i-1] ();
+}