Add RISCV64 support.
authorMikhail Kurinnoi <m.kurinnoi@samsung.com>
Mon, 13 Nov 2023 17:38:11 +0000 (20:38 +0300)
committerGleb Balykov/Advanced System SW Lab /SRR/Staff Engineer/Samsung Electronics <g.balykov@samsung.com>
Mon, 20 Nov 2023 07:48:50 +0000 (16:48 +0900)
clrdefinitions.cmake
detectplatform.cmake
platformdefinitions.cmake
src/CMakeLists.txt
src/debugger/frames.cpp

index 38272a9a849ef708da820a2668ab5aff8f615b83..abec65f31a61325f179821760cb4a6fb2ffbf01a 100644 (file)
@@ -43,6 +43,16 @@ elseif (CLR_CMAKE_TARGET_ARCH_I386)
   add_definitions(-D_TARGET_X86_=1)
   add_definitions(-DDBG_TARGET_32BIT=1)
   add_definitions(-DDBG_TARGET_X86=1)
+elseif (CLR_CMAKE_TARGET_ARCH_RISCV64)
+  if (CLR_CMAKE_PLATFORM_UNIX)
+    add_definitions(-DDBG_TARGET_RISCV64_UNIX)
+  endif()
+  add_definitions(-D_TARGET_RISCV64_=1)
+  add_definitions(-D_TARGET_64BIT_=1)
+  add_definitions(-DDBG_TARGET_64BIT=1)
+  add_definitions(-DDBG_TARGET_RISCV64=1)
+  add_definitions(-DDBG_TARGET_WIN64=1)
+  add_definitions(-DFEATURE_MULTIREG_RETURN)
 else ()
   clr_unknown_arch()
 endif (CLR_CMAKE_TARGET_ARCH_AMD64)
index 06508198588a754d76e0a6981860c36ef84c96e1..0a32210900e970ae5ffc5f14668d872d47540c55 100644 (file)
@@ -33,6 +33,8 @@ if(CMAKE_SYSTEM_NAME STREQUAL Linux)
             set(CLR_CMAKE_PLATFORM_UNIX_ARM64 1)
         elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686)
             set(CLR_CMAKE_PLATFORM_UNIX_X86 1)
+        elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL riscv64)
+            set(CLR_CMAKE_PLATFORM_UNIX_RISCV64 1)
         else()
             clr_unknown_arch()
         endif()
@@ -125,6 +127,9 @@ elseif(CLR_CMAKE_PLATFORM_UNIX_AMD64)
 elseif(CLR_CMAKE_PLATFORM_UNIX_X86)
     set(CLR_CMAKE_PLATFORM_ARCH_I386 1)
     set(CLR_CMAKE_HOST_ARCH "x86")
+elseif(CLR_CMAKE_PLATFORM_UNIX_RISCV64)
+    set(CLR_CMAKE_PLATFORM_ARCH_RISCV64 1)
+    set(CLR_CMAKE_HOST_ARCH "riscv64")
 elseif(WIN32)
     # CLR_CMAKE_HOST_ARCH is passed in as param to cmake
     if (CLR_CMAKE_HOST_ARCH STREQUAL x64)
@@ -156,6 +161,8 @@ if (CLR_CMAKE_TARGET_ARCH STREQUAL x64)
     set(CLR_CMAKE_TARGET_ARCH_ARM64 1)
   elseif(CLR_CMAKE_TARGET_ARCH STREQUAL arm)
     set(CLR_CMAKE_TARGET_ARCH_ARM 1)
+  elseif(CLR_CMAKE_TARGET_ARCH STREQUAL riscv64)
+    set(CLR_CMAKE_TARGET_ARCH_RISCV64 1)
   else()
     clr_unknown_arch()
 endif()
index a5460e48f5c9be5df4f36d3f39c30ff497c300a7..c2ecae28cf9353d86ff83ecf28ca605530474c8c 100644 (file)
@@ -22,6 +22,13 @@ elseif (CLR_CMAKE_PLATFORM_ARCH_ARM64)
   add_definitions(-DBIT64=1)          # CoreClr <= 3.x
   add_definitions(-DHOST_64BIT=1)     # CoreClr > 3.x
   add_definitions(-DHOST_ARM64)
+elseif (CLR_CMAKE_PLATFORM_ARCH_RISCV64)
+  add_definitions(-D_RISCV64_)
+  add_definitions(-DRISCV64)
+  add_definitions(-D_WIN64)
+  add_definitions(-DBIT64=1)          # CoreClr <= 3.x
+  add_definitions(-DHOST_64BIT=1)     # CoreClr > 3.x
+  add_definitions(-DHOST_RISCV64)
 else ()
   clr_unknown_arch()
 endif ()
@@ -40,6 +47,9 @@ if (CLR_CMAKE_PLATFORM_UNIX)
     elseif(CLR_CMAKE_PLATFORM_UNIX_X86)
       message("Detected Linux i686")
       add_definitions(-DLINUX32)
+    elseif(CLR_CMAKE_PLATFORM_UNIX_RISCV64)
+      message("Detected Linux RiscV64")
+      add_definitions(-DLINUX64)
     else()
       clr_unknown_arch()
     endif()
@@ -82,6 +92,8 @@ elseif (CLR_CMAKE_TARGET_ARCH_ARM)
     set(ARCH_SOURCES_DIR arm)
 elseif (CLR_CMAKE_TARGET_ARCH_I386)
     set(ARCH_SOURCES_DIR i386)
+elseif (CLR_CMAKE_TARGET_ARCH_RISCV64)
+    set(ARCH_SOURCES_DIR riscv64)
 else ()
     clr_unknown_arch()
 endif ()
index e51916eb7fa6aba64422098ef6d2ca5975932129..42f36312e778522a983714460dcd00892fd63938 100644 (file)
@@ -207,6 +207,10 @@ if (INTEROP_DEBUGGING)
         message(FATAL_ERROR "Interop debugging feature not implemented for this OS.")
     endif()
 
+    if (CLR_CMAKE_PLATFORM_UNIX_RISCV64)
+        message(FATAL_ERROR "Interop debugging feature not implemented for RISCV64.")
+    endif()
+
     add_definitions(-DINTEROP_DEBUGGING)
 
     if (CLR_CMAKE_PLATFORM_UNIX_AMD64)
index 2a1c059391ca0a5075226f2a674115e6b5cf6c2a..ca0164dfb71ca5365bb58b3e7d37be0112285f54 100644 (file)
@@ -39,6 +39,8 @@ static std::uintptr_t GetIP(CONTEXT *context)
     return (std::uintptr_t)context->Pc;
 #elif defined(_TARGET_ARM64_)
     return (std::uintptr_t)context->Pc;
+#elif defined(_TARGET_RISCV64_)
+    return (std::uintptr_t)context->Pc;
 #else
 #error "Unsupported platform"
 #endif
@@ -54,6 +56,8 @@ static std::uintptr_t GetSP(CONTEXT *context)
     return (std::uintptr_t)context->Sp;
 #elif defined(_TARGET_ARM64_)
     return (std::uintptr_t)context->Sp;
+#elif defined(_TARGET_RISCV64_)
+    return (std::uintptr_t)context->Sp;
 #else
 #error "Unsupported platform"
 #endif
@@ -69,6 +73,8 @@ static std::uintptr_t GetFP(CONTEXT *context)
     return (std::uintptr_t)context->R11;
 #elif defined(_TARGET_ARM64_)
     return (std::uintptr_t)context->Fp;
+#elif defined(_TARGET_RISCV64_)
+    return (std::uintptr_t)context->Fp;
 #else
 #error "Unsupported platform"
 #endif
@@ -84,6 +90,8 @@ static void SetFP(CONTEXT *context, std::uintptr_t value)
     context->R11 = value;
 #elif defined(_TARGET_ARM64_)
     context->Fp = value;
+#elif defined(_TARGET_RISCV64_)
+    context->Fp = value;
 #else
 #error "Unsupported platform"
 #endif