Skip to content

Commit e8e1e77

Browse files
committed
add riscv64 TLS support
1 parent 0f3d716 commit e8e1e77

1 file changed

Lines changed: 10 additions & 1 deletion

File tree

include/mimalloc/prim.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)