diff --git a/Build_full_riscv_toolchain_baremetal.txt b/Build_full_riscv_toolchain_baremetal.txt
new file mode 100644
index 0000000000000000000000000000000000000000..dcbde2d00828c32eb12d2aaba1ffe5a0ae7be0ce
--- /dev/null
+++ b/Build_full_riscv_toolchain_baremetal.txt
@@ -0,0 +1,41 @@
+cmake -B cmake_riscv64 ./llvm \
+    -DCMAKE_BUILD_TYPE=Release \
+    -DCMAKE_INSTALL_PREFIX=/opt/llvm-vortex \
+    -DLLVM_ENABLE_PROJECTS='clang;lld' \
+    -DLLVM_DEFAULT_TARGET_TRIPLE=riscv64gc-none-unknown-eabi \
+    -DLLVM_TARGETS_TO_BUILD=RISCV \
+    -DLLVM_INCLUDE_TESTS=OFF \
+    -DLLVM_CCACHE_BUILD=ON \
+    -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON \
+    \
+    -DLLVM_ENABLE_RUNTIMES='libc;compiler-rt' \
+    -DLLVM_RUNTIME_TARGETS="riscv64-none-unknown-eabi;riscv32-none-unknown-eabi" \
+    -DLLVM_BUILTIN_TARGETS="riscv64-none-unknown-eabi;riscv32-none-unknown-eabi" \
+    -DLLVM_RUNTIME_MULTILIBS="i;imfd" \
+    -DLLVM_RUNTIME_MULTILIB_i_TARGETS="riscv64-none-unknown-eabi;riscv32-none-unknown-eabi"\
+    -DLLVM_RUNTIME_MULTILIB_imfd_TARGETS="riscv64-none-unknown-eabi;riscv32-none-unknown-eabi" \
+    \
+    -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_BAREMETAL_BUILD=ON \
+    -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_BUILD_BUILTINS=ON \
+    -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_USE_BUILTINS_LIBRARY=ON \
+    -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_BUILD_SANITIZERS=OFF \
+    -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_INCLUDE_TESTS=OFF \
+    -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_BUILD_XRAY=OFF \
+    -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_BUILD_LIBFUZZER=OFF \
+    -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_BUILD_MEMPROF=OFF \
+    -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_BUILD_PROFILE=OFF \
+    \
+    -DRUNTIMES_riscv64-none-unknown-eabi_LLVM_LIBC_FULL_BUILD=ON \
+    -DRUNTIMES_riscv64-none-unknown-eabi_LIBC_ENABLE_USE_BY_CLANG=ON \
+    -DRUNTIMES_riscv64-none-unknown-eabi+imfd_LIBC_COMPILE_OPTIONS_DEFAULT="-march=rv64imfd" \
+    -DBUILTINS_riscv64-none-unknown-eabi+imfd_CMAKE_C_FLAGS="-march=rv64i" \
+    -DBUILTINS_riscv64-none-unknown-eabi+imfd_CMAKE_CXX_FLAGS="-march=rv64i" \
+    -DBUILTINS_riscv64-none-unknown-eabi+imfd_CMAKE_ASM_FLAGS="-march=rv64i"\
+    -DRUNTIMES_riscv32-none-unknown-eabi+imfd_LIBC_COMPILE_OPTIONS_DEFAULT="-march=rv32imfd" \
+    -DBUILTINS_riscv32-none-unknown-eabi+imfd_CMAKE_C_FLAGS="-march=rv32imfd" \
+    -DBUILTINS_riscv32-none-unknown-eabi+imfd_CMAKE_CXX_FLAGS="-march=rv32imfd" \
+    -DBUILTINS_riscv32-none-unknown-eabi+imfd_CMAKE_ASM_FLAGS="-march=rv32imfd"
+
+cmake -B build ./llvm -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_LIBDIR=lib/x86_64-linux-gnu -DCMAKE_INSTALL_PREFIX=/usr/local -DLLVM_CCACHE_BUILD=ON -C ./RV_preload.cmake
+
+cmake --build build -j `nproc` --target install
\ No newline at end of file
diff --git a/RV_preload.cmake b/RV_preload.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..819ef12f31d8fdaffc9efc910d88cbadfc017db7
--- /dev/null
+++ b/RV_preload.cmake
@@ -0,0 +1,116 @@
+
+option(RV_64 "Enable 64 bits" ON)
+option(RV_32 "Enable 32 bits" ON)
+set(RV_VENDOR "none" CACHE STRING  "Vendor of the toolchain")
+set(RV_OS "unknown" CACHE STRING "Targeted OS of the toolchain")
+set(RV_ABI "elf" CACHE STRING "ABI of the toolchain")
+set(RV_EXT32 "imaf" CACHE STRING "Extensions to include")
+set(RV_EXT64 "imafd" CACHE STRING "Extensions to include")
+
+if(RV_64)
+    list(APPEND RV_XLEN "64")
+endif()
+if(RV_32)
+    list(APPEND RV_XLEN "32")
+endif()
+set(LLVM_CCACHE_BUILD ON CACHE BOOL "")
+
+
+set(LLVM_TARGETS_TO_BUILD RISCV CACHE STRING "")
+set(LLVM_ENABLE_PROJECTS "clang;lld;libc" CACHE STRING "")
+set(LLVM_ENABLE_RUNTIMES "libc;libcxx;compiler-rt" CACHE STRING "")
+set(COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "")
+
+set(LLVM_LIBC_FULL_BUILD ON CACHE BOOL "")
+set(LIBC_HDRGEN_ONLY ON CACHE BOOL "") # build libc-hdrgen first with host-host compiler
+set(GENERATED_LIBC_HDRGEN_EXE "${CMAKE_CURRENT_BINARY_DIR}/bin/libc-hdrgen" CACHE STRING "")
+message(STATUS "generating libc-hdrgen in ${GENERATED_LIBC_HDRGEN_EXE}")
+
+#set(LLVM_INSTALL_TOOLCHAIN_ONLY ON CACHE BOOL "")
+set(LIBC_ENABLE_USE_BY_CLANG ON CACHE BOOL "")
+#set(LLVM_BUILD_STATIC    ON CACHE BOOL "")
+set(LLVM_ENABLE_TERMINFO OFF CACHE BOOL "")
+set(LLVM_ENABLE_ZLIB     OFF CACHE BOOL "") # does not get passed to runtimes and default is 1
+
+foreach (xlen ${RV_XLEN})
+    foreach(exts IN ZIP_LISTS RV_EXT32 RV_EXT64)
+        if(${xlen} EQUAL 32)
+            set(ext ${exts_0})
+        endif ()
+        if(${xlen} EQUAL 64)
+            set(ext ${exts_1})
+        endif ()
+        set(march "rv${xlen}${ext}")
+        message(STATUS "Extension added: rv${xlen}${ext}")
+        set(target "riscv${xlen}-${RV_VENDOR}-${RV_OS}-${RV_ABI}")
+        list(APPEND RV_TARGETS_TRIPLES "${target}")
+
+        set(RUNTIMES_${target}_COMPILER_RT_BUILD_BUILTINS       ON CACHE BOOL "")
+        # BUILTINS defs
+        set(BUILTINS_${target}_CMAKE_SYSTEM_NAME                Generic CACHE STRING "")
+        set(BUILTINS_${target}_CMAKE_SYSTEM_PROCESSOR           RISCV CACHE STRING "")
+        set(BUILTINS_${target}_CMAKE_SYSROOT                    "" CACHE STRING "")
+
+        set(BUILTINS_${target}_COMPILER_RT_BAREMETAL_BUILD      ON CACHE BOOL "")
+        set(BUILTINS_${target}_CRT_CFLAGS                       "-ffreestanding" CACHE STRING "")
+        set(BUILTINS_${target}_BUILTIN_CFLAGS                   "-ffreestanding" CACHE STRING "")
+
+
+        foreach(lang C;CXX;ASM)
+            set(BUILTINS_${target}_CMAKE_${lang}_FLAGS "--target=${target} -march=${march}" CACHE STRING "") #mabi auto
+            set(RUNTIMES_${target}_CMAKE_${lang}_FLAGS "--target=${target} -march=${march}" CACHE STRING "")
+        endforeach()
+
+        set(RUNTIMES_${target}_CMAKE_SYSTEM_NAME                Generic CACHE STRING "")
+        set(RUNTIMES_${target}_CMAKE_SYSTEM_PROCESSOR           RISCV CACHE STRING "")
+        set(RUNTIMES_${target}_CMAKE_SYSROOT                    "" CACHE STRING "")
+
+        set(RUNTIMES_${target}_LLVM_ENABLE_RUNTIMES             "libc;libcxx" CACHE STRING "only build libc during runtime (builtins is already built")
+        set(RUNTIMES_${target}_COMPILER_RT_USE_BUILTINS_LIBRARY OFF CACHE BOOL "")
+        set(RUNTIMES_${target}_COMPILER_RT_BUILD_SANITIZERS     OFF CACHE BOOL "")
+        set(RUNTIMES_${target}_COMPILER_RT_INCLUDE_TESTS        OFF CACHE BOOL "")
+        set(RUNTIMES_${target}_COMPILER_RT_BUILD_XRAY           OFF CACHE BOOL "")
+        set(RUNTIMES_${target}_COMPILER_RT_BUILD_LIBFUZZER      OFF CACHE BOOL "")
+        set(RUNTIMES_${target}_COMPILER_RT_BUILD_MEMPROF        OFF CACHE BOOL "")
+        set(RUNTIMES_${target}_COMPILER_RT_BUILD_PROFILE        OFF CACHE BOOL "")
+
+        # LIBC defs
+        set(RUNTIMES_${target}_LIBC_ENABLE_USE_BY_CLANG ON CACHE BOOL "")
+        set(RUNTIMES_${target}_LLVM_LIBC_FULL_BUILD ON CACHE BOOL "")
+        set(RUNTIMES_${target}_LIBC_HDRGEN_ONLY OFF CACHE BOOL "Ensure that we do not generate HDRGEN (it would be cross compiled)")
+        set(RUNTIMES_${target}_LIBC_HDRGEN_EXE "${GENERATED_LIBC_HDRGEN_EXE}" CACHE STRING "Point to where the native HDRGEN was compiled")
+        #set(RUNTIMES_${target}_LIBC_COMPILE_OPTIONS_DEFAULT "-ffreestanding" CACHE STRING "")
+
+        # LIBCXX defs
+        set(RUNTIMES_${target}_LIBCXX_ENABLE_STATIC ON CACHE BOOL "")
+        set(RUNTIMES_${target}_LIBCXX_INCLUDE_TESTS OFF CACHE BOOL "")
+        set(RUNTIMES_${target}_LIBCXX_INCLUDE_BENCHMARKS OFF CACHE BOOL "")
+        set(RUNTIMES_${target}_LIBCXX_USE_COMPILER_RT ON CACHE BOOL "")
+        set(RUNTIMES_${target}_LIBCXX_ENABLE_STATIC_ABI_LIBRARY ON CACHE BOOL "")
+        set(RUNTIMES_${target}_LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY ON CACHE BOOL "")
+        # LIBCXX FEATURES
+        set(RUNTIMES_${target}_LIBCXX_ENABLE_RANDOM_DEVICE OFF CACHE BOOL "")
+        set(RUNTIMES_${target}_LIBCXX_ENABLE_LOCALIZATION OFF CACHE BOOL "")
+        set(RUNTIMES_${target}_LIBCXX_ENABLE_UNICODE OFF CACHE BOOL "")
+        set(RUNTIMES_${target}_LIBCXX_ENABLE_EXCEPTIONS OFF CACHE BOOL "")
+        set(RUNTIMES_${target}_LIBCXX_ENABLE_WIDE_CHARACTERS OFF CACHE BOOL "")
+        set(RUNTIMES_${target}_LIBCXX_ENABLE_RTTI OFF CACHE BOOL "")
+        set(RUNTIMES_${target}_LIBCXX_ENABLE_THREADS OFF CACHE BOOL "")
+
+    endforeach ()
+endforeach()
+
+
+list (GET RV_TARGETS_TRIPLES 0 default_target)
+set(LLVM_DEFAULT_TARGET_TRIPLE ${default_target} CACHE STRING "")
+
+#set(LLVM_RUNTIME_MULTILIBS ${RV_EXT} CACHE STRING "")
+#foreach (ext ${RV_EXT})
+#    set(LLVM_RUNTIME_MULTILIB_${ext}_TARGETS ${RV_TARGETS_TRIPLES} CACHE STRING "")
+#endforeach ()
+
+set(LLVM_BUILTIN_TARGETS ${RV_TARGETS_TRIPLES} CACHE STRING "")
+set(LLVM_RUNTIME_TARGETS ${RV_TARGETS_TRIPLES} CACHE STRING "")
+
+set(LLVM_INCLUDE_TESTS OFF CACHE BOOL "")
+set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR ON CACHE BOOL "")
diff --git a/compiler-rt/cmake/base-config-ix.cmake b/compiler-rt/cmake/base-config-ix.cmake
index 5a97992756a9c9ab6468256aad0eaf70f1905103..37a9e642adcb650f7ddd420203fc86b05dd21060 100644
--- a/compiler-rt/cmake/base-config-ix.cmake
+++ b/compiler-rt/cmake/base-config-ix.cmake
@@ -279,9 +279,9 @@ macro(test_targets)
     elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "aarch64")
       test_target_arch(aarch64 "" "-march=armv8-a")
     elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "riscv32")
-      test_target_arch(riscv32 "" "")
+      test_target_arch(riscv32 "" "-march=rv32gc")
     elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "riscv64")
-      test_target_arch(riscv64 "" "")
+      test_target_arch(riscv64 "" "-march=rv64gc")
     elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "wasm32")
       test_target_arch(wasm32 "" "--target=wasm32-unknown-unknown")
     elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "wasm64")
diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index 6e0760724d96384a91fb5f69387af7ba3846a403..52d0ebaac42d01b94a3d22cef55bcf00b2c096ce 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -229,9 +229,9 @@ foreach(config_path IN LISTS LIBC_CONFIG_JSON_FILE_LIST)
 endforeach()
 
 if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND LIBC_ENABLE_USE_BY_CLANG)
-  set(LIBC_INCLUDE_DIR ${LLVM_BINARY_DIR}/include/${LLVM_DEFAULT_TARGET_TRIPLE})
-  set(LIBC_INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}/${LLVM_DEFAULT_TARGET_TRIPLE})
-  set(LIBC_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE})
+  set(LIBC_INCLUDE_DIR ${LLVM_BINARY_DIR}/lib/clang-runtimes/${LLVM_DEFAULT_TARGET_TRIPLE}/include)
+  set(LIBC_INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_PREFIX}/lib/clang-runtimes/${LLVM_DEFAULT_TARGET_TRIPLE}/include)
+  set(LIBC_LIBRARY_DIR ${LLVM_BINARY_DIR}/lib/clang-runtimes/${LLVM_DEFAULT_TARGET_TRIPLE}/lib)
 else()
   if(NOT LIBC_ENABLE_USE_BY_CLANG)
     set(LIBC_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include)
@@ -259,8 +259,13 @@ endif()
 if(LIBC_TARGET_TRIPLE)
   set(LIBC_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LIBC_TARGET_TRIPLE})
 elseif(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR)
-  set(LIBC_INSTALL_LIBRARY_DIR
+  if(LIBC_ENABLE_USE_BY_CLANG)
+    set(LIBC_INSTALL_LIBRARY_DIR
+      ${CMAKE_INSTALL_PREFIX}/lib/clang-runtimes/${LLVM_DEFAULT_TARGET_TRIPLE}/lib)
+  else()
+    set(LIBC_INSTALL_LIBRARY_DIR
       lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE})
+  endif()
 else()
   set(LIBC_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX})
 endif()
diff --git a/libc/lib/CMakeLists.txt b/libc/lib/CMakeLists.txt
index 37acf3950b4602c5878ca3efecd75f4a3a30c08a..1cc9a03d89716df68928bc6ba8daf61396cefbb5 100644
--- a/libc/lib/CMakeLists.txt
+++ b/libc/lib/CMakeLists.txt
@@ -2,7 +2,11 @@ set(libc_archive_targets "")
 set(libc_archive_names "")
 set(libc_archive_entrypoint_lists "")
 if(LLVM_LIBC_FULL_BUILD)
-  list(APPEND libc_archive_names c m)
+  if(LIBC_TARGET_ARCHITECTURE_IS_GPU)
+    list(APPEND libc_archive_names cgpu mgpu)
+  else()
+    list(APPEND libc_archive_names c m)
+  endif()
   list(APPEND libc_archive_targets libc libm)
   list(APPEND libc_archive_entrypoint_lists
        TARGET_LIBC_ENTRYPOINTS TARGET_LIBM_ENTRYPOINTS)
@@ -31,44 +35,23 @@ foreach(archive IN ZIP_LISTS
   )
   if(LLVM_LIBC_FULL_BUILD)
     target_link_libraries(${archive_1} PUBLIC libc-headers)
-    if(TARGET libc-startup)
-      add_dependencies(${archive_1} libc-startup)
-    endif()
   endif()
   list(APPEND added_archive_targets ${archive_1})
+endforeach()
 
-  # Add the offloading version of the library for offloading languages. These
-  # are installed in the standard search path separate from the other libraries.
-  if(LIBC_TARGET_OS_IS_GPU)
-    add_gpu_entrypoint_library(
-      ${archive_1}gpu
-      ${archive_1}
-      DEPENDS
-        ${${archive_2}}
-    )
-    set_target_properties(
-      ${archive_1}gpu
-      PROPERTIES
-        ARCHIVE_OUTPUT_NAME ${archive_0}gpu-${LIBC_TARGET_ARCHITECTURE}
-        ARCHIVE_OUTPUT_DIRECTORY ${LLVM_LIBRARY_OUTPUT_INTDIR}
-    )
-    list(APPEND added_gpu_archive_targets ${archive_1}gpu)
-
-    add_bitcode_entrypoint_library(
-      ${archive_1}bitcode
-      ${archive_1}
-      DEPENDS
-        ${${archive_2}}
-    )
-    set_target_properties(
-      ${archive_1}bitcode
-      PROPERTIES
-        OUTPUT_NAME ${archive_1}.bc
-    )
-    add_dependencies(${archive_1}gpu ${archive_1}bitcode)
-    list(APPEND added_gpu_bitcode_targets ${archive_1}bitcode)
+if(LIBC_TARGET_TRIPLE)
+  set(LIBC_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LIBC_TARGET_TRIPLE})
+elseif(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT LIBC_GPU_BUILD)
+  if(LIBC_ENABLE_USE_BY_CLANG)
+    set(LIBC_INSTALL_LIBRARY_DIR
+      ${CMAKE_INSTALL_PREFIX}/lib/clang-runtimes/${LLVM_DEFAULT_TARGET_TRIPLE}/lib)
+  else()
+    set(LIBC_INSTALL_LIBRARY_DIR
+      lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE})
   endif()
-endforeach()
+else()
+  set(LIBC_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX})
+endif()
 
 install(
   TARGETS ${added_archive_targets}
@@ -76,25 +59,6 @@ install(
   COMPONENT libc
 )
 
-if(LIBC_TARGET_OS_IS_GPU)
-  set(gpu_install_dir lib${LLVM_LIBDIR_SUFFIX})
-  if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR)
-    set(gpu_install_dir lib${LLVM_LIBDIR_SUFFIX}/${LLVM_HOST_TRIPLE})
-  endif()
-  install(
-    TARGETS ${added_gpu_archive_targets}
-    ARCHIVE DESTINATION ${gpu_install_dir}
-    COMPONENT libc
-  )
-  foreach(file ${added_gpu_bitcode_targets})
-    install(FILES $<TARGET_PROPERTY:${file},TARGET_OBJECT>
-            DESTINATION ${LIBC_INSTALL_LIBRARY_DIR}
-            RENAME $<TARGET_PROPERTY:${file},OUTPUT_NAME>
-            COMPONENT libc
-    )
-  endforeach()
-endif()
-
 if(NOT LIBC_TARGET_OS_IS_BAREMETAL)
   # For now we will disable libc-startup installation for baremetal. The
   # correct way to do it would be to make a hookable startup for baremetal