You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2024/06/14 11:50:07 UTC

(nuttx) 01/02: arch/risc-v: add rv64ilp32 toolchain

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 33afbaadb9d75148bb12e149d0ac03651da71a50
Author: Yanfeng Liu <yf...@qq.com>
AuthorDate: Sat Jun 8 08:45:28 2024 +0800

    arch/risc-v: add rv64ilp32 toolchain
    
    This adds support of rv64ilp32 toolchain available from Github repo
    `ruyisdk/riscv-gnu-toolchain-rv64ilp32`. With this 32-bit nuttx can
    be generated for RV64 devices.
    
    Signed-off-by: Yanfeng Liu <yf...@qq.com>
---
 arch/risc-v/Kconfig                   | 15 ++++++++++++++-
 arch/risc-v/src/cmake/Toolchain.cmake | 13 +++++++++++--
 arch/risc-v/src/common/Toolchain.defs | 10 +++++++++-
 3 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/arch/risc-v/Kconfig b/arch/risc-v/Kconfig
index 428768b320..bd370372ac 100644
--- a/arch/risc-v/Kconfig
+++ b/arch/risc-v/Kconfig
@@ -337,7 +337,12 @@ config ARCH_RV32
 config ARCH_RV64
 	bool
 	default n
-	select LIBC_ARCH_ELF_64BIT if LIBC_ARCH_ELF
+	select LIBC_ARCH_ELF_64BIT if LIBC_ARCH_ELF && !ARCH_RV64ILP32
+
+config ARCH_RV64ILP32
+	bool
+	depends on ARCH_RV64
+	default n
 
 config ARCH_RV_ISA_M
 	bool
@@ -547,6 +552,14 @@ config RISCV_TOOLCHAIN_CLANG
 	bool "LLVM Clang toolchain"
 	select ARCH_TOOLCHAIN_CLANG
 
+config RISCV_TOOLCHAIN_GNU_RV64ILP32
+	bool "Generic GNU RV64ILP32 toolchain"
+	select ARCH_TOOLCHAIN_GNU
+	select ARCH_RV64ILP32
+	---help---
+		This option work with Ruyisdk toolchain (GCC 13 or newer)
+		configured for riscv64-unknown-elf.
+
 endchoice # Toolchain Selection
 
 config RISCV_SEMIHOSTING_HOSTFS
diff --git a/arch/risc-v/src/cmake/Toolchain.cmake b/arch/risc-v/src/cmake/Toolchain.cmake
index 05de8ac833..fb0e9d1db5 100644
--- a/arch/risc-v/src/cmake/Toolchain.cmake
+++ b/arch/risc-v/src/cmake/Toolchain.cmake
@@ -26,6 +26,7 @@ set(CMAKE_CXX_COMPILER_FORCED TRUE)
 
 if(CONFIG_RISCV_TOOLCHAIN_GNU_RV32
    OR CONFIG_RISCV_TOOLCHAIN_GNU_RV64
+   OR CONFIG_RISCV_TOOLCHAIN_GNU_RV64ILP32
    OR CONFIG_RISCV_TOOLCHAIN_CLANG)
   if(NOT CONFIG_RISCV_TOOLCHAIN)
     set(CONFIG_RISCV_TOOLCHAIN GNU_RVG)
@@ -184,7 +185,11 @@ if(CONFIG_ARCH_RV32)
   add_link_options(-Wl,-melf32lriscv)
 elseif(CONFIG_ARCH_RV64)
   add_compile_options(-mcmodel=medany)
-  add_link_options(-Wl,-melf64lriscv)
+  if(CONFIG_ARCH_RV64ILP32)
+    add_link_options(-Wl,-melf32lriscv)
+  else()
+    add_link_options(-Wl,-melf64lriscv)
+  endif()
 endif()
 
 if(CONFIG_DEBUG_OPT_UNUSED_SECTIONS)
@@ -268,7 +273,11 @@ if(${CONFIG_RISCV_TOOLCHAIN} STREQUAL GNU_RVG)
     set(LLVM_ARCHTYPE "riscv32")
   elseif(CONFIG_ARCH_RV64)
     set(ARCHTYPE "rv64")
-    set(ARCHABITYPE "lp64")
+    if(CONFIG_ARCH_RV64ILP32)
+      set(ARCHABITYPE "ilp32")
+    else()
+      set(ARCHABITYPE "lp64")
+    endif()
     set(LLVM_ARCHTYPE "riscv64")
   endif()
 
diff --git a/arch/risc-v/src/common/Toolchain.defs b/arch/risc-v/src/common/Toolchain.defs
index 4600f915fb..ca7f8de05d 100644
--- a/arch/risc-v/src/common/Toolchain.defs
+++ b/arch/risc-v/src/common/Toolchain.defs
@@ -29,6 +29,8 @@
 
 ifeq ($(filter y, $(CONFIG_RISCV_TOOLCHAIN_GNU_RV64)),y)
   CONFIG_RISCV_TOOLCHAIN ?= GNU_RVG
+else ifeq ($(filter y, $(CONFIG_RISCV_TOOLCHAIN_GNU_RV64ILP32)),y)
+  CONFIG_RISCV_TOOLCHAIN ?= GNU_RVG
 else ifeq ($(filter y, $(CONFIG_RISCV_TOOLCHAIN_GNU_RV32)),y)
   CONFIG_RISCV_TOOLCHAIN ?= GNU_RVG
 else ifeq ($(filter y, $(CONFIG_RISCV_TOOLCHAIN_CLANG)),y)
@@ -119,6 +121,8 @@ SHMODULEFLAGS = -Bsymbolic -G -Bdynamic --entry=__start
 ifeq ($(CONFIG_ARCH_RV32),y)
 LDFLAGS += -melf32lriscv
 SHMODULEFLAGS += -melf32lriscv
+else ifeq ($(CONFIG_ARCH_RV64ILP32),y)
+LDFLAGS += -melf32lriscv
 else
 LDFLAGS += -melf64lriscv
 endif
@@ -231,7 +235,11 @@ ifeq ($(CONFIG_RISCV_TOOLCHAIN),GNU_RVG)
     LLVM_ARCHTYPE := riscv32
   else ifeq ($(CONFIG_ARCH_RV64),y)
     ARCHTYPE = rv64
-    ARCHABITYPE = lp64
+    ifeq ($(CONFIG_ARCH_RV64ILP32),y)
+      ARCHABITYPE = ilp32
+    else
+      ARCHABITYPE = lp64
+    endif
     LLVM_ARCHTYPE := riscv64
     # https://www.sifive.com/blog/all-aboard-part-4-risc-v-code-models
     ARCHCPUFLAGS = -mcmodel=medany