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 Collingbournevoid *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 Collingbourneint 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