/* Check that these thread relative memory accesses play along with surrounding code. These should be moved to C torture tests once there are target independent thread_pointer built-in functions available. */ /* { dg-do compile } */ /* { dg-options "-O1" } */ /* { dg-skip-if "" { "sh*-*-*" } { "-m5*"} { "" } } */ int test00 (void* p, int x) { int* tcb = (int*)__builtin_thread_pointer (); int r = tcb[4]; __builtin_set_thread_pointer (p); tcb = (int*)__builtin_thread_pointer (); return tcb[255] + r; } int test01 (void) { unsigned short* tcb = (unsigned short*)__builtin_thread_pointer (); return tcb[500]; } void test02 (int* x, int a, int b) { int* tcb = (int*)__builtin_thread_pointer (); tcb[50] = a; __builtin_set_thread_pointer (x); tcb = (int*)__builtin_thread_pointer (); tcb[40] = b; } int test03 (const int* x, int c) { volatile int* tcb = (volatile int*)__builtin_thread_pointer (); int s = 0; int i; for (i = 0; i < c; ++i) s ^= x[i] + tcb[40]; return s; } int test04 (const int* x, int c, int** xx, int d) { int s = 0; int i; for (i = 0; i < c; ++i) { volatile int* tcb = (volatile int*)__builtin_thread_pointer (); tcb[20] = s; __builtin_set_thread_pointer (xx[i]); tcb = (volatile int*)__builtin_thread_pointer (); s ^= x[i] + tcb[40] + d; } return s; }