this cleans up what had become widespread direct inline use of "GNU C"
style attributes directly in the source, and lowers the barrier to
increased use of hidden visibility, which will be useful to recovering
some of the efficiency lost when the protected visibility hack was
dropped in commit dc2f368e56, especially
on archs where the PLT ABI is costly.
34 lines
805 B
C
34 lines
805 B
C
#if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
|
|
|| __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
|
|
|
|
static inline pthread_t __pthread_self()
|
|
{
|
|
char *p;
|
|
__asm__ __volatile__ ( "mrc p15,0,%0,c13,c0,3" : "=r"(p) );
|
|
return (void *)(p-sizeof(struct pthread));
|
|
}
|
|
|
|
#else
|
|
|
|
#if __ARM_ARCH_4__ || __ARM_ARCH_4T__ || __ARM_ARCH == 4
|
|
#define BLX "mov lr,pc\n\tbx"
|
|
#else
|
|
#define BLX "blx"
|
|
#endif
|
|
|
|
static inline pthread_t __pthread_self()
|
|
{
|
|
extern hidden uintptr_t __a_gettp_ptr;
|
|
register uintptr_t p __asm__("r0");
|
|
__asm__ __volatile__ ( BLX " %1" : "=r"(p) : "r"(__a_gettp_ptr) : "cc", "lr" );
|
|
return (void *)(p-sizeof(struct pthread));
|
|
}
|
|
|
|
#endif
|
|
|
|
#define TLS_ABOVE_TP
|
|
#define GAP_ABOVE_TP 8
|
|
#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
|
|
|
|
#define MC_PC arm_pc
|