[compiler-rt] Fix build errors when using gcc on LoongArch

- GCC does not recognize $fcsr0, uses $r0 instead.
- GCC does not implement __builtin_thread_pointer, which can be
  obtained directly through $tp.

Reviewed By: SixWeining

Differential Revision: https://reviews.llvm.org/D140545
This commit is contained in:
Youling Tang 2022-12-26 09:33:54 +08:00 committed by Weining Lu
parent 2f6aef52f2
commit 2b15c63fb7
2 changed files with 15 additions and 0 deletions

View File

@ -20,7 +20,11 @@
CRT_FE_ROUND_MODE __fe_getround(void) {
#if __loongarch_frlen != 0
int fcsr;
# ifdef __clang__
__asm__ __volatile__("movfcsr2gr %0, $fcsr0" : "=r" (fcsr));
# else
__asm__ __volatile__("movfcsr2gr %0, $r0" : "=r" (fcsr));
# endif
fcsr &= LOONGARCH_RMODE_MASK;
switch (fcsr) {
case LOONGARCH_TOWARDZERO:
@ -41,9 +45,15 @@ CRT_FE_ROUND_MODE __fe_getround(void) {
int __fe_raise_inexact(void) {
#if __loongarch_frlen != 0
int fcsr;
# ifdef __clang__
__asm__ __volatile__("movfcsr2gr %0, $fcsr0" : "=r" (fcsr));
__asm__ __volatile__(
"movgr2fcsr $fcsr0, %0" :: "r" (fcsr | LOONGARCH_INEXACT));
# else
__asm__ __volatile__("movfcsr2gr %0, $r0" : "=r" (fcsr));
__asm__ __volatile__(
"movgr2fcsr $r0, %0" :: "r" (fcsr | LOONGARCH_INEXACT));
# endif
#endif
return 0;
}

View File

@ -507,8 +507,13 @@ static void GetTls(uptr *addr, uptr *size) {
ThreadDescriptorSize();
*size = g_tls_size + ThreadDescriptorSize();
#elif SANITIZER_GLIBC && defined(__loongarch__)
# ifdef __clang__
*addr = reinterpret_cast<uptr>(__builtin_thread_pointer()) -
ThreadDescriptorSize();
# else
asm("or %0,$tp,$zero" : "=r"(*addr));
*addr -= ThreadDescriptorSize();
# endif
*size = g_tls_size + ThreadDescriptorSize();
#elif SANITIZER_GLIBC && defined(__powerpc64__)
// Workaround for glibc<2.25(?). 2.27 is known to not need this.