4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-01-18 20:39:33 +08:00
newlib-cygwin/newlib/libc/ssp/stack_protector.c
Jeff Johnston 1787e9d033 AMD GCN Port contributed by Andrew Stubbs <ams@codesourcery.com>
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.
2019-01-15 10:48:08 -05:00

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