@@ -141,7 +141,7 @@ void _mi_prim_thread_associate_default_heap(mi_heap_t* heap);
141141// but unfortunately we can not detect support reliably (see issue #883)
142142// We also use it on Apple OS as we use a TLS slot for the default heap there.
143143#if defined(__GNUC__ ) && ( \
144- (defined(__GLIBC__ ) && (defined(__x86_64__ ) || defined(__i386__ ) || (defined(__arm__ ) && __ARM_ARCH >= 7 ) || defined(__aarch64__ ))) \
144+ (defined(__GLIBC__ ) && (defined(__x86_64__ ) || defined(__i386__ ) || (defined(__arm__ ) && __ARM_ARCH >= 7 ) || defined(__aarch64__ ) || defined( __riscv )) \
145145 || (defined(__APPLE__ ) && (defined(__x86_64__ ) || defined(__aarch64__ ) || defined(__POWERPC__ ))) \
146146 || (defined(__BIONIC__ ) && (defined(__x86_64__ ) || defined(__i386__ ) || (defined(__arm__ ) && __ARM_ARCH >= 7 ) || defined(__aarch64__ ))) \
147147 || (defined(__FreeBSD__ ) && (defined(__x86_64__ ) || defined(__i386__ ) || defined(__aarch64__ ))) \
@@ -173,6 +173,10 @@ static inline void* mi_prim_tls_slot(size_t slot) mi_attr_noexcept {
173173 __asm__ volatile ("mrs %0, tpidr_el0" : "=r" (tcb ));
174174 #endif
175175 res = tcb [slot ];
176+ #elif defined(__riscv )
177+ void * * tcb ; MI_UNUSED (ofs );
178+ __asm__ volatile ("mv %0, tp" : "=r" (tcb ));
179+ res = tcb [slot ];
176180 #elif defined(__APPLE__ ) && defined(__POWERPC__ ) // ppc, issue #781
177181 MI_UNUSED (ofs );
178182 res = pthread_getspecific (slot );
@@ -203,6 +207,10 @@ static inline void mi_prim_tls_slot_set(size_t slot, void* value) mi_attr_noexce
203207 __asm__ volatile ("mrs %0, tpidr_el0" : "=r" (tcb ));
204208 #endif
205209 tcb [slot ] = value ;
210+ #elif defined(__riscv )
211+ void * * tcb ; MI_UNUSED (ofs );
212+ __asm__ volatile ("mv %0, tp" : "=r" (tcb ));
213+ tcb [slot ] = value ;
206214 #elif defined(__APPLE__ ) && defined(__POWERPC__ ) // ppc, issue #781
207215 MI_UNUSED (ofs );
208216 pthread_setspecific (slot , value );
@@ -265,6 +273,7 @@ static inline void mi_prim_tls_slot_set(size_t slot, void* value) mi_attr_noexce
265273 && !defined(MI_LIBC_MUSL ) \
266274 && (!defined(__clang_major__ ) || __clang_major__ >= 14 ) /* older clang versions emit bad code; fall back to using the TLS slot (<https://lore.kernel.org/linux-arm-kernel/202110280952.352F66D8@keescook/T/>) */
267275 #if (defined(__GNUC__ ) && (__GNUC__ >= 7 ) && defined(__aarch64__ )) /* aarch64 for older gcc versions (issue #851) */ \
276+ || (defined(__GNUC__ ) && (__GNUC__ >= 7 ) && defined(__riscv )) \
268277 || (defined(__GNUC__ ) && (__GNUC__ >= 11 ) && defined(__x86_64__ )) \
269278 || (defined(__clang_major__ ) && (__clang_major__ >= 14 ) && (defined(__aarch64__ ) || defined(__x86_64__ )))
270279 #define MI_USE_BUILTIN_THREAD_POINTER 1
0 commit comments