mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-18 20:39:33 +08:00
1787e9d033
Add support for the AMD GCN GPU architecture. This is primarily intended for use with OpenMP and OpenACC offloading. It can also be used for stand-alone programs, but this is intended mostly for testing the compiler and is not expected to be useful in general. The GPU architecture is highly parallel, and therefore Newlib must be configured to use dynamic re-entrancy, and thread-safe malloc. The only I/O available is a via a shared-memory interface provided by libgomp and the gcn-run tool included with GCC. At this time this is limited to stdout, argc/argv, and the return code.
52 lines
1.1 KiB
C
52 lines
1.1 KiB
C
#include <sys/cdefs.h>
|
|
#include <sys/param.h>
|
|
#include <signal.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
#if defined(__AMDGCN__)
|
|
/* GCN does not support constructors, yet. */
|
|
uintptr_t __stack_chk_guard = 0x00000aff; /* 0, 0, '\n', 255 */
|
|
|
|
#else
|
|
uintptr_t __stack_chk_guard = 0;
|
|
|
|
void
|
|
__attribute__((__constructor__))
|
|
__stack_chk_init (void)
|
|
{
|
|
if (__stack_chk_guard != 0)
|
|
return;
|
|
|
|
#if defined(__CYGWIN__) || defined(__rtems__)
|
|
arc4random_buf(&__stack_chk_guard, sizeof(__stack_chk_guard));
|
|
#else
|
|
/* If getentropy is not available, use the "terminator canary". */
|
|
((unsigned char *)&__stack_chk_guard)[0] = 0;
|
|
((unsigned char *)&__stack_chk_guard)[1] = 0;
|
|
((unsigned char *)&__stack_chk_guard)[2] = '\n';
|
|
((unsigned char *)&__stack_chk_guard)[3] = 255;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
void
|
|
__attribute__((__noreturn__))
|
|
__stack_chk_fail (void)
|
|
{
|
|
char msg[] = "*** stack smashing detected ***: terminated\n";
|
|
write (2, msg, strlen (msg));
|
|
raise (SIGABRT);
|
|
_exit (127);
|
|
}
|
|
|
|
#ifdef __ELF__
|
|
void
|
|
__attribute__((visibility ("hidden")))
|
|
__stack_chk_fail_local (void)
|
|
{
|
|
__stack_chk_fail();
|
|
}
|
|
#endif
|