[compiler-rt] Fix build errors when using gcc on LoongArch
authorYouling Tang <tangyouling@loongson.cn>
Mon, 26 Dec 2022 01:33:54 +0000 (09:33 +0800)
committerWeining Lu <luweining@loongson.cn>
Mon, 26 Dec 2022 01:33:54 +0000 (09:33 +0800)
- 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

compiler-rt/lib/builtins/loongarch/fp_mode.c
compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp

index 0e3d796..31877fb 100644 (file)
 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;
 }
index 6ceaf94..ec860fd 100644 (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.