diff options
Diffstat (limited to 'libgcc')
-rw-r--r-- | libgcc/config/gcn/crt0.c | 56 |
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] (); +} |