| /* Macros to support TLS testing in times of missing compiler support. */ |
| |
| extern void *__tls_get_addr (void *); |
| |
| # define TLS_GD(x) \ |
| ({ register void *__gp asm ("$29"); void *__result; \ |
| asm ("lda %0, " #x "($gp) !tlsgd" : "=r" (__result) : "r"(__gp)); \ |
| __tls_get_addr (__result); }) |
| |
| # define TLS_LD(x) \ |
| ({ register void *__gp asm ("$29"); void *__result; \ |
| asm ("lda %0, " #x "($gp) !tlsldm" : "=r" (__result) : "r"(__gp)); \ |
| __result = __tls_get_addr (__result); \ |
| asm ("lda %0, " #x "(%0) !dtprel" : "+r" (__result)); \ |
| __result; }) |
| |
| # define TLS_IE(x) \ |
| ({ register void *__gp asm ("$29"); long ofs; \ |
| asm ("ldq %0, " #x "($gp) !gottprel" : "=r"(ofs) : "r"(__gp)); \ |
| __builtin_thread_pointer () + ofs; }) |
| |
| # define TLS_LE(x) \ |
| ({ void *__result = __builtin_thread_pointer (); \ |
| asm ("lda %0, " #x "(%0) !tprel" : "+r" (__result)); \ |
| __result; }) |