libphobos: Add D support for RISC-V Linux
authorIain Buclaw <ibuclaw@gdcproject.org>
Tue, 23 Apr 2019 22:53:12 +0000 (22:53 +0000)
committerIain Buclaw <ibuclaw@gcc.gnu.org>
Tue, 23 Apr 2019 22:53:12 +0000 (22:53 +0000)
2019-04-23  Iain Buclaw  <ibuclaw@gdcproject.org>

* configure.tgt: Add riscv*-*-linux* as supported target.
* libdruntime/gcc/sections/elf_shared.d (getDependencies): Adjust
dlpi_addr on RISCV32 and RISCV64.
* src/std/math.d: Add IEEE FPU control support for RISCV.

From-SVN: r270522

libphobos/ChangeLog
libphobos/configure.tgt
libphobos/libdruntime/gcc/sections/elf_shared.d
libphobos/src/std/math.d

index 74c9c88730d2b9b30caa8aff00dc049ff666c6d0..1f5ea28ddf765948586d73dbfe1da52603122d30 100644 (file)
@@ -1,3 +1,10 @@
+2019-04-23  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+       * configure.tgt: Add linux/riscv as supported target.
+       * libdruntime/gcc/sections/elf_shared.d (getDependencies): Adjust
+       dlpi_addr on RISCV32 and RISCV64.
+       * src/std/math.d: Add IEEE FPU control support for RISC-V.
+
 2019-04-23  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
            Bernd Edlinger  <bernd.edlinger@hotmail.de>
            Jakub Jelinek  <jakub@redhat.com>
index b30f08581080b2c79893936a5887b18125035be1..5deba2a9961e73088959e98b9cc8ae76f562c3ec 100644 (file)
@@ -29,6 +29,9 @@ case "${target}" in
   mips*-*-linux*)
        LIBPHOBOS_SUPPORTED=yes
        ;;
+  riscv*-*-linux*)
+       LIBPHOBOS_SUPPORTED=yes
+       ;;
   x86_64-*-kfreebsd*-gnu | i?86-*-kfreebsd*-gnu)
        LIBPHOBOS_SUPPORTED=yes
        ;;
index 4cf5a233fc4af591239b571fc316050bbe76b42f..89adcea889e26f653ffa0ced65b08781b3b2f315 100644 (file)
@@ -22,6 +22,9 @@
 
 module gcc.sections.elf_shared;
 
+version (RISCV32) version = RISCV_Any;
+version (RISCV64) version = RISCV_Any;
+
 version (CRuntime_Glibc) enum SharedELF = true;
 else version (CRuntime_Musl) enum SharedELF = true;
 else version (FreeBSD) enum SharedELF = true;
@@ -723,7 +726,16 @@ version (Shared)
                 version (CRuntime_Musl)
                     strtab = cast(const(char)*)(info.dlpi_addr + dyn.d_un.d_ptr); // relocate
                 else version (linux)
-                    strtab = cast(const(char)*)dyn.d_un.d_ptr;
+                {
+                    // This might change in future glibc releases (after 2.29) as dynamic sections
+                    // are not required to be read-only on RISC-V. This was copy & pasted from MIPS
+                    // while upstreaming RISC-V support. Otherwise MIPS is the only arch which sets
+                    // in glibc: #define DL_RO_DYN_SECTION 1
+                    version (RISCV_Any)
+                        strtab = cast(const(char)*)(info.dlpi_addr + dyn.d_un.d_ptr); // relocate
+                    else
+                        strtab = cast(const(char)*)dyn.d_un.d_ptr;
+                }
                 else version (FreeBSD)
                     strtab = cast(const(char)*)(info.dlpi_addr + dyn.d_un.d_ptr); // relocate
                 else version (NetBSD)
index daee6ec3c33a0e0b6eba383434d3dd6853110938..6dec9cee9a0e35303e845f4b553bb217ae87ffe7 100644 (file)
@@ -4757,6 +4757,15 @@ private:
                     return result;
                 }
             }
+            else version (RISCV_Any)
+            {
+                uint result = void;
+                asm pure nothrow @nogc
+                {
+                    "frflags %0" : "=r" result;
+                }
+                return result;
+            }
             else
                 assert(0, "Not yet supported");
         }
@@ -4831,6 +4840,14 @@ private:
                     }
                 }
             }
+            else version (RISCV_Any)
+            {
+                uint newValues = 0x0;
+                asm pure nothrow @nogc
+                {
+                    "fsflags %0" : : "r" newValues;
+                }
+            }
             else
                 assert(0, "Not yet supported");
         }
@@ -5423,6 +5440,15 @@ private:
                 }
                 return cont;
             }
+            else version (RISCV_Any)
+            {
+                ControlState cont;
+                asm pure nothrow @nogc
+                {
+                    "frcsr %0" : "=r" cont;
+                }
+                return cont;
+            }
             else
                 assert(0, "Not yet supported");
         }
@@ -5508,6 +5534,13 @@ private:
                     }
                 }
             }
+            else version (RISCV_Any)
+            {
+                asm pure nothrow @nogc
+                {
+                    "fscsr %0" : : "r" (newState);
+                }
+            }
             else
                 assert(0, "Not yet supported");
         }