xref: /llvm-project/compiler-rt/test/safestack/pthread.c (revision a6446223e39445b30c7ef2d1ce94b54d0eec7797)
1*b64d0b1eSPeter Collingbourne // RUN: %clang_safestack %s -pthread -o %t
2*b64d0b1eSPeter Collingbourne // RUN: %run %t
3*b64d0b1eSPeter Collingbourne 
4*b64d0b1eSPeter Collingbourne // Test that pthreads receive their own unsafe stack.
5*b64d0b1eSPeter Collingbourne 
6*b64d0b1eSPeter Collingbourne #include <stdlib.h>
7*b64d0b1eSPeter Collingbourne #include <string.h>
8*b64d0b1eSPeter Collingbourne #include <pthread.h>
9*b64d0b1eSPeter Collingbourne #include "utils.h"
10*b64d0b1eSPeter Collingbourne 
11*b64d0b1eSPeter Collingbourne static int ptr_test = 42;
12*b64d0b1eSPeter Collingbourne 
t1_start(void * ptr)13*b64d0b1eSPeter Collingbourne void *t1_start(void *ptr)
14*b64d0b1eSPeter Collingbourne {
15*b64d0b1eSPeter Collingbourne   if (ptr != &ptr_test)
16*b64d0b1eSPeter Collingbourne     abort();
17*b64d0b1eSPeter Collingbourne 
18*b64d0b1eSPeter Collingbourne   // safe stack
19*b64d0b1eSPeter Collingbourne   int val = ptr_test * 5;
20*b64d0b1eSPeter Collingbourne 
21*b64d0b1eSPeter Collingbourne   // unsafe stack
22*b64d0b1eSPeter Collingbourne   char buffer[8096]; // two pages
23*b64d0b1eSPeter Collingbourne   memset(buffer, val, sizeof (buffer));
24*b64d0b1eSPeter Collingbourne   break_optimization(buffer);
25*b64d0b1eSPeter Collingbourne 
26*b64d0b1eSPeter Collingbourne   return ptr;
27*b64d0b1eSPeter Collingbourne }
28*b64d0b1eSPeter Collingbourne 
main(int argc,char ** argv)29*b64d0b1eSPeter Collingbourne int main(int argc, char **argv)
30*b64d0b1eSPeter Collingbourne {
31*b64d0b1eSPeter Collingbourne   pthread_t t1;
32*b64d0b1eSPeter Collingbourne   void *ptr = NULL;
33*b64d0b1eSPeter Collingbourne   if (pthread_create(&t1, NULL, t1_start, &ptr_test))
34*b64d0b1eSPeter Collingbourne     abort();
35*b64d0b1eSPeter Collingbourne   if (pthread_join(t1, &ptr))
36*b64d0b1eSPeter Collingbourne     abort();
37*b64d0b1eSPeter Collingbourne   if (ptr != &ptr_test)
38*b64d0b1eSPeter Collingbourne     abort();
39*b64d0b1eSPeter Collingbourne   return 0;
40*b64d0b1eSPeter Collingbourne }
41