changeset 39277:27933959db65

host-cpu-c-abi: Support for RISC-V CPU. * m4/host-cpu-c-abi.m4 (gl_HOST_CPU_C_ABI): Recognize the various riscv32 and riscv64 ABIs. References: https://github.com/riscv/riscv-toolchain-conventions https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/RISC-V-Options.html https://gnu-mcu-eclipse.github.io/toolchain/riscv/
author Bruno Haible <bruno@clisp.org>
date Thu, 15 Mar 2018 22:26:09 +0100
parents 95c696c715b8
children 8090d30c7a92
files ChangeLog m4/host-cpu-c-abi.m4
diffstat 2 files changed, 98 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Mar 13 08:53:44 2018 -0700
+++ b/ChangeLog	Thu Mar 15 22:26:09 2018 +0100
@@ -1,3 +1,13 @@
+2018-03-15  Bruno Haible  <bruno@clisp.org>
+
+	host-cpu-c-abi: Support for RISC-V CPU.
+	* m4/host-cpu-c-abi.m4 (gl_HOST_CPU_C_ABI): Recognize the various
+	riscv32 and riscv64 ABIs.
+	References:
+	https://github.com/riscv/riscv-toolchain-conventions
+	https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/RISC-V-Options.html
+	https://gnu-mcu-eclipse.github.io/toolchain/riscv/
+
 2018-03-08  Paul Eggert  <eggert@cs.ucla.edu>
 
 	fflush: be more paranoid about libio.h change
--- a/m4/host-cpu-c-abi.m4	Tue Mar 13 08:53:44 2018 -0700
+++ b/m4/host-cpu-c-abi.m4	Thu Mar 15 22:26:09 2018 +0100
@@ -1,4 +1,4 @@
-# host-cpu-c-abi.m4 serial 9
+# host-cpu-c-abi.m4 serial 10
 dnl Copyright (C) 2002-2018 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -237,6 +237,60 @@
          gl_cv_host_cpu_c_abi=powerpc
          ;;
 
+       riscv32 | riscv64 )
+         # There are 2 architectures (with variants): rv32* and rv64*.
+         AC_COMPILE_IFELSE(
+           [AC_LANG_SOURCE(
+              [[#if __riscv_xlen == 64
+                  int ok;
+                #else
+                  error fail
+                #endif
+              ]])],
+           [cpu=riscv64],
+           [cpu=riscv32])
+         # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d.
+         # Size of 'long' and 'void *':
+         AC_COMPILE_IFELSE(
+           [AC_LANG_SOURCE(
+              [[#if defined __LP64__
+                  int ok;
+                #else
+                  error fail
+                #endif
+              ]])],
+           [main_abi=lp64],
+           [main_abi=ilp32])
+         # Float ABIs:
+         # __riscv_float_abi_double:
+         #   'float' and 'double' are passed in floating-point registers.
+         # __riscv_float_abi_single:
+         #   'float' are passed in floating-point registers.
+         # __riscv_float_abi_soft:
+         #   No values are passed in floating-point registers.
+         AC_COMPILE_IFELSE(
+           [AC_LANG_SOURCE(
+              [[#if defined __riscv_float_abi_double
+                  int ok;
+                #else
+                  error fail
+                #endif
+              ]])],
+           [float_abi=d],
+           [AC_COMPILE_IFELSE(
+              [AC_LANG_SOURCE(
+                 [[#if defined __riscv_float_abi_single
+                     int ok;
+                   #else
+                     error fail
+                   #endif
+                 ]])],
+              [float_abi=f],
+              [float_abi=''])
+           ])
+         gl_cv_host_cpu_c_abi="${cpu}-${main_abi}${float_abi}"
+         ;;
+
        s390* )
          # On s390x, the C compiler may be generating 64-bit (= s390x) code
          # or 31-bit (= s390) code.
@@ -349,6 +403,39 @@
 #ifndef __powerpc64_elfv2__
 #undef __powerpc64_elfv2__
 #endif
+#ifndef __riscv32__
+#undef __riscv32__
+#endif
+#ifndef __riscv64__
+#undef __riscv64__
+#endif
+#ifndef __riscv32_ilp32__
+#undef __riscv32_ilp32__
+#endif
+#ifndef __riscv32_ilp32f__
+#undef __riscv32_ilp32f__
+#endif
+#ifndef __riscv32_ilp32d__
+#undef __riscv32_ilp32d__
+#endif
+#ifndef __riscv64_ilp32__
+#undef __riscv64_ilp32__
+#endif
+#ifndef __riscv64_ilp32f__
+#undef __riscv64_ilp32f__
+#endif
+#ifndef __riscv64_ilp32d__
+#undef __riscv64_ilp32d__
+#endif
+#ifndef __riscv64_lp64__
+#undef __riscv64_lp64__
+#endif
+#ifndef __riscv64_lp64f__
+#undef __riscv64_lp64f__
+#endif
+#ifndef __riscv64_lp64d__
+#undef __riscv64_lp64d__
+#endif
 #ifndef __s390__
 #undef __s390__
 #endif