| lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | /* Macros to support TLS testing in times of missing compiler support.  */ | 
 | 2 |  | 
 | 3 | extern void *__tls_get_addr (void *); | 
 | 4 |  | 
 | 5 | # define TLS_GD(x)							\ | 
 | 6 |   ({ register void *__gp asm ("$29"); void *__result;			\ | 
 | 7 |      asm ("lda %0, " #x "($gp) !tlsgd" : "=r" (__result) : "r"(__gp));	\ | 
 | 8 |      __tls_get_addr (__result); }) | 
 | 9 |  | 
 | 10 | # define TLS_LD(x)							\ | 
 | 11 |   ({ register void *__gp asm ("$29"); void *__result;			\ | 
 | 12 |      asm ("lda %0, " #x "($gp) !tlsldm" : "=r" (__result) : "r"(__gp));	\ | 
 | 13 |      __result = __tls_get_addr (__result);				\ | 
 | 14 |      asm ("lda %0, " #x "(%0) !dtprel" : "+r" (__result));		\ | 
 | 15 |      __result; }) | 
 | 16 |  | 
 | 17 | # define TLS_IE(x)							\ | 
 | 18 |   ({ register void *__gp asm ("$29"); long ofs;				\ | 
 | 19 |      asm ("ldq %0, " #x "($gp) !gottprel" : "=r"(ofs) : "r"(__gp));	\ | 
 | 20 |      __builtin_thread_pointer () + ofs; }) | 
 | 21 |  | 
 | 22 | # define TLS_LE(x)						\ | 
 | 23 |   ({ void *__result = __builtin_thread_pointer ();		\ | 
 | 24 |      asm ("lda %0, " #x "(%0) !tprel" : "+r" (__result));	\ | 
 | 25 |      __result; }) |