Browse Source

clang: Upgrade to 16.0.5 version

Previously we are using bbappend for the clang recipes, however it is now
not applicable as there are changes for some directory structure in
llvm-project (Support/Triple.cpp to TargetParser/Triple.cpp). Hence,
clang 16.0.5 recipes are brought into meta-starfive instead.

Besides, for clang-native in clang_16.0.5, it is now not bootstrapped to be
aligned with our toolchain compilation steps. Our custom parameters are
currently separated with the bb file for easier maintanence going forward.

Co-authored by: Kai Zhe Mooi <kaizhe.mooi@starfivetech.com>
Signed-off-by: Jun Yuan Tan <junyuan.tan@starfivetech.com>
Jun Yuan Tan 7 months ago
parent
commit
004cc74d33
77 changed files with 3510 additions and 771 deletions
  1. 1 1
      conf/machine/starfive-jh8100.conf
  2. 36 0
      recipes-devtools/clang/clang-cross-canadian_16.0.5.bb
  3. 0 3
      recipes-devtools/clang/clang-cross-canadian_git.bbappend
  4. 35 0
      recipes-devtools/clang/clang-cross_16.0.5.bb
  5. 0 3
      recipes-devtools/clang/clang-cross_git.bbappend
  6. 34 0
      recipes-devtools/clang/clang-crosssdk_16.0.5.bb
  7. 0 3
      recipes-devtools/clang/clang-crosssdk_git.bbappend
  8. 27 0
      recipes-devtools/clang/clang.inc
  9. 11 20
      recipes-devtools/clang/clang/0001-libcxxabi-Find-libunwind-headers-when-LIBCXXABI_LIBU.patch
  10. 151 0
      recipes-devtools/clang/clang/0001-neon2rvv-support-type-convert-between-fixed-vector-a.patch
  11. 2 1
      recipes-devtools/clang/clang/0002-compiler-rt-support-a-new-embedded-linux-target.patch
  12. 1278 0
      recipes-devtools/clang/clang/0002-neon2rvv-Model-vxrm-in-LLVM-intrinsics-and-add-optim.patch
  13. 44 51
      recipes-devtools/clang/clang/0003-RISCV-Add-prefetch-instructions.patch
  14. 15 14
      recipes-devtools/clang/clang/0003-compiler-rt-Simplify-cross-compilation.-Don-t-use-na.patch
  15. 10 10
      recipes-devtools/clang/clang/0004-RISCV-Add-customer-cache-instructions.patch
  16. 32 30
      recipes-devtools/clang/clang/0004-llvm-TargetLibraryInfo-Undefine-libc-functions-if-th.patch
  17. 0 49
      recipes-devtools/clang/clang/0004-set-default-march-to-rv64imafcd_zba_zbb_zbc_zbs-and-.patch
  18. 5 5
      recipes-devtools/clang/clang/0005-RISCV-Add-multilib-v-b-support-for-baremetal-toolcha.patch
  19. 14 9
      recipes-devtools/clang/clang/0005-llvm-allow-env-override-of-exe-and-libdir-path.patch
  20. 0 75
      recipes-devtools/clang/clang/0005-support-b-letter-in-march-string.patch
  21. 7 7
      recipes-devtools/clang/clang/0006-RISCV-Change-baremetal-multilib-directory-name-to-al.patch
  22. 6 5
      recipes-devtools/clang/clang/0006-clang-driver-Check-sysroot-for-ldso-path.patch
  23. 5 5
      recipes-devtools/clang/clang/0007-Driver-Set-clang-default-dwarf-version-to-4.patch
  24. 4 3
      recipes-devtools/clang/clang/0007-clang-Driver-tools.cpp-Add-lssp_nonshared-on-musl.patch
  25. 0 33
      recipes-devtools/clang/clang/0007-set-clang-default-march-to-rv64gc.patch
  26. 60 0
      recipes-devtools/clang/clang/0008-RISCV-Support-b-letter-in-march-string.patch
  27. 4 3
      recipes-devtools/clang/clang/0008-clang-Prepend-trailing-to-sysroot.patch
  28. 38 0
      recipes-devtools/clang/clang/0009-RISCV-Align-default-march-with-dubhe-gcc-toolchain.patch
  29. 9 8
      recipes-devtools/clang/clang/0009-clang-Look-inside-the-target-sysroot-for-compiler-ru.patch
  30. 5 3
      recipes-devtools/clang/clang/0010-clang-Define-releative-gcc-installation-dir.patch
  31. 6 5
      recipes-devtools/clang/clang/0011-clang-Add-lpthread-and-ldl-along-with-lunwind-for-st.patch
  32. 7 6
      recipes-devtools/clang/clang/0012-Pass-PYTHON_EXECUTABLE-when-cross-compiling-for-nati.patch
  33. 3 2
      recipes-devtools/clang/clang/0013-Check-for-atomic-double-intrinsics.patch
  34. 7 7
      recipes-devtools/clang/clang/0014-libcxx-Add-compiler-runtime-library-to-link-step-for.patch
  35. 48 49
      recipes-devtools/clang/clang/0015-clang-llvm-cmake-Fix-configure-for-packages-using-fi.patch
  36. 6 5
      recipes-devtools/clang/clang/0016-clang-Fix-resource-dir-location-for-cross-toolchains.patch
  37. 7 6
      recipes-devtools/clang/clang/0017-clang-driver-Add-dyld-prefix-when-checking-sysroot-f.patch
  38. 7 44
      recipes-devtools/clang/clang/0018-clang-Use-python3-in-python-scripts.patch
  39. 4 4
      recipes-devtools/clang/clang/0019-For-x86_64-set-Yocto-based-GCC-install-search-path.patch
  40. 5 4
      recipes-devtools/clang/clang/0020-llvm-Do-not-use-find_library-for-ncurses.patch
  41. 8 8
      recipes-devtools/clang/clang/0021-llvm-Insert-anchor-for-adding-OE-distro-vendor-names.patch
  42. 1 1
      recipes-devtools/clang/clang/0022-compiler-rt-Do-not-use-backtrace-APIs-on-non-glibc-l.patch
  43. 0 36
      recipes-devtools/clang/clang/0022-compiler-rt-Use-mcr-based-barrier-on-armv6.patch
  44. 4 3
      recipes-devtools/clang/clang/0023-clang-Fix-x86-triple-for-non-debian-multiarch-linux-.patch
  45. 5 5
      recipes-devtools/clang/clang/0024-libunwind-Added-unw_backtrace-method.patch
  46. 3 3
      recipes-devtools/clang/clang/0025-clang-Do-not-use-install-relative-libc-headers.patch
  47. 0 28
      recipes-devtools/clang/clang/0025-compiler-rt-Link-scudo-with-SANITIZER_CXX_ABI_LIBRAR.patch
  48. 4 4
      recipes-devtools/clang/clang/0026-clang-Fix-how-driver-finds-GCC-installation-path-on-.patch
  49. 0 29
      recipes-devtools/clang/clang/0026-compiler-rt-Link-scudo-standalone-with-libatomic-on-.patch
  50. 11 11
      recipes-devtools/clang/clang/0027-Fix-lib-paths-for-OpenEmbedded-Host.patch
  51. 7 7
      recipes-devtools/clang/clang/0028-Correct-library-search-path-for-OpenEmbedded-Host.patch
  52. 0 46
      recipes-devtools/clang/clang/0028-Do-not-force-thumb-mode-directive.patch
  53. 2 2
      recipes-devtools/clang/clang/0029-lldb-Link-with-libatomic-on-x86.patch
  54. 3 3
      recipes-devtools/clang/clang/0030-clang-exclude-openembedded-distributions-from-settin.patch
  55. 30 15
      recipes-devtools/clang/clang/0031-compiler-rt-Enable-__int128-for-ppc32.patch
  56. 62 0
      recipes-devtools/clang/clang/0032-llvm-Do-not-use-cmake-infra-to-detect-libzstd.patch
  57. 53 0
      recipes-devtools/clang/clang/0033-build-Enable-64bit-off_t-on-32bit-glibc-systems.patch
  58. 36 0
      recipes-devtools/clang/clang/0034-compiler-rt-Undef-_TIME_BITS-along-with-_FILE_OFFSET.patch
  59. 44 0
      recipes-devtools/clang/clang/0035-compiler-rt-Fix-stat-struct-s-size-for-O32-ABI.patch
  60. 43 0
      recipes-devtools/clang/clang/0036-compiler-rt-Undef-_TIME_BITS-along-with-_FILE_OFFSET.patch
  61. 70 0
      recipes-devtools/clang/clang/0037-clang-Call-printName-to-get-name-of-Decl.patch
  62. 443 0
      recipes-devtools/clang/clang_16.0.5.bb
  63. 28 0
      recipes-devtools/clang/clang_16.0.5.bbappend
  64. 0 63
      recipes-devtools/clang/clang_git.bbappend
  65. 17 0
      recipes-devtools/clang/common-source.inc
  66. 60 0
      recipes-devtools/clang/common.inc
  67. 116 0
      recipes-devtools/clang/compiler-rt-sanitizers_16.0.5.bb
  68. 129 0
      recipes-devtools/clang/compiler-rt_16.0.5.bb
  69. 0 3
      recipes-devtools/clang/compiler-rt_git.bbappend
  70. 48 0
      recipes-devtools/clang/libclc_16.0.5.bb
  71. 115 0
      recipes-devtools/clang/libcxx_16.0.5.bb
  72. 0 4
      recipes-devtools/clang/libcxx_16.0.5.bbappend
  73. 10 0
      recipes-devtools/clang/llvm-project-source.bb
  74. 29 27
      recipes-devtools/clang/llvm-project-source.bbappend
  75. 96 0
      recipes-devtools/clang/llvm-project-source.inc
  76. 35 0
      recipes-devtools/clang/nativesdk-clang-glue.bb
  77. 65 0
      recipes-devtools/clang/openmp_16.0.5.bb

+ 1 - 1
conf/machine/starfive-jh8100.conf

@@ -23,7 +23,7 @@ SERIAL_CONSOLE = "115200 ttyS0"
 PREFERRED_PROVIDER_virtual/kernel = "linux-starfive-dev"
 PREFERRED_PROVIDER_virtual/bootloader = "u-boot-starfive"
 
-LLVMVERSION = "14.0.0"
+LLVMVERSION = "16.0.5"
 GLIBCVERSION = "2.36"
 BINUVERSION = "2.39"
 GCCVERSION = "12.2.0"

+ 36 - 0
recipes-devtools/clang/clang-cross-canadian_16.0.5.bb

@@ -0,0 +1,36 @@
+# Copyright (C) 2014 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "Clang/LLVM based C/C++ compiler (cross-canadian for ${TARGET_ARCH} target)"
+HOMEPAGE = "http://clang.llvm.org/"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0-with-LLVM-exception;md5=0bcd48c3bdfef0c9d9fd17726e4b7dab"
+SECTION = "devel"
+
+PN = "clang-cross-canadian-${TRANSLATED_TARGET_ARCH}"
+
+require clang.inc
+require common-source.inc
+inherit cross-canadian
+
+DEPENDS += "nativesdk-clang binutils-cross-canadian-${TRANSLATED_TARGET_ARCH} virtual/${HOST_PREFIX}binutils-crosssdk virtual/nativesdk-libc"
+# We have to point gcc at a sysroot but we don't need to rebuild if this changes
+# e.g. we switch between different machines with different tunes.
+EXTRA_OECONF_PATHS[vardepsexclude] = "TUNE_PKGARCH"
+TARGET_ARCH[vardepsexclude] = "TUNE_ARCH"
+
+do_install() {
+        install -d ${D}${bindir}
+	for tool in clang clang++ clang-tidy lld ld.lld llvm-profdata \
+            llvm-nm llvm-ar llvm-as llvm-ranlib llvm-strip llvm-objcopy llvm-objdump llvm-readelf \
+            llvm-addr2line llvm-dwp llvm-size llvm-strings llvm-cov
+	do
+		ln -sf ../$tool ${D}${bindir}/${TARGET_PREFIX}$tool
+	done
+}
+SSTATE_SCAN_FILES += "*-clang *-clang++ *-llvm-profdata *-llvm-ar \
+                      *-llvm-ranlib *-llvm-nm *-lld *-ld.lld *-llvm-as *-llvm-strip \
+                      *-llvm-objcopy *-llvm-objdump *-llvm-readelf *-llvm-addr2line \
+                      *-llvm-dwp *-llvm-size *-llvm-strings *-llvm-cov"
+do_install:append() {
+        cross_canadian_bindirlinks
+}

+ 0 - 3
recipes-devtools/clang/clang-cross-canadian_git.bbappend

@@ -1,3 +0,0 @@
-MAJOR_VER = "15"
-MINOR_VER = "0"
-PATCH_VER = "0"

+ 35 - 0
recipes-devtools/clang/clang-cross_16.0.5.bb

@@ -0,0 +1,35 @@
+# Copyright (C) 2014 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "Cross compiler wrappers for LLVM based C/C++ compiler"
+HOMEPAGE = "http://clang.llvm.org/"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0-with-LLVM-exception;md5=0bcd48c3bdfef0c9d9fd17726e4b7dab"
+SECTION = "devel"
+
+PN = "clang-cross-${TARGET_ARCH}"
+
+require clang.inc
+require common-source.inc
+inherit cross
+DEPENDS += "clang-native virtual/${TARGET_PREFIX}binutils"
+
+do_install() {
+        install -d ${D}${bindir}
+	for tool in clang clang++ clang-tidy lld ld.lld llvm-profdata \
+            llvm-nm llvm-ar llvm-as llvm-ranlib llvm-strip llvm-objcopy llvm-objdump llvm-readelf \
+            llvm-addr2line llvm-dwp llvm-size llvm-strings llvm-cov
+	do
+		ln -sf ../$tool ${D}${bindir}/${TARGET_PREFIX}$tool
+	done
+}
+SSTATE_SCAN_FILES += "*-clang *-clang++ *-llvm-profdata *-lld *-ld.lld \
+                      *-llvm-nm *-llvm-ar *-llvm-as *-llvm-ranlib *-llvm-strip \
+                      *-llvm-objcopy *-llvm-objdump *-llvm-readelf *-llvm-addr2line \
+                      *-llvm-dwp *-llvm-size *-llvm-strings *-llvm-cov"
+
+SYSROOT_PREPROCESS_FUNCS += "clangcross_sysroot_preprocess"
+
+clangcross_sysroot_preprocess () {
+        sysroot_stage_dir ${D}${bindir} ${SYSROOT_DESTDIR}${bindir}
+}
+PACKAGES = ""

+ 0 - 3
recipes-devtools/clang/clang-cross_git.bbappend

@@ -1,3 +0,0 @@
-MAJOR_VER = "15"
-MINOR_VER = "0"
-PATCH_VER = "0"

+ 34 - 0
recipes-devtools/clang/clang-crosssdk_16.0.5.bb

@@ -0,0 +1,34 @@
+# Copyright (C) 2014 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "SDK Cross compiler wrappers for LLVM based C/C++ compiler"
+HOMEPAGE = "http://clang.llvm.org/"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0-with-LLVM-exception;md5=0bcd48c3bdfef0c9d9fd17726e4b7dab"
+SECTION = "devel"
+
+PN = "clang-crosssdk-${TARGET_ARCH}"
+
+require clang.inc
+require common-source.inc
+inherit crosssdk
+DEPENDS += "clang-native nativesdk-clang-glue virtual/${TARGET_PREFIX}binutils-crosssdk virtual/nativesdk-libc"
+
+do_install() {
+        install -d ${D}${bindir}
+	for tool in clang clang++ clang-tidy lld ld.lld llvm-profdata \
+            llvm-nm llvm-ar llvm-as llvm-ranlib llvm-strip llvm-objcopy llvm-objdump llvm-readelf \
+            llvm-addr2line llvm-dwp llvm-size llvm-strings llvm-cov
+	do
+		ln -sf ../$tool ${D}${bindir}/${TARGET_PREFIX}$tool
+	done
+}
+SSTATE_SCAN_FILES += "*-clang *-clang++ *-llvm-profdata *-lld *-ld.lld \
+                      *-llvm-nm *-llvm-ar *-llvm-as *-llvm-ranlib *-llvm-strip \
+                      *-llvm-objcopy *-llvm-objdump *-llvm-readelf *-llvm-addr2line \
+                      *-llvm-dwp *-llvm-size *-llvm-strings *-llvm-cov"
+sysroot_stage_all () {
+        sysroot_stage_dir ${D}${bindir} ${SYSROOT_DESTDIR}${bindir}
+}
+
+PACKAGES = ""
+

+ 0 - 3
recipes-devtools/clang/clang-crosssdk_git.bbappend

@@ -1,3 +0,0 @@
-MAJOR_VER = "15"
-MINOR_VER = "0"
-PATCH_VER = "0"

+ 27 - 0
recipes-devtools/clang/clang.inc

@@ -0,0 +1,27 @@
+LLVM_RELEASE = ""
+LLVM_DIR = "llvm${LLVM_RELEASE}"
+
+LLVM_GIT ?= "git://github.com/llvm"
+LLVM_GIT_PROTOCOL ?= "https"
+
+MAJOR_VER = "16"
+MINOR_VER = "0"
+PATCH_VER = "5"
+
+SRCREV ?= "185b81e034ba60081023b6e59504dfffb560f3e3"
+
+PV = "${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}"
+#BRANCH = "release/15.x"
+BRANCH = "release/16.x"
+
+LLVMMD5SUM = "8a15a0759ef07f2682d2ba4b893c9afe"
+CLANGMD5SUM = "ff42885ed2ab98f1ecb8c1fc41205343"
+LLDMD5SUM = "ae7dc7c027b1fa89b5b013d391d3ee2b"
+LLDBMD5SUM = "2e0d44968471fcde980034dbb826bea9"
+
+LLVM_LIBDIR_SUFFIX="${@d.getVar('baselib').replace('lib', '')}"
+
+# set the default pigz thread
+export PIGZ = "-p ${@oe.utils.cpu_count(at_least=2)}"
+
+require common.inc

+ 11 - 20
recipes-devtools/clang/clang/0001-libcxxabi-Find-libunwind-headers-when.patch → recipes-devtools/clang/clang/0001-libcxxabi-Find-libunwind-headers-when-LIBCXXABI_LIBU.patch

@@ -1,7 +1,7 @@
-From 2ca03d2f8cc86821efb781c7ae97b84592c3888a Mon Sep 17 00:00:00 2001
-From: "yang.lee" <yang.lee@starfivetech.com>
-Date: Thu, 26 May 2022 11:01:19 +0800
-Subject: [PATCH 1/3] libcxxabi: Find libunwind headers when 
+From 60d418bdd291f061e32a73ffee7ad7acc27a4768 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sun, 27 Aug 2017 10:37:49 -0700
+Subject: [PATCH] libcxxabi: Find libunwind headers when
  LIBCXXABI_LIBUNWIND_INCLUDES is set
 
 Currently, when LIBCXXABI_LIBUNWIND_INCLUDES is set via CMake arguments
@@ -11,32 +11,26 @@ especially for ARM targets
 This patch makes the searching synthesized directories and then set
 LIBCXXABI_LIBUNWIND_INCLUDES if its there in environment
 
-Rebased by Lee Yang
+Upstream-Status: Pending
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
- libcxxabi/CMakeLists.txt | 21 +++++++++++----------
- 1 file changed, 11 insertions(+), 10 deletions(-)
+ libcxxabi/CMakeLists.txt | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
 
 diff --git a/libcxxabi/CMakeLists.txt b/libcxxabi/CMakeLists.txt
-index a7d6d1902158..16a040fcef27 100644
+index 8f48d402bc22..c2470267d8e3 100644
 --- a/libcxxabi/CMakeLists.txt
 +++ b/libcxxabi/CMakeLists.txt
-@@ -517,13 +517,8 @@ endif()
- # Setup Source Code
- #===============================================================================
+@@ -483,7 +483,7 @@ set(LIBCXXABI_LIBUNWIND_PATH "${LIBCXXABI_LIBUNWIND_PATH}" CACHE PATH
+     "Specify path to libunwind source." FORCE)
  
--set(LIBCXXABI_LIBUNWIND_INCLUDES "${LIBCXXABI_LIBUNWIND_INCLUDES}" CACHE PATH
--    "Specify path to libunwind includes." FORCE)
--set(LIBCXXABI_LIBUNWIND_PATH "${LIBCXXABI_LIBUNWIND_PATH}" CACHE PATH
--    "Specify path to libunwind source." FORCE)
--
  if (LIBCXXABI_USE_LLVM_UNWINDER OR LLVM_NATIVE_ARCH MATCHES ARM)
 -  find_path(LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL libunwind.h
 +  find_path(LIBCXXABI_LIBUNWIND_INCLUDES libunwind.h
      PATHS ${LIBCXXABI_LIBUNWIND_INCLUDES}
            ${LIBCXXABI_LIBUNWIND_PATH}/include
            ${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBUNWIND_INCLUDES}
-@@ -534,15 +529,21 @@ if (LIBCXXABI_USE_LLVM_UNWINDER OR LLVM_NATIVE_ARCH MATCHES ARM)
+@@ -494,15 +494,21 @@ if (LIBCXXABI_USE_LLVM_UNWINDER OR LLVM_NATIVE_ARCH MATCHES ARM)
      NO_CMAKE_FIND_ROOT_PATH
    )
  
@@ -62,6 +56,3 @@ index a7d6d1902158..16a040fcef27 100644
  # Add source code. This also contains all of the logic for deciding linker flags
  # soname, etc...
  add_subdirectory(include)
--- 
-2.25.1
-

+ 151 - 0
recipes-devtools/clang/clang/0001-neon2rvv-support-type-convert-between-fixed-vector-a.patch

@@ -0,0 +1,151 @@
+From 51248b6c65c8809f27e84a56e43b00c88d473280 Mon Sep 17 00:00:00 2001
+From: Eric Tang <eric.tang@starfivetech.com>
+Date: Fri, 2 Jun 2023 09:07:44 +0800
+Subject: [PATCH 1/9] [neon2rvv] support type convert between fixed vector and
+ scalable vector
+
+  disable the default vectorize options on O1,O2,O3,Oz...
+
+Signed-off-by: Eric Tang <eric.tang@starfivetech.com>
+---
+ clang/include/clang/Basic/BuiltinsRISCV.def | 49 ++++++++++++++++++++
+ clang/lib/CodeGen/CGBuiltin.cpp             | 51 +++++++++++++++++++++
+ clang/lib/Driver/ToolChains/Clang.cpp       |  1 +
+ 3 files changed, 101 insertions(+)
+
+diff --git a/clang/include/clang/Basic/BuiltinsRISCV.def b/clang/include/clang/Basic/BuiltinsRISCV.def
+index c26e3b807370..cbeb29245aec 100644
+--- a/clang/include/clang/Basic/BuiltinsRISCV.def
++++ b/clang/include/clang/Basic/BuiltinsRISCV.def
+@@ -79,5 +79,54 @@ TARGET_BUILTIN(__builtin_riscv_sm4ks, "LiLiLiIUc", "nc", "zksed")
+ TARGET_BUILTIN(__builtin_riscv_sm3p0, "LiLi", "nc", "zksh")
+ TARGET_BUILTIN(__builtin_riscv_sm3p1, "LiLi", "nc", "zksh")
+ 
++// Scalable Vector type <-> Fixed Vector type
++
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_i8m1, "q8ScV8Sc", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_i8m2, "q16ScV16Sc", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_i16m1, "q4SsV4Ss", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_i16m2, "q8SsV8Ss", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_i32m1, "q2SiV2Si", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_i32m2, "q4SiV4Si", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_i64m1, "q1LSiV1LSi", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_i64m2, "q2LSiV2LSi", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_u8m1, "q8UcV8Uc", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_u8m2, "q16UcV16Uc", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_u16m1, "q4UsV4Us", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_u16m2, "q8UsV8Us", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_u32m1, "q2UiV2Ui", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_u32m2, "q4UiV4Ui", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_u64m1, "q1LUiV1LUi", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_u64m2, "q2LUiV2LUi", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_f16m1, "q4hV4h", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_f16m2, "q8hV8h", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_f32m1, "q2fV2f", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_f32m2, "q4fV4f", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_f64m1, "q1dV1d", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_from_f64m2, "q2dV2d", "nc", "v,64bit")
++
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_i8m1, "V8Scq8Sc", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_i8m2, "V16Scq16Sc", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_i16m1, "V4Ssq4Ss", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_i16m2, "V8Ssq8Ss", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_i32m1, "V2Siq2Si", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_i32m2, "V4Siq4Si", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_i64m1, "V1LSiq1LSi", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_i64m2, "V2LSiq2LSi", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_u8m1, "V8Ucq8Uc", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_u8m2, "V16Ucq16Uc", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_u16m1, "V4Usq4Us", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_u16m2, "V8Usq8Us", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_u32m1, "V2Uiq2Ui", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_u32m2, "V4Uiq4Ui", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_u64m1, "V1LUiq1LUi", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_u64m2, "V2LUiq2LUi", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_f16m1, "V4hq4h", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_f16m2, "V8hq8h", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_f32m1, "V2fq2f", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_f32m2, "V4fq4f", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_f64m1, "V1dq1d", "nc", "v,64bit")
++TARGET_BUILTIN(__builtin_rvv_type_cast_to_f64m2, "V2dq2d", "nc", "v,64bit")
++
++
+ #undef BUILTIN
+ #undef TARGET_BUILTIN
+diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
+index f72e04a425d9..1e276bac4e54 100644
+--- a/clang/lib/CodeGen/CGBuiltin.cpp
++++ b/clang/lib/CodeGen/CGBuiltin.cpp
+@@ -19666,6 +19666,57 @@ Value *CodeGenFunction::EmitRISCVBuiltinExpr(unsigned BuiltinID,
+     ID = Intrinsic::riscv_sm3p1;
+     IntrinsicTypes = {ResultType};
+     break;
++  //scalable vector type <-> fixed vector types
++  case RISCV::BI__builtin_rvv_type_cast_from_i8m1:
++  case RISCV::BI__builtin_rvv_type_cast_from_i8m2:
++  case RISCV::BI__builtin_rvv_type_cast_from_i16m1:
++  case RISCV::BI__builtin_rvv_type_cast_from_i16m2:
++  case RISCV::BI__builtin_rvv_type_cast_from_i32m1:
++  case RISCV::BI__builtin_rvv_type_cast_from_i32m2:
++  case RISCV::BI__builtin_rvv_type_cast_from_i64m1:
++  case RISCV::BI__builtin_rvv_type_cast_from_i64m2:
++  case RISCV::BI__builtin_rvv_type_cast_from_u8m1:
++  case RISCV::BI__builtin_rvv_type_cast_from_u8m2:
++  case RISCV::BI__builtin_rvv_type_cast_from_u16m1:
++  case RISCV::BI__builtin_rvv_type_cast_from_u16m2:
++  case RISCV::BI__builtin_rvv_type_cast_from_u32m1:
++  case RISCV::BI__builtin_rvv_type_cast_from_u32m2:
++  case RISCV::BI__builtin_rvv_type_cast_from_u64m1:
++  case RISCV::BI__builtin_rvv_type_cast_from_u64m2:
++  case RISCV::BI__builtin_rvv_type_cast_from_f16m1:
++  case RISCV::BI__builtin_rvv_type_cast_from_f16m2:
++  case RISCV::BI__builtin_rvv_type_cast_from_f32m1:
++  case RISCV::BI__builtin_rvv_type_cast_from_f32m2:
++  case RISCV::BI__builtin_rvv_type_cast_from_f64m1:
++  case RISCV::BI__builtin_rvv_type_cast_from_f64m2:
++  {
++    return Builder.CreateInsertVector(ResultType, UndefValue::get(ResultType), Ops[0], Builder.getInt64(0));
++  }
++  case RISCV::BI__builtin_rvv_type_cast_to_i8m1:
++  case RISCV::BI__builtin_rvv_type_cast_to_i8m2:
++  case RISCV::BI__builtin_rvv_type_cast_to_i16m1:
++  case RISCV::BI__builtin_rvv_type_cast_to_i16m2:
++  case RISCV::BI__builtin_rvv_type_cast_to_i32m1:
++  case RISCV::BI__builtin_rvv_type_cast_to_i32m2:
++  case RISCV::BI__builtin_rvv_type_cast_to_i64m1:
++  case RISCV::BI__builtin_rvv_type_cast_to_i64m2:
++  case RISCV::BI__builtin_rvv_type_cast_to_u8m1:
++  case RISCV::BI__builtin_rvv_type_cast_to_u8m2:
++  case RISCV::BI__builtin_rvv_type_cast_to_u16m1:
++  case RISCV::BI__builtin_rvv_type_cast_to_u16m2:
++  case RISCV::BI__builtin_rvv_type_cast_to_u32m1:
++  case RISCV::BI__builtin_rvv_type_cast_to_u32m2:
++  case RISCV::BI__builtin_rvv_type_cast_to_u64m1:
++  case RISCV::BI__builtin_rvv_type_cast_to_u64m2:
++  case RISCV::BI__builtin_rvv_type_cast_to_f16m1:
++  case RISCV::BI__builtin_rvv_type_cast_to_f16m2:
++  case RISCV::BI__builtin_rvv_type_cast_to_f32m1:
++  case RISCV::BI__builtin_rvv_type_cast_to_f32m2:
++  case RISCV::BI__builtin_rvv_type_cast_to_f64m1:
++  case RISCV::BI__builtin_rvv_type_cast_to_f64m2:
++  {
++    return Builder.CreateExtractVector(ResultType, Ops[0], Builder.getInt64(0));
++  }
+ 
+   // Vector builtins are handled from here.
+ #include "clang/Basic/riscv_vector_builtin_cg.inc"
+diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
+index 77554aa2c462..d207a636e07f 100644
+--- a/clang/lib/Driver/ToolChains/Clang.cpp
++++ b/clang/lib/Driver/ToolChains/Clang.cpp
+@@ -635,6 +635,7 @@ static void addCoveragePrefixMapArg(const Driver &D, const ArgList &Args,
+ /// For -Oz the loop vectorizer is disabled, while the slp vectorizer is
+ /// enabled.
+ static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
++  return false;
+   if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
+     if (A->getOption().matches(options::OPT_O4) ||
+         A->getOption().matches(options::OPT_Ofast))
+-- 
+2.25.1
+

+ 2 - 1
recipes-devtools/clang/clang/0002-compiler-rt-support-a-new-embedded-linux-target.patch

@@ -1,8 +1,9 @@
-From 5a1cf5bd6eb5b7ee299c11b7a39ada74fd60be1d Mon Sep 17 00:00:00 2001
+From f205cf35a9ad116b291b2b36a50800e4573e6ac6 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Sun, 19 Apr 2015 15:16:23 -0700
 Subject: [PATCH] compiler-rt: support a new embedded linux target
 
+Upstream-Status: Pending
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
  .../make/platform/clang_linux_embedded.mk     | 286 ++++++++++++++++++

+ 1278 - 0
recipes-devtools/clang/clang/0002-neon2rvv-Model-vxrm-in-LLVM-intrinsics-and-add-optim.patch

@@ -0,0 +1,1278 @@
+From 29318f779da9c962af60d574b19159ecc10cfdd7 Mon Sep 17 00:00:00 2001
+From: Eric Tang <eric.tang@starfivetech.com>
+Date: Thu, 15 Jun 2023 09:30:16 +0800
+Subject: [PATCH 2/9] [neon2rvv] Model vxrm in LLVM intrinsics and add
+ optimization for removing redundant csrwi
+
+Signed-off-by: Eric Tang <eric.tang@starfivetech.com>
+---
+ clang/include/clang/Basic/riscv_vector.td     | 134 +++++-
+ llvm/include/llvm/IR/IntrinsicsRISCV.td       |  94 +++-
+ llvm/lib/Target/RISCV/CMakeLists.txt          |   1 +
+ .../Target/RISCV/MCTargetDesc/RISCVBaseInfo.h |   8 +
+ llvm/lib/Target/RISCV/RISCV.h                 |   3 +
+ .../Target/RISCV/RISCVInsertReadWriteCSR.cpp  | 115 +++++
+ llvm/lib/Target/RISCV/RISCVInstrFormats.td    |   3 +
+ llvm/lib/Target/RISCV/RISCVInstrInfo.td       |   2 +
+ .../Target/RISCV/RISCVInstrInfoVPseudos.td    | 428 +++++++++++++++++-
+ llvm/lib/Target/RISCV/RISCVMCInstLower.cpp    |   2 +
+ llvm/lib/Target/RISCV/RISCVSystemOperands.td  |   2 +-
+ llvm/lib/Target/RISCV/RISCVTargetMachine.cpp  |   2 +
+ 12 files changed, 747 insertions(+), 47 deletions(-)
+ create mode 100644 llvm/lib/Target/RISCV/RISCVInsertReadWriteCSR.cpp
+
+diff --git a/clang/include/clang/Basic/riscv_vector.td b/clang/include/clang/Basic/riscv_vector.td
+index b23e26ecaa57..9d443be0403c 100644
+--- a/clang/include/clang/Basic/riscv_vector.td
++++ b/clang/include/clang/Basic/riscv_vector.td
+@@ -316,11 +316,21 @@ multiclass RVVSignedBinBuiltinSet
+                           [["vv", "v", "vvv"],
+                            ["vx", "v", "vve"]]>;
+ 
++multiclass RVVSignedBinBuiltinSetRoundingMode
++    : RVVOutOp1BuiltinSet<NAME, "csil",
++                          [["vv", "v", "vvvu"],
++                           ["vx", "v", "vveu"]]>;
++
+ multiclass RVVUnsignedBinBuiltinSet
+     : RVVOutOp1BuiltinSet<NAME, "csil",
+                           [["vv", "Uv", "UvUvUv"],
+                            ["vx", "Uv", "UvUvUe"]]>;
+ 
++multiclass RVVUnsignedBinBuiltinSetRoundingMode
++    : RVVOutOp1BuiltinSet<NAME, "csil",
++                          [["vv", "Uv", "UvUvUvu"],
++                           ["vx", "Uv", "UvUvUeu"]]>;
++
+ multiclass RVVIntBinBuiltinSet
+     : RVVSignedBinBuiltinSet,
+       RVVUnsignedBinBuiltinSet;
+@@ -335,11 +345,21 @@ multiclass RVVSignedShiftBuiltinSet
+                           [["vv", "v", "vvUv"],
+                            ["vx", "v", "vvz"]]>;
+ 
++multiclass RVVSignedShiftBuiltinSetRoundingMode
++    : RVVOutOp1BuiltinSet<NAME, "csil",
++                          [["vv", "v", "vvUvu"],
++                           ["vx", "v", "vvzu"]]>;
++
+ multiclass RVVUnsignedShiftBuiltinSet
+     : RVVOutOp1BuiltinSet<NAME, "csil",
+                           [["vv", "Uv", "UvUvUv"],
+                            ["vx", "Uv", "UvUvz"]]>;
+ 
++multiclass RVVUnsignedShiftBuiltinSetRoundingMode
++    : RVVOutOp1BuiltinSet<NAME, "csil",
++                          [["vv", "Uv", "UvUvUvu"],
++                           ["vx", "Uv", "UvUvzu"]]>;
++
+ multiclass RVVShiftBuiltinSet
+     : RVVSignedShiftBuiltinSet,
+       RVVUnsignedShiftBuiltinSet;
+@@ -349,10 +369,18 @@ let Log2LMUL = [-3, -2, -1, 0, 1, 2] in {
+       : RVVOutOp0Op1BuiltinSet<NAME, "csil",
+                                      [["wv", "v", "vwUv"],
+                                       ["wx", "v", "vwz"]]>;
++  multiclass RVVSignedNShiftBuiltinSetRoundingMode
++      : RVVOutOp0Op1BuiltinSet<NAME, "csil",
++                                     [["wv", "v", "vwUvu"],
++                                      ["wx", "v", "vwzu"]]>;
+   multiclass RVVUnsignedNShiftBuiltinSet
+       : RVVOutOp0Op1BuiltinSet<NAME, "csil",
+                                      [["wv", "Uv", "UvUwUv"],
+                                       ["wx", "Uv", "UvUwz"]]>;
++  multiclass RVVUnsignedNShiftBuiltinSetRoundingMode
++      : RVVOutOp0Op1BuiltinSet<NAME, "csil",
++                                     [["wv", "Uv", "UvUwUvu"],
++                                      ["wx", "Uv", "UvUwzu"]]>;
+ }
+ 
+ multiclass RVVCarryinBuiltinSet
+@@ -1928,6 +1956,17 @@ let HasMasked = false,
+ }
+ 
+ // 13. Vector Fixed-Point Arithmetic Instructions
++let HeaderCode =
++[{
++enum __RISCV_VXRM {
++  __RISCV_VXRM_RNU = 0,
++  __RISCV_VXRM_RNE = 1,
++  __RISCV_VXRM_RDN = 2,
++  __RISCV_VXRM_ROD = 3,
++};
++}] in
++def vxrm_enum : RVVHeader;
++
+ // 13.1. Vector Single-Width Saturating Add and Subtract
+ let UnMaskedPolicyScheme = HasPassthruOperand in {
+ defm vsaddu : RVVUnsignedBinBuiltinSet;
+@@ -1936,23 +1975,94 @@ defm vssubu : RVVUnsignedBinBuiltinSet;
+ defm vssub : RVVSignedBinBuiltinSet;
+ 
+ // 13.2. Vector Single-Width Averaging Add and Subtract
+-defm vaaddu : RVVUnsignedBinBuiltinSet;
+-defm vaadd : RVVSignedBinBuiltinSet;
+-defm vasubu : RVVUnsignedBinBuiltinSet;
+-defm vasub : RVVSignedBinBuiltinSet;
++let ManualCodegen = [{
++  {
++    // LLVM intrinsic
++    // Unmasked: (passthru, op0, op1, round_mode, vl)
++    // Masked:   (passthru, vector_in, vector_in/scalar_in, mask, vxrm, vl, policy)
++
++    SmallVector<llvm::Value*, 7> Operands;
++    bool HasMaskedOff = !(
++        (IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) ||
++        (!IsMasked && PolicyAttrs & RVV_VTA));
++    unsigned Offset = IsMasked ?
++        (HasMaskedOff ? 2 : 1) : (HasMaskedOff ? 1 : 0);
++
++    if (!HasMaskedOff)
++      Operands.push_back(llvm::PoisonValue::get(ResultType));
++    else
++      Operands.push_back(Ops[Offset]);
++
++    Operands.push_back(Ops[Offset]); // op0
++    Operands.push_back(Ops[Offset + 1]); // op1
++
++    if (IsMasked)
++      Operands.push_back(Ops[0]); // mask
++
++    Operands.push_back(Ops[Offset + 2]); // vxrm
++    Operands.push_back(Ops[Offset + 3]); // vl
++
++    if (IsMasked)
++      Operands.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
++
++    IntrinsicTypes = {ResultType, Ops[Offset + 1]->getType(), Ops.back()->getType()};
++    llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
++    return Builder.CreateCall(F, Operands, "");
++  }
++}] in {
++  defm vaaddu : RVVUnsignedBinBuiltinSetRoundingMode;
++  defm vaadd : RVVSignedBinBuiltinSetRoundingMode;
++  defm vasubu : RVVUnsignedBinBuiltinSetRoundingMode;
++  defm vasub : RVVSignedBinBuiltinSetRoundingMode;
+ 
+ // 13.3. Vector Single-Width Fractional Multiply with Rounding and Saturation
+-let RequiredFeatures = ["FullMultiply"] in {
+-defm vsmul : RVVSignedBinBuiltinSet;
+-}
++  let RequiredFeatures = ["FullMultiply"] in {
++    defm vsmul : RVVSignedBinBuiltinSetRoundingMode;
++  }
+ 
+ // 13.4. Vector Single-Width Scaling Shift Instructions
+-defm vssrl : RVVUnsignedShiftBuiltinSet;
+-defm vssra : RVVSignedShiftBuiltinSet;
+-
++  defm vssrl : RVVUnsignedShiftBuiltinSetRoundingMode;
++  defm vssra : RVVSignedShiftBuiltinSetRoundingMode;
++}
++let ManualCodegen = [{
++  {
++    // LLVM intrinsic
++    // Unmasked: (passthru, op0, op1, round_mode, vl)
++    // Masked:   (passthru, vector_in, vector_in/scalar_in, mask, vxrm, vl, policy)
++
++    SmallVector<llvm::Value*, 7> Operands;
++    bool HasMaskedOff = !(
++        (IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) ||
++        (!IsMasked && PolicyAttrs & RVV_VTA));
++    unsigned Offset = IsMasked ?
++        (HasMaskedOff ? 2 : 1) : (HasMaskedOff ? 1 : 0);
++
++    if (!HasMaskedOff)
++      Operands.push_back(llvm::PoisonValue::get(ResultType));
++    else
++      Operands.push_back(Ops[Offset - 1]);
++
++    Operands.push_back(Ops[Offset]); // op0
++    Operands.push_back(Ops[Offset + 1]); // op1
++
++    if (IsMasked)
++      Operands.push_back(Ops[0]); // mask
++
++    Operands.push_back(Ops[Offset + 2]); // vxrm
++    Operands.push_back(Ops[Offset + 3]); // vl
++
++    if (IsMasked)
++      Operands.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
++
++    IntrinsicTypes = {ResultType, Ops[Offset]->getType(), Ops[Offset + 1]->getType(), Ops.back()->getType()};
++    llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
++    return Builder.CreateCall(F, Operands, "");
++  }
++}] in {
+ // 13.5. Vector Narrowing Fixed-Point Clip Instructions
+-defm vnclipu : RVVUnsignedNShiftBuiltinSet;
+-defm vnclip : RVVSignedNShiftBuiltinSet;
++  defm vnclipu : RVVUnsignedNShiftBuiltinSetRoundingMode;
++  defm vnclip : RVVSignedNShiftBuiltinSetRoundingMode;
++}
+ 
+ // 14. Vector Floating-Point Instructions
+ // 14.2. Vector Single-Width Floating-Point Add/Subtract Instructions
+diff --git a/llvm/include/llvm/IR/IntrinsicsRISCV.td b/llvm/include/llvm/IR/IntrinsicsRISCV.td
+index e9c88f468076..7103bb5f5e39 100644
+--- a/llvm/include/llvm/IR/IntrinsicsRISCV.td
++++ b/llvm/include/llvm/IR/IntrinsicsRISCV.td
+@@ -586,6 +586,17 @@ let TargetPrefix = "riscv" in {
+     let ScalarOperand = 2;
+     let VLOperand = 3;
+   }
++  // For Saturating binary operations with rounding-mode operand
++  // The destination vector type is the same as first source vector.
++  // Input: (passthru, vector_in, vector_in/scalar_in, vxrm, vl)
++  class RISCVSaturatingBinaryAAXUnMaskedRoundingMode
++        : Intrinsic<[llvm_anyvector_ty],
++                    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_any_ty,
++                     llvm_anyint_ty, LLVMMatchType<2>],
++                    [ImmArg<ArgIndex<3>>, IntrNoMem]>, RISCVVIntrinsic {
++    let ScalarOperand = 2;
++    let VLOperand = 4;
++  }
+   // For Saturating binary operations with mask.
+   // The destination vector type is the same as first source vector.
+   // Input: (maskedoff, vector_in, vector_in/scalar_in, mask, vl, policy)
+@@ -598,6 +609,18 @@ let TargetPrefix = "riscv" in {
+     let ScalarOperand = 2;
+     let VLOperand = 4;
+   }
++  // For Saturating binary operations with mask and rounding-mode operand
++  // The destination vector type is the same as first source vector.
++  // Input: (maskedoff, vector_in, vector_in/scalar_in, mask, vxrm, vl, policy)
++  class RISCVSaturatingBinaryAAXMaskedRoundingMode
++        : Intrinsic<[llvm_anyvector_ty],
++                    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_any_ty,
++                     LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, llvm_anyint_ty,
++                     LLVMMatchType<2>, LLVMMatchType<2>],
++                    [ImmArg<ArgIndex<4>>, ImmArg<ArgIndex<6>>, IntrNoMem]>, RISCVVIntrinsic {
++    let ScalarOperand = 2;
++    let VLOperand = 5;
++  }
+   // For Saturating binary operations.
+   // The destination vector type is the same as first source vector.
+   // The second source operand matches the destination type or is an XLen scalar.
+@@ -609,6 +632,15 @@ let TargetPrefix = "riscv" in {
+                     [IntrNoMem, IntrHasSideEffects]>, RISCVVIntrinsic {
+     let VLOperand = 3;
+   }
++
++  // Input: (passthru, vector_in, vector_in/scalar_in, vxrm, vl)
++  class RISCVSaturatingBinaryAAShiftUnMaskedRoundingMode
++        : Intrinsic<[llvm_anyvector_ty],
++                    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_any_ty,
++                     llvm_anyint_ty, LLVMMatchType<2>],
++                    [ImmArg<ArgIndex<3>>, IntrNoMem]>, RISCVVIntrinsic {
++    let VLOperand = 4;
++  }
+   // For Saturating binary operations with mask.
+   // The destination vector type is the same as first source vector.
+   // The second source operand matches the destination type or is an XLen scalar.
+@@ -621,6 +653,17 @@ let TargetPrefix = "riscv" in {
+                     [ImmArg<ArgIndex<5>>, IntrNoMem, IntrHasSideEffects]>, RISCVVIntrinsic {
+     let VLOperand = 4;
+   }
++
++  // Input: (maskedoff, vector_in, vector_in/scalar_in, mask, vxrm, vl, policy)
++  class RISCVSaturatingBinaryAAShiftMaskedRoundingMode
++        : Intrinsic<[llvm_anyvector_ty],
++                    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_any_ty,
++                     LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, llvm_anyint_ty,
++                     LLVMMatchType<2>, LLVMMatchType<2>],
++                    [ImmArg<ArgIndex<4>>, ImmArg<ArgIndex<6>>, IntrNoMem]>, RISCVVIntrinsic {
++    let VLOperand = 5;
++  }
++
+   // For Saturating binary operations.
+   // The destination vector type is NOT the same as first source vector.
+   // The second source operand matches the destination type or is an XLen scalar.
+@@ -632,6 +675,16 @@ let TargetPrefix = "riscv" in {
+                     [IntrNoMem, IntrHasSideEffects]>, RISCVVIntrinsic {
+     let VLOperand = 3;
+   }
++
++  // Input: (passthru, vector_in, vector_in/scalar_in, vxrm, vl)
++  class RISCVSaturatingBinaryABShiftUnMaskedRoundingMode
++        : Intrinsic<[llvm_anyvector_ty],
++                    [LLVMMatchType<0>, llvm_anyvector_ty, llvm_any_ty,
++                     llvm_anyint_ty, LLVMMatchType<3>],
++                    [ImmArg<ArgIndex<3>>, IntrNoMem]>, RISCVVIntrinsic {
++    let VLOperand = 4;
++  }
++
+   // For Saturating binary operations with mask.
+   // The destination vector type is NOT the same as first source vector (with mask).
+   // The second source operand matches the destination type or is an XLen scalar.
+@@ -644,6 +697,17 @@ let TargetPrefix = "riscv" in {
+                     [ImmArg<ArgIndex<5>>, IntrNoMem, IntrHasSideEffects]>, RISCVVIntrinsic {
+     let VLOperand = 4;
+   }
++
++  // Input: (maskedoff, vector_in, vector_in/scalar_in, mask, vxrm, vl, policy)
++  class RISCVSaturatingBinaryABShiftMaskedRoundingMode
++        : Intrinsic<[llvm_anyvector_ty],
++                    [LLVMMatchType<0>, llvm_anyvector_ty, llvm_any_ty,
++                     LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, llvm_anyint_ty,
++                     LLVMMatchType<3>, LLVMMatchType<3>],
++                    [ImmArg<ArgIndex<4>>, ImmArg<ArgIndex<6>>, IntrNoMem]>, RISCVVIntrinsic {
++    let VLOperand = 5;
++  }
++
+   // Input: (vector_in, vector_in, scalar_in, vl, policy)
+   class RVVSlideUnMasked
+         : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
+@@ -1074,14 +1138,26 @@ let TargetPrefix = "riscv" in {
+     def "int_riscv_" # NAME : RISCVSaturatingBinaryAAXUnMasked;
+     def "int_riscv_" # NAME # "_mask" : RISCVSaturatingBinaryAAXMasked;
+   }
++  multiclass RISCVSaturatingBinaryAAXRoundingMode {
++    def "int_riscv_" # NAME : RISCVSaturatingBinaryAAXUnMaskedRoundingMode;
++    def "int_riscv_" # NAME # "_mask" : RISCVSaturatingBinaryAAXMaskedRoundingMode;
++  }
+   multiclass RISCVSaturatingBinaryAAShift {
+     def "int_riscv_" # NAME : RISCVSaturatingBinaryAAShiftUnMasked;
+     def "int_riscv_" # NAME # "_mask" : RISCVSaturatingBinaryAAShiftMasked;
+   }
++  multiclass RISCVSaturatingBinaryAAShiftRoundingMode {
++    def "int_riscv_" # NAME : RISCVSaturatingBinaryAAShiftUnMaskedRoundingMode;
++    def "int_riscv_" # NAME # "_mask" : RISCVSaturatingBinaryAAShiftMaskedRoundingMode;
++  }
+   multiclass RISCVSaturatingBinaryABShift {
+     def "int_riscv_" # NAME : RISCVSaturatingBinaryABShiftUnMasked;
+     def "int_riscv_" # NAME # "_mask" : RISCVSaturatingBinaryABShiftMasked;
+   }
++  multiclass RISCVSaturatingBinaryABShiftRoundingMode {
++    def "int_riscv_" # NAME : RISCVSaturatingBinaryABShiftUnMaskedRoundingMode;
++    def "int_riscv_" # NAME # "_mask" : RISCVSaturatingBinaryABShiftMaskedRoundingMode;
++  }
+   multiclass RVVSlide {
+     def "int_riscv_" # NAME : RVVSlideUnMasked;
+     def "int_riscv_" # NAME # "_mask" : RVVSlideMasked;
+@@ -1350,18 +1426,18 @@ let TargetPrefix = "riscv" in {
+ 
+   def "int_riscv_vcompress" : RISCVCompress;
+ 
+-  defm vaaddu : RISCVSaturatingBinaryAAX;
+-  defm vaadd : RISCVSaturatingBinaryAAX;
+-  defm vasubu : RISCVSaturatingBinaryAAX;
+-  defm vasub : RISCVSaturatingBinaryAAX;
++  defm vaaddu : RISCVSaturatingBinaryAAXRoundingMode;
++  defm vaadd : RISCVSaturatingBinaryAAXRoundingMode;
++  defm vasubu : RISCVSaturatingBinaryAAXRoundingMode;
++  defm vasub : RISCVSaturatingBinaryAAXRoundingMode;
+ 
+-  defm vsmul : RISCVSaturatingBinaryAAX;
++  defm vsmul : RISCVSaturatingBinaryAAXRoundingMode;
+ 
+-  defm vssrl : RISCVSaturatingBinaryAAShift;
+-  defm vssra : RISCVSaturatingBinaryAAShift;
++  defm vssrl : RISCVSaturatingBinaryAAShiftRoundingMode;
++  defm vssra : RISCVSaturatingBinaryAAShiftRoundingMode;
+ 
+-  defm vnclipu : RISCVSaturatingBinaryABShift;
+-  defm vnclip : RISCVSaturatingBinaryABShift;
++  defm vnclipu : RISCVSaturatingBinaryABShiftRoundingMode;
++  defm vnclip : RISCVSaturatingBinaryABShiftRoundingMode;
+ 
+   defm vmfeq : RISCVCompare;
+   defm vmfne : RISCVCompare;
+diff --git a/llvm/lib/Target/RISCV/CMakeLists.txt b/llvm/lib/Target/RISCV/CMakeLists.txt
+index f909e0017e2b..db84f0504f21 100644
+--- a/llvm/lib/Target/RISCV/CMakeLists.txt
++++ b/llvm/lib/Target/RISCV/CMakeLists.txt
+@@ -27,6 +27,7 @@ add_llvm_target(RISCVCodeGen
+   RISCVFrameLowering.cpp
+   RISCVGatherScatterLowering.cpp
+   RISCVInsertVSETVLI.cpp
++  RISCVInsertReadWriteCSR.cpp
+   RISCVInstrInfo.cpp
+   RISCVISelDAGToDAG.cpp
+   RISCVISelLowering.cpp
+diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h
+index 2cf2045c1719..eb43f4bf0a02 100644
+--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h
++++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h
+@@ -102,6 +102,9 @@ enum {
+   // in bits 63:31. Used by the SExtWRemoval pass.
+   IsSignExtendingOpWShift = UsesMaskPolicyShift + 1,
+   IsSignExtendingOpWMask = 1ULL << IsSignExtendingOpWShift,
++
++  HasRoundModeOpShift = IsSignExtendingOpWShift + 1,
++  HasRoundModeOpMask = 1 << HasRoundModeOpShift,
+ };
+ 
+ // Match with the definitions in RISCVInstrFormats.td
+@@ -176,6 +179,11 @@ static inline bool usesMaskPolicy(uint64_t TSFlags) {
+   return TSFlags & UsesMaskPolicyMask;
+ }
+ 
++/// \returns true if there is a rounding mode operand for this instruction
++static inline bool hasRoundModeOp(uint64_t TSFlags) {
++  return TSFlags & HasRoundModeOpMask;
++}
++
+ static inline unsigned getMergeOpNum(const MCInstrDesc &Desc) {
+   assert(hasMergeOp(Desc.TSFlags));
+   assert(!Desc.isVariadic());
+diff --git a/llvm/lib/Target/RISCV/RISCV.h b/llvm/lib/Target/RISCV/RISCV.h
+index c42fb070aade..f629bd2faea9 100644
+--- a/llvm/lib/Target/RISCV/RISCV.h
++++ b/llvm/lib/Target/RISCV/RISCV.h
+@@ -68,6 +68,9 @@ void initializeRISCVExpandAtomicPseudoPass(PassRegistry &);
+ FunctionPass *createRISCVInsertVSETVLIPass();
+ void initializeRISCVInsertVSETVLIPass(PassRegistry &);
+ 
++FunctionPass *createRISCVInsertReadWriteCSRPass();
++void initializeRISCVInsertReadWriteCSRPass(PassRegistry &);
++
+ FunctionPass *createRISCVRedundantCopyEliminationPass();
+ void initializeRISCVRedundantCopyEliminationPass(PassRegistry &);
+ 
+diff --git a/llvm/lib/Target/RISCV/RISCVInsertReadWriteCSR.cpp b/llvm/lib/Target/RISCV/RISCVInsertReadWriteCSR.cpp
+new file mode 100644
+index 000000000000..9cc06adf658c
+--- /dev/null
++++ b/llvm/lib/Target/RISCV/RISCVInsertReadWriteCSR.cpp
+@@ -0,0 +1,115 @@
++//===-- RISCVInsertReadWriteCSR.cpp - Insert Read/Write of RISC-V CSR -----===//
++//
++// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
++// See https://llvm.org/LICENSE.txt for license information.
++// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
++//
++//===----------------------------------------------------------------------===//
++// This file implements the machine function pass to insert read/write of CSR-s
++// of the RISC-V instructions.
++//
++// Currently the pass implements naive insertion of a write to vxrm before an
++// RVV fixed-point instruction.
++//
++//===----------------------------------------------------------------------===//
++
++#include "RISCV.h"
++#include "RISCVSubtarget.h"
++#include "llvm/CodeGen/MachineFunctionPass.h"
++using namespace llvm;
++
++#define DEBUG_TYPE "riscv-insert-read-write-csr"
++#define RISCV_INSERT_READ_WRITE_CSR_NAME "RISC-V Insert Read/Write CSR Pass"
++
++namespace {
++
++class RISCVInsertReadWriteCSR : public MachineFunctionPass {
++  const TargetInstrInfo *TII;
++
++public:
++  static char ID;
++
++  RISCVInsertReadWriteCSR() : MachineFunctionPass(ID) {
++    initializeRISCVInsertReadWriteCSRPass(*PassRegistry::getPassRegistry());
++  }
++
++  bool runOnMachineFunction(MachineFunction &MF) override;
++
++  void getAnalysisUsage(AnalysisUsage &AU) const override {
++    AU.setPreservesCFG();
++    MachineFunctionPass::getAnalysisUsage(AU);
++  }
++
++  StringRef getPassName() const override {
++    return RISCV_INSERT_READ_WRITE_CSR_NAME;
++  }
++
++private:
++  bool emitWriteVXRM(MachineBasicBlock &MBB);
++  std::optional<unsigned> getRoundModeIdx(const MachineInstr &MI);
++};
++
++} // end anonymous namespace
++
++char RISCVInsertReadWriteCSR::ID = 0;
++
++static unsigned PreVXRMValue = 4;
++
++INITIALIZE_PASS(RISCVInsertReadWriteCSR, DEBUG_TYPE,
++                RISCV_INSERT_READ_WRITE_CSR_NAME, false, false)
++
++// This function returns the index to the rounding mode immediate value if any,
++// otherwise the function will return None.
++std::optional<unsigned>
++RISCVInsertReadWriteCSR::getRoundModeIdx(const MachineInstr &MI) {
++  uint64_t TSFlags = MI.getDesc().TSFlags;
++  if (!RISCVII::hasRoundModeOp(TSFlags))
++    return std::nullopt;
++
++  // The operand order
++  // -------------------------------------
++  // | n-1 (if any)   | n-2  | n-3 | n-4 |
++  // | policy         | sew  | vl  | rm  |
++  // -------------------------------------
++  return MI.getNumExplicitOperands() - RISCVII::hasVecPolicyOp(TSFlags) - 3;
++}
++
++// This function inserts a write to vxrm when encountering an RVV fixed-point
++// instruction.
++bool RISCVInsertReadWriteCSR::emitWriteVXRM(MachineBasicBlock &MBB) {
++  bool Changed = false;
++  for (MachineInstr &MI : MBB) {
++    if (auto RoundModeIdx = getRoundModeIdx(MI)) {
++      unsigned VXRMImm = MI.getOperand(*RoundModeIdx).getImm();
++      if (VXRMImm == PreVXRMValue)
++          continue;
++      PreVXRMValue = VXRMImm;
++      Changed = true;
++      BuildMI(MBB, MI, MI.getDebugLoc(), TII->get(RISCV::WriteVXRMImm))
++          .addImm(VXRMImm);
++      MI.addOperand(MachineOperand::CreateReg(RISCV::VXRM, /*IsDef*/ false,
++                                              /*IsImp*/ true));
++    }
++  }
++  return Changed;
++}
++
++bool RISCVInsertReadWriteCSR::runOnMachineFunction(MachineFunction &MF) {
++  // Skip if the vector extension is not enabled.
++  const RISCVSubtarget &ST = MF.getSubtarget<RISCVSubtarget>();
++  if (!ST.hasVInstructions())
++    return false;
++
++  TII = ST.getInstrInfo();
++
++  bool Changed = false;
++
++  for (MachineBasicBlock &MBB : MF)
++    Changed |= emitWriteVXRM(MBB);
++
++  return Changed;
++}
++
++FunctionPass *llvm::createRISCVInsertReadWriteCSRPass() {
++  return new RISCVInsertReadWriteCSR();
++}
+diff --git a/llvm/lib/Target/RISCV/RISCVInstrFormats.td b/llvm/lib/Target/RISCV/RISCVInstrFormats.td
+index 3a494a5e3b58..f2cd4ed8857f 100644
+--- a/llvm/lib/Target/RISCV/RISCVInstrFormats.td
++++ b/llvm/lib/Target/RISCV/RISCVInstrFormats.td
+@@ -211,6 +211,9 @@ class RVInst<dag outs, dag ins, string opcodestr, string argstr,
+   // in bits 63:31. Used by the SExtWRemoval pass.
+   bit IsSignExtendingOpW = 0;
+   let TSFlags{19} = IsSignExtendingOpW;
++
++  bit HasRoundModeOp = 0;
++  let TSFlags{20} =  HasRoundModeOp;
+ }
+ 
+ // Pseudo instructions
+diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
+index c699a94943d8..75fee3f962d0 100644
+--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td
++++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
+@@ -1693,6 +1693,8 @@ def WriteFRM : WriteSysReg<SysRegFRM, [FRM]>;
+ def WriteFRMImm : WriteSysRegImm<SysRegFRM, [FRM]>;
+ def SwapFRMImm : SwapSysRegImm<SysRegFRM, [FRM]>;
+ 
++def WriteVXRMImm : WriteSysRegImm<SysRegVXRM, [VXRM]>;
++
+ let hasSideEffects = true in {
+ def ReadFFLAGS : ReadSysReg<SysRegFFLAGS, [FFLAGS]>;
+ def WriteFFLAGS : WriteSysReg<SysRegFFLAGS, [FFLAGS]>;
+diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td
+index 3f69b5e41cf1..ec7af31a23e2 100644
+--- a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td
++++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td
+@@ -1139,6 +1139,65 @@ class VPseudoBinaryNoMaskTU<VReg RetClass,
+   let HasMergeOp = 1;
+ }
+ 
++class VPseudoBinaryNoMaskRoundingMode<VReg RetClass,
++                                      VReg Op1Class,
++                                      DAGOperand Op2Class,
++                                      string Constraint,
++                                      int DummyMask = 1> :
++        Pseudo<(outs RetClass:$rd),
++               (ins Op1Class:$rs2, Op2Class:$rs1, ixlenimm:$rm, AVL:$vl, ixlenimm:$sew), []>,
++        RISCVVPseudo {
++  let mayLoad = 0;
++  let mayStore = 0;
++  let hasSideEffects = 0;
++  let Constraints = Constraint;
++  let HasVLOp = 1;
++  let HasSEWOp = 1;
++  let HasDummyMask = DummyMask;
++  let HasRoundModeOp = 1;
++}
++
++class VPseudoBinaryNoMaskTURoundingMode<VReg RetClass,
++                                        VReg Op1Class,
++                                        DAGOperand Op2Class,
++                                        string Constraint> :
++        Pseudo<(outs RetClass:$rd),
++               (ins RetClass:$merge, Op1Class:$rs2, Op2Class:$rs1, ixlenimm:$rm,
++                    AVL:$vl, ixlenimm:$sew), []>,
++        RISCVVPseudo {
++  let mayLoad = 0;
++  let mayStore = 0;
++  let hasSideEffects = 0;
++  let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret;
++  let HasVLOp = 1;
++  let HasSEWOp = 1;
++  let HasDummyMask = 1;
++  let HasMergeOp = 1;
++  let HasRoundModeOp = 1;
++}
++
++class VPseudoBinaryMaskPolicyRoundingMode<VReg RetClass,
++                                          RegisterClass Op1Class,
++                                          DAGOperand Op2Class,
++                                          string Constraint> :
++        Pseudo<(outs GetVRegNoV0<RetClass>.R:$rd),
++                (ins GetVRegNoV0<RetClass>.R:$merge,
++                     Op1Class:$rs2, Op2Class:$rs1,
++                     VMaskOp:$vm, ixlenimm:$rm, AVL:$vl,
++                     ixlenimm:$sew, ixlenimm:$policy), []>,
++        RISCVVPseudo {
++  let mayLoad = 0;
++  let mayStore = 0;
++  let hasSideEffects = 0;
++  let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret;
++  let HasVLOp = 1;
++  let HasSEWOp = 1;
++  let HasMergeOp = 1;
++  let HasVecPolicyOp = 1;
++  let UsesMaskPolicy = 1;
++  let HasRoundModeOp = 1;
++}
++
+ // Special version of VPseudoBinaryNoMask where we pretend the first source is
+ // tied to the destination.
+ // This allows maskedoff and rs2 to be the same register.
+@@ -1923,6 +1982,24 @@ multiclass VPseudoBinary<VReg RetClass,
+   }
+ }
+ 
++multiclass VPseudoBinaryRoundingMode<VReg RetClass,
++                                     VReg Op1Class,
++                                     DAGOperand Op2Class,
++                                     LMULInfo MInfo,
++                                     string Constraint = ""> {
++  let VLMul = MInfo.value in {
++    def "_" # MInfo.MX :
++      VPseudoBinaryNoMaskRoundingMode<RetClass, Op1Class, Op2Class, Constraint>;
++    def "_" # MInfo.MX # "_TU" :
++      VPseudoBinaryNoMaskTURoundingMode<RetClass, Op1Class, Op2Class,
++                                        Constraint>;
++    def "_" # MInfo.MX # "_MASK" :
++      VPseudoBinaryMaskPolicyRoundingMode<RetClass, Op1Class, Op2Class,
++                                          Constraint>,
++                                          RISCVMaskedPseudo</*MaskOpIdx*/ 3>;
++  }
++}
++
+ multiclass VPseudoBinaryM<VReg RetClass,
+                           VReg Op1Class,
+                           DAGOperand Op2Class,
+@@ -1971,6 +2048,10 @@ multiclass VPseudoBinaryV_VV<LMULInfo m, string Constraint = ""> {
+   defm _VV : VPseudoBinary<m.vrclass, m.vrclass, m.vrclass, m, Constraint>;
+ }
+ 
++multiclass VPseudoBinaryV_VV_RM<LMULInfo m, string Constraint = ""> {
++  defm _VV : VPseudoBinaryRoundingMode<m.vrclass, m.vrclass, m.vrclass, m, Constraint>;
++}
++
+ // Similar to VPseudoBinaryV_VV, but uses MxListF.
+ multiclass VPseudoBinaryFV_VV<LMULInfo m, string Constraint = ""> {
+   defm _VV : VPseudoBinary<m.vrclass, m.vrclass, m.vrclass, m, Constraint>;
+@@ -2000,6 +2081,10 @@ multiclass VPseudoBinaryV_VX<LMULInfo m, string Constraint = ""> {
+   defm "_VX" : VPseudoBinary<m.vrclass, m.vrclass, GPR, m, Constraint>;
+ }
+ 
++multiclass VPseudoBinaryV_VX_RM<LMULInfo m, string Constraint = ""> {
++  defm "_VX" : VPseudoBinaryRoundingMode<m.vrclass, m.vrclass, GPR, m, Constraint>;
++}
++
+ multiclass VPseudoVSLD1_VX<string Constraint = ""> {
+   foreach m = MxList in {
+     defvar mx = m.MX;
+@@ -2036,6 +2121,10 @@ multiclass VPseudoBinaryV_VI<Operand ImmType = simm5, LMULInfo m, string Constra
+   defm _VI : VPseudoBinary<m.vrclass, m.vrclass, ImmType, m, Constraint>;
+ }
+ 
++multiclass VPseudoBinaryV_VI_RM<Operand ImmType = simm5, LMULInfo m, string Constraint = ""> {
++  defm _VI : VPseudoBinaryRoundingMode<m.vrclass, m.vrclass, ImmType, m, Constraint>;
++}
++
+ multiclass VPseudoVALU_MM {
+   foreach m = MxList in {
+     defvar mx = m.MX;
+@@ -2098,16 +2187,31 @@ multiclass VPseudoBinaryV_WV<LMULInfo m> {
+                            !if(!ge(m.octuple, 8), "@earlyclobber $rd", "")>;
+ }
+ 
++multiclass VPseudoBinaryV_WV_RM<LMULInfo m> {
++  defm _WV : VPseudoBinaryRoundingMode<m.vrclass, m.wvrclass, m.vrclass, m,
++                                       !if(!ge(m.octuple, 8), "@earlyclobber $rd", "")>;
++}
++
+ multiclass VPseudoBinaryV_WX<LMULInfo m> {
+   defm _WX : VPseudoBinary<m.vrclass, m.wvrclass, GPR, m,
+                            !if(!ge(m.octuple, 8), "@earlyclobber $rd", "")>;
+ }
+ 
++multiclass VPseudoBinaryV_WX_RM<LMULInfo m> {
++  defm _WX : VPseudoBinaryRoundingMode<m.vrclass, m.wvrclass, GPR, m,
++                                       !if(!ge(m.octuple, 8), "@earlyclobber $rd", "")>;
++}
++
+ multiclass VPseudoBinaryV_WI<LMULInfo m> {
+   defm _WI : VPseudoBinary<m.vrclass, m.wvrclass, uimm5, m,
+                            !if(!ge(m.octuple, 8), "@earlyclobber $rd", "")>;
+ }
+ 
++multiclass VPseudoBinaryV_WI_RM<LMULInfo m> {
++  defm _WI : VPseudoBinaryRoundingMode<m.vrclass, m.wvrclass, uimm5, m,
++                                       !if(!ge(m.octuple, 8), "@earlyclobber $rd", "")>;
++}
++
+ // For vadc and vsbc, the instruction encoding is reserved if the destination
+ // vector register is v0.
+ // For vadc and vsbc, CarryIn == 1 and CarryOut == 0
+@@ -2419,6 +2523,23 @@ multiclass VPseudoVSALU_VV_VX_VI<Operand ImmType = simm5, string Constraint = ""
+   }
+ }
+ 
++multiclass VPseudoVSALU_VV_VX_VI_RM<Operand ImmType = simm5, string Constraint = ""> {
++  foreach m = MxList in {
++    defvar mx = m.MX;
++    defvar WriteVSALUV_MX = !cast<SchedWrite>("WriteVSALUV_" # mx);
++    defvar WriteVSALUX_MX = !cast<SchedWrite>("WriteVSALUX_" # mx);
++    defvar WriteVSALUI_MX = !cast<SchedWrite>("WriteVSALUI_" # mx);
++    defvar ReadVSALUV_MX = !cast<SchedRead>("ReadVSALUV_" # mx);
++    defvar ReadVSALUX_MX = !cast<SchedRead>("ReadVSALUX_" # mx);
++
++    defm "" : VPseudoBinaryV_VV_RM<m, Constraint>,
++              Sched<[WriteVSALUV_MX, ReadVSALUV_MX, ReadVSALUV_MX, ReadVMask]>;
++    defm "" : VPseudoBinaryV_VX_RM<m, Constraint>,
++              Sched<[WriteVSALUX_MX, ReadVSALUV_MX, ReadVSALUX_MX, ReadVMask]>;
++    defm "" : VPseudoBinaryV_VI_RM<ImmType, m, Constraint>,
++              Sched<[WriteVSALUI_MX, ReadVSALUV_MX, ReadVMask]>;
++  }
++}
+ 
+ multiclass VPseudoVSHT_VV_VX_VI<Operand ImmType = simm5, string Constraint = ""> {
+   foreach m = MxList in {
+@@ -2456,6 +2577,24 @@ multiclass VPseudoVSSHT_VV_VX_VI<Operand ImmType = simm5, string Constraint = ""
+   }
+ }
+ 
++multiclass VPseudoVSSHT_VV_VX_VI_RM<Operand ImmType = simm5, string Constraint = ""> {
++  foreach m = MxList in {
++    defvar mx = m.MX;
++    defvar WriteVSShiftV_MX = !cast<SchedWrite>("WriteVSShiftV_" # mx);
++    defvar WriteVSShiftX_MX = !cast<SchedWrite>("WriteVSShiftX_" # mx);
++    defvar WriteVSShiftI_MX = !cast<SchedWrite>("WriteVSShiftI_" # mx);
++    defvar ReadVSShiftV_MX = !cast<SchedRead>("ReadVSShiftV_" # mx);
++    defvar ReadVSShiftX_MX = !cast<SchedRead>("ReadVSShiftX_" # mx);
++
++    defm "" : VPseudoBinaryV_VV_RM<m, Constraint>,
++              Sched<[WriteVSShiftV_MX, ReadVSShiftV_MX, ReadVSShiftV_MX, ReadVMask]>;
++    defm "" : VPseudoBinaryV_VX_RM<m, Constraint>,
++              Sched<[WriteVSShiftX_MX, ReadVSShiftV_MX, ReadVSShiftX_MX, ReadVMask]>;
++    defm "" : VPseudoBinaryV_VI_RM<ImmType, m, Constraint>,
++              Sched<[WriteVSShiftI_MX, ReadVSShiftV_MX, ReadVMask]>;
++  }
++}
++
+ multiclass VPseudoVALU_VV_VX_VI<Operand ImmType = simm5, string Constraint = ""> {
+   foreach m = MxList in {
+     defvar mx = m.MX;
+@@ -2489,6 +2628,21 @@ multiclass VPseudoVSALU_VV_VX {
+   }
+ }
+ 
++multiclass VPseudoVSALU_VV_VX_RM {
++  foreach m = MxList in {
++    defvar mx = m.MX;
++    defvar WriteVSALUV_MX = !cast<SchedWrite>("WriteVSALUV_" # mx);
++    defvar WriteVSALUX_MX = !cast<SchedWrite>("WriteVSALUX_" # mx);
++    defvar ReadVSALUV_MX = !cast<SchedRead>("ReadVSALUV_" # mx);
++    defvar ReadVSALUX_MX = !cast<SchedRead>("ReadVSALUX_" # mx);
++
++    defm "" : VPseudoBinaryV_VV_RM<m>,
++              Sched<[WriteVSALUV_MX, ReadVSALUV_MX, ReadVSALUV_MX, ReadVMask]>;
++    defm "" : VPseudoBinaryV_VX_RM<m>,
++              Sched<[WriteVSALUX_MX, ReadVSALUV_MX, ReadVSALUX_MX, ReadVMask]>;
++  }
++}
++
+ multiclass VPseudoVSMUL_VV_VX {
+   foreach m = MxList in {
+     defvar mx = m.MX;
+@@ -2504,6 +2658,21 @@ multiclass VPseudoVSMUL_VV_VX {
+   }
+ }
+ 
++multiclass VPseudoVSMUL_VV_VX_RM {
++  foreach m = MxList in {
++    defvar mx = m.MX;
++    defvar WriteVSMulV_MX = !cast<SchedWrite>("WriteVSMulV_" # mx);
++    defvar WriteVSMulX_MX = !cast<SchedWrite>("WriteVSMulX_" # mx);
++    defvar ReadVSMulV_MX = !cast<SchedRead>("ReadVSMulV_" # mx);
++    defvar ReadVSMulX_MX = !cast<SchedRead>("ReadVSMulX_" # mx);
++
++    defm "" : VPseudoBinaryV_VV_RM<m>,
++              Sched<[WriteVSMulV_MX, ReadVSMulV_MX, ReadVSMulV_MX, ReadVMask]>;
++    defm "" : VPseudoBinaryV_VX_RM<m>,
++              Sched<[WriteVSMulX_MX, ReadVSMulV_MX, ReadVSMulX_MX, ReadVMask]>;
++  }
++}
++
+ multiclass VPseudoVAALU_VV_VX {
+   foreach m = MxList in {
+     defvar mx = m.MX;
+@@ -2519,6 +2688,21 @@ multiclass VPseudoVAALU_VV_VX {
+   }
+ }
+ 
++multiclass VPseudoVAALU_VV_VX_RM {
++  foreach m = MxList in {
++    defvar mx = m.MX;
++    defvar WriteVAALUV_MX = !cast<SchedWrite>("WriteVAALUV_" # mx);
++    defvar WriteVAALUX_MX = !cast<SchedWrite>("WriteVAALUX_" # mx);
++    defvar ReadVAALUV_MX = !cast<SchedRead>("ReadVAALUV_" # mx);
++    defvar ReadVAALUX_MX = !cast<SchedRead>("ReadVAALUX_" # mx);
++
++    defm "" : VPseudoBinaryV_VV_RM<m>,
++              Sched<[WriteVAALUV_MX, ReadVAALUV_MX, ReadVAALUV_MX, ReadVMask]>;
++    defm "" : VPseudoBinaryV_VX_RM<m>,
++              Sched<[WriteVAALUX_MX, ReadVAALUV_MX, ReadVAALUX_MX, ReadVMask]>;
++  }
++}
++
+ multiclass VPseudoVMINMAX_VV_VX {
+   foreach m = MxList in {
+     defvar mx = m.MX;
+@@ -3002,6 +3186,24 @@ multiclass VPseudoVNCLP_WV_WX_WI {
+   }
+ }
+ 
++multiclass VPseudoVNCLP_WV_WX_WI_RM {
++  foreach m = MxListW in {
++    defvar mx = m.MX;
++    defvar WriteVNClipV_MX = !cast<SchedWrite>("WriteVNClipV_" # mx);
++    defvar WriteVNClipX_MX = !cast<SchedWrite>("WriteVNClipX_" # mx);
++    defvar WriteVNClipI_MX = !cast<SchedWrite>("WriteVNClipI_" # mx);
++    defvar ReadVNClipV_MX = !cast<SchedRead>("ReadVNClipV_" # mx);
++    defvar ReadVNClipX_MX = !cast<SchedRead>("ReadVNClipX_" # mx);
++
++    defm "" : VPseudoBinaryV_WV_RM<m>,
++              Sched<[WriteVNClipV_MX, ReadVNClipV_MX, ReadVNClipV_MX, ReadVMask]>;
++    defm "" : VPseudoBinaryV_WX_RM<m>,
++              Sched<[WriteVNClipX_MX, ReadVNClipV_MX, ReadVNClipX_MX, ReadVMask]>;
++    defm "" : VPseudoBinaryV_WI_RM<m>,
++              Sched<[WriteVNClipI_MX, ReadVNClipV_MX, ReadVMask]>;
++  }
++}
++
+ multiclass VPseudoVNSHT_WV_WX_WI {
+   foreach m = MxListW in {
+     defvar mx = m.MX;
+@@ -3881,6 +4083,48 @@ class VPatBinaryNoMaskTU<string intrinsic_name,
+                    (op2_type op2_kind:$rs2),
+                    GPR:$vl, sew)>;
+ 
++class VPatBinaryNoMaskTARoundingMode<string intrinsic_name,
++                                     string inst,
++                                     ValueType result_type,
++                                     ValueType op1_type,
++                                     ValueType op2_type,
++                                     int sew,
++                                     VReg op1_reg_class,
++                                     DAGOperand op2_kind> :
++  Pat<(result_type (!cast<Intrinsic>(intrinsic_name)
++                   (result_type (undef)),
++                   (op1_type op1_reg_class:$rs1),
++                   (op2_type op2_kind:$rs2),
++                   (XLenVT timm:$round),
++                   VLOpFrag)),
++                   (!cast<Instruction>(inst)
++                   (op1_type op1_reg_class:$rs1),
++                   (op2_type op2_kind:$rs2),
++                   (XLenVT timm:$round),
++                   GPR:$vl, sew)>;
++
++class VPatBinaryNoMaskTURoundingMode<string intrinsic_name,
++                                     string inst,
++                                     ValueType result_type,
++                                     ValueType op1_type,
++                                     ValueType op2_type,
++                                     int sew,
++                                     VReg result_reg_class,
++                                     VReg op1_reg_class,
++                                     DAGOperand op2_kind> :
++  Pat<(result_type (!cast<Intrinsic>(intrinsic_name)
++                   (result_type result_reg_class:$merge),
++                   (op1_type op1_reg_class:$rs1),
++                   (op2_type op2_kind:$rs2),
++                   (XLenVT timm:$round),
++                   VLOpFrag)),
++                   (!cast<Instruction>(inst#"_TU")
++                   (result_type result_reg_class:$merge),
++                   (op1_type op1_reg_class:$rs1),
++                   (op2_type op2_kind:$rs2),
++                   (XLenVT timm:$round),
++                   GPR:$vl, sew)>;
++
+ // Same as above but source operands are swapped.
+ class VPatBinaryNoMaskSwapped<string intrinsic_name,
+                               string inst,
+@@ -3943,6 +4187,31 @@ class VPatBinaryMaskTA<string intrinsic_name,
+                    (op2_type op2_kind:$rs2),
+                    (mask_type V0), GPR:$vl, sew, (XLenVT timm:$policy))>;
+ 
++class VPatBinaryMaskTARoundingMode<string intrinsic_name,
++                                   string inst,
++                                   ValueType result_type,
++                                   ValueType op1_type,
++                                   ValueType op2_type,
++                                   ValueType mask_type,
++                                   int sew,
++                                   VReg result_reg_class,
++                                   VReg op1_reg_class,
++                                   DAGOperand op2_kind> :
++  Pat<(result_type (!cast<Intrinsic>(intrinsic_name#"_mask")
++                   (result_type result_reg_class:$merge),
++                   (op1_type op1_reg_class:$rs1),
++                   (op2_type op2_kind:$rs2),
++                   (mask_type V0),
++                   (XLenVT timm:$round),
++                   VLOpFrag, (XLenVT timm:$policy))),
++                   (!cast<Instruction>(inst#"_MASK")
++                   (result_type result_reg_class:$merge),
++                   (op1_type op1_reg_class:$rs1),
++                   (op2_type op2_kind:$rs2),
++                   (mask_type V0),
++                   (XLenVT timm:$round),
++                   GPR:$vl, sew, (XLenVT timm:$policy))>;
++
+ // Same as above but source operands are swapped.
+ class VPatBinaryMaskSwapped<string intrinsic_name,
+                             string inst,
+@@ -4261,6 +4530,26 @@ multiclass VPatBinaryTA<string intrinsic,
+                          op2_kind>;
+ }
+ 
++multiclass VPatBinaryTARoundingMode<string intrinsic,
++                                    string inst,
++                                    ValueType result_type,
++                                    ValueType op1_type,
++                                    ValueType op2_type,
++                                    ValueType mask_type,
++                                    int sew,
++                                    VReg result_reg_class,
++                                    VReg op1_reg_class,
++                                    DAGOperand op2_kind>
++{
++  def : VPatBinaryNoMaskTARoundingMode<intrinsic, inst, result_type, op1_type, op2_type,
++                                       sew, op1_reg_class, op2_kind>;
++  def : VPatBinaryNoMaskTURoundingMode<intrinsic, inst, result_type, op1_type, op2_type,
++                                       sew, result_reg_class, op1_reg_class, op2_kind>;
++  def : VPatBinaryMaskTARoundingMode<intrinsic, inst, result_type, op1_type, op2_type,
++                                     mask_type, sew, result_reg_class, op1_reg_class,
++                                     op2_kind>;
++}
++
+ multiclass VPatBinarySwapped<string intrinsic,
+                       string inst,
+                       ValueType result_type,
+@@ -4387,6 +4676,15 @@ multiclass VPatBinaryV_VV<string intrinsic, string instruction,
+                         vti.RegClass, vti.RegClass>;
+ }
+ 
++multiclass VPatBinaryV_VVRoundingMode<string intrinsic, string instruction,
++                                      list<VTypeInfo> vtilist> {
++  foreach vti = vtilist in
++    defm : VPatBinaryTARoundingMode<intrinsic, instruction # "_VV_" # vti.LMul.MX,
++                                    vti.Vector, vti.Vector, vti.Vector,vti.Mask,
++                                    vti.Log2SEW, vti.RegClass,
++                                    vti.RegClass, vti.RegClass>;
++}
++
+ multiclass VPatBinaryV_VV_INT<string intrinsic, string instruction,
+                           list<VTypeInfo> vtilist> {
+   foreach vti = vtilist in {
+@@ -4428,6 +4726,17 @@ multiclass VPatBinaryV_VX<string intrinsic, string instruction,
+   }
+ }
+ 
++multiclass VPatBinaryV_VXRoundingMode<string intrinsic, string instruction,
++                                      list<VTypeInfo> vtilist> {
++  foreach vti = vtilist in {
++    defvar kind = "V"#vti.ScalarSuffix;
++    defm : VPatBinaryTARoundingMode<intrinsic, instruction#"_"#kind#"_"#vti.LMul.MX,
++                                    vti.Vector, vti.Vector, vti.Scalar, vti.Mask,
++                                    vti.Log2SEW, vti.RegClass,
++                                    vti.RegClass, vti.ScalarRegClass>;
++  }
++}
++
+ multiclass VPatBinaryV_VX_INT<string intrinsic, string instruction,
+                           list<VTypeInfo> vtilist> {
+   foreach vti = vtilist in
+@@ -4446,6 +4755,15 @@ multiclass VPatBinaryV_VI<string intrinsic, string instruction,
+                         vti.RegClass, imm_type>;
+ }
+ 
++multiclass VPatBinaryV_VIRoundingMode<string intrinsic, string instruction,
++                                      list<VTypeInfo> vtilist, Operand imm_type> {
++  foreach vti = vtilist in
++    defm : VPatBinaryTARoundingMode<intrinsic, instruction # "_VI_" # vti.LMul.MX,
++                                    vti.Vector, vti.Vector, XLenVT, vti.Mask,
++                                    vti.Log2SEW, vti.RegClass,
++                                    vti.RegClass, imm_type>;
++}
++
+ multiclass VPatBinaryM_MM<string intrinsic, string instruction> {
+   foreach mti = AllMasks in
+     def : VPatBinaryM<intrinsic, instruction # "_MM_" # mti.LMul.MX,
+@@ -4529,6 +4847,18 @@ multiclass VPatBinaryV_WV<string intrinsic, string instruction,
+   }
+ }
+ 
++multiclass VPatBinaryV_WVRoundingMode<string intrinsic, string instruction,
++                                      list<VTypeInfoToWide> vtilist> {
++  foreach VtiToWti = vtilist in {
++    defvar Vti = VtiToWti.Vti;
++    defvar Wti = VtiToWti.Wti;
++    defm : VPatBinaryTARoundingMode<intrinsic, instruction # "_WV_" # Vti.LMul.MX,
++                                    Vti.Vector, Wti.Vector, Vti.Vector, Vti.Mask,
++                                    Vti.Log2SEW, Vti.RegClass,
++                                    Wti.RegClass, Vti.RegClass>;
++  }
++}
++
+ multiclass VPatBinaryV_WX<string intrinsic, string instruction,
+                           list<VTypeInfoToWide> vtilist> {
+   foreach VtiToWti = vtilist in {
+@@ -4542,6 +4872,19 @@ multiclass VPatBinaryV_WX<string intrinsic, string instruction,
+   }
+ }
+ 
++multiclass VPatBinaryV_WXRoundingMode<string intrinsic, string instruction,
++                          list<VTypeInfoToWide> vtilist> {
++  foreach VtiToWti = vtilist in {
++    defvar Vti = VtiToWti.Vti;
++    defvar Wti = VtiToWti.Wti;
++    defvar kind = "W"#Vti.ScalarSuffix;
++    defm : VPatBinaryTARoundingMode<intrinsic, instruction#"_"#kind#"_"#Vti.LMul.MX,
++                                    Vti.Vector, Wti.Vector, Vti.Scalar, Vti.Mask,
++                                    Vti.Log2SEW, Vti.RegClass,
++                                    Wti.RegClass, Vti.ScalarRegClass>;
++  }
++}
++
+ multiclass VPatBinaryV_WI<string intrinsic, string instruction,
+                           list<VTypeInfoToWide> vtilist> {
+   foreach VtiToWti = vtilist in {
+@@ -4554,6 +4897,18 @@ multiclass VPatBinaryV_WI<string intrinsic, string instruction,
+   }
+ }
+ 
++multiclass VPatBinaryV_WIRoundingMode<string intrinsic, string instruction,
++                          list<VTypeInfoToWide> vtilist> {
++  foreach VtiToWti = vtilist in {
++    defvar Vti = VtiToWti.Vti;
++    defvar Wti = VtiToWti.Wti;
++    defm : VPatBinaryTARoundingMode<intrinsic, instruction # "_WI_" # Vti.LMul.MX,
++                                    Vti.Vector, Wti.Vector, XLenVT, Vti.Mask,
++                                    Vti.Log2SEW, Vti.RegClass,
++                                    Wti.RegClass, uimm5>;
++  }
++}
++
+ multiclass VPatBinaryV_VM<string intrinsic, string instruction,
+                           bit CarryOut = 0,
+                           list<VTypeInfo> vtilist = AllIntegerVectors> {
+@@ -4688,11 +5043,22 @@ multiclass VPatBinaryV_VV_VX_VI<string intrinsic, string instruction,
+       VPatBinaryV_VX<intrinsic, instruction, vtilist>,
+       VPatBinaryV_VI<intrinsic, instruction, vtilist, ImmType>;
+ 
++multiclass VPatBinaryV_VV_VX_VIRoundingMode<string intrinsic, string instruction,
++                                            list<VTypeInfo> vtilist, Operand ImmType = simm5>
++    : VPatBinaryV_VVRoundingMode<intrinsic, instruction, vtilist>,
++      VPatBinaryV_VXRoundingMode<intrinsic, instruction, vtilist>,
++      VPatBinaryV_VIRoundingMode<intrinsic, instruction, vtilist, ImmType>;
++
+ multiclass VPatBinaryV_VV_VX<string intrinsic, string instruction,
+                              list<VTypeInfo> vtilist>
+     : VPatBinaryV_VV<intrinsic, instruction, vtilist>,
+       VPatBinaryV_VX<intrinsic, instruction, vtilist>;
+ 
++multiclass VPatBinaryV_VV_VXRoundingMode<string intrinsic, string instruction,
++                             list<VTypeInfo> vtilist>
++    : VPatBinaryV_VVRoundingMode<intrinsic, instruction, vtilist>,
++      VPatBinaryV_VXRoundingMode<intrinsic, instruction, vtilist>;
++
+ multiclass VPatBinaryV_VX_VI<string intrinsic, string instruction,
+                              list<VTypeInfo> vtilist>
+     : VPatBinaryV_VX<intrinsic, instruction, vtilist>,
+@@ -4714,6 +5080,12 @@ multiclass VPatBinaryV_WV_WX_WI<string intrinsic, string instruction,
+       VPatBinaryV_WX<intrinsic, instruction, vtilist>,
+       VPatBinaryV_WI<intrinsic, instruction, vtilist>;
+ 
++multiclass VPatBinaryV_WV_WX_WIRoundingMode<string intrinsic, string instruction,
++                                            list<VTypeInfoToWide> vtilist>
++    : VPatBinaryV_WVRoundingMode<intrinsic, instruction, vtilist>,
++      VPatBinaryV_WXRoundingMode<intrinsic, instruction, vtilist>,
++      VPatBinaryV_WIRoundingMode<intrinsic, instruction, vtilist>;
++
+ multiclass VPatBinaryV_VM_XM_IM<string intrinsic, string instruction>
+     : VPatBinaryV_VM_TAIL<intrinsic, instruction>,
+       VPatBinaryV_XM_TAIL<intrinsic, instruction>,
+@@ -5382,34 +5754,34 @@ let Defs = [VXSAT], hasSideEffects = 1 in {
+ //===----------------------------------------------------------------------===//
+ // 12.2. Vector Single-Width Averaging Add and Subtract
+ //===----------------------------------------------------------------------===//
+-let Uses = [VXRM], hasSideEffects = 1 in {
+-  defm PseudoVAADDU : VPseudoVAALU_VV_VX;
+-  defm PseudoVAADD  : VPseudoVAALU_VV_VX;
+-  defm PseudoVASUBU : VPseudoVAALU_VV_VX;
+-  defm PseudoVASUB  : VPseudoVAALU_VV_VX;
++let hasSideEffects = 1 in {
++  defm PseudoVAADDU : VPseudoVAALU_VV_VX_RM;
++  defm PseudoVAADD  : VPseudoVAALU_VV_VX_RM;
++  defm PseudoVASUBU : VPseudoVAALU_VV_VX_RM;
++  defm PseudoVASUB  : VPseudoVAALU_VV_VX_RM;
+ }
+ 
+ //===----------------------------------------------------------------------===//
+ // 12.3. Vector Single-Width Fractional Multiply with Rounding and Saturation
+ //===----------------------------------------------------------------------===//
+-let Uses = [VXRM], Defs = [VXSAT], hasSideEffects = 1 in {
+-  defm PseudoVSMUL : VPseudoVSMUL_VV_VX;
++let Defs = [VXSAT], hasSideEffects = 1 in {
++  defm PseudoVSMUL : VPseudoVSMUL_VV_VX_RM;
+ }
+ 
+ //===----------------------------------------------------------------------===//
+ // 12.4. Vector Single-Width Scaling Shift Instructions
+ //===----------------------------------------------------------------------===//
+-let Uses = [VXRM], hasSideEffects = 1 in {
+-  defm PseudoVSSRL : VPseudoVSSHT_VV_VX_VI<uimm5>;
+-  defm PseudoVSSRA : VPseudoVSSHT_VV_VX_VI<uimm5>;
++let hasSideEffects = 1 in {
++  defm PseudoVSSRL : VPseudoVSSHT_VV_VX_VI_RM<uimm5>;
++  defm PseudoVSSRA : VPseudoVSSHT_VV_VX_VI_RM<uimm5>;
+ }
+ 
+ //===----------------------------------------------------------------------===//
+ // 12.5. Vector Narrowing Fixed-Point Clip Instructions
+ //===----------------------------------------------------------------------===//
+-let Uses = [VXRM], Defs = [VXSAT], hasSideEffects = 1 in {
+-  defm PseudoVNCLIP  : VPseudoVNCLP_WV_WX_WI;
+-  defm PseudoVNCLIPU : VPseudoVNCLP_WV_WX_WI;
++let Defs = [VXSAT], hasSideEffects = 1 in {
++  defm PseudoVNCLIP  : VPseudoVNCLP_WV_WX_WI_RM;
++  defm PseudoVNCLIPU : VPseudoVNCLP_WV_WX_WI_RM;
+ }
+ 
+ } // Predicates = [HasVInstructions]
+@@ -6040,30 +6412,36 @@ defm : VPatBinaryV_VV_VX<"int_riscv_vssub", "PseudoVSSUB", AllIntegerVectors>;
+ //===----------------------------------------------------------------------===//
+ // 12.2. Vector Single-Width Averaging Add and Subtract
+ //===----------------------------------------------------------------------===//
+-defm : VPatBinaryV_VV_VX<"int_riscv_vaaddu", "PseudoVAADDU", AllIntegerVectors>;
+-defm : VPatBinaryV_VV_VX<"int_riscv_vaadd", "PseudoVAADD", AllIntegerVectors>;
+-defm : VPatBinaryV_VV_VX<"int_riscv_vasubu", "PseudoVASUBU", AllIntegerVectors>;
+-defm : VPatBinaryV_VV_VX<"int_riscv_vasub", "PseudoVASUB", AllIntegerVectors>;
++defm : VPatBinaryV_VV_VXRoundingMode<"int_riscv_vaaddu", "PseudoVAADDU",
++                                     AllIntegerVectors>;
++defm : VPatBinaryV_VV_VXRoundingMode<"int_riscv_vasubu", "PseudoVASUBU",
++                                     AllIntegerVectors>;
++defm : VPatBinaryV_VV_VXRoundingMode<"int_riscv_vasub", "PseudoVASUB",
++                                     AllIntegerVectors>;
++defm : VPatBinaryV_VV_VXRoundingMode<"int_riscv_vaadd", "PseudoVAADD",
++                                     AllIntegerVectors>;
+ 
+ //===----------------------------------------------------------------------===//
+ // 12.3. Vector Single-Width Fractional Multiply with Rounding and Saturation
+ //===----------------------------------------------------------------------===//
+-defm : VPatBinaryV_VV_VX<"int_riscv_vsmul", "PseudoVSMUL", AllIntegerVectors>;
++defm : VPatBinaryV_VV_VXRoundingMode<"int_riscv_vsmul", "PseudoVSMUL",
++                                     AllIntegerVectors>;
+ 
+ //===----------------------------------------------------------------------===//
+ // 12.4. Vector Single-Width Scaling Shift Instructions
+ //===----------------------------------------------------------------------===//
+-defm : VPatBinaryV_VV_VX_VI<"int_riscv_vssrl", "PseudoVSSRL", AllIntegerVectors,
+-                            uimm5>;
+-defm : VPatBinaryV_VV_VX_VI<"int_riscv_vssra", "PseudoVSSRA", AllIntegerVectors,
+-                            uimm5>;
++defm : VPatBinaryV_VV_VX_VIRoundingMode<"int_riscv_vssrl", "PseudoVSSRL",
++                                        AllIntegerVectors, uimm5>;
++defm : VPatBinaryV_VV_VX_VIRoundingMode<"int_riscv_vssra", "PseudoVSSRA",
++                                        AllIntegerVectors, uimm5>;
+ 
+ //===----------------------------------------------------------------------===//
+ // 12.5. Vector Narrowing Fixed-Point Clip Instructions
+ //===----------------------------------------------------------------------===//
+-defm : VPatBinaryV_WV_WX_WI<"int_riscv_vnclipu", "PseudoVNCLIPU", AllWidenableIntVectors>;
+-defm : VPatBinaryV_WV_WX_WI<"int_riscv_vnclip", "PseudoVNCLIP", AllWidenableIntVectors>;
+-
++defm : VPatBinaryV_WV_WX_WIRoundingMode<"int_riscv_vnclipu", "PseudoVNCLIPU",
++                                        AllWidenableIntVectors>;
++defm : VPatBinaryV_WV_WX_WIRoundingMode<"int_riscv_vnclip", "PseudoVNCLIP",
++                                        AllWidenableIntVectors>;
+ } // Predicates = [HasVInstructions]
+ 
+ //===----------------------------------------------------------------------===//
+diff --git a/llvm/lib/Target/RISCV/RISCVMCInstLower.cpp b/llvm/lib/Target/RISCV/RISCVMCInstLower.cpp
+index 281918259cdb..7455df64c38a 100644
+--- a/llvm/lib/Target/RISCV/RISCVMCInstLower.cpp
++++ b/llvm/lib/Target/RISCV/RISCVMCInstLower.cpp
+@@ -159,6 +159,8 @@ static bool lowerRISCVVMachineInstrToMCInst(const MachineInstr *MI,
+     --NumOps;
+   if (RISCVII::hasVLOp(TSFlags))
+     --NumOps;
++  if (RISCVII::hasRoundModeOp(TSFlags))
++    --NumOps;
+   if (RISCVII::hasSEWOp(TSFlags))
+     --NumOps;
+ 
+diff --git a/llvm/lib/Target/RISCV/RISCVSystemOperands.td b/llvm/lib/Target/RISCV/RISCVSystemOperands.td
+index b9aa25b321b0..ced58fbb2a6d 100644
+--- a/llvm/lib/Target/RISCV/RISCVSystemOperands.td
++++ b/llvm/lib/Target/RISCV/RISCVSystemOperands.td
+@@ -350,7 +350,7 @@ def : SysReg<"dscratch1", 0x7B3>;
+ //===----------------------------------------------------------------------===//
+ def : SysReg<"vstart", 0x008>;
+ def : SysReg<"vxsat", 0x009>;
+-def : SysReg<"vxrm", 0x00A>;
++def SysRegVXRM : SysReg<"vxrm", 0x00A>;
+ def : SysReg<"vcsr", 0x00F>;
+ def : SysReg<"vl", 0xC20>;
+ def : SysReg<"vtype", 0xC21>;
+diff --git a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
+index cc881406666c..28908e88f39f 100644
+--- a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
++++ b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
+@@ -81,6 +81,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTarget() {
+   initializeRISCVPreRAExpandPseudoPass(*PR);
+   initializeRISCVExpandPseudoPass(*PR);
+   initializeRISCVInsertVSETVLIPass(*PR);
++  initializeRISCVInsertReadWriteCSRPass(*PR);
+   initializeRISCVDAGToDAGISelPass(*PR);
+ }
+ 
+@@ -354,6 +355,7 @@ void RISCVPassConfig::addPreRegAlloc() {
+   if (TM->getOptLevel() != CodeGenOpt::None)
+     addPass(createRISCVMergeBaseOffsetOptPass());
+   addPass(createRISCVInsertVSETVLIPass());
++  addPass(createRISCVInsertReadWriteCSRPass());
+ }
+ 
+ void RISCVPassConfig::addPostRegAlloc() {
+-- 
+2.25.1
+

+ 44 - 51
recipes-devtools/clang/clang/0002-add-pref-instruction.patch → recipes-devtools/clang/clang/0003-RISCV-Add-prefetch-instructions.patch

@@ -1,37 +1,29 @@
-From 39cead71ef235f6fb6fc0a67a385234f1d182a06 Mon Sep 17 00:00:00 2001
+From 4cd4084046f2dd3d57eb6bee0e88baecd66e49df Mon Sep 17 00:00:00 2001
 From: "max.ma" <max.ma@starfivetech.com>
-Date: Sun, 7 Nov 2021 23:01:41 -0800
-Subject: [PATCH 2/6] add pref instruction
+Date: Sun, 25 Jun 2023 19:36:20 -0700
+Subject: [PATCH 3/9] [RISCV] Add prefetch instructions
 
 ---
- .../Target/RISCV/AsmParser/RISCVAsmParser.cpp | 18 ++++++++++++
+ .../Target/RISCV/AsmParser/RISCVAsmParser.cpp | 10 +++++++
  .../Target/RISCV/MCTargetDesc/RISCVBaseInfo.h |  2 ++
  llvm/lib/Target/RISCV/RISCVInstrFormats.td    | 16 +++++++++++
- llvm/lib/Target/RISCV/RISCVInstrInfo.td       | 28 +++++++++++++++++++
- 4 files changed, 64 insertions(+)
+ llvm/lib/Target/RISCV/RISCVInstrInfo.td       | 27 +++++++++++++++++++
+ 4 files changed, 55 insertions(+)
 
 diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
-index 2954f9d1a1f6..93f43e1ed7cc 100644
+index 9752e398bd99..d577d83bf14e 100644
 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
 +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
-@@ -573,6 +573,15 @@ public:
-     return IsConstantImm && isUInt<3>(Imm) && VK == RISCVMCExpr::VK_RISCV_None;
-   }
+@@ -566,6 +566,7 @@ public:
  
-+  bool isUImm4() const {
-+    int64_t Imm;
-+    RISCVMCExpr::VariantKind VK = RISCVMCExpr::VK_RISCV_None;
-+    if (!isImm())
-+      return false;
-+    bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
-+    return IsConstantImm && isUInt<4>(Imm) && VK == RISCVMCExpr::VK_RISCV_None;
-+  }
-+
-   bool isUImm5() const {
-     int64_t Imm;
-     RISCVMCExpr::VariantKind VK = RISCVMCExpr::VK_RISCV_None;
-@@ -629,6 +638,15 @@ public:
-            VK == RISCVMCExpr::VK_RISCV_None;
+   bool isUImm2() { return IsUImm<2>(); }
+   bool isUImm3() { return IsUImm<3>(); }
++  bool isUImm4() { return IsUImm<4>(); }
+   bool isUImm5() { return IsUImm<5>(); }
+   bool isUImm7() { return IsUImm<7>(); }
+ 
+@@ -597,6 +598,15 @@ public:
+     return IsConstantImm && isInt<6>(Imm) && VK == RISCVMCExpr::VK_RISCV_None;
    }
  
 +  bool isSImm8() const {
@@ -43,30 +35,32 @@ index 2954f9d1a1f6..93f43e1ed7cc 100644
 +    return IsConstantImm && isInt<8>(Imm) && VK == RISCVMCExpr::VK_RISCV_None;
 +  }
 +
-   bool isCLUIImm() const {
+   bool isSImm6NonZero() const {
      if (!isImm())
        return false;
 diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h
-index 5826a2c2a4ef..32f54111e413 100644
+index eb43f4bf0a02..a832f51bd517 100644
 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h
 +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h
-@@ -197,9 +197,11 @@ enum OperandType : unsigned {
+@@ -244,11 +244,13 @@ enum OperandType : unsigned {
    OPERAND_UIMM2 = OPERAND_FIRST_RISCV_IMM,
    OPERAND_UIMM3,
    OPERAND_UIMM4,
 +  OPERAND_UIMM4_PREF,
    OPERAND_UIMM5,
    OPERAND_UIMM7,
-   OPERAND_UIMM12,
+   OPERAND_UIMM7_LSB00,
+   OPERAND_UIMM8_LSB00,
+   OPERAND_UIMM8_LSB000,
 +  OPERAND_SIMM8,
-   OPERAND_SIMM12,
-   OPERAND_UIMM20,
-   OPERAND_UIMMLOG2XLEN,
+   OPERAND_UIMM12,
+   OPERAND_ZERO,
+   OPERAND_SIMM5,
 diff --git a/llvm/lib/Target/RISCV/RISCVInstrFormats.td b/llvm/lib/Target/RISCV/RISCVInstrFormats.td
-index 18b3844b1e10..1c4b3f553d82 100644
+index f2cd4ed8857f..e913edc47ec2 100644
 --- a/llvm/lib/Target/RISCV/RISCVInstrFormats.td
 +++ b/llvm/lib/Target/RISCV/RISCVInstrFormats.td
-@@ -359,6 +359,22 @@ class RVInstCache<bits<12> cache, RISCVOpcode opcode, dag outs, dag ins,
+@@ -361,6 +361,22 @@ class RVInstI<bits<3> funct3, RISCVOpcode opcode, dag outs, dag ins,
    let Opcode = opcode.Value;
  }
  
@@ -90,10 +84,10 @@ index 18b3844b1e10..1c4b3f553d82 100644
                     dag outs, dag ins, string opcodestr, string argstr>
      : RVInst<outs, ins, opcodestr, argstr, [], InstFormatI> {
 diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
-index a185926db5fe..1b7ba7f05e2e 100644
+index 75fee3f962d0..5849327ca255 100644
 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td
 +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
-@@ -180,6 +180,18 @@ def uimm3 : Operand<XLenVT> {
+@@ -205,6 +205,18 @@ def uimm3 : Operand<XLenVT> {
    let OperandNamespace = "RISCVOp";
  }
  
@@ -112,7 +106,7 @@ index a185926db5fe..1b7ba7f05e2e 100644
  def uimm5 : Operand<XLenVT>, ImmLeaf<XLenVT, [{return isUInt<5>(Imm);}]> {
    let ParserMatchClass = UImmAsmOperand<5>;
    let DecoderMethod = "decodeUImmOperand<5>";
-@@ -208,6 +220,14 @@ def uimm7 : Operand<XLenVT> {
+@@ -212,6 +224,14 @@ def uimm5 : Operand<XLenVT>, ImmLeaf<XLenVT, [{return isUInt<5>(Imm);}]> {
    let OperandNamespace = "RISCVOp";
  }
  
@@ -124,12 +118,12 @@ index a185926db5fe..1b7ba7f05e2e 100644
 +  let OperandNamespace = "RISCVOp";
 +}
 +
- def simm12 : Operand<XLenVT>, ImmLeaf<XLenVT, [{return isInt<12>(Imm);}]> {
-   let ParserMatchClass = SImmAsmOperand<12>;
-   let EncoderMethod = "getImmOpValue";
-@@ -529,6 +549,12 @@ class CSR_cache<bits<12> cache, string opcodestr>
-     : RVInstCache<cache, OPC_SYSTEM, (outs), (ins GPR:$rs1),
-               opcodestr, "$rs1">, Sched<[WriteCSR, ReadCSR]>;
+ def InsnDirectiveOpcode : AsmOperandClass {
+   let Name = "InsnDirectiveOpcode";
+   let ParserMethod = "parseInsnDirectiveOpcode";
+@@ -560,6 +580,12 @@ class CSR_ir<bits<3> funct3, string opcodestr>
+     : RVInstI<funct3, OPC_SYSTEM, (outs GPR:$rd), (ins csr_sysreg:$imm12, GPR:$rs1),
+               opcodestr, "$rd, $imm12, $rs1">, Sched<[WriteCSR, ReadCSR]>;
  
 +let hasNoSchedulingInfo = 1,
 +    hasSideEffects = 1, mayLoad = 0, mayStore = 0 in
@@ -140,15 +134,14 @@ index a185926db5fe..1b7ba7f05e2e 100644
  let hasNoSchedulingInfo = 1,
      hasSideEffects = 1, mayLoad = 0, mayStore = 0 in
  class CSR_ii<bits<3> funct3, string opcodestr>
-@@ -683,6 +709,8 @@ def CFLUSH_D_L1   : CSR_cache<0b111111000000, "cflush.d.l1">;
- def CDISCARD_D_L1 : CSR_cache<0b111111000010, "cdiscard.d.l1">;
- def CFLUSH_D_L2   : CSR_cache<0b111111000100, "cflush.d.l2">;
- def CDISCARD_D_L2 : CSR_cache<0b111111000110, "cdiscard.d.l2">;
-+def PREF          : PREF_iir<"pref">;
-+
- /* End */
- 
- def CSRRW : CSR_ir<0b001, "csrrw">;
+@@ -670,6 +696,7 @@ def SLT  : ALU_rr<0b0000000, 0b010, "slt">,
+ def SLTU : ALU_rr<0b0000000, 0b011, "sltu">,
+            Sched<[WriteIALU, ReadIALU, ReadIALU]>;
+ }
++def PREF : PREF_iir<"pref">;
+ def XOR  : ALU_rr<0b0000000, 0b100, "xor", /*Commutable*/1>,
+            Sched<[WriteIALU, ReadIALU, ReadIALU]>;
+ def SRL  : ALU_rr<0b0000000, 0b101, "srl">,
 -- 
 2.25.1
 

+ 15 - 14
recipes-devtools/clang/clang/0003-compiler-rt-Simplify-cross-compilation.-Don-t-use-na.patch

@@ -1,4 +1,4 @@
-From 3bc3328f89915cde33c26cec91a57b79109420f0 Mon Sep 17 00:00:00 2001
+From e1031fdbe63c6065b89e1e15f9bbc62cd36cd898 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Thu, 19 May 2016 23:11:45 -0700
 Subject: [PATCH] compiler-rt: Simplify cross-compilation. Don't use
@@ -13,6 +13,7 @@ Subject: [PATCH] compiler-rt: Simplify cross-compilation. Don't use
 
 https://us.codeaurora.org/patches/quic/llvm/50683/compiler-rt-cross-compilation.patch
 
+Upstream-Status: Pending
 Signed-off-by: Greg Fitzgerald <gregf@codeaurora.org>
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
@@ -20,24 +21,24 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  1 file changed, 10 insertions(+), 1 deletion(-)
 
 diff --git a/compiler-rt/CMakeLists.txt b/compiler-rt/CMakeLists.txt
-index 3a41aa43e406..3bbfbca1f645 100644
+index 8a13508fcb98..2c2bda5befa5 100644
 --- a/compiler-rt/CMakeLists.txt
 +++ b/compiler-rt/CMakeLists.txt
-@@ -67,7 +67,16 @@ set(COMPILER_RT_BAREMETAL_BUILD OFF CACHE BOOL
-   "Build for a bare-metal target.")
+@@ -89,7 +89,16 @@ if (COMPILER_RT_STANDALONE_BUILD)
+   set(CMAKE_CXX_EXTENSIONS NO)
  
- if (COMPILER_RT_STANDALONE_BUILD)
--  load_llvm_config()
-+  find_package(LLVM REQUIRED)
-+  list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
+   if (NOT LLVM_RUNTIMES_BUILD)
+-    load_llvm_config()
++    find_package(LLVM REQUIRED)
++    list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
 +
-+  # Variables that AddLLVM.cmake depends on (included by AddCompilerRT)
-+  set(LLVM_TOOLS_BINARY_DIR "${LLVM_INSTALL_PREFIX}/bin")
-+  set(LLVM_LIBRARY_DIR "${LLVM_INSTALL_PREFIX}/lib")
++    # Variables that AddLLVM.cmake depends on (included by AddCompilerRT)
++    set(LLVM_TOOLS_BINARY_DIR "${LLVM_INSTALL_PREFIX}/bin")
++    set(LLVM_LIBRARY_DIR "${LLVM_INSTALL_PREFIX}/lib")
 +
-+  set(LLVM_LIBRARY_OUTPUT_INTDIR
-+    ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
++    set(LLVM_LIBRARY_OUTPUT_INTDIR
++      ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
 +
+   endif()
    if (TARGET intrinsics_gen)
      # Loading the llvm config causes this target to be imported so place it
-     # under the appropriate folder in an IDE.

+ 10 - 10
recipes-devtools/clang/clang/0001-Merge-four-Custom-CSR-cache-instruction.patch → recipes-devtools/clang/clang/0004-RISCV-Add-customer-cache-instructions.patch

@@ -1,7 +1,7 @@
-From 00aa2f52bad795911c756b759e1a79baef01e414 Mon Sep 17 00:00:00 2001
+From bcd728e619143e082767170bfd7b255e521923db Mon Sep 17 00:00:00 2001
 From: "yilun.xie" <yilun.xie@starfivetech.com>
 Date: Fri, 29 Oct 2021 10:16:06 +0800
-Subject: [PATCH 1/6] Merge four Custom CSR cache instruction
+Subject: [PATCH 4/9] [RISCV] Add customer cache instructions
 
 ---
  llvm/lib/Target/RISCV/RISCVInstrFormats.td | 12 ++++++++++++
@@ -9,10 +9,10 @@ Subject: [PATCH 1/6] Merge four Custom CSR cache instruction
  2 files changed, 25 insertions(+)
 
 diff --git a/llvm/lib/Target/RISCV/RISCVInstrFormats.td b/llvm/lib/Target/RISCV/RISCVInstrFormats.td
-index 18b31f85bfdb..18b3844b1e10 100644
+index e913edc47ec2..d3953227b0cd 100644
 --- a/llvm/lib/Target/RISCV/RISCVInstrFormats.td
 +++ b/llvm/lib/Target/RISCV/RISCVInstrFormats.td
-@@ -347,6 +347,18 @@ class RVInstI<bits<3> funct3, RISCVOpcode opcode, dag outs, dag ins,
+@@ -377,6 +377,18 @@ class RVInstPref<RISCVOpcode opcode, dag outs, dag ins,
    let Opcode = opcode.Value;
  }
  
@@ -32,12 +32,12 @@ index 18b31f85bfdb..18b3844b1e10 100644
                     dag outs, dag ins, string opcodestr, string argstr>
      : RVInst<outs, ins, opcodestr, argstr, [], InstFormatI> {
 diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
-index fdb1af9d558f..a185926db5fe 100644
+index 5849327ca255..6bd3de20b807 100644
 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td
 +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
-@@ -523,6 +523,12 @@ class CSR_ir<bits<3> funct3, string opcodestr>
-     : RVInstI<funct3, OPC_SYSTEM, (outs GPR:$rd), (ins csr_sysreg:$imm12, GPR:$rs1),
-               opcodestr, "$rd, $imm12, $rs1">, Sched<[WriteCSR, ReadCSR]>;
+@@ -586,6 +586,12 @@ class PREF_iir<string opcodestr>
+     : RVInstPref<OPC_OP_IMM, (outs), (ins uimm4_pref:$imm4, simm8:$imm8, GPR:$rs1),
+               opcodestr, "$imm4, ${imm8}(${rs1})">;
  
 +let hasNoSchedulingInfo = 1,
 +    hasSideEffects = 1, mayLoad = 0, mayStore = 0 in
@@ -48,8 +48,8 @@ index fdb1af9d558f..a185926db5fe 100644
  let hasNoSchedulingInfo = 1,
      hasSideEffects = 1, mayLoad = 0, mayStore = 0 in
  class CSR_ii<bits<3> funct3, string opcodestr>
-@@ -672,6 +678,13 @@ def UNIMP : RVInstI<0b001, OPC_SYSTEM, (outs), (ins), "unimp", "">,
- }
+@@ -773,6 +779,13 @@ def WRS_STO : RVInstI<0b000, OPC_SYSTEM, (outs), (ins), "wrs.sto", "">,
+ 
  } // hasSideEffects = 1, mayLoad = 0, mayStore = 0
  
 +/* Custom instruction and CSRs */

+ 32 - 30
recipes-devtools/clang/clang/0004-llvm-TargetLibraryInfo-Undefine-libc-functions-if-th.patch

@@ -1,4 +1,4 @@
-From 2da0422b45b2b9842a2ceb6840beba05356057d2 Mon Sep 17 00:00:00 2001
+From 1279fd32e3809fe9b8f0bddab69042a92637282b Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Sat, 21 May 2016 00:33:20 +0000
 Subject: [PATCH] llvm: TargetLibraryInfo: Undefine libc functions if they are
@@ -7,82 +7,84 @@ Subject: [PATCH] llvm: TargetLibraryInfo: Undefine libc functions if they are
 musl defines some functions as macros and not inline functions
 if this is the case then make sure to undefine them
 
+Upstream-Status: Pending
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
- .../llvm/Analysis/TargetLibraryInfo.def       | 21 +++++++++++++++++++
- 1 file changed, 21 insertions(+)
+ .../llvm/Analysis/TargetLibraryInfo.def       | 22 ++++++++++++++++++-
+ 1 file changed, 21 insertions(+), 1 deletion(-)
 
 diff --git a/llvm/include/llvm/Analysis/TargetLibraryInfo.def b/llvm/include/llvm/Analysis/TargetLibraryInfo.def
-index 9c1abef33b28..29d2a79ddecc 100644
+index 5f6af3514fc2..9ac2e912590f 100644
 --- a/llvm/include/llvm/Analysis/TargetLibraryInfo.def
 +++ b/llvm/include/llvm/Analysis/TargetLibraryInfo.def
-@@ -815,6 +815,9 @@ TLI_DEFINE_STRING_INTERNAL("fmodl")
- TLI_DEFINE_ENUM_INTERNAL(fopen)
- TLI_DEFINE_STRING_INTERNAL("fopen")
+@@ -1303,6 +1303,9 @@ TLI_DEFINE_STRING_INTERNAL("fopen")
+ TLI_DEFINE_SIG_INTERNAL(Ptr, Ptr, Ptr)
+ 
  /// FILE *fopen64(const char *filename, const char *opentype)
 +#ifdef fopen64
 +#undef fopen64
 +#endif
  TLI_DEFINE_ENUM_INTERNAL(fopen64)
  TLI_DEFINE_STRING_INTERNAL("fopen64")
- /// int fork();
-@@ -862,6 +865,9 @@ TLI_DEFINE_STRING_INTERNAL("fseek")
- /// int fseeko(FILE *stream, off_t offset, int whence);
+ TLI_DEFINE_SIG_INTERNAL(Ptr, Ptr, Ptr)
+@@ -1381,7 +1384,9 @@ TLI_DEFINE_SIG_INTERNAL(Int, Ptr, Long, Int)
  TLI_DEFINE_ENUM_INTERNAL(fseeko)
  TLI_DEFINE_STRING_INTERNAL("fseeko")
+ TLI_DEFINE_SIG_INTERNAL(Int, Ptr, IntX, Int)
+-
 +#ifdef fseeko64
 +#undef fseeko64
 +#endif
  /// int fseeko64(FILE *stream, off64_t offset, int whence)
  TLI_DEFINE_ENUM_INTERNAL(fseeko64)
  TLI_DEFINE_STRING_INTERNAL("fseeko64")
-@@ -872,6 +878,9 @@ TLI_DEFINE_STRING_INTERNAL("fsetpos")
- TLI_DEFINE_ENUM_INTERNAL(fstat)
- TLI_DEFINE_STRING_INTERNAL("fstat")
+@@ -1398,6 +1403,9 @@ TLI_DEFINE_STRING_INTERNAL("fstat")
+ TLI_DEFINE_SIG_INTERNAL(Int, Int, Ptr)
+ 
  /// int fstat64(int filedes, struct stat64 *buf)
 +#ifdef fstat64
 +#undef fstat64
 +#endif
  TLI_DEFINE_ENUM_INTERNAL(fstat64)
  TLI_DEFINE_STRING_INTERNAL("fstat64")
- /// int fstatvfs(int fildes, struct statvfs *buf);
-@@ -887,6 +896,9 @@ TLI_DEFINE_STRING_INTERNAL("ftell")
- TLI_DEFINE_ENUM_INTERNAL(ftello)
- TLI_DEFINE_STRING_INTERNAL("ftello")
+ TLI_DEFINE_SIG_INTERNAL(Int, Int, Ptr)
+@@ -1423,6 +1431,9 @@ TLI_DEFINE_STRING_INTERNAL("ftello")
+ TLI_DEFINE_SIG_INTERNAL(IntPlus, Ptr)
+ 
  /// off64_t ftello64(FILE *stream)
 +#ifdef ftello64
 +#undef ftello64
 +#endif
  TLI_DEFINE_ENUM_INTERNAL(ftello64)
  TLI_DEFINE_STRING_INTERNAL("ftello64")
- /// int ftrylockfile(FILE *file);
-@@ -1013,6 +1025,9 @@ TLI_DEFINE_STRING_INTERNAL("logl")
- TLI_DEFINE_ENUM_INTERNAL(lstat)
- TLI_DEFINE_STRING_INTERNAL("lstat")
+ TLI_DEFINE_SIG_INTERNAL(Int64, Ptr)
+@@ -1633,6 +1644,9 @@ TLI_DEFINE_STRING_INTERNAL("lstat")
+ TLI_DEFINE_SIG_INTERNAL(Int, Ptr, Ptr)
+ 
  /// int lstat64(const char *path, struct stat64 *buf);
 +#ifdef lstat64
 +#undef lstat64
 +#endif
  TLI_DEFINE_ENUM_INTERNAL(lstat64)
  TLI_DEFINE_STRING_INTERNAL("lstat64")
- /// void *malloc(size_t size);
-@@ -1262,6 +1277,9 @@ TLI_DEFINE_STRING_INTERNAL("sscanf")
- TLI_DEFINE_ENUM_INTERNAL(stat)
- TLI_DEFINE_STRING_INTERNAL("stat")
+ TLI_DEFINE_SIG_INTERNAL(Int, Ptr, Ptr)
+@@ -2045,6 +2059,9 @@ TLI_DEFINE_STRING_INTERNAL("stat")
+ TLI_DEFINE_SIG_INTERNAL(Int, Ptr, Ptr)
+ 
  /// int stat64(const char *path, struct stat64 *buf);
 +#ifdef stat64
 +#undef stat64
 +#endif
  TLI_DEFINE_ENUM_INTERNAL(stat64)
  TLI_DEFINE_STRING_INTERNAL("stat64")
- /// int statvfs(const char *path, struct statvfs *buf);
-@@ -1397,6 +1415,9 @@ TLI_DEFINE_STRING_INTERNAL("times")
- TLI_DEFINE_ENUM_INTERNAL(tmpfile)
- TLI_DEFINE_STRING_INTERNAL("tmpfile")
+ TLI_DEFINE_SIG_INTERNAL(Int, Ptr, Ptr)
+@@ -2270,6 +2287,9 @@ TLI_DEFINE_STRING_INTERNAL("tmpfile")
+ TLI_DEFINE_SIG_INTERNAL(Ptr)
+ 
  /// FILE *tmpfile64(void)
 +#ifdef tmpfile64
 +#undef tmpfile64
 +#endif
  TLI_DEFINE_ENUM_INTERNAL(tmpfile64)
  TLI_DEFINE_STRING_INTERNAL("tmpfile64")
- /// int toascii(int c);
+ TLI_DEFINE_SIG_INTERNAL(Ptr)

+ 0 - 49
recipes-devtools/clang/clang/0004-set-default-march-to-rv64imafcd_zba_zbb_zbc_zbs-and-.patch

@@ -1,49 +0,0 @@
-From 4a54300a0ebde3b9152878c55d3c394c74b4876c Mon Sep 17 00:00:00 2001
-From: "max.ma" <max.ma@starfivetech.com>
-Date: Mon, 10 Jan 2022 19:19:33 -0800
-Subject: [PATCH 4/6] set default march to rv64imafcd_zba_zbb_zbc_zbs and mabi
- to lp64d
-
----
- clang/lib/Driver/ToolChains/Arch/RISCV.cpp | 19 +++++++++++--------
- 1 file changed, 11 insertions(+), 8 deletions(-)
-
-diff --git a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
-index 8a8ed20986c5..21a7cdf02291 100644
---- a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
-+++ b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
-@@ -211,10 +211,11 @@ StringRef riscv::getRISCVABI(const ArgList &Args, const llvm::Triple &Triple) {
-     else
-       return "ilp32d";
-   } else {
--    if (Triple.getOS() == llvm::Triple::UnknownOS)
--      return "lp64";
--    else
--      return "lp64d";
-+    //if (Triple.getOS() == llvm::Triple::UnknownOS)
-+    //  return "lp64";
-+    //else
-+    //  return "lp64d";
-+    return "lp64d";
-   }
- }
- 
-@@ -289,9 +290,11 @@ StringRef riscv::getRISCVArch(const llvm::opt::ArgList &Args,
-     else
-       return "rv32imafdc";
-   } else {
--    if (Triple.getOS() == llvm::Triple::UnknownOS)
--      return "rv64imac";
--    else
--      return "rv64imafdc";
-+    //if (Triple.getOS() == llvm::Triple::UnknownOS)
-+    //  return "rv64imac";
-+    //else
-+    //  return "rv64imafdc";
-+    // align the default march with gcc toolchain of dubhe
-+    return "rv64imafdc_zba_zbb_zbc_zbs";  
-   }
- }
--- 
-2.25.1
-

+ 5 - 5
recipes-devtools/clang/clang/0003-add-multilib-v-b-support-for-baremetal-toolchain.patch → recipes-devtools/clang/clang/0005-RISCV-Add-multilib-v-b-support-for-baremetal-toolcha.patch

@@ -1,17 +1,17 @@
-From dccca6f853d2c9ed88bce3f3082dd2b46f179f3d Mon Sep 17 00:00:00 2001
+From f24280ce4b015090f4da8de03d5b57bfc6756de8 Mon Sep 17 00:00:00 2001
 From: "max.ma" <max.ma@starfivetech.com>
 Date: Wed, 5 Jan 2022 19:27:39 -0800
-Subject: [PATCH 3/6] add multilib v&b support for baremetal toolchain
+Subject: [PATCH 5/9] [RISCV] Add multilib v&b support for baremetal toolchain
 
 ---
  clang/lib/Driver/ToolChains/Gnu.cpp | 30 +++++++++++++++++++++++++++--
  1 file changed, 28 insertions(+), 2 deletions(-)
 
 diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
-index a10edc3db409..045f063b28f2 100644
+index 4f2340316654..c1737fe56635 100644
 --- a/clang/lib/Driver/ToolChains/Gnu.cpp
 +++ b/clang/lib/Driver/ToolChains/Gnu.cpp
-@@ -1656,7 +1656,8 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
+@@ -1695,7 +1695,8 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
    constexpr RiscvMultilib RISCVMultilibSet[] = {
        {"rv32i", "ilp32"},     {"rv32im", "ilp32"},     {"rv32iac", "ilp32"},
        {"rv32imac", "ilp32"},  {"rv32imafc", "ilp32f"}, {"rv64imac", "lp64"},
@@ -21,7 +21,7 @@ index a10edc3db409..045f063b28f2 100644
  
    std::vector<Multilib> Ms;
    for (auto Element : RISCVMultilibSet) {
-@@ -1682,8 +1683,33 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
+@@ -1721,8 +1722,33 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
    llvm::StringSet<> Added_ABIs;
    StringRef ABIName = tools::riscv::getRISCVABI(Args, TargetTriple);
    StringRef MArch = tools::riscv::getRISCVArch(Args, TargetTriple);

+ 14 - 9
recipes-devtools/clang/clang/0005-llvm-allow-env-override-of-exe-and-libdir-path.patch

@@ -1,4 +1,4 @@
-From affcd7f14bca2d9ee95352cd979f66f55901272a Mon Sep 17 00:00:00 2001
+From 8f8e25be1822d93341b0e32ba42d22c8c54016d4 Mon Sep 17 00:00:00 2001
 From: Martin Kelly <mkelly@xevo.com>
 Date: Fri, 19 May 2017 00:22:57 -0700
 Subject: [PATCH] llvm: allow env override of exe and libdir path
@@ -15,14 +15,14 @@ Upstream-Status: Inappropriate [OE-specific]
 Signed-off-by: Martin Kelly <mkelly@xevo.com>
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
- llvm/tools/llvm-config/llvm-config.cpp | 21 +++++++++++++++++++--
- 1 file changed, 19 insertions(+), 2 deletions(-)
+ llvm/tools/llvm-config/llvm-config.cpp | 25 +++++++++++++++++++------
+ 1 file changed, 19 insertions(+), 6 deletions(-)
 
 diff --git a/llvm/tools/llvm-config/llvm-config.cpp b/llvm/tools/llvm-config/llvm-config.cpp
-index 8ed88f33ead4..9e26a2b41409 100644
+index b1d795a0a349..dbeddeb2152e 100644
 --- a/llvm/tools/llvm-config/llvm-config.cpp
 +++ b/llvm/tools/llvm-config/llvm-config.cpp
-@@ -247,6 +247,13 @@ Typical components:\n\
+@@ -246,6 +246,13 @@ Typical components:\n\
  
  /// Compute the path to the main executable.
  std::string GetExecutablePath(const char *Argv0) {
@@ -36,7 +36,7 @@ index 8ed88f33ead4..9e26a2b41409 100644
    // This just needs to be some symbol in the binary; C++ doesn't
    // allow taking the address of ::main however.
    void *P = (void *)(intptr_t)GetExecutablePath;
-@@ -326,7 +333,7 @@ int main(int argc, char **argv) {
+@@ -325,7 +332,7 @@ int main(int argc, char **argv) {
    // Compute various directory locations based on the derived location
    // information.
    std::string ActivePrefix, ActiveBinDir, ActiveIncludeDir, ActiveLibDir,
@@ -45,11 +45,15 @@ index 8ed88f33ead4..9e26a2b41409 100644
    std::string ActiveIncludeOption;
    if (IsInDevelopmentTree) {
      ActiveIncludeDir = std::string(LLVM_SRC_ROOT) + "/include";
-@@ -367,7 +374,17 @@ int main(int argc, char **argv) {
+@@ -366,12 +373,18 @@ int main(int argc, char **argv) {
        sys::fs::make_absolute(ActivePrefix, Path);
        ActiveBinDir = std::string(Path.str());
      }
 -    ActiveLibDir = ActivePrefix + "/lib" + LLVM_LIBDIR_SUFFIX;
+-    {
+-      SmallString<256> Path(LLVM_INSTALL_PACKAGE_DIR);
+-      sys::fs::make_absolute(ActivePrefix, Path);
+-      ActiveCMakeDir = std::string(Path.str());
 +    // Hack for Yocto: we need to override the lib path when we are using
 +    // llvm-config from within a target sysroot since LLVM_LIBDIR_SUFFIX
 +    // maybe different for host llvm vs target e.g. ppc64 Libdir=lib64 but
@@ -59,8 +63,9 @@ index 8ed88f33ead4..9e26a2b41409 100644
 +      BaseLibDir = std::string(YoctoLibDir);
 +    } else {
 +      BaseLibDir = std::string("/lib") + LLVM_LIBDIR_SUFFIX;
-+    }
+     }
 +    ActiveLibDir = ActivePrefix + BaseLibDir;
-     ActiveCMakeDir = ActiveLibDir + "/cmake/llvm";
++    ActiveCMakeDir = ActiveLibDir + "/cmake/llvm";
      ActiveIncludeOption = "-I" + ActiveIncludeDir;
    }
+ 

+ 0 - 75
recipes-devtools/clang/clang/0005-support-b-letter-in-march-string.patch

@@ -1,75 +0,0 @@
-From 49624b4167173ffbbf3bdf1b9cfa33d5efcd1f0b Mon Sep 17 00:00:00 2001
-From: "max.ma" <max.ma@starfivetech.com>
-Date: Fri, 15 Apr 2022 02:16:43 -0700
-Subject: [PATCH 5/6] support "b" letter in march string
-
----
- llvm/lib/Support/RISCVISAInfo.cpp      |  8 +++++++-
- llvm/lib/Target/RISCV/RISCV.td         | 11 +++++++++++
- llvm/lib/Target/RISCV/RISCVSubtarget.h |  2 ++
- 3 files changed, 20 insertions(+), 1 deletion(-)
-
-diff --git a/llvm/lib/Support/RISCVISAInfo.cpp b/llvm/lib/Support/RISCVISAInfo.cpp
-index 20dd08f17311..edeceeaf4e82 100644
---- a/llvm/lib/Support/RISCVISAInfo.cpp
-+++ b/llvm/lib/Support/RISCVISAInfo.cpp
-@@ -600,7 +600,13 @@ RISCVISAInfo::parseArchString(StringRef Arch, bool EnableExperimentalExtension,
-       return createStringError(errc::invalid_argument,
-                                "unsupported standard user-level extension '%c'",
-                                C);
--    ISAInfo->addExtension(std::string(1, C), Major, Minor);
-+    if (C == 'b') {
-+      ISAInfo->addExtension("zba", Major, Minor);
-+      ISAInfo->addExtension("zbb", Major, Minor);
-+      ISAInfo->addExtension("zbc", Major, Minor);
-+      ISAInfo->addExtension("zbs", Major, Minor);
-+    } else 
-+      ISAInfo->addExtension(std::string(1, C), Major, Minor);
- 
-     // Consume full extension name and version, including any optional '_'
-     // between this extension and the next
-diff --git a/llvm/lib/Target/RISCV/RISCV.td b/llvm/lib/Target/RISCV/RISCV.td
-index 2940fdf04192..e9b64bdafab8 100644
---- a/llvm/lib/Target/RISCV/RISCV.td
-+++ b/llvm/lib/Target/RISCV/RISCV.td
-@@ -193,6 +193,17 @@ def HasStdExtZbbOrZbp
-                                    "'Zbb' (Basic Bit-Manipulation) or "
-                                    "'Zbp' (Permutation 'Zb' Instructions)">;
- 
-+def FeatureStdExtB
-+    : SubtargetFeature<"b", "HasStdExtB", "true",
-+                       "'B' (Bit Manipulation Instructions)",
-+                       [FeatureStdExtZba,
-+                        FeatureStdExtZbb,
-+                        FeatureStdExtZbc,
-+                        FeatureStdExtZbs]>;
-+def HasStdExtB : Predicate<"Subtarget->hasStdExtB()">,
-+                           AssemblerPredicate<(all_of FeatureStdExtB),
-+                           "'B' (Bit Manipulation Instructions)">;
-+
- def FeatureStdExtZbkb
-     : SubtargetFeature<"zbkb", "HasStdExtZbkb", "true",
-                        "'Zbkb' (Bitmanip instructions for Cryptography)">;
-diff --git a/llvm/lib/Target/RISCV/RISCVSubtarget.h b/llvm/lib/Target/RISCV/RISCVSubtarget.h
-index a63c07597a2c..75d20193c9a0 100644
---- a/llvm/lib/Target/RISCV/RISCVSubtarget.h
-+++ b/llvm/lib/Target/RISCV/RISCVSubtarget.h
-@@ -65,6 +65,7 @@ private:
-   bool HasStdExtF = false;
-   bool HasStdExtD = false;
-   bool HasStdExtC = false;
-+  bool HasStdExtB = false;  
-   bool HasStdExtZihintpause = false;
-   bool HasStdExtZba = false;
-   bool HasStdExtZbb = false;
-@@ -164,6 +165,7 @@ public:
-   bool hasStdExtC() const { return HasStdExtC; }
-   bool hasStdExtV() const { return HasStdExtV; }
-   bool hasStdExtZihintpause() const { return HasStdExtZihintpause; }
-+  bool hasStdExtB() const { return HasStdExtB; }
-   bool hasStdExtZba() const { return HasStdExtZba; }
-   bool hasStdExtZbb() const { return HasStdExtZbb; }
-   bool hasStdExtZbc() const { return HasStdExtZbc; }
--- 
-2.25.1
-

+ 7 - 7
recipes-devtools/clang/clang/0008-change-baremetal-multilib-directory-name-to-align-wi.patch → recipes-devtools/clang/clang/0006-RISCV-Change-baremetal-multilib-directory-name-to-al.patch

@@ -1,18 +1,18 @@
-From aaa51f4f755256f9a53b5bfba8054b135050dbeb Mon Sep 17 00:00:00 2001
+From 6c56523d3583772c5e4e9102e42ed41abe902dff Mon Sep 17 00:00:00 2001
 From: "max.ma" <max.ma@starfivetech.com>
 Date: Sun, 9 Oct 2022 00:19:02 -0700
-Subject: [PATCH 8/8] change baremetal multilib directory name to align with
- gcc 12.1
+Subject: [PATCH 6/9] [RISCV] Change baremetal multilib directory name to align
+ with gcc 12.1
 
 ---
  clang/lib/Driver/ToolChains/Gnu.cpp | 16 ++++++++++++++--
  1 file changed, 14 insertions(+), 2 deletions(-)
 
 diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
-index 045f063b28f2..208671a4f962 100644
+index c1737fe56635..06aec80f366a 100644
 --- a/clang/lib/Driver/ToolChains/Gnu.cpp
 +++ b/clang/lib/Driver/ToolChains/Gnu.cpp
-@@ -1657,7 +1657,11 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
+@@ -1696,7 +1696,11 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
        {"rv32i", "ilp32"},     {"rv32im", "ilp32"},     {"rv32iac", "ilp32"},
        {"rv32imac", "ilp32"},  {"rv32imafc", "ilp32f"}, {"rv64imac", "lp64"},
        {"rv64imafdc", "lp64d"}, {"rv64imafdc_zba_zbb_zbc_zbs", "lp64d"},
@@ -25,7 +25,7 @@ index 045f063b28f2..208671a4f962 100644
  
    std::vector<Multilib> Ms;
    for (auto Element : RISCVMultilibSet) {
-@@ -1683,8 +1687,10 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
+@@ -1722,8 +1726,10 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
    llvm::StringSet<> Added_ABIs;
    StringRef ABIName = tools::riscv::getRISCVABI(Args, TargetTriple);
    StringRef MArch = tools::riscv::getRISCVArch(Args, TargetTriple);
@@ -37,7 +37,7 @@ index 045f063b28f2..208671a4f962 100644
      char c = *I;
      switch (c) {
        default: 
-@@ -1693,12 +1699,18 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
+@@ -1732,12 +1738,18 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
  
        case 'g':
        Ext += "imafd";

+ 6 - 5
recipes-devtools/clang/clang/0006-clang-driver-Check-sysroot-for-ldso-path.patch

@@ -1,4 +1,4 @@
-From 7ff4f134a5e5e1f6ffe31637a474cf118ae0079b Mon Sep 17 00:00:00 2001
+From 953b9d2c5a7ef4224dec304154feceb30e2b836f Mon Sep 17 00:00:00 2001
 From: Dan McGregor <dan.mcgregor@usask.ca>
 Date: Wed, 26 Apr 2017 20:29:41 -0600
 Subject: [PATCH] clang: driver: Check sysroot for ldso path
@@ -7,6 +7,7 @@ OE does not necessarily follow the default path for the dynamic linker,
 therefore adjust it for OE. Check for the default path, and if it isn't
 there, check /lib.
 
+Upstream-Status: Pending
 Signed-off-by: Dan McGregor <dan.mcgregor@usask.ca>
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
@@ -14,10 +15,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  1 file changed, 16 insertions(+)
 
 diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp
-index f85c04df4f6c..97e987c37e4a 100644
+index c6fb290ffdb4..2a58f876a68d 100644
 --- a/clang/lib/Driver/ToolChains/Linux.cpp
 +++ b/clang/lib/Driver/ToolChains/Linux.cpp
-@@ -493,11 +493,19 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
+@@ -518,11 +518,19 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
      LibDir = "lib64";
      Loader =
          (tools::ppc::hasPPCAbiArg(Args, "elfv2")) ? "ld64.so.2" : "ld64.so.1";
@@ -37,7 +38,7 @@ index f85c04df4f6c..97e987c37e4a 100644
      break;
    case llvm::Triple::riscv32: {
      StringRef ABIName = tools::riscv::getRISCVABI(Args, Triple);
-@@ -519,6 +527,10 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
+@@ -544,6 +552,10 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
    case llvm::Triple::sparcv9:
      LibDir = "lib64";
      Loader = "ld-linux.so.2";
@@ -48,7 +49,7 @@ index f85c04df4f6c..97e987c37e4a 100644
      break;
    case llvm::Triple::systemz:
      LibDir = "lib";
-@@ -533,6 +545,10 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
+@@ -558,6 +570,10 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
  
      LibDir = X32 ? "libx32" : "lib64";
      Loader = X32 ? "ld-linux-x32.so.2" : "ld-linux-x86-64.so.2";

+ 5 - 5
recipes-devtools/clang/clang/0006-set-clang-default-dwarf-version-to-4.patch → recipes-devtools/clang/clang/0007-Driver-Set-clang-default-dwarf-version-to-4.patch

@@ -1,18 +1,18 @@
-From 2adad705725dd8e8e8b38b189207284fc2a5b436 Mon Sep 17 00:00:00 2001
+From a10e0f315a96f4b7f2458f377fd9a8de9288f829 Mon Sep 17 00:00:00 2001
 From: "max.ma" <max.ma@starfivetech.com>
 Date: Sun, 1 May 2022 05:51:37 -0700
-Subject: [PATCH 6/6] set clang default dwarf version to 4
+Subject: [PATCH 7/9] [Driver] Set clang default dwarf version to 4
 
 ---
  clang/include/clang/Driver/ToolChain.h | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h
-index adf1753e8d3a..c8adc4d917ce 100644
+index f75f35dc9e65..a70ae2b17833 100644
 --- a/clang/include/clang/Driver/ToolChain.h
 +++ b/clang/include/clang/Driver/ToolChain.h
-@@ -518,7 +518,7 @@ public:
-   
+@@ -547,7 +547,7 @@ public:
+ 
    // Return the DWARF version to emit, in the absence of arguments
    // to the contrary.
 -  virtual unsigned GetDefaultDwarfVersion() const { return 5; }

+ 4 - 3
recipes-devtools/clang/clang/0007-clang-Driver-tools.cpp-Add-lssp_nonshared-on-musl.patch

@@ -1,4 +1,4 @@
-From 12b2de3db9a53a25610f3c61fef10fe877e765c4 Mon Sep 17 00:00:00 2001
+From c35e16f856192a090696b033bc5a32af18f592ac Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Thu, 19 May 2016 21:11:06 -0700
 Subject: [PATCH] clang: Driver/tools.cpp: Add -lssp_nonshared on musl
@@ -7,16 +7,17 @@ musl driver will need to add ssp_nonshared for stack_check_local
 on the linker cmdline when using stack protector commands on
 compiler cmdline
 
+Upstream-Status: Pending
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
  clang/lib/Driver/ToolChains/Gnu.cpp | 6 ++++++
  1 file changed, 6 insertions(+)
 
 diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
-index 7a9570a686f4..633daa58590d 100644
+index 4f2340316654..cc9ed4f6b8ac 100644
 --- a/clang/lib/Driver/ToolChains/Gnu.cpp
 +++ b/clang/lib/Driver/ToolChains/Gnu.cpp
-@@ -622,6 +622,12 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
+@@ -653,6 +653,12 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
        if (IsIAMCU)
          CmdArgs.push_back("-lgloss");
  

+ 0 - 33
recipes-devtools/clang/clang/0007-set-clang-default-march-to-rv64gc.patch

@@ -1,33 +0,0 @@
-From bf362d8a818dee92a93c7062e9bfb0399746ef59 Mon Sep 17 00:00:00 2001
-From: "max.ma" <max.ma@starfivetech.com>
-Date: Sun, 9 Oct 2022 00:12:28 -0700
-Subject: [PATCH 7/8] set clang default march to rv64gc
-
----
- clang/lib/Driver/ToolChains/Arch/RISCV.cpp | 11 +++++------
- 1 file changed, 5 insertions(+), 6 deletions(-)
-
-diff --git a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
-index 21a7cdf02291..9fe13fe2aec3 100644
---- a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
-+++ b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
-@@ -290,11 +290,10 @@ StringRef riscv::getRISCVArch(const llvm::opt::ArgList &Args,
-     else
-       return "rv32imafdc";
-   } else {
--    //if (Triple.getOS() == llvm::Triple::UnknownOS)
--    //  return "rv64imac";
--    //else
--    //  return "rv64imafdc";
--    // align the default march with gcc toolchain of dubhe
--    return "rv64imafdc_zba_zbb_zbc_zbs";  
-+    if (Triple.getOS() == llvm::Triple::UnknownOS)
-+      return "rv64imafdc";
-+    else
-+      //for dubhe linux toolchain, default is rv64gcb 
-+      return "rv64imafdc_zba_zbb_zbc_zbs";
-   }
- }
--- 
-2.25.1
-

+ 60 - 0
recipes-devtools/clang/clang/0008-RISCV-Support-b-letter-in-march-string.patch

@@ -0,0 +1,60 @@
+From 7f3eaa0f7b494f9091b1916f208d78ba681b19a3 Mon Sep 17 00:00:00 2001
+From: "max.ma" <max.ma@starfivetech.com>
+Date: Fri, 15 Apr 2022 02:16:43 -0700
+Subject: [PATCH 8/9] [RISCV] Support "b" letter in march string
+
+---
+ llvm/lib/Support/RISCVISAInfo.cpp      |  9 ++++++++-
+ llvm/lib/Target/RISCV/RISCVFeatures.td | 12 ++++++++++++
+ 2 files changed, 20 insertions(+), 1 deletion(-)
+
+diff --git a/llvm/lib/Support/RISCVISAInfo.cpp b/llvm/lib/Support/RISCVISAInfo.cpp
+index 7cb1147d4265..8b3dcc91746b 100644
+--- a/llvm/lib/Support/RISCVISAInfo.cpp
++++ b/llvm/lib/Support/RISCVISAInfo.cpp
+@@ -64,6 +64,7 @@ static const RISCVSupportedExtension SupportedExtensions[] = {
+     {"zbb", RISCVExtensionVersion{1, 0}},
+     {"zbc", RISCVExtensionVersion{1, 0}},
+     {"zbs", RISCVExtensionVersion{1, 0}},
++    {"b", RISCVExtensionVersion{1, 0}},
+ 
+     {"zbkb", RISCVExtensionVersion{1, 0}},
+     {"zbkc", RISCVExtensionVersion{1, 0}},
+@@ -707,7 +708,13 @@ RISCVISAInfo::parseArchString(StringRef Arch, bool EnableExperimentalExtension,
+                                "unsupported standard user-level extension '%c'",
+                                C);
+     }
+-    ISAInfo->addExtension(std::string(1, C), Major, Minor);
++    if (C == 'b') {
++      ISAInfo->addExtension("zba", Major, Minor);
++      ISAInfo->addExtension("zbb", Major, Minor);
++      ISAInfo->addExtension("zbc", Major, Minor);
++      ISAInfo->addExtension("zbs", Major, Minor);
++    } else
++      ISAInfo->addExtension(std::string(1, C), Major, Minor);
+ 
+     // Consume full extension name and version, including any optional '_'
+     // between this extension and the next
+diff --git a/llvm/lib/Target/RISCV/RISCVFeatures.td b/llvm/lib/Target/RISCV/RISCVFeatures.td
+index be8834fd4c2f..c0443eddeb90 100644
+--- a/llvm/lib/Target/RISCV/RISCVFeatures.td
++++ b/llvm/lib/Target/RISCV/RISCVFeatures.td
+@@ -547,3 +547,15 @@ def FeatureTaggedGlobals : SubtargetFeature<"tagged-globals",
+     "AllowTaggedGlobals",
+     "true", "Use an instruction sequence for taking the address of a global "
+     "that allows a memory tag in the upper address bits">;
++
++def FeatureStdExtB
++    : SubtargetFeature<"b", "HasStdExtB", "true",
++                       "'B' (Bit Manipulation Instructions)",
++                       [FeatureStdExtZba,
++                        FeatureStdExtZbb,
++                        FeatureStdExtZbc,
++                        FeatureStdExtZbs]>;
++def HasStdExtB : Predicate<"Subtarget->hasStdExtB()">,
++                           AssemblerPredicate<(all_of FeatureStdExtB),
++                           "'B' (Bit Manipulation Instructions)">;
++
+-- 
+2.25.1
+

+ 4 - 3
recipes-devtools/clang/clang/0008-clang-Prepend-trailing-to-sysroot.patch

@@ -1,4 +1,4 @@
-From 610d6a7c8c9d21f10b225f971a377be49bbaea4f Mon Sep 17 00:00:00 2001
+From 51b99c1b9836f2e6967f1192f16fb639e127df2e Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Thu, 16 Mar 2017 09:02:13 -0700
 Subject: [PATCH] clang: Prepend trailing '/' to sysroot
@@ -18,16 +18,17 @@ to linker steps which would then be wrong
 since they will become relative to clang
 installation and not sysroot
 
+Upstream-Status: Pending
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
  clang/lib/Driver/ToolChains/Linux.cpp | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp
-index 97e987c37e4a..f9e233f15dfc 100644
+index 2a58f876a68d..c68a842b45e0 100644
 --- a/clang/lib/Driver/ToolChains/Linux.cpp
 +++ b/clang/lib/Driver/ToolChains/Linux.cpp
-@@ -181,7 +181,7 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
+@@ -184,7 +184,7 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
    Multilibs = GCCInstallation.getMultilibs();
    SelectedMultilib = GCCInstallation.getMultilib();
    llvm::Triple::ArchType Arch = Triple.getArch();

+ 38 - 0
recipes-devtools/clang/clang/0009-RISCV-Align-default-march-with-dubhe-gcc-toolchain.patch

@@ -0,0 +1,38 @@
+From a108ed8c2f32b4c5929b3bd72f1b4d1830ddcd4a Mon Sep 17 00:00:00 2001
+From: "max.ma" <max.ma@starfivetech.com>
+Date: Mon, 26 Jun 2023 03:04:07 -0700
+Subject: [PATCH 9/9] [RISCV] Align default march with dubhe gcc toolchain
+
+---
+ clang/lib/Driver/ToolChains/Arch/RISCV.cpp | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
+
+diff --git a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
+index 4c34c09d5589..dddf8d7cd168 100644
+--- a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
++++ b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
+@@ -220,9 +220,7 @@ StringRef riscv::getRISCVABI(const ArgList &Args, const llvm::Triple &Triple) {
+     else
+       return "ilp32d";
+   } else {
+-    if (Triple.getOS() == llvm::Triple::UnknownOS)
+-      return "lp64";
+-    else
++      //align default march with dubhe gcc toolchain
+       return "lp64d";
+   }
+ }
+@@ -299,9 +297,7 @@ StringRef riscv::getRISCVArch(const llvm::opt::ArgList &Args,
+     else
+       return "rv32imafdc";
+   } else {
+-    if (Triple.getOS() == llvm::Triple::UnknownOS)
+-      return "rv64imac";
+-    else
++      //align default march with dubhe gcc toolchain
+       return "rv64imafdc";
+   }
+ }
+-- 
+2.25.1
+

+ 9 - 8
recipes-devtools/clang/clang/0009-clang-Look-inside-the-target-sysroot-for-compiler-ru.patch

@@ -1,4 +1,4 @@
-From da2647d56a98cc708a6b13e3586e7fb364ef77a0 Mon Sep 17 00:00:00 2001
+From 243f40f492fbbbc3104de0fc77eef3122a4a42c4 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Thu, 16 Mar 2017 19:06:26 -0700
 Subject: [PATCH] clang: Look inside the target sysroot for compiler runtime
@@ -9,13 +9,14 @@ driver installation where the libraries are not instlled
 
 Specific to cross compiling the way yocto/OE works
 
+Upstream-Status: Pending
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
  clang/lib/Driver/ToolChain.cpp | 6 +++++-
  1 file changed, 5 insertions(+), 1 deletion(-)
 
 diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
-index d657d21bfcdb..e83a556b708c 100644
+index bc70205a6c01..527efd421e01 100644
 --- a/clang/lib/Driver/ToolChain.cpp
 +++ b/clang/lib/Driver/ToolChain.cpp
 @@ -13,6 +13,7 @@
@@ -26,15 +27,15 @@ index d657d21bfcdb..e83a556b708c 100644
  #include "clang/Config/config.h"
  #include "clang/Driver/Action.h"
  #include "clang/Driver/Driver.h"
-@@ -419,7 +420,10 @@ StringRef ToolChain::getOSLibName() const {
+@@ -488,7 +489,10 @@ StringRef ToolChain::getOSLibName() const {
  }
  
  std::string ToolChain::getCompilerRTPath() const {
 -  SmallString<128> Path(getDriver().ResourceDir);
 +  SmallString<128> Path(getDriver().SysRoot);
-+  StringRef ClangLibdirSuffix(CLANG_LIBDIR_SUFFIX);
-+  llvm::sys::path::append(Path, "/usr/", Twine("lib") + ClangLibdirSuffix, "clang",
++  StringRef ClangLibdirBasename(CLANG_INSTALL_LIBDIR_BASENAME);
++  llvm::sys::path::append(Path, "/usr/", ClangLibdirBasename, "clang",
 +                            CLANG_VERSION_STRING);
-   if (Triple.isOSUnknown()) {
-     llvm::sys::path::append(Path, "lib");
-   } else {
+   if (isBareMetal()) {
+     llvm::sys::path::append(Path, "lib", getOSLibName());
+     Path += SelectedMultilib.gccSuffix();

+ 5 - 3
recipes-devtools/clang/clang/0010-clang-Define-releative-gcc-installation-dir.patch

@@ -1,4 +1,4 @@
-From 6e17f402773f9408a62c8d03a39db5af6f637653 Mon Sep 17 00:00:00 2001
+From d1fdcd76fc759e644d697c967ddfbeae279aa7ac Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Sat, 20 Mar 2021 16:09:16 -0700
 Subject: [PATCH] clang: Define / releative gcc installation dir
@@ -8,16 +8,18 @@ Without this its not able to find the paths for libgcc
 and other standard headers and libraries from gcc
 installation in OE
 
+Upstream-Status: Pending
+
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
  clang/lib/Driver/ToolChains/Gnu.cpp | 14 +++++++-------
  1 file changed, 7 insertions(+), 7 deletions(-)
 
 diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
-index 633daa58590d..d22eaf698eb8 100644
+index cc9ed4f6b8ac..846163329d92 100644
 --- a/clang/lib/Driver/ToolChains/Gnu.cpp
 +++ b/clang/lib/Driver/ToolChains/Gnu.cpp
-@@ -2517,19 +2517,19 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
+@@ -2681,19 +2681,19 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
      // Whether this library suffix is relevant for the triple.
      bool Active;
    } Suffixes[] = {

+ 6 - 5
recipes-devtools/clang/clang/0011-clang-Add-lpthread-and-ldl-along-with-lunwind-for-st.patch

@@ -1,4 +1,4 @@
-From 718bc533b5d621ee5eb24a87ed882bf82360807c Mon Sep 17 00:00:00 2001
+From 16ec16d11424040b83b360199ab785650bd1fb65 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Wed, 31 Jul 2019 22:51:39 -0700
 Subject: [PATCH] clang: Add -lpthread and -ldl along with -lunwind for static
@@ -14,21 +14,22 @@ libunwind/src/AddressSpace.hpp:597: undefined reference to `dladdr'
 
 therefore we need to link in libpthread and libdl to fill these symbols
 
+Upstream-Status: Pending
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
  clang/lib/Driver/ToolChains/CommonArgs.cpp | 2 ++
  1 file changed, 2 insertions(+)
 
 diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
-index dfcef2304040..dbc91e427dfb 100644
+index 0883631dfe98..dfab4075e03e 100644
 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
 +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
-@@ -1472,6 +1472,8 @@ static void AddUnwindLibrary(const ToolChain &TC, const Driver &D,
+@@ -1718,6 +1718,8 @@ static void AddUnwindLibrary(const ToolChain &TC, const Driver &D,
          CmdArgs.push_back("-lunwind");
      } else if (LGT == LibGccType::StaticLibGcc) {
        CmdArgs.push_back("-l:libunwind.a");
 +      CmdArgs.push_back("-lpthread");
 +      CmdArgs.push_back("-ldl");
-     } else if (TC.getTriple().isOSCygMing()) {
-       if (LGT == LibGccType::SharedLibGcc)
+     } else if (LGT == LibGccType::SharedLibGcc) {
+       if (TC.getTriple().isOSCygMing())
          CmdArgs.push_back("-l:libunwind.dll.a");

+ 7 - 6
recipes-devtools/clang/clang/0012-Pass-PYTHON_EXECUTABLE-when-cross-compiling-for-nati.patch

@@ -1,8 +1,9 @@
-From d26acd3f09d6796c35b29a70480142e70ec74d51 Mon Sep 17 00:00:00 2001
+From e9e65cc455973c05ae3502b84bc90b3f8b70b438 Mon Sep 17 00:00:00 2001
 From: Anuj Mittal <anuj.mittal@intel.com>
 Date: Thu, 26 Dec 2019 12:56:16 -0800
 Subject: [PATCH] Pass PYTHON_EXECUTABLE when cross compiling for native build
 
+Upstream-Status: Pending
 Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
@@ -10,14 +11,14 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  1 file changed, 1 insertion(+)
 
 diff --git a/llvm/cmake/modules/CrossCompile.cmake b/llvm/cmake/modules/CrossCompile.cmake
-index 2a39b6a40a28..8a441729c943 100644
+index a46a0fd630b0..55f6dba2901a 100644
 --- a/llvm/cmake/modules/CrossCompile.cmake
 +++ b/llvm/cmake/modules/CrossCompile.cmake
-@@ -84,6 +84,7 @@ function(llvm_create_cross_target project_name target_name toolchain buildtype)
-         -DLLVM_ENABLE_RUNTIMES="${llvm_enable_runtimes_arg}"
-         ${external_project_source_dirs}
+@@ -86,6 +86,7 @@ function(llvm_create_cross_target project_name target_name toolchain buildtype)
          -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN="${LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN}"
-+	-DPYTHON_EXECUTABLE="${PYTHON_EXECUTABLE}"
+         -DLLVM_INCLUDE_BENCHMARKS=OFF
+         -DLLVM_INCLUDE_TESTS=OFF
++        -DPYTHON_EXECUTABLE="${PYTHON_EXECUTABLE}"
          ${build_type_flags} ${linker_flag} ${external_clang_dir}
          ${ARGN}
      WORKING_DIRECTORY ${${project_name}_${target_name}_BUILD}

+ 3 - 2
recipes-devtools/clang/clang/0013-Check-for-atomic-double-intrinsics.patch

@@ -1,4 +1,4 @@
-From 8bee07de2d0078373f0f1a72e924d7808ddf03e0 Mon Sep 17 00:00:00 2001
+From b0310dcff11cade76add2b84f9d694fc626284ee Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Mon, 18 Nov 2019 17:00:29 -0800
 Subject: [PATCH] Check for atomic<double> intrinsics
@@ -9,13 +9,14 @@ therefore detect if clang can use built-ins for atomic<double> if not
 then link libatomic, this helps building clangd for x86 on linux systems
 with gcc runtime
 
+Upstream-Status: Pending
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
  llvm/cmake/modules/CheckAtomic.cmake | 3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)
 
 diff --git a/llvm/cmake/modules/CheckAtomic.cmake b/llvm/cmake/modules/CheckAtomic.cmake
-index 3c5ba72993a3..34a1b950bbed 100644
+index f11cadf39ff6..80a18a92956a 100644
 --- a/llvm/cmake/modules/CheckAtomic.cmake
 +++ b/llvm/cmake/modules/CheckAtomic.cmake
 @@ -30,10 +30,11 @@ function(check_working_cxx_atomics64 varname)

+ 7 - 7
recipes-devtools/clang/clang/0014-libcxx-Add-compiler-runtime-library-to-link-step-for.patch

@@ -1,4 +1,4 @@
-From 3d7469e6d46dd19a20500fdb56f21a0cc7198e9d Mon Sep 17 00:00:00 2001
+From fbe1464c92e5b4e078390c040f0a7f446cda81f0 Mon Sep 17 00:00:00 2001
 From: Jeremy Puhlman <jpuhlman@mvista.com>
 Date: Thu, 16 Jan 2020 21:16:10 +0000
 Subject: [PATCH] libcxx: Add compiler runtime library to link step for libcxx
@@ -14,10 +14,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 diff --git a/libcxx/src/CMakeLists.txt b/libcxx/src/CMakeLists.txt
-index 12dcdf954405..54e446e2aecd 100644
+index 9ff2a62e9394..e76625d5a5ac 100644
 --- a/libcxx/src/CMakeLists.txt
 +++ b/libcxx/src/CMakeLists.txt
-@@ -212,7 +212,7 @@ if (LIBCXX_ENABLE_SHARED)
+@@ -200,7 +200,7 @@ if (LIBCXX_ENABLE_SHARED)
    add_library(cxx_shared SHARED ${exclude_from_all} ${LIBCXX_SOURCES} ${LIBCXX_HEADERS})
    target_include_directories(cxx_shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
    target_link_libraries(cxx_shared PUBLIC cxx-headers
@@ -26,12 +26,12 @@ index 12dcdf954405..54e446e2aecd 100644
    set_target_properties(cxx_shared
      PROPERTIES
        COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}"
-@@ -290,7 +290,7 @@ if (LIBCXX_ENABLE_STATIC)
+@@ -294,7 +294,7 @@ if (LIBCXX_ENABLE_STATIC)
    add_library(cxx_static STATIC ${exclude_from_all} ${LIBCXX_SOURCES} ${LIBCXX_HEADERS})
    target_include_directories(cxx_static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
    target_link_libraries(cxx_static PUBLIC cxx-headers
--                                   PRIVATE ${LIBCXX_LIBRARIES})
-+                                   PRIVATE ${LIBCXX_LIBRARIES} "$$($$CC --print-libgcc-file-name)")
+-                                   PRIVATE ${LIBCXX_LIBRARIES}
++                                   PRIVATE ${LIBCXX_LIBRARIES} "$$($$CC --print-libgcc-file-name)"
+                                    PRIVATE libcxx-abi-static)
    set_target_properties(cxx_static
      PROPERTIES
-       COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}"

+ 48 - 49
recipes-devtools/clang/clang/0015-clang-llvm-cmake-Fix-configure-for-packages-using-fi.patch

@@ -1,4 +1,4 @@
-From 728e023a8d2dc85402fbe1295e87023fdb7c4c1b Mon Sep 17 00:00:00 2001
+From f16083f3436f1286941547b3036787f128c9d8a4 Mon Sep 17 00:00:00 2001
 From: Ovidiu Panait <ovidiu.panait@windriver.com>
 Date: Fri, 31 Jan 2020 10:56:11 +0200
 Subject: [PATCH] clang,llvm: cmake: Fix configure for packages using
@@ -22,58 +22,58 @@ This is due to the fact that currently the cmake scripts look for target
 binaries in sysroot. Work around this by not exporting the target binaries in
 Exports-* cmake files.
 
-Upstream-Status: Innapropriate [oe-specific]
+Upstream-Status: Inappropriate [oe-specific]
 
 Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
 ---
  clang/cmake/modules/AddClang.cmake | 2 --
  llvm/cmake/modules/AddLLVM.cmake   | 6 ------
- llvm/cmake/modules/TableGen.cmake  | 7 -------
- 3 files changed, 15 deletions(-)
+ llvm/cmake/modules/TableGen.cmake  | 6 ------
+ 3 files changed, 14 deletions(-)
 
 diff --git a/clang/cmake/modules/AddClang.cmake b/clang/cmake/modules/AddClang.cmake
-index 9bbbfc032b7d..7ee5170bbc71 100644
+index 75b0080f6715..ddf446a13eca 100644
 --- a/clang/cmake/modules/AddClang.cmake
 +++ b/clang/cmake/modules/AddClang.cmake
-@@ -159,7 +159,6 @@ macro(add_clang_tool name)
-   if (CLANG_BUILD_TOOLS)
-     get_target_export_arg(${name} Clang export_to_clangtargets)
-     install(TARGETS ${name}
--      ${export_to_clangtargets}
-       RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
-       COMPONENT ${name})
+@@ -168,7 +168,6 @@ macro(add_clang_tool name)
+     if (CLANG_BUILD_TOOLS)
+       get_target_export_arg(${name} Clang export_to_clangtargets)
+       install(TARGETS ${name}
+-        ${export_to_clangtargets}
+         RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+         COMPONENT ${name})
  
-@@ -168,7 +167,6 @@ macro(add_clang_tool name)
-                                DEPENDS ${name}
-                                COMPONENT ${name})
+@@ -177,7 +176,6 @@ macro(add_clang_tool name)
+                                  DEPENDS ${name}
+                                  COMPONENT ${name})
+       endif()
+-      set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name})
      endif()
--    set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name})
    endif()
  endmacro()
- 
 diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake
-index 37bc98f9e021..d34083fa52ec 100644
+index 94fc83db9344..5155b0222d87 100644
 --- a/llvm/cmake/modules/AddLLVM.cmake
 +++ b/llvm/cmake/modules/AddLLVM.cmake
-@@ -1251,7 +1251,6 @@ macro(add_llvm_tool name)
-     if( LLVM_BUILD_TOOLS )
-       get_target_export_arg(${name} LLVM export_to_llvmexports)
-       install(TARGETS ${name}
--              ${export_to_llvmexports}
-               RUNTIME DESTINATION ${LLVM_TOOLS_INSTALL_DIR}
-               COMPONENT ${name})
+@@ -1335,7 +1335,6 @@ macro(llvm_add_tool project name)
+       if( LLVM_BUILD_TOOLS )
+         get_target_export_arg(${name} LLVM export_to_llvmexports)
+         install(TARGETS ${name}
+-                ${export_to_llvmexports}
+                 RUNTIME DESTINATION ${${project}_TOOLS_INSTALL_DIR}
+                 COMPONENT ${name})
  
-@@ -1262,9 +1261,6 @@ macro(add_llvm_tool name)
+@@ -1346,9 +1345,6 @@ macro(llvm_add_tool project name)
+         endif()
        endif()
      endif()
+-    if( LLVM_BUILD_TOOLS )
+-      set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
+-    endif()
+     set_target_properties(${name} PROPERTIES FOLDER "Tools")
    endif()
--  if( LLVM_BUILD_TOOLS )
--    set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
--  endif()
-   set_target_properties(${name} PROPERTIES FOLDER "Tools")
- endmacro(add_llvm_tool name)
- 
-@@ -1304,7 +1300,6 @@ macro(add_llvm_utility name)
+ endmacro(llvm_add_tool project name)
+@@ -1393,7 +1389,6 @@ macro(add_llvm_utility name)
      if (LLVM_INSTALL_UTILS AND LLVM_BUILD_UTILS)
        get_target_export_arg(${name} LLVM export_to_llvmexports)
        install(TARGETS ${name}
@@ -81,7 +81,7 @@ index 37bc98f9e021..d34083fa52ec 100644
                RUNTIME DESTINATION ${LLVM_UTILS_INSTALL_DIR}
                COMPONENT ${name})
  
-@@ -1313,7 +1308,6 @@ macro(add_llvm_utility name)
+@@ -1402,7 +1397,6 @@ macro(add_llvm_utility name)
                                   DEPENDS ${name}
                                   COMPONENT ${name})
        endif()
@@ -90,27 +90,26 @@ index 37bc98f9e021..d34083fa52ec 100644
        set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS_BUILDTREE_ONLY ${name})
      endif()
 diff --git a/llvm/cmake/modules/TableGen.cmake b/llvm/cmake/modules/TableGen.cmake
-index 59fd0d3b0733..3b9ac56ed37f 100644
+index 70c2edb8c833..e012fea08982 100644
 --- a/llvm/cmake/modules/TableGen.cmake
 +++ b/llvm/cmake/modules/TableGen.cmake
-@@ -183,14 +183,8 @@ macro(add_tablegen target project)
-   endif()
+@@ -189,12 +189,7 @@ macro(add_tablegen target project)
  
-   if ((${project} STREQUAL LLVM OR ${project} STREQUAL MLIR) AND NOT LLVM_INSTALL_TOOLCHAIN_ONLY AND LLVM_BUILD_UTILS)
--    set(export_to_llvmexports)
--    if(${target} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
--        NOT LLVM_DISTRIBUTION_COMPONENTS)
--      set(export_to_llvmexports EXPORT LLVMExports)
+   if (ADD_TABLEGEN_DESTINATION AND NOT LLVM_INSTALL_TOOLCHAIN_ONLY AND
+       (LLVM_BUILD_UTILS OR ${target} IN_LIST LLVM_DISTRIBUTION_COMPONENTS))
+-    set(export_arg)
+-    if(ADD_TABLEGEN_EXPORT)
+-      get_target_export_arg(${target} ${ADD_TABLEGEN_EXPORT} export_arg)
 -    endif()
- 
      install(TARGETS ${target}
--            ${export_to_llvmexports}
+-            ${export_arg}
              COMPONENT ${target}
-             RUNTIME DESTINATION ${LLVM_TOOLS_INSTALL_DIR})
+             RUNTIME DESTINATION "${ADD_TABLEGEN_DESTINATION}")
      if(NOT LLVM_ENABLE_IDE)
-@@ -199,5 +193,4 @@ macro(add_tablegen target project)
-                                COMPONENT ${target})
-     endif()
+@@ -205,6 +200,5 @@ macro(add_tablegen target project)
+   endif()
+   if(ADD_TABLEGEN_EXPORT)
+     string(TOUPPER ${ADD_TABLEGEN_EXPORT} export_upper)
+-    set_property(GLOBAL APPEND PROPERTY ${export_upper}_EXPORTS ${target})
    endif()
--  set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${target})
  endmacro()

+ 6 - 5
recipes-devtools/clang/clang/0016-clang-Fix-resource-dir-location-for-cross-toolchains.patch

@@ -1,4 +1,4 @@
-From e12e426d3c67b17d74879d7dec434eb64310881e Mon Sep 17 00:00:00 2001
+From 3b58bf71bf2908d1c7361e420b13330366402ea6 Mon Sep 17 00:00:00 2001
 From: Jim Broadus <jbroadus@xevo.com>
 Date: Thu, 26 Mar 2020 16:05:53 -0700
 Subject: [PATCH] clang: Fix resource dir location for cross toolchains
@@ -12,6 +12,7 @@ This causes clang to form a path that looks like /usr/bin/lib/clang/...
 As a fix for this, check the parent directory name. If that is "bin", then
 use that directory's parent.
 
+Upstream-Status: Pending
 Signed-off-by: Jim Broadus <jbroadus@xevo.com>
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
@@ -19,10 +20,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  1 file changed, 7 insertions(+), 1 deletion(-)
 
 diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
-index 3bfddeefc7b2..8a806efb292b 100644
+index a268f2fa8fc5..ab813044dc8c 100644
 --- a/clang/lib/Driver/Driver.cpp
 +++ b/clang/lib/Driver/Driver.cpp
-@@ -176,7 +176,13 @@ std::string Driver::GetResourcesPath(StringRef BinaryPath,
+@@ -181,7 +181,13 @@ std::string Driver::GetResourcesPath(StringRef BinaryPath,
      // With a static-library build of libclang, LibClangPath will contain the
      // path of the embedding binary, which for LLVM binaries will be in bin/.
      // ../lib gets us to lib/ in both cases.
@@ -34,6 +35,6 @@ index 3bfddeefc7b2..8a806efb292b 100644
 +      Dir = std::string(llvm::sys::path::parent_path(Dir));
 +    }
 +    P = Dir;
-     llvm::sys::path::append(P, Twine("lib") + CLANG_LIBDIR_SUFFIX, "clang",
-                             CLANG_VERSION_STRING);
+     llvm::sys::path::append(P, CLANG_INSTALL_LIBDIR_BASENAME, "clang",
+                             CLANG_VERSION_MAJOR_STRING);
    }

+ 7 - 6
recipes-devtools/clang/clang/0017-clang-driver-Add-dyld-prefix-when-checking-sysroot-f.patch

@@ -1,4 +1,4 @@
-From 554002679332300b789cf44384c2274840ed24d9 Mon Sep 17 00:00:00 2001
+From a9127817f4ceb0f19e99c89c08ffb1d9d256d1a2 Mon Sep 17 00:00:00 2001
 From: Oleksandr Ocheretnyi <oocheret@cisco.com>
 Date: Wed, 15 Apr 2020 00:08:39 +0300
 Subject: [PATCH] clang: driver: Add dyld-prefix when checking sysroot for ldso
@@ -11,6 +11,7 @@ Subject: [PATCH] clang: driver: Add dyld-prefix when checking sysroot for ldso
    'clang: driver: Check sysroot for ldso path' which includes
    the usrmerge scenario.
 
+Upstream-Status: Pending
 Signed-off-by: Oleksandr Ocheretnyi <oocheret@cisco.com>
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
@@ -18,10 +19,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  1 file changed, 8 insertions(+), 8 deletions(-)
 
 diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp
-index f9e233f15dfc..bf73b1ef27db 100644
+index c68a842b45e0..ca9f5f2e4f74 100644
 --- a/clang/lib/Driver/ToolChains/Linux.cpp
 +++ b/clang/lib/Driver/ToolChains/Linux.cpp
-@@ -493,8 +493,8 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
+@@ -518,8 +518,8 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
      LibDir = "lib64";
      Loader =
          (tools::ppc::hasPPCAbiArg(Args, "elfv2")) ? "ld64.so.2" : "ld64.so.1";
@@ -32,7 +33,7 @@ index f9e233f15dfc..bf73b1ef27db 100644
          LibDir = "lib";
      }
      break;
-@@ -502,8 +502,8 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
+@@ -527,8 +527,8 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
      LibDir = "lib64";
      Loader =
          (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "ld64.so.1" : "ld64.so.2";
@@ -43,7 +44,7 @@ index f9e233f15dfc..bf73b1ef27db 100644
          LibDir = "lib";
      }
      break;
-@@ -527,8 +527,8 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
+@@ -552,8 +552,8 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
    case llvm::Triple::sparcv9:
      LibDir = "lib64";
      Loader = "ld-linux.so.2";
@@ -54,7 +55,7 @@ index f9e233f15dfc..bf73b1ef27db 100644
          LibDir = "lib";
      }
      break;
-@@ -545,8 +545,8 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
+@@ -570,8 +570,8 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
  
      LibDir = X32 ? "libx32" : "lib64";
      Loader = X32 ? "ld-linux-x32.so.2" : "ld-linux-x86-64.so.2";

+ 7 - 44
recipes-devtools/clang/clang/0018-clang-Use-python3-in-python-scripts.patch

@@ -1,25 +1,21 @@
-From d43e1333436fb61cea9d053d6999d6be74799ba3 Mon Sep 17 00:00:00 2001
-From: "yang.lee" <yang.lee@starfivetech.com>
-Date: Thu, 26 May 2022 11:18:32 +0800
-Subject: [PATCH 2/3] clang: Use python3 in python scripts
+From 5b8fe61522fbf453b514fc1c9f317742cf34cbcd Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Wed, 14 Oct 2020 22:19:57 -0700
+Subject: [PATCH] clang: Use python3 in python scripts
 
 Some scripts ask for python, but they work fine with python3
 and in OE python symlink is not exposed to build, only python3 is
 
-Rebased By Lee Yang
 Upstream-Status: Pending
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
  .../find-all-symbols/tool/run-find-all-symbols.py               | 2 +-
- clang-tools-extra/clang-tidy/add_new_check.py                   | 2 +-
- clang-tools-extra/clang-tidy/rename_check.py                    | 2 +-
  clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py            | 2 +-
- clang/tools/clang-format/git-clang-format                       | 2 +-
  clang/tools/scan-view/bin/scan-view                             | 2 +-
- 6 files changed, 6 insertions(+), 6 deletions(-)
+ 3 files changed, 3 insertions(+), 3 deletions(-)
 
 diff --git a/clang-tools-extra/clang-include-fixer/find-all-symbols/tool/run-find-all-symbols.py b/clang-tools-extra/clang-include-fixer/find-all-symbols/tool/run-find-all-symbols.py
-index 8655af137bb2..e95ba59a421c 100755
+index a0fa64592e62..27aa97a35571 100755
 --- a/clang-tools-extra/clang-include-fixer/find-all-symbols/tool/run-find-all-symbols.py
 +++ b/clang-tools-extra/clang-include-fixer/find-all-symbols/tool/run-find-all-symbols.py
 @@ -1,4 +1,4 @@
@@ -28,28 +24,8 @@ index 8655af137bb2..e95ba59a421c 100755
  #
  #=- run-find-all-symbols.py - Parallel find-all-symbols runner -*- python  -*-=#
  #
-diff --git a/clang-tools-extra/clang-tidy/add_new_check.py b/clang-tools-extra/clang-tidy/add_new_check.py
-index fc8397448631..0fc97862dcae 100644
---- a/clang-tools-extra/clang-tidy/add_new_check.py
-+++ b/clang-tools-extra/clang-tidy/add_new_check.py
-@@ -1,4 +1,4 @@
--#!/usr/bin/env python
-+#!/usr/bin/env python3
- #
- #===- add_new_check.py - clang-tidy check generator ---------*- python -*--===#
- #
-diff --git a/clang-tools-extra/clang-tidy/rename_check.py b/clang-tools-extra/clang-tidy/rename_check.py
-index 9c2021751e0e..4bb9af8cbe0a 100755
---- a/clang-tools-extra/clang-tidy/rename_check.py
-+++ b/clang-tools-extra/clang-tidy/rename_check.py
-@@ -1,4 +1,4 @@
--#!/usr/bin/env python
-+#!/usr/bin/env python3
- #
- #===- rename_check.py - clang-tidy check renamer ------------*- python -*--===#
- #
 diff --git a/clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py b/clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py
-index 6bd05531333b..9e134123ef44 100755
+index a26d2144b7f9..396a201b667e 100755
 --- a/clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py
 +++ b/clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py
 @@ -1,4 +1,4 @@
@@ -58,16 +34,6 @@ index 6bd05531333b..9e134123ef44 100755
  #
  #===- clang-tidy-diff.py - ClangTidy Diff Checker -----------*- python -*--===#
  #
-diff --git a/clang/tools/clang-format/git-clang-format b/clang/tools/clang-format/git-clang-format
-index 1d6f216240c1..4a12070c0081 100755
---- a/clang/tools/clang-format/git-clang-format
-+++ b/clang/tools/clang-format/git-clang-format
-@@ -1,4 +1,4 @@
--#!/usr/bin/env python
-+#!/usr/bin/env python3
- #
- #===- git-clang-format - ClangFormat Git Integration ---------*- python -*--===#
- #
 diff --git a/clang/tools/scan-view/bin/scan-view b/clang/tools/scan-view/bin/scan-view
 index 6165432e7af8..07effbca5969 100755
 --- a/clang/tools/scan-view/bin/scan-view
@@ -78,6 +44,3 @@ index 6165432e7af8..07effbca5969 100755
  
  from __future__ import print_function
  
--- 
-2.25.1
-

+ 4 - 4
recipes-devtools/clang/clang/0019-For-x86_64-set-Yocto-based-GCC-install-search-path.patch

@@ -1,4 +1,4 @@
-From d720595723c92fe8e2d17887bab85c6fd154825e Mon Sep 17 00:00:00 2001
+From ca344d46711d5ce6b5e0f7862b98bbfc7abb7d4c Mon Sep 17 00:00:00 2001
 From: Hongxu Jia <hongxu.jia@windriver.com>
 Date: Mon, 25 Jan 2021 16:14:35 +0800
 Subject: [PATCH] For x86_64, set Yocto based GCC install search path
@@ -45,7 +45,7 @@ is different between clang and clang-native
 
 The //CLANG_EXTRA_OE_VENDORS_TRIPLES string is replaced with list of
 additional triples based on CLANG_EXTRA_OE_VENDORS variable in
-recipes-devtools/clang/llvm-project-source.inc:add_more_target_vendors()
+recipes-devtools/clang/llvm-project-source.inc:add_distro_vendor()
 
 Upstream-Status: Inappropriate [oe specific]
 
@@ -57,10 +57,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  1 file changed, 1 insertion(+)
 
 diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
-index d22eaf698eb8..6fcd5abe7211 100644
+index 846163329d92..0db37c6ef1a8 100644
 --- a/clang/lib/Driver/ToolChains/Gnu.cpp
 +++ b/clang/lib/Driver/ToolChains/Gnu.cpp
-@@ -2105,6 +2105,7 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
+@@ -2254,6 +2254,7 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
        "x86_64-redhat-linux",    "x86_64-suse-linux",
        "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
        "x86_64-slackware-linux", "x86_64-unknown-linux",

+ 5 - 4
recipes-devtools/clang/clang/0020-llvm-Do-not-use-find_library-for-ncurses.patch

@@ -1,4 +1,4 @@
-From fd5760df7696cd9c6ec9ef38ed6cbab19d70e3ac Mon Sep 17 00:00:00 2001
+From 20208fe7aaaf65837d06bd00a5550134075a2b22 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Sun, 7 Feb 2021 23:58:41 -0800
 Subject: [PATCH] llvm: Do not use find_library for ncurses
@@ -10,6 +10,7 @@ horribly with native and target libs when build clang for target
 TOPDIR/build/tmp/work/cortexa57-yoe-linux-musl/clang/12.0.0-r0/recipe-sysroot-native/usr/lib/libtinfo.so: error adding symbols: file in wrong format
 clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
 
+Upstream-Status: Pending
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
  compiler-rt/cmake/config-ix.cmake     | 2 +-
@@ -17,10 +18,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  2 files changed, 2 insertions(+), 2 deletions(-)
 
 diff --git a/compiler-rt/cmake/config-ix.cmake b/compiler-rt/cmake/config-ix.cmake
-index 4299a0589a7b..cb53b6fd14bd 100644
+index 5f51befc1973..55c04b76908e 100644
 --- a/compiler-rt/cmake/config-ix.cmake
 +++ b/compiler-rt/cmake/config-ix.cmake
-@@ -149,7 +149,7 @@ else()
+@@ -179,7 +179,7 @@ else()
    set(MAYBE_REQUIRED)
  endif()
  if(LLVM_ENABLE_TERMINFO)
@@ -30,7 +31,7 @@ index 4299a0589a7b..cb53b6fd14bd 100644
  if(COMPILER_RT_TERMINFO_LIB)
    set(LLVM_ENABLE_TERMINFO 1)
 diff --git a/llvm/cmake/modules/FindTerminfo.cmake b/llvm/cmake/modules/FindTerminfo.cmake
-index 65edb80fa69a..a58180be8926 100644
+index eef1f95853eb..b3b330dd3d59 100644
 --- a/llvm/cmake/modules/FindTerminfo.cmake
 +++ b/llvm/cmake/modules/FindTerminfo.cmake
 @@ -11,7 +11,7 @@

+ 8 - 8
recipes-devtools/clang/clang/0021-llvm-Insert-anchor-for-adding-OE-distro-vendor-names.patch

@@ -1,4 +1,4 @@
-From ef4ee8181adc48116a563adafae014409e9432d0 Mon Sep 17 00:00:00 2001
+From c63accf38a7c7db518e01311b23e661392af916d Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Thu, 11 Feb 2021 16:42:49 -0800
 Subject: [PATCH] llvm: Insert anchor for adding OE distro vendor names
@@ -7,21 +7,21 @@ This helps in making right detection for OE built gcc toolchains
 
 The //CLANG_EXTRA_OE_VENDORS_CASES string is replaced with list of
 additional Ceses based on CLANG_EXTRA_OE_VENDORS variable in
-recipes-devtools/clang/llvm-project-source.inc:add_more_target_vendors()
+recipes-devtools/clang/llvm-project-source.inc:add_distro_vendor()
 
 Upstream-Status: Inappropriate [OE-specific]
 
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 Signed-off-by: Martin Jansa <martin.jansa@gmail.com>
 ---
- llvm/lib/Support/Triple.cpp | 2 +-
+ llvm/lib/TargetParser/Triple.cpp | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-diff --git a/llvm/lib/Support/Triple.cpp b/llvm/lib/Support/Triple.cpp
-index a9afcc9db96a..dc48caf02616 100644
---- a/llvm/lib/Support/Triple.cpp
-+++ b/llvm/lib/Support/Triple.cpp
-@@ -506,7 +506,7 @@ static Triple::VendorType parseVendor(StringRef VendorName) {
+diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
+index a68035989a93..ab1fef23d6fc 100644
+--- a/llvm/lib/TargetParser/Triple.cpp
++++ b/llvm/lib/TargetParser/Triple.cpp
+@@ -551,7 +551,7 @@ static Triple::VendorType parseVendor(StringRef VendorName) {
      .Case("amd", Triple::AMD)
      .Case("mesa", Triple::Mesa)
      .Case("suse", Triple::SUSE)

+ 1 - 1
recipes-devtools/clang/clang/0023-compiler-rt-Do-not-use-backtrace-APIs-on-non-glibc-l.patch → recipes-devtools/clang/clang/0022-compiler-rt-Do-not-use-backtrace-APIs-on-non-glibc-l.patch

@@ -1,4 +1,4 @@
-From e350e74522f03ed6d202b8130cf615e58a2ea714 Mon Sep 17 00:00:00 2001
+From f8ee0a66ba5b81f5489d8954dfc521f6b2612c6d Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Wed, 19 May 2021 17:32:13 -0700
 Subject: [PATCH] compiler-rt: Do not use backtrace APIs on non-glibc linux

+ 0 - 36
recipes-devtools/clang/clang/0022-compiler-rt-Use-mcr-based-barrier-on-armv6.patch

@@ -1,36 +0,0 @@
-From 0fab2593b436ef1aa87cb272297903a4e0189fd5 Mon Sep 17 00:00:00 2001
-From: "yang.lee" <yang.lee@starfivetech.com>
-Date: Thu, 26 May 2022 11:26:50 +0800
-Subject: [PATCH 3/3] compiler-rt: Use mcr based barrier on armv6
-
-dsb is an armv7 instruction and wont work when we are building for armv6.
-
-Rebased By Lee Yang
-Upstream-Status: Pending
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- compiler-rt/lib/builtins/assembly.h | 8 ++++++++
- 1 file changed, 8 insertions(+)
-
-diff --git a/compiler-rt/lib/builtins/assembly.h b/compiler-rt/lib/builtins/assembly.h
-index 69a3d8620f92..60bac86df218 100644
---- a/compiler-rt/lib/builtins/assembly.h
-+++ b/compiler-rt/lib/builtins/assembly.h
-@@ -189,6 +189,14 @@
-   JMP(ip)
- #endif
- 
-+#if __ARM_ARCH >= 7
-+#define DMB dmb
-+#elif __ARM_ARCH >= 6
-+#define DMB mcr p15, #0, r0, c7, c10, #5
-+#else
-+#error Only use this with ARMv6+
-+#endif
-+
- #if defined(USE_THUMB_2)
- #define WIDE(op) op.w
- #else
--- 
-2.25.1
-

+ 4 - 3
recipes-devtools/clang/clang/0024-clang-Fix-x86-triple-for-non-debian-multiarch-linux-.patch → recipes-devtools/clang/clang/0023-clang-Fix-x86-triple-for-non-debian-multiarch-linux-.patch

@@ -1,4 +1,4 @@
-From a310ecc416f38d81c13af43cdecaaf001cf06274 Mon Sep 17 00:00:00 2001
+From 013ee27a17e32ddf078bf33a82293a9f9980512e Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Wed, 19 May 2021 17:56:03 -0700
 Subject: [PATCH] clang: Fix x86 triple for non-debian multiarch linux distros
@@ -6,16 +6,17 @@ Subject: [PATCH] clang: Fix x86 triple for non-debian multiarch linux distros
 OpenEmbedded does not hardcode mutli-arch like debian therefore ensure
 that it still uses the proper tuple
 
+Upstream-Status: Pending
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
  clang/lib/Driver/ToolChains/Linux.cpp | 3 +++
  1 file changed, 3 insertions(+)
 
 diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp
-index bf73b1ef27db..eb92a037c930 100644
+index ca9f5f2e4f74..20c7c7a745be 100644
 --- a/clang/lib/Driver/ToolChains/Linux.cpp
 +++ b/clang/lib/Driver/ToolChains/Linux.cpp
-@@ -636,6 +636,9 @@ void Linux::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
+@@ -667,6 +667,9 @@ void Linux::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
        GCCInstallation.getTriple().getArch() == llvm::Triple::x86
            ? "i386-linux-gnu"
            : TripleStr;

+ 5 - 5
recipes-devtools/clang/clang/0027-libunwind-Added-unw_backtrace-method.patch → recipes-devtools/clang/clang/0024-libunwind-Added-unw_backtrace-method.patch

@@ -1,4 +1,4 @@
-From a71fda827da45c357d92d07ea491c208c1e044fe Mon Sep 17 00:00:00 2001
+From 959667047a6d92e3912762c8db5695a945c564b4 Mon Sep 17 00:00:00 2001
 From: Maksim Kita <maksim-kita@yandex-team.ru>
 Date: Sun, 23 May 2021 10:27:29 +0000
 Subject: [PATCH] libunwind: Added unw_backtrace method
@@ -12,10 +12,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  2 files changed, 19 insertions(+)
 
 diff --git a/libunwind/include/libunwind.h b/libunwind/include/libunwind.h
-index 9a74faa48d6f..f7480c9cf27a 100644
+index d2ad5ab87122..d735d955aee2 100644
 --- a/libunwind/include/libunwind.h
 +++ b/libunwind/include/libunwind.h
-@@ -127,6 +127,7 @@ extern int unw_is_fpreg(unw_cursor_t *, unw_regnum_t) LIBUNWIND_AVAIL;
+@@ -130,6 +130,7 @@ extern int unw_is_fpreg(unw_cursor_t *, unw_regnum_t) LIBUNWIND_AVAIL;
  extern int unw_is_signal_frame(unw_cursor_t *) LIBUNWIND_AVAIL;
  extern int unw_get_proc_name(unw_cursor_t *, char *, size_t, unw_word_t *) LIBUNWIND_AVAIL;
  //extern int       unw_get_save_loc(unw_cursor_t*, int, unw_save_loc_t*);
@@ -24,10 +24,10 @@ index 9a74faa48d6f..f7480c9cf27a 100644
  extern unw_addr_space_t unw_local_addr_space;
  
 diff --git a/libunwind/src/libunwind.cpp b/libunwind/src/libunwind.cpp
-index 03f8b75b5bba..730e2393a8f8 100644
+index 0faea2b78570..14bf07d8f470 100644
 --- a/libunwind/src/libunwind.cpp
 +++ b/libunwind/src/libunwind.cpp
-@@ -326,7 +326,25 @@ void __unw_remove_dynamic_eh_frame_section(unw_word_t eh_frame_start) {
+@@ -349,7 +349,25 @@ void __unw_remove_dynamic_eh_frame_section(unw_word_t eh_frame_start) {
  #endif // defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
  #endif // !defined(__USING_SJLJ_EXCEPTIONS__)
  

+ 3 - 3
recipes-devtools/clang/clang/0029-clang-Do-not-use-install-relative-libc-headers.patch → recipes-devtools/clang/clang/0025-clang-Do-not-use-install-relative-libc-headers.patch

@@ -1,4 +1,4 @@
-From 71a195e5ed96e47a21fe3f55708046350ebabdfe Mon Sep 17 00:00:00 2001
+From d249ebabcd4e0350acf3595f80160110cb0ab56d Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Wed, 11 Aug 2021 18:37:11 -0700
 Subject: [PATCH] clang: Do not use install relative libc++ headers
@@ -16,10 +16,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  1 file changed, 3 insertions(+), 1 deletion(-)
 
 diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
-index 6fcd5abe7211..0d04a199a7af 100644
+index 0db37c6ef1a8..80a21d58c86c 100644
 --- a/clang/lib/Driver/ToolChains/Gnu.cpp
 +++ b/clang/lib/Driver/ToolChains/Gnu.cpp
-@@ -2919,7 +2919,9 @@ Generic_GCC::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
+@@ -3093,7 +3093,9 @@ Generic_GCC::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
  
    // Android never uses the libc++ headers installed alongside the toolchain,
    // which are generally incompatible with the NDK libraries anyway.

+ 0 - 28
recipes-devtools/clang/clang/0025-compiler-rt-Link-scudo-with-SANITIZER_CXX_ABI_LIBRAR.patch

@@ -1,28 +0,0 @@
-From 4bbb4ab9d4cd3ff1424bed6346dd8e47cd4bcb24 Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Wed, 19 May 2021 21:49:18 -0700
-Subject: [PATCH] compiler-rt: Link scudo with SANITIZER_CXX_ABI_LIBRARIES
-
-If SANITIZER_CXX_ABI_LIBRARIES is set then link scudo with it, this
-fixes build time errors like
-
-projects/compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.armhf.dir/sanitizer_posix_libcdep.cpp.o: in function `__sanitizer::UnsetAlternateSignalStack()':
-| sanitizer_posix_libcdep.cpp:(.text+0x3d2): undefined reference to `__cxa_guard_acquire'
-
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- compiler-rt/lib/scudo/CMakeLists.txt | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/compiler-rt/lib/scudo/CMakeLists.txt b/compiler-rt/lib/scudo/CMakeLists.txt
-index 995e853e2a4d..25b79a8d17e8 100644
---- a/compiler-rt/lib/scudo/CMakeLists.txt
-+++ b/compiler-rt/lib/scudo/CMakeLists.txt
-@@ -15,6 +15,7 @@ append_list_if(COMPILER_RT_HAS_LIBDL dl SCUDO_MINIMAL_DYNAMIC_LIBS)
- append_list_if(COMPILER_RT_HAS_LIBRT rt SCUDO_MINIMAL_DYNAMIC_LIBS)
- append_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread SCUDO_MINIMAL_DYNAMIC_LIBS)
- append_list_if(COMPILER_RT_HAS_LIBLOG log SCUDO_MINIMAL_DYNAMIC_LIBS)
-+append_list_if(SANITIZER_CXX_ABI_LIBRARIES ${SANITIZER_CXX_ABI_LIBRARIES} SCUDO_MINIMAL_DYNAMIC_LIBS)
- append_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fno-omit-frame-pointer
-                SCUDO_CFLAGS)
- 

+ 4 - 4
recipes-devtools/clang/clang/0030-clang-Fix-how-driver-finds-GCC-installation-path-on-.patch → recipes-devtools/clang/clang/0026-clang-Fix-how-driver-finds-GCC-installation-path-on-.patch

@@ -1,4 +1,4 @@
-From d7b262b22c16436c836de7f39591eaafd28a4e21 Mon Sep 17 00:00:00 2001
+From 1801fad99e1dedbe8d40931b18c37d326a1d532c Mon Sep 17 00:00:00 2001
 From: David Abdurachmanov <david.abdurachmanov@sifive.com>
 Date: Wed, 20 Oct 2021 17:30:36 -0700
 Subject: [PATCH] clang: Fix how driver finds GCC installation path on
@@ -31,10 +31,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  1 file changed, 28 insertions(+), 11 deletions(-)
 
 diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
-index 0d04a199a7af..1e5a3cc2c1f1 100644
+index 80a21d58c86c..77f5c3f58a8b 100644
 --- a/clang/lib/Driver/ToolChains/Gnu.cpp
 +++ b/clang/lib/Driver/ToolChains/Gnu.cpp
-@@ -1641,18 +1641,29 @@ static void findRISCVMultilibs(const Driver &D,
+@@ -1748,18 +1748,29 @@ static void findRISCVMultilibs(const Driver &D,
      return findRISCVBareMetalMultilibs(D, TargetTriple, Path, Args, Result);
  
    FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
@@ -74,7 +74,7 @@ index 0d04a199a7af..1e5a3cc2c1f1 100644
  
    Multilib::flags_list Flags;
    bool IsRV64 = TargetTriple.getArch() == llvm::Triple::riscv64;
-@@ -2549,13 +2560,19 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
+@@ -2713,13 +2724,19 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
            continue; // Saw this path before; no need to look at it again.
        if (CandidateVersion.isOlderThan(4, 1, 1))
          continue;

+ 0 - 29
recipes-devtools/clang/clang/0026-compiler-rt-Link-scudo-standalone-with-libatomic-on-.patch

@@ -1,29 +0,0 @@
-From 0806d2c4a56116b99413c506e8ff5ebe11bf270f Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Fri, 21 May 2021 08:14:29 -0700
-Subject: [PATCH] compiler-rt: Link scudo standalone with libatomic on mips
-
-clang on mips generate atomic built-ins which should be provided by
-libatomic
-
-Upstream-Status: Pending
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- compiler-rt/lib/scudo/standalone/CMakeLists.txt | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/compiler-rt/lib/scudo/standalone/CMakeLists.txt b/compiler-rt/lib/scudo/standalone/CMakeLists.txt
-index 739f131bdefd..5862545b842b 100644
---- a/compiler-rt/lib/scudo/standalone/CMakeLists.txt
-+++ b/compiler-rt/lib/scudo/standalone/CMakeLists.txt
-@@ -137,6 +137,10 @@ append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread SCUDO_LINK_FLAGS)
- 
- append_list_if(FUCHSIA zircon SCUDO_LINK_LIBS)
- 
-+if (CMAKE_SYSTEM_PROCESSOR MATCHES "mips" AND CMAKE_SYSTEM_NAME MATCHES "Linux")
-+    list(APPEND SCUDO_LINK_LIBS atomic)
-+endif()
-+
- if(COMPILER_RT_HAS_SCUDO_STANDALONE)
-   add_compiler_rt_object_libraries(RTScudoStandalone
-     ARCHS ${SCUDO_STANDALONE_SUPPORTED_ARCH}

+ 11 - 11
recipes-devtools/clang/clang/0031-Fix-lib-paths-for-OpenEmbedded-Host.patch → recipes-devtools/clang/clang/0027-Fix-lib-paths-for-OpenEmbedded-Host.patch

@@ -1,4 +1,4 @@
-From 4dab11c8abdd1a48cd0df4475ef2f82732c7f7e3 Mon Sep 17 00:00:00 2001
+From b8dd608a9ca83b9c321dce3ca0d18e8aeea987af Mon Sep 17 00:00:00 2001
 From: Changqing Li <changqing.li@windriver.com>
 Date: Tue, 7 Dec 2021 04:08:22 +0000
 Subject: [PATCH] Fix lib paths for OpenEmbedded Host
@@ -48,18 +48,18 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  1 file changed, 4 insertions(+), 1 deletion(-)
 
 diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
-index 1e5a3cc2c1f1..d3574b86cb26 100644
+index 77f5c3f58a8b..0ec2dadafc05 100644
 --- a/clang/lib/Driver/ToolChains/Gnu.cpp
 +++ b/clang/lib/Driver/ToolChains/Gnu.cpp
-@@ -22,6 +22,7 @@
- #include "clang/Driver/Options.h"
- #include "clang/Driver/Tool.h"
- #include "clang/Driver/ToolChain.h"
+@@ -18,6 +18,7 @@
+ #include "Linux.h"
+ #include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
+ #include "clang/Driver/Compilation.h"
 +#include "clang/Driver/Distro.h"
- #include "llvm/Option/ArgList.h"
- #include "llvm/Support/CodeGen.h"
- #include "llvm/Support/Path.h"
-@@ -2518,6 +2519,7 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
+ #include "clang/Driver/Driver.h"
+ #include "clang/Driver/DriverDiagnostic.h"
+ #include "clang/Driver/Options.h"
+@@ -2682,6 +2683,7 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
      const llvm::Triple &TargetTriple, const ArgList &Args,
      const std::string &LibDir, StringRef CandidateTriple,
      bool NeedsBiarchSuffix, bool GCCDirExists, bool GCCCrossDirExists) {
@@ -67,7 +67,7 @@ index 1e5a3cc2c1f1..d3574b86cb26 100644
    // Locations relative to the system lib directory where GCC's triple-specific
    // directories might reside.
    struct GCCLibSuffix {
-@@ -2535,7 +2537,8 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
+@@ -2699,7 +2701,8 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
        // files in that location, not just GCC installation data.
        {CandidateTriple.str(), "..",
         TargetTriple.getVendor() == llvm::Triple::Freescale ||

+ 7 - 7
recipes-devtools/clang/clang/0032-Correct-library-search-path-for-OpenEmbedded-Host.patch → recipes-devtools/clang/clang/0028-Correct-library-search-path-for-OpenEmbedded-Host.patch

@@ -1,4 +1,4 @@
-From 12b439deed0381e603155a11f3aec5eb20cd6803 Mon Sep 17 00:00:00 2001
+From a4574f3cfd55c014d0e09956fe413835debe1b87 Mon Sep 17 00:00:00 2001
 From: Changqing Li <changqing.li@windriver.com>
 Date: Tue, 7 Dec 2021 04:55:48 +0000
 Subject: [PATCH] Correct library search path for OpenEmbedded Host
@@ -39,10 +39,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  3 files changed, 4 insertions(+)
 
 diff --git a/clang/include/clang/Driver/Distro.h b/clang/include/clang/Driver/Distro.h
-index 2723f75e8945..cd43e8f11574 100644
+index 1aaf93ddb7c4..31f03e327b78 100644
 --- a/clang/include/clang/Driver/Distro.h
 +++ b/clang/include/clang/Driver/Distro.h
-@@ -44,6 +44,7 @@ public:
+@@ -45,6 +45,7 @@ public:
      RHEL7,
      Fedora,
      Gentoo,
@@ -50,7 +50,7 @@ index 2723f75e8945..cd43e8f11574 100644
      OpenSUSE,
      UbuntuHardy,
      UbuntuIntrepid,
-@@ -132,6 +133,7 @@ public:
+@@ -135,6 +136,7 @@ public:
  
    bool IsGentoo() const { return DistroVal == Gentoo; }
  
@@ -59,7 +59,7 @@ index 2723f75e8945..cd43e8f11574 100644
  };
  
 diff --git a/clang/lib/Driver/Distro.cpp b/clang/lib/Driver/Distro.cpp
-index 5ac38c34d112..f20dd4b526e5 100644
+index 87a0c5a58511..b607a3f18d1e 100644
 --- a/clang/lib/Driver/Distro.cpp
 +++ b/clang/lib/Driver/Distro.cpp
 @@ -44,6 +44,7 @@ static Distro::DistroType DetectOsRelease(llvm::vfs::FileSystem &VFS) {
@@ -71,10 +71,10 @@ index 5ac38c34d112..f20dd4b526e5 100644
    return Version;
  }
 diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp
-index eb92a037c930..c92cef442005 100644
+index 20c7c7a745be..f5d9b3187cf5 100644
 --- a/clang/lib/Driver/ToolChains/Linux.cpp
 +++ b/clang/lib/Driver/ToolChains/Linux.cpp
-@@ -77,6 +77,7 @@ std::string Linux::getMultiarchTriple(const Driver &D,
+@@ -78,6 +78,7 @@ std::string Linux::getMultiarchTriple(const Driver &D,
        return "x86_64-linux-android";
      if (TargetEnvironment == llvm::Triple::GNUX32)
        return "x86_64-linux-gnux32";

+ 0 - 46
recipes-devtools/clang/clang/0028-Do-not-force-thumb-mode-directive.patch

@@ -1,46 +0,0 @@
-From f69f7529bc8b561ddc32a5057da6d74d90dd9c94 Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Sat, 12 Jun 2021 08:42:36 -0700
-Subject: [PATCH] Do not force thumb mode directive
-
-.thumb_func was not switching mode until [1]
-so it did not show up but now that .thumb_func (without argument) is
-switching mode, its causing build failures on armv6 ( rpi0 ) even when
-build is explicitly asking for this file to be built with -marm (ARM
-mode), therefore use DEFINE_COMPILERRT_FUNCTION macro to add function
-header which considers arch and mode from compiler cmdline to decide if
-the function is built using thumb mode or arm mode.
-
-[1] https://reviews.llvm.org/D101975
-
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- compiler-rt/lib/builtins/arm/sync-ops.h | 6 ++----
- 1 file changed, 2 insertions(+), 4 deletions(-)
-
-diff --git a/compiler-rt/lib/builtins/arm/sync-ops.h b/compiler-rt/lib/builtins/arm/sync-ops.h
-index 7a26170741ad..d914f9d3a109 100644
---- a/compiler-rt/lib/builtins/arm/sync-ops.h
-+++ b/compiler-rt/lib/builtins/arm/sync-ops.h
-@@ -16,9 +16,8 @@
- 
- #define SYNC_OP_4(op)                                                          \
-   .p2align 2;                                                                  \
--  .thumb;                                                                      \
-   .syntax unified;                                                             \
--  DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_##op)                      \
-+  DEFINE_COMPILERRT_FUNCTION(__sync_fetch_and_##op)                            \
-   DMB;                                                                         \
-   mov r12, r0;                                                                 \
-   LOCAL_LABEL(tryatomic_##op) : ldrex r0, [r12];                               \
-@@ -31,9 +30,8 @@
- 
- #define SYNC_OP_8(op)                                                          \
-   .p2align 2;                                                                  \
--  .thumb;                                                                      \
-   .syntax unified;                                                             \
--  DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_##op)                      \
-+  DEFINE_COMPILERRT_FUNCTION(__sync_fetch_and_##op)                            \
-   push {r4, r5, r6, lr};                                                       \
-   DMB;                                                                         \
-   mov r12, r0;                                                                 \

+ 2 - 2
recipes-devtools/clang/clang/0033-lldb-Link-with-libatomic-on-x86.patch → recipes-devtools/clang/clang/0029-lldb-Link-with-libatomic-on-x86.patch

@@ -1,4 +1,4 @@
-From 17c7ad88f765bfbcfe25dd8f76ab9264250b9ea3 Mon Sep 17 00:00:00 2001
+From e9c06e4994d4cd52d8783838186df8c93ffd0052 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Tue, 8 Feb 2022 01:31:26 -0800
 Subject: [PATCH] lldb: Link with libatomic on x86
@@ -17,7 +17,7 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  1 file changed, 4 insertions(+)
 
 diff --git a/lldb/source/Utility/CMakeLists.txt b/lldb/source/Utility/CMakeLists.txt
-index cc0bf5fdb61a..5228bf01c276 100644
+index 89acd7cd2eaf..6aa84f9d284d 100644
 --- a/lldb/source/Utility/CMakeLists.txt
 +++ b/lldb/source/Utility/CMakeLists.txt
 @@ -19,6 +19,10 @@ if (CMAKE_SYSTEM_NAME MATCHES "Windows")

+ 3 - 3
recipes-devtools/clang/clang/0034-clang-exclude-openembedded-distributions-from-settin.patch → recipes-devtools/clang/clang/0030-clang-exclude-openembedded-distributions-from-settin.patch

@@ -1,4 +1,4 @@
-From 5c0d026419a69d5b8722f1abb0000caa4c151885 Mon Sep 17 00:00:00 2001
+From b34b67256aa36ceb6bce1b6f657ad129ecf90313 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Fri, 11 Feb 2022 12:29:14 -0800
 Subject: [PATCH] clang: exclude openembedded distributions from setting rpath
@@ -18,10 +18,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com>
  1 file changed, 5 insertions(+)
 
 diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
-index dbc91e427dfb..b2cbfca9898c 100644
+index dfab4075e03e..14c6f0a3b21d 100644
 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
 +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
-@@ -648,6 +648,11 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
+@@ -794,6 +794,11 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
  void tools::addOpenMPRuntimeSpecificRPath(const ToolChain &TC,
                                            const ArgList &Args,
                                            ArgStringList &CmdArgs) {

+ 30 - 15
recipes-devtools/clang/clang/0035-compiler-rt-Enable-__int128-for-ppc32.patch → recipes-devtools/clang/clang/0031-compiler-rt-Enable-__int128-for-ppc32.patch

@@ -1,4 +1,4 @@
-From 734aaa66800b91abe42bdef1dd721c368fa17b07 Mon Sep 17 00:00:00 2001
+From 2a622188e62705f20d7806926a99f47f727d8858 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Wed, 9 Mar 2022 16:28:16 -0800
 Subject: [PATCH] compiler-rt: Enable __int128 for ppc32
@@ -6,15 +6,15 @@ Subject: [PATCH] compiler-rt: Enable __int128 for ppc32
 Upstream-Status: Pending
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
- compiler-rt/lib/builtins/CMakeLists.txt | 7 +++----
- compiler-rt/lib/builtins/int_types.h    | 2 +-
- 2 files changed, 4 insertions(+), 5 deletions(-)
+ compiler-rt/lib/builtins/CMakeLists.txt | 15 +++++++--------
+ compiler-rt/lib/builtins/int_types.h    |  2 +-
+ 2 files changed, 8 insertions(+), 9 deletions(-)
 
 diff --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt
-index ea5ad9cdb864..4d1efc690d71 100644
+index 2fc70522895f..55f0ecb20a1f 100644
 --- a/compiler-rt/lib/builtins/CMakeLists.txt
 +++ b/compiler-rt/lib/builtins/CMakeLists.txt
-@@ -607,8 +607,6 @@ set(mips64_SOURCES ${GENERIC_TF_SOURCES}
+@@ -668,11 +668,9 @@ set(mips64_SOURCES ${GENERIC_TF_SOURCES}
  set(mips64el_SOURCES ${GENERIC_TF_SOURCES}
                       ${mips_SOURCES})
  
@@ -22,16 +22,31 @@ index ea5ad9cdb864..4d1efc690d71 100644
 -
  set(powerpcspe_SOURCES ${GENERIC_SOURCES})
  
- set(powerpc64_SOURCES
-@@ -634,6 +632,7 @@ if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
+-set(powerpc64_SOURCES
++set(powerpc_SOURCES
+   ppc/divtc3.c
+   ppc/fixtfdi.c
+   ppc/fixunstfdi.c
+@@ -687,14 +685,15 @@ set(powerpc64_SOURCES
+ )
+ # These routines require __int128, which isn't supported on AIX.
+ if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
+-  set(powerpc64_SOURCES
++  set(powerpc_SOURCES
+     ppc/floattitf.c
+     ppc/fixtfti.c
+     ppc/fixunstfti.c
+-    ${powerpc64_SOURCES}
++    ${powerpc_SOURCES}
    )
  endif()
- set(powerpc64le_SOURCES ${powerpc64_SOURCES})
-+set(powerpc_SOURCES ${powerpc64_SOURCES})
+-set(powerpc64le_SOURCES ${powerpc64_SOURCES})
++set(powerpc64le_SOURCES ${powerpc_SOURCES})
++set(powerpc64_SOURCES ${powerpc_SOURCES})
  
  set(riscv_SOURCES
-   riscv/save.S
-@@ -740,9 +739,9 @@ else ()
+   riscv/fp_mode.c
+@@ -818,9 +817,9 @@ else ()
          list(APPEND BUILTIN_CFLAGS_${arch} -fomit-frame-pointer -DCOMPILER_RT_ARMHF_TARGET)
        endif()
  
@@ -44,15 +59,15 @@ index ea5ad9cdb864..4d1efc690d71 100644
        endif()
  
 diff --git a/compiler-rt/lib/builtins/int_types.h b/compiler-rt/lib/builtins/int_types.h
-index 7a72de480676..9ee5a327b28a 100644
+index e94d3154c6d4..37b2cb43f932 100644
 --- a/compiler-rt/lib/builtins/int_types.h
 +++ b/compiler-rt/lib/builtins/int_types.h
 @@ -64,7 +64,7 @@ typedef union {
  } udwords;
  
  #if defined(__LP64__) || defined(__wasm__) || defined(__mips64) ||             \
--    defined(__riscv) || defined(_WIN64)
-+    defined(__riscv) || defined(_WIN64) || defined(__powerpc__)
+-    defined(__SIZEOF_INT128__) || defined(_WIN64)
++    defined(__SIZEOF_INT128__) || defined(_WIN64) || defined(__powerpc__)
  #define CRT_HAS_128BIT
  #endif
  

+ 62 - 0
recipes-devtools/clang/clang/0032-llvm-Do-not-use-cmake-infra-to-detect-libzstd.patch

@@ -0,0 +1,62 @@
+From ab07bcf103432f49aeff486e2898110c879e8bc0 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Fri, 12 Aug 2022 11:50:57 -0700
+Subject: [PATCH] llvm: Do not use cmake infra to detect libzstd
+
+OE's version is build using plain make not cmake as a result we do not
+have the cmake support files and this probing method can get this info
+from build host and force linking with libzstd from /usr/lib which is
+not what we want when cross building.
+
+Fixes errors building llvm-config like
+/usr/lib/libzstd.so.1.5.2: error adding symbols: file in wrong
+format
+| clang-15: error: linker command failed with exit code 1 (use -v to see invocation)
+| ninja: build stopped: subcommand failed.
+
+Upstream-Status: Inappropriate [OE-Specific]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ llvm/lib/Support/CMakeLists.txt | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt
+index 8fbb2ca4c164..a6daa7c9f20f 100644
+--- a/llvm/lib/Support/CMakeLists.txt
++++ b/llvm/lib/Support/CMakeLists.txt
+@@ -22,7 +22,7 @@ if (HAS_WERROR_GLOBAL_CTORS)
+ endif()
+ 
+ if(LLVM_ENABLE_ZLIB)
+-  list(APPEND imported_libs ZLIB::ZLIB)
++  list(APPEND imported_libs z)
+ endif()
+ 
+ if(LLVM_ENABLE_ZSTD)
+@@ -34,7 +34,7 @@ if(LLVM_ENABLE_ZSTD)
+ endif()
+ 
+ if(LLVM_ENABLE_ZSTD)
+-  list(APPEND imported_libs ${zstd_target})
++  list(APPEND imported_libs zstd)
+ endif()
+ 
+ if( MSVC OR MINGW )
+@@ -291,7 +291,7 @@ if(LLVM_ENABLE_ZLIB)
+     get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION)
+   endif()
+   get_library_name(${zlib_library} zlib_library)
+-  set(llvm_system_libs ${llvm_system_libs} "${zlib_library}")
++  set(llvm_system_libs ${llvm_system_libs} z)
+ endif()
+ 
+ if(LLVM_ENABLE_ZSTD)
+@@ -304,7 +304,7 @@ if(LLVM_ENABLE_ZSTD)
+     get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION)
+   endif()
+   get_library_name(${zstd_library} zstd_library)
+-  set(llvm_system_libs ${llvm_system_libs} "${zstd_library}")
++  set(llvm_system_libs ${llvm_system_libs} zstd)
+ endif()
+ 
+ if(LLVM_ENABLE_TERMINFO)

+ 53 - 0
recipes-devtools/clang/clang/0033-build-Enable-64bit-off_t-on-32bit-glibc-systems.patch

@@ -0,0 +1,53 @@
+From 48cf70c06ae6085ff3d1f8b28e323f153cff23c6 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sun, 25 Dec 2022 15:13:41 -0800
+Subject: [PATCH] build: Enable 64bit off_t on 32bit glibc systems
+
+Pass -D_FILE_OFFSET_BITS=64 to compiler flags on 32bit glibc based
+systems. This will make sure that 64bit versions of LFS functions are
+used e.g. lseek will behave same as lseek64. Also revert [1] partially
+because this added a cmake test to detect lseek64 but then forgot to
+pass the needed macro during actual compile, this test was incomplete too
+since libc implementations like musl has 64-bit off_t by default on 32-bit
+systems and does not bundle -D_LARGEFILE64_SOURCE [2] under -D_GNU_SOURCE
+like glibc, which means the compile now fails on musl because the cmake
+check passes but we do not have _LARGEFILE64_SOURCE defined. Moreover,
+Using the *64 function was transitional anyways so use
+-D_FILE_OFFSET_BITS=64 instead
+
+[1] https://github.com/llvm/llvm-project/commit/8db7e5e4eed4c4e697dc3164f2c9351d8c3e942b
+[2] https://git.musl-libc.org/cgit/musl/commit/?id=25e6fee27f4a293728dd15b659170e7b9c7db9bc
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ utils/bazel/llvm-project-overlay/llvm/config.bzl               | 1 -
+ .../llvm-project-overlay/llvm/include/llvm/Config/config.h     | 3 ---
+ 2 files changed, 4 deletions(-)
+
+diff --git a/utils/bazel/llvm-project-overlay/llvm/config.bzl b/utils/bazel/llvm-project-overlay/llvm/config.bzl
+index 5507f80efa0b..b15ec9e1bb39 100644
+--- a/utils/bazel/llvm-project-overlay/llvm/config.bzl
++++ b/utils/bazel/llvm-project-overlay/llvm/config.bzl
+@@ -48,7 +48,6 @@ posix_defines = [
+ linux_defines = posix_defines + [
+     "_GNU_SOURCE",
+     "HAVE_LINK_H=1",
+-    "HAVE_LSEEK64=1",
+     "HAVE_MALLINFO=1",
+     "HAVE_SBRK=1",
+     "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=1",
+diff --git a/utils/bazel/llvm-project-overlay/llvm/include/llvm/Config/config.h b/utils/bazel/llvm-project-overlay/llvm/include/llvm/Config/config.h
+index 8a30957b6120..6a68ac040bb8 100644
+--- a/utils/bazel/llvm-project-overlay/llvm/include/llvm/Config/config.h
++++ b/utils/bazel/llvm-project-overlay/llvm/include/llvm/Config/config.h
+@@ -144,9 +144,6 @@
+ /* Define to 1 if you have the <link.h> header file. */
+ /* HAVE_LINK_H defined in Bazel */
+ 
+-/* Define to 1 if you have the `lseek64' function. */
+-/* HAVE_LSEEK64 defined in Bazel */
+-
+ /* Define to 1 if you have the <mach/mach.h> header file. */
+ /* HAVE_MACH_MACH_H defined in Bazel */
+ 

+ 36 - 0
recipes-devtools/clang/clang/0034-compiler-rt-Undef-_TIME_BITS-along-with-_FILE_OFFSET.patch

@@ -0,0 +1,36 @@
+From 3c7ebde16bea113e119b2ef7134b10cd8d7e3b1c Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 31 Dec 2022 15:03:24 -0800
+Subject: [PATCH] compiler-rt: Undef _TIME_BITS along with _FILE_OFFSET_BITS on
+ linux
+
+On 32bit systems using 64bit time_t build fails because
+_FILE_OFFSET_BITS is undefined here but _TIME_BITS is still set to 64
+
+Fixes
+/usr/include/features-time64.h:26:5: error: "_TIME_BITS=64 is allowed
+ only with _FILE_OFFSET_BITS=64"
+| #   error "_TIME_BITS=64 is allowed only with _FILE_OFFSET_BITS=64"
+|     ^
+| 1 error generated.
+
+Also avoid LFS64 functions on musl
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ .../lib/sanitizer_common/sanitizer_platform_limits_posix.cpp     | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+index fc01498aa228..eb2ee78c2f45 100644
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+@@ -18,6 +18,7 @@
+ // depends on _FILE_OFFSET_BITS setting.
+ // To get this "true" dirent definition, we undefine _FILE_OFFSET_BITS below.
+ #undef _FILE_OFFSET_BITS
++#undef _TIME_BITS
+ #endif
+ 
+ // Must go after undef _FILE_OFFSET_BITS.

+ 44 - 0
recipes-devtools/clang/clang/0035-compiler-rt-Fix-stat-struct-s-size-for-O32-ABI.patch

@@ -0,0 +1,44 @@
+From 577a70fd39778fb7e3bcd22b6c6713fcb516c365 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Tue, 3 Jan 2023 18:44:34 -0800
+Subject: [PATCH] compiler-rt: Fix stat struct's size for O32 ABI
+
+stat struct size differs on glibc based on ABI choices e.g. 64bit off_t
+and/or 64bit time_t will make this size different. Therefore separate
+out the O32 case out, makes it more readable.
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ .../sanitizer_platform_limits_posix.h               | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+index fdc69b8a5fba..d2246893f8a5 100644
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+@@ -97,11 +97,24 @@ const unsigned struct_kernel_stat64_sz = 104;
+ const unsigned struct_kernel_stat_sz = 144;
+ const unsigned struct_kernel_stat64_sz = 104;
+ #elif defined(__mips__)
++#if defined(__mips_o32) // O32 ABI
++#if _TIME_BITS == 64
++const unsigned struct_kernel_stat_sz = 112;
++const unsigned struct_kernel_stat64_sz = 112;
++#elif _FILE_OFFSET_BITS == 64
++const unsigned struct_kernel_stat_sz = 160;
++const unsigned struct_kernel_stat64_sz = 160;
++#else
++const unsigned struct_kernel_stat_sz = 144;
++const unsigned struct_kernel_stat64_sz = 160;
++#endif
++#else // __mips_o32
+ const unsigned struct_kernel_stat_sz =
+     SANITIZER_ANDROID
+         ? FIRST_32_SECOND_64(104, 128)
+         : FIRST_32_SECOND_64((_MIPS_SIM == _ABIN32) ? 176 : 160, 216);
+ const unsigned struct_kernel_stat64_sz = 104;
++#endif
+ #elif defined(__s390__) && !defined(__s390x__)
+ const unsigned struct_kernel_stat_sz = 64;
+ const unsigned struct_kernel_stat64_sz = 104;

+ 43 - 0
recipes-devtools/clang/clang/0036-compiler-rt-Undef-_TIME_BITS-along-with-_FILE_OFFSET.patch

@@ -0,0 +1,43 @@
+From c62140c7e116fabe7bccf9b55848c74e5beefccd Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Tue, 21 Feb 2023 12:46:10 -0800
+Subject: [PATCH] compiler-rt: Undef _TIME_BITS along with _FILE_OFFSET_BITS in
+ sanitizers
+
+On 32bit systems using 64bit time_t build fails because
+_FILE_OFFSET_BITS is undefined here but _TIME_BITS is still set to 64
+
+Fixes
+In file included from compiler-rt/lib/sanitizer_common/sanitizer_procmaps_solaris.cpp:17:
+In file included from compiler-rt/lib/sanitizer_common/sanitizer_platform.h:25:
+In file included from /usr/include/features.h:393:
+/usr/include/features-time64.h:26:5: error: "_TIME_BITS=64 is allowed only with _FILE_OFFSET_BITS=64"
+    ^
+1 error generated.
+
+Upstream-Status: Submitted [https://reviews.llvm.org/D144514]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ compiler-rt/lib/sanitizer_common/sanitizer_platform.h | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
+index 764996e57355..df3d165ecdb6 100644
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
+@@ -22,6 +22,15 @@
+ // function declarations into a .S file which doesn't compile.
+ // https://crbug.com/1162741
+ #if __has_include(<features.h>) && !defined(__ANDROID__)
++// Some sources undefine _FILE_OFFSET_BITS deliberately e.g.
++// sanitizer_procmaps_solaris.cpp. This is problematic on glibc systems with
++// 32-bit architectures using 64-bit time_t and users passing _TIME_BITS=64
++// from build environment, therefore both _FILE_OFFSET_BITS and _TIME_BITS
++// need to be undefined together since features.h will check for both being 64
++// if one is set to 64
++#  if !defined(_FILE_OFFSET_BITS)
++#    undef _TIME_BITS
++#  endif
+ #  include <features.h>
+ #endif
+ 

+ 70 - 0
recipes-devtools/clang/clang/0037-clang-Call-printName-to-get-name-of-Decl.patch

@@ -0,0 +1,70 @@
+From d33d6a8c4f43907cb53130730a2bc48624a34b74 Mon Sep 17 00:00:00 2001
+From: Dan McGregor <dan.mcgregor@usask.ca>
+Date: Tue, 21 Mar 2023 13:04:51 -0600
+Subject: [PATCH] [clang] Call printName to get name of Decl
+
+Rather than sending a name directly to the stream, use printName
+to preserve any PrintingPolicy. This ensures that names are properly
+affected by path remapping.
+
+Differential Revision: https://reviews.llvm.org/D149272
+
+Upstream-Status: Pending
+---
+ clang/lib/AST/Decl.cpp                  |  4 ++--
+ clang/lib/AST/DeclarationName.cpp       |  4 ++--
+ clang/test/CodeGen/debug-prefix-map.cpp | 11 +++++++++++
+ 3 files changed, 15 insertions(+), 4 deletions(-)
+ create mode 100644 clang/test/CodeGen/debug-prefix-map.cpp
+
+diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
+index e60cc28f6e0f..24de6156c0f5 100644
+--- a/clang/lib/AST/Decl.cpp
++++ b/clang/lib/AST/Decl.cpp
+@@ -1626,8 +1626,8 @@ Module *Decl::getOwningModuleForLinkage(bool IgnoreLinkage) const {
+   llvm_unreachable("unknown module kind");
+ }
+ 
+-void NamedDecl::printName(raw_ostream &OS, const PrintingPolicy&) const {
+-  OS << Name;
++void NamedDecl::printName(raw_ostream &OS, const PrintingPolicy &Policy) const {
++  Name.print(OS, Policy);
+ }
+ 
+ void NamedDecl::printName(raw_ostream &OS) const {
+diff --git a/clang/lib/AST/DeclarationName.cpp b/clang/lib/AST/DeclarationName.cpp
+index c1219041a466..da8b3886c340 100644
+--- a/clang/lib/AST/DeclarationName.cpp
++++ b/clang/lib/AST/DeclarationName.cpp
+@@ -117,12 +117,12 @@ static void printCXXConstructorDestructorName(QualType ClassType,
+   Policy.adjustForCPlusPlus();
+ 
+   if (const RecordType *ClassRec = ClassType->getAs<RecordType>()) {
+-    OS << *ClassRec->getDecl();
++    ClassRec->getDecl()->printName(OS, Policy);
+     return;
+   }
+   if (Policy.SuppressTemplateArgsInCXXConstructors) {
+     if (auto *InjTy = ClassType->getAs<InjectedClassNameType>()) {
+-      OS << *InjTy->getDecl();
++      InjTy->getDecl()->printName(OS, Policy);
+       return;
+     }
+   }
+diff --git a/clang/test/CodeGen/debug-prefix-map.cpp b/clang/test/CodeGen/debug-prefix-map.cpp
+new file mode 100644
+index 000000000000..7ddaee531282
+--- /dev/null
++++ b/clang/test/CodeGen/debug-prefix-map.cpp
+@@ -0,0 +1,11 @@
++// RUN: %clang_cc1 -debug-info-kind=standalone -fdebug-prefix-map=%p=./UNLIKELY_PATH/empty -S %s -emit-llvm -o - | FileCheck %s
++
++struct alignas(64) an {
++  struct {
++    unsigned char x{0};
++  } arr[64];
++};
++
++struct an *pan = new an;
++
++// CHECK: !DISubprogram(name: "(unnamed struct at ./UNLIKELY_PATH/empty{{/|\\\\}}{{.*}}",

+ 443 - 0
recipes-devtools/clang/clang_16.0.5.bb

@@ -0,0 +1,443 @@
+# Copyright (C) 2014 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "LLVM based C/C++ compiler"
+HOMEPAGE = "http://clang.llvm.org/"
+SECTION = "devel"
+
+require clang.inc
+require common-source.inc
+
+INHIBIT_DEFAULT_DEPS = "1"
+
+BUILD_CC:class-nativesdk = "clang"
+BUILD_CXX:class-nativesdk = "clang++"
+BUILD_AR:class-nativesdk = "llvm-ar"
+BUILD_RANLIB:class-nativesdk = "llvm-ranlib"
+BUILD_NM:class-nativesdk = "llvm-nm"
+LDFLAGS:remove:class-nativesdk = "-fuse-ld=lld"
+
+LDFLAGS:append:class-target:riscv32 = " -Wl,--no-as-needed -latomic -Wl,--as-needed"
+LDFLAGS:append:class-target:mips = " -Wl,--no-as-needed -latomic -Wl,--as-needed"
+
+inherit cmake cmake-native pkgconfig python3native python3targetconfig
+
+OECMAKE_FIND_ROOT_PATH_MODE_PROGRAM = "BOTH"
+
+def get_clang_experimental_arch(bb, d, arch_var):
+    import re
+    a = d.getVar(arch_var, True)
+    return ""
+
+def get_clang_arch(bb, d, arch_var):
+    import re
+    a = d.getVar(arch_var, True)
+    if   re.match('(i.86|athlon|x86.64)$', a):         return 'X86'
+    elif re.match('arm$', a):                          return 'ARM'
+    elif re.match('armeb$', a):                        return 'ARM'
+    elif re.match('aarch64$', a):                      return 'AArch64'
+    elif re.match('aarch64_be$', a):                   return 'AArch64'
+    elif re.match('mips(isa|)(32|64|)(r6|)(el|)$', a): return 'Mips'
+    elif re.match('riscv32$', a):                      return 'riscv32'
+    elif re.match('riscv64$', a):                      return 'riscv64'
+    elif re.match('p(pc|owerpc)(|64)', a):             return 'PowerPC'
+    elif re.match('loongarch64$', a):                  return 'loongarch64'
+    else:
+        bb.note("'%s' is not a primary llvm architecture" % a)
+    return ""
+
+def get_clang_host_arch(bb, d):
+    return get_clang_arch(bb, d, 'HOST_ARCH')
+
+def get_clang_target_arch(bb, d):
+    return get_clang_arch(bb, d, 'TARGET_ARCH')
+
+def get_clang_experimental_target_arch(bb, d):
+    return get_clang_experimental_arch(bb, d, 'TARGET_ARCH')
+
+PACKAGECONFIG ??= "compiler-rt libcplusplus shared-libs lldb-wchar \
+                   ${@bb.utils.filter('DISTRO_FEATURES', 'thin-lto lto', d)} \
+                   ${@bb.utils.contains('RUNTIME', 'llvm', 'compiler-rt libcplusplus unwindlib libomp', '', d)} \
+                   rtti eh libedit terminfo \
+                   "
+PACKAGECONFIG:class-native = "rtti eh libedit shared-libs ${@bb.utils.contains('RUNTIME', 'llvm', 'compiler-rt libcplusplus unwindlib libomp', '', d)}"
+PACKAGECONFIG:class-nativesdk = "rtti eh libedit shared-libs ${@bb.utils.filter('DISTRO_FEATURES', 'thin-lto lto', d)} ${@bb.utils.contains('RUNTIME', 'llvm', 'compiler-rt libcplusplus unwindlib libomp', '', d)}"
+
+PACKAGECONFIG[compiler-rt] = "-DCLANG_DEFAULT_RTLIB=compiler-rt,,"
+PACKAGECONFIG[libcplusplus] = "-DCLANG_DEFAULT_CXX_STDLIB=libc++,,"
+PACKAGECONFIG[unwindlib] = "-DCLANG_DEFAULT_UNWINDLIB=libunwind,-DCLANG_DEFAULT_UNWINDLIB=libgcc,,"
+PACKAGECONFIG[libomp] = "-DCLANG_DEFAULT_OPENMP_RUNTIME=libomp,,"
+PACKAGECONFIG[thin-lto] = "-DLLVM_ENABLE_LTO=Thin -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR},,binutils,"
+PACKAGECONFIG[lto] = "-DLLVM_ENABLE_LTO=Full -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR},,binutils,"
+PACKAGECONFIG[shared-libs] = "-DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON,,,"
+PACKAGECONFIG[terminfo] = "-DLLVM_ENABLE_TERMINFO=ON -DCOMPILER_RT_TERMINFO_LIB=ON,-DLLVM_ENABLE_TERMINFO=OFF -DCOMPILER_RT_TERMINFO_LIB=OFF,ncurses,"
+PACKAGECONFIG[pfm] = "-DLLVM_ENABLE_LIBPFM=ON,-DLLVM_ENABLE_LIBPFM=OFF,libpfm,"
+PACKAGECONFIG[lldb-wchar] = "-DLLDB_EDITLINE_USE_WCHAR=1,-DLLDB_EDITLINE_USE_WCHAR=0,"
+PACKAGECONFIG[lldb-lua] = "-DLLDB_ENABLE_LUA=ON,-DLLDB_ENABLE_LUA=OFF,lua"
+PACKAGECONFIG[bootstrap] = "-DCLANG_ENABLE_BOOTSTRAP=On -DCLANG_BOOTSTRAP_PASSTHROUGH='${PASSTHROUGH}' -DBOOTSTRAP_LLVM_ENABLE_LTO=Thin -DBOOTSTRAP_LLVM_ENABLE_LLD=ON,,,"
+PACKAGECONFIG[eh] = "-DLLVM_ENABLE_EH=ON,-DLLVM_ENABLE_EH=OFF,,"
+PACKAGECONFIG[rtti] = "-DLLVM_ENABLE_RTTI=ON,-DLLVM_ENABLE_RTTI=OFF,,"
+PACKAGECONFIG[split-dwarf] = "-DLLVM_USE_SPLIT_DWARF=ON,-DLLVM_USE_SPLIT_DWARF=OFF,,"
+PACKAGECONFIG[libedit] = "-DLLVM_ENABLE_LIBEDIT=ON -DLLDB_ENABLE_LIBEDIT=ON,-DLLVM_ENABLE_LIBEDIT=OFF -DLLDB_ENABLE_LIBEDIT=OFF,libedit libedit-native"
+
+OECMAKE_SOURCEPATH = "${S}/llvm"
+
+OECMAKE_TARGET_COMPILE = "${@bb.utils.contains('PACKAGECONFIG', 'bootstrap', 'stage2', 'all', d)}"
+OECMAKE_TARGET_INSTALL = "${@bb.utils.contains('PACKAGECONFIG', 'bootstrap', 'stage2-install', 'install', d)}"
+BINPATHPREFIX = "${@bb.utils.contains('PACKAGECONFIG', 'bootstrap', '/tools/clang/stage2-bins/NATIVE', '', d)}"
+
+PASSTHROUGH = "\
+CLANG_DEFAULT_RTLIB;CLANG_DEFAULT_CXX_STDLIB;LLVM_BUILD_LLVM_DYLIB;LLVM_LINK_LLVM_DYLIB;\
+LLVM_ENABLE_ASSERTIONS;LLVM_ENABLE_EXPENSIVE_CHECKS;LLVM_ENABLE_PIC;\
+LLVM_BINDINGS_LIST;LLVM_ENABLE_FFI;FFI_INCLUDE_DIR;LLVM_OPTIMIZED_TABLEGEN;\
+LLVM_ENABLE_RTTI;LLVM_ENABLE_EH;LLVM_BUILD_EXTERNAL_COMPILER_RT;CMAKE_SYSTEM_NAME;\
+CMAKE_BUILD_TYPE;BUILD_SHARED_LIBS;LLVM_ENABLE_PROJECTS;LLVM_BINUTILS_INCDIR;\
+LLVM_TARGETS_TO_BUILD;LLVM_EXPERIMENTAL_TARGETS_TO_BUILD;PYTHON_EXECUTABLE;\
+PYTHON_LIBRARY;PYTHON_INCLUDE_DIR;LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN;LLDB_EDITLINE_USE_WCHAR;\
+LLVM_ENABLE_LIBEDIT;LLDB_ENABLE_LIBEDIT;LLDB_PYTHON_RELATIVE_PATH;LLDB_PYTHON_EXE_RELATIVE_PATH;\
+LLDB_PYTHON_EXT_SUFFIX;CMAKE_C_FLAGS_RELEASE;CMAKE_CXX_FLAGS_RELEASE;CMAKE_ASM_FLAGS_RELEASE;\
+CLANG_DEFAULT_CXX_STDLIB;CLANG_DEFAULT_RTLIB;CLANG_DEFAULT_UNWINDLIB;\
+CLANG_DEFAULT_OPENMP_RUNTIME;LLVM_ENABLE_PER_TARGET_RUNTIME_DIR;\
+LLVM_BUILD_TOOLS;LLVM_USE_HOST_TOOLS;LLVM_CONFIG_PATH;\
+"
+#
+# Default to build all OE-Core supported target arches (user overridable).
+# Gennerally setting LLVM_TARGETS_TO_BUILD = "" in local.conf is ok in most simple situations
+# where only one target architecture is needed along with just one build arch (usually X86)
+#
+LLVM_TARGETS_TO_BUILD ?= "AMDGPU;AArch64;ARM;BPF;Mips;PowerPC;RISCV;X86;LoongArch"
+
+LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ?= ""
+LLVM_EXPERIMENTAL_TARGETS_TO_BUILD:append = ";${@get_clang_experimental_target_arch(bb, d)}"
+
+HF = ""
+HF:class-target = "${@ bb.utils.contains('TUNE_CCARGS_MFLOAT', 'hard', 'hf', '', d)}"
+HF[vardepvalue] = "${HF}"
+
+LLVM_PROJECTS ?= "clang;clang-tools-extra;lld${LLDB}"
+LLDB ?= ";lldb"
+# LLDB support for RISCV/Mips32 does not work yet
+LLDB:riscv32 = ""
+LLDB:riscv64 = ""
+LLDB:mips = ""
+LLDB:mipsel = ""
+LLDB:powerpc = ""
+
+# linux hosts (.so) on Windows .pyd
+SOLIBSDEV:mingw32 = ".pyd"
+
+#CMAKE_VERBOSE = "VERBOSE=1"
+
+EXTRA_OECMAKE += "-DLLVM_ENABLE_ASSERTIONS=OFF \
+                  -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \
+                  -DLLVM_ENABLE_EXPENSIVE_CHECKS=OFF \
+                  -DLLVM_ENABLE_PIC=ON \
+                  -DCLANG_DEFAULT_PIE_ON_LINUX=ON \
+                  -DLLVM_BINDINGS_LIST='' \
+                  -DLLVM_ENABLE_FFI=ON \
+                  -DLLVM_ENABLE_ZSTD=ON \
+                  -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \
+                  -DLLVM_OPTIMIZED_TABLEGEN=ON \
+                  -DLLVM_BUILD_EXTERNAL_COMPILER_RT=ON \
+                  -DCMAKE_SYSTEM_NAME=Linux \
+                  -DCMAKE_BUILD_TYPE=Release \
+                  -DCMAKE_CXX_FLAGS_RELEASE='${CXXFLAGS} -DNDEBUG -g0' \
+                  -DCMAKE_C_FLAGS_RELEASE='${CFLAGS} -DNDEBUG -g0' \
+                  -DBUILD_SHARED_LIBS=OFF \
+                  -DLLVM_ENABLE_PROJECTS='${LLVM_PROJECTS}' \
+                  -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR} \
+                  -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON \
+                  -DLLVM_TARGETS_TO_BUILD='${LLVM_TARGETS_TO_BUILD}' \
+                  -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD='${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD}' \
+"
+
+EXTRA_OECMAKE:append:class-native = "\
+                  -DPYTHON_EXECUTABLE='${PYTHON}' \
+"
+EXTRA_OECMAKE:append:class-nativesdk = "\
+                  -DCMAKE_CROSSCOMPILING:BOOL=ON \
+                  -DCROSS_TOOLCHAIN_FLAGS_NATIVE='-DLLDB_PYTHON_RELATIVE_PATH=${PYTHON_SITEPACKAGES_DIR} \
+                                                  -DLLDB_PYTHON_EXE_RELATIVE_PATH=${PYTHON} \
+                                                  -DLLDB_PYTHON_EXT_SUFFIX=${SOLIBSDEV} \
+                                                  -DCMAKE_TOOLCHAIN_FILE=${WORKDIR}/toolchain-native.cmake' \
+                  -DCMAKE_RANLIB=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ranlib \
+                  -DCMAKE_AR=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ar \
+                  -DCMAKE_NM=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-nm \
+                  -DCMAKE_STRIP=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-strip \
+                  -DLLVM_USE_HOST_TOOLS=OFF \
+                  -DLLVM_CONFIG_PATH=${STAGING_BINDIR_NATIVE}/llvm-config \
+                  -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen \
+                  -DLLDB_TABLEGEN=${STAGING_BINDIR_NATIVE}/lldb-tblgen \
+                  -DCLANG_TABLEGEN=${STAGING_BINDIR_NATIVE}/clang-tblgen \
+                  -DCLANG_TIDY_CONFUSABLE_CHARS_GEN=${STAGING_BINDIR_NATIVE}/clang-tidy-confusable-chars-gen \
+                  -DCLANG_PSEUDO_GEN=${STAGING_BINDIR_NATIVE}/clang-pseudo-gen \
+                  -DPYTHON_LIBRARY=${STAGING_LIBDIR}/lib${PYTHON_DIR}${PYTHON_ABI}.so \
+                  -DLLDB_PYTHON_RELATIVE_PATH=${PYTHON_SITEPACKAGES_DIR} \
+                  -DLLDB_PYTHON_EXE_RELATIVE_PATH=${PYTHON} \
+                  -DLLDB_PYTHON_EXT_SUFFIX=${SOLIBSDEV} \
+                  -DPYTHON_INCLUDE_DIR=${STAGING_INCDIR}/${PYTHON_DIR}${PYTHON_ABI} \
+                  -DPYTHON_EXECUTABLE='${PYTHON}' \
+"
+EXTRA_OECMAKE:append:class-target = "\
+                  -DCMAKE_CROSSCOMPILING:BOOL=ON \
+                  -DLLVM_USE_HOST_TOOLS=OFF \
+                  -DLLVM_CONFIG_PATH=${STAGING_BINDIR_NATIVE}/llvm-config \
+                  -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen \
+                  -DLLDB_TABLEGEN=${STAGING_BINDIR_NATIVE}/lldb-tblgen \
+                  -DCLANG_TABLEGEN=${STAGING_BINDIR_NATIVE}/clang-tblgen \
+                  -DCLANG_TIDY_CONFUSABLE_CHARS_GEN=${STAGING_BINDIR_NATIVE}/clang-tidy-confusable-chars-gen \
+                  -DCLANG_PSEUDO_GEN=${STAGING_BINDIR_NATIVE}/clang-pseudo-gen \
+                  -DCMAKE_RANLIB=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ranlib \
+                  -DCMAKE_AR=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ar \
+                  -DCMAKE_NM=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-nm \
+                  -DCMAKE_STRIP=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-strip \
+                  -DLLVM_TARGET_ARCH=${@get_clang_target_arch(bb, d)} \
+                  -DLLVM_DEFAULT_TARGET_TRIPLE=${TARGET_SYS}${HF} \
+                  -DLLVM_HOST_TRIPLE=${TARGET_SYS}${HF} \
+                  -DPYTHON_LIBRARY=${STAGING_LIBDIR}/lib${PYTHON_DIR}${PYTHON_ABI}.so \
+                  -DPYTHON_INCLUDE_DIR=${STAGING_INCDIR}/${PYTHON_DIR}${PYTHON_ABI} \
+                  -DLLVM_LIBDIR_SUFFIX=${@d.getVar('baselib').replace('lib', '')} \
+                  -DLLDB_PYTHON_RELATIVE_PATH=${PYTHON_SITEPACKAGES_DIR} \
+                  -DLLDB_PYTHON_EXE_RELATIVE_PATH=${bindir} \
+                  -DLLDB_PYTHON_EXT_SUFFIX=${SOLIBSDEV} \
+"
+
+DEPENDS = "binutils zlib zstd libffi libxml2 libxml2-native ninja-native swig-native"
+DEPENDS:append:class-nativesdk = " clang-crosssdk-${SDK_ARCH} virtual/${TARGET_PREFIX}binutils-crosssdk nativesdk-python3"
+DEPENDS:append:class-target = " clang-cross-${TARGET_ARCH} python3 compiler-rt libcxx"
+
+RRECOMMENDS:${PN} = "binutils"
+RRECOMMENDS:${PN}:append:class-target = " libcxx-dev"
+
+# patch out build host paths for reproducibility
+do_compile:prepend:class-target() {
+    sed -i -e "s,${STAGING_DIR_NATIVE},,g" \
+        -e "s,${STAGING_DIR_TARGET},,g" \
+        -e "s,${S},,g"  \
+        -e "s,${B},,g" \
+        ${B}/tools/llvm-config/BuildVariables.inc
+}
+
+do_install:append() {
+    rm -rf ${D}${libdir}/python*/site-packages/six.py
+}
+
+do_install:append:class-target () {
+    # Allow bin path to change based on YOCTO_ALTERNATE_EXE_PATH
+    sed -i 's;${_IMPORT_PREFIX}/bin;${_IMPORT_PREFIX_BIN};g' ${D}${libdir}/cmake/llvm/LLVMExports-release.cmake
+
+    # Insert function to populate Import Variables
+    sed -i "4i\
+if(DEFINED ENV{YOCTO_ALTERNATE_EXE_PATH})\n\
+  execute_process(COMMAND \"llvm-config\" \"--bindir\" OUTPUT_VARIABLE _IMPORT_PREFIX_BIN OUTPUT_STRIP_TRAILING_WHITESPACE)\n\
+else()\n\
+  set(_IMPORT_PREFIX_BIN \"\${_IMPORT_PREFIX}/bin\")\n\
+endif()\n" ${D}${libdir}/cmake/llvm/LLVMExports-release.cmake
+
+    if [ -n "${LLVM_LIBDIR_SUFFIX}" ]; then
+        mkdir -p ${D}${nonarch_libdir}
+        mv ${D}${libdir}/clang ${D}${nonarch_libdir}/clang
+        ln -rs ${D}${nonarch_libdir}/clang ${D}${libdir}/clang
+        rmdir --ignore-fail-on-non-empty ${D}${libdir}
+    fi
+    for t in clang clang++ llvm-nm llvm-ar llvm-as llvm-ranlib llvm-strip llvm-objcopy llvm-objdump llvm-readelf \
+        llvm-addr2line llvm-dwp llvm-size llvm-strings llvm-cov; do
+        ln -sf $t ${D}${bindir}/${TARGET_PREFIX}$t
+    done
+
+    # reproducibility
+    sed -i -e 's,${B},,g' ${D}${libdir}/cmake/llvm/LLVMConfig.cmake
+}
+
+do_install:append:class-native () {
+    install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clang-tblgen ${D}${bindir}/clang-tblgen
+    install -Dm 0755 ${B}/bin/clang-pseudo-gen ${D}${bindir}/clang-pseudo-gen
+    install -Dm 0755 ${B}/bin/lldb-tblgen ${D}${bindir}/lldb-tblgen
+    install -Dm 0755 ${B}/bin/clang-tidy-confusable-chars-gen ${D}${bindir}/clang-tidy-confusable-chars-gen
+    for f in `find ${D}${bindir} -executable -type f -not -type l`; do
+        test -n "`file -b $f|grep -i ELF`" && ${STRIP} $f
+        echo "stripped $f"
+    done
+    ln -sf clang-tblgen ${D}${bindir}/clang-tblgen${PV}
+    ln -sf llvm-tblgen ${D}${bindir}/llvm-tblgen${PV}
+    ln -sf llvm-config ${D}${bindir}/llvm-config${PV}
+}
+
+do_install:append:class-nativesdk () {
+    install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clang-tblgen ${D}${bindir}/clang-tblgen
+    install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clang-pseudo-gen ${D}${bindir}/clang-pseudo-gen
+    install -Dm 0755 ${B}${BINPATHPREFIX}/bin/lldb-tblgen ${D}${bindir}/lldb-tblgen
+    install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clang-tidy-confusable-chars-gen ${D}${bindir}/clang-tidy-confusable-chars-gen
+    for f in `find ${D}${bindir} -executable -type f -not -type l`; do
+        test -n "`file -b $f|grep -i ELF`" && ${STRIP} $f
+    done
+    ln -sf clang-tblgen ${D}${bindir}/clang-tblgen${PV}
+    ln -sf llvm-tblgen ${D}${bindir}/llvm-tblgen${PV}
+    ln -sf llvm-config ${D}${bindir}/llvm-config${PV}
+    rm -rf ${D}${datadir}/llvm/cmake
+    rm -rf ${D}${datadir}/llvm
+}
+
+PACKAGES =+ "${PN}-libllvm ${PN}-lldb-python ${PN}-libclang-cpp ${PN}-tidy ${PN}-format ${PN}-tools \
+             libclang lldb lldb-server liblldb llvm-linker-tools"
+
+PROVIDES += "llvm llvm${PV}"
+PROVIDES:append:class-native = " llvm-native"
+
+BBCLASSEXTEND = "native nativesdk"
+
+RDEPENDS:lldb += "${PN}-lldb-python lldb-server"
+
+RDEPENDS:${PN}-tools += "\
+  perl-module-digest-md5 \
+  perl-module-file-basename \
+  perl-module-file-copy \
+  perl-module-file-find \
+  perl-module-file-path \
+  perl-module-findbin \
+  perl-module-hash-util \
+  perl-module-sys-hostname \
+  perl-module-term-ansicolor \
+"
+
+RRECOMMENDS:${PN}-tidy += "${PN}-tools"
+
+FILES:llvm-linker-tools = "${libdir}/LLVMgold* ${libdir}/libLTO.so.* ${libdir}/LLVMPolly*"
+
+FILES:${PN}-libclang-cpp = "${libdir}/libclang-cpp.so.*"
+
+FILES:${PN}-lldb-python = "${libdir}/python*/site-packages/lldb/*"
+
+FILES:${PN}-tidy = "${bindir}/*clang-tidy*"
+FILES:${PN}-format = "${bindir}/*clang-format*"
+
+FILES:${PN}-tools = "${bindir}/analyze-build \
+  ${bindir}/c-index-test \
+  ${bindir}/clang-apply-replacements \
+  ${bindir}/clang-change-namespace \
+  ${bindir}/clang-check \
+  ${bindir}/clang-doc \
+  ${bindir}/clang-extdef-mapping \
+  ${bindir}/clang-include-fixer \
+  ${bindir}/clang-linker-wrapper \
+  ${bindir}/clang-move \
+  ${bindir}/clang-nvlink-wrapper \
+  ${bindir}/clang-offload-bundler \
+  ${bindir}/clang-offload-packager \
+  ${bindir}/clang-pseudo \
+  ${bindir}/clang-query \
+  ${bindir}/clang-refactor \
+  ${bindir}/clang-rename \
+  ${bindir}/clang-reorder-fields \
+  ${bindir}/clang-repl \
+  ${bindir}/clang-scan-deps \
+  ${bindir}/diagtool \
+  ${bindir}/find-all-symbols \
+  ${bindir}/hmaptool \
+  ${bindir}/hwasan_symbolize \
+  ${bindir}/intercept-build \
+  ${bindir}/modularize \
+  ${bindir}/pp-trace \
+  ${bindir}/sancov \
+  ${bindir}/scan-build \
+  ${bindir}/scan-build-py \
+  ${bindir}/scan-view \
+  ${bindir}/split-file \
+  ${libdir}/libscanbuild/* \
+  ${libdir}/libear/* \
+  ${libexecdir}/analyze-c++ \
+  ${libexecdir}/analyze-cc \
+  ${libexecdir}/c++-analyzer \
+  ${libexecdir}/ccc-analyzer \
+  ${libexecdir}/intercept-c++ \
+  ${libexecdir}/intercept-cc \
+  ${datadir}/scan-build/* \
+  ${datadir}/scan-view/* \
+  ${datadir}/opt-viewer/* \
+  ${datadir}/clang/* \
+"
+
+FILES:${PN} += "\
+  ${bindir}/clang-cl \
+  ${libdir}/BugpointPasses.so \
+  ${libdir}/LLVMHello.so \
+  ${libdir}/*Plugin.so \
+  ${libdir}/${BPN} \
+  ${nonarch_libdir}/${BPN}/*/include/ \
+"
+
+FILES:lldb = "\
+  ${bindir}/lldb \
+  ${bindir}/lldb-argdumper \
+  ${bindir}/lldb-instr \
+  ${bindir}/lldb-vscode \
+"
+
+FILES:lldb-server = "\
+  ${bindir}/lldb-server \
+"
+
+FILES:liblldb = "\
+  ${libdir}/liblldbIntelFeatures.so.* \
+  ${libdir}/liblldb.so.* \
+"
+
+FILES:${PN}-libllvm =+ "\
+  ${libdir}/libLLVM-${MAJOR_VER}.${MINOR_VER}.so \
+  ${libdir}/libLLVM-${MAJOR_VER}.so \
+  ${libdir}/libLLVM-${MAJOR_VER}git.so \
+  ${libdir}/libLLVM-${MAJOR_VER}.${MINOR_VER}git.so \
+  ${libdir}/libRemarks.so.* \
+"
+
+FILES:libclang = "\
+  ${libdir}/libclang.so.* \
+"
+
+FILES:${PN}-dev += "\
+  ${datadir}/llvm/cmake \
+  ${libdir}/cmake \
+  ${nonarch_libdir}/libear \
+  ${nonarch_libdir}/${BPN}/*.la \
+"
+
+FILES:${PN}-staticdev += "${nonarch_libdir}/${BPN}/*.a"
+
+FILES:${PN}-staticdev:remove = "${libdir}/${BPN}/*.a"
+FILES:${PN}-dev:remove = "${libdir}/${BPN}/*.la"
+FILES:${PN}:remove = "${libdir}/${BPN}/*"
+
+
+INSANE_SKIP:${PN} += "already-stripped"
+#INSANE_SKIP:${PN}-dev += "dev-elf"
+INSANE_SKIP:${PN}-lldb-python += "dev-so dev-deps"
+INSANE_SKIP:${MLPREFIX}liblldb = "dev-so"
+
+#Avoid SSTATE_SCAN_COMMAND running sed over llvm-config.
+SSTATE_SCAN_FILES:remove = "*-config"
+
+TOOLCHAIN = "clang"
+TOOLCHAIN:class-native = "gcc"
+TOOLCHAIN:class-nativesdk = "clang"
+COMPILER_RT:class-nativesdk:toolchain-clang:runtime-llvm = "-rtlib=libgcc --unwindlib=libgcc"
+LIBCPLUSPLUS:class-nativesdk:toolchain-clang:runtime-llvm = "-stdlib=libstdc++"
+
+SYSROOT_DIRS:append:class-target = " ${nonarch_libdir}"
+
+SYSROOT_PREPROCESS_FUNCS:append:class-target = " clang_sysroot_preprocess"
+
+clang_sysroot_preprocess() {
+	install -d ${SYSROOT_DESTDIR}${bindir_crossscripts}/
+	install -m 0755 ${S}/../llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/
+	ln -sf llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/llvm-config${PV}
+	# LLDTargets.cmake references the lld executable(!) that some modules/plugins link to
+	install -d ${SYSROOT_DESTDIR}${bindir}
+	for f in lld diagtool clang-${MAJOR_VER} clang-format clang-offload-packager \
+            clang-offload-bundler clang-scan-deps clang-repl \
+            clang-rename clang-refactor clang-check clang-extdef-mapping clang-apply-replacements \
+            clang-reorder-fields clang-tidy clang-change-namespace clang-doc clang-include-fixer \
+            find-all-symbols clang-move clang-query pp-trace clang-pseudo clangd modularize
+	do
+		install -m 755 ${D}${bindir}/$f ${SYSROOT_DESTDIR}${bindir}/
+	done
+}

+ 28 - 0
recipes-devtools/clang/clang_16.0.5.bbappend

@@ -0,0 +1,28 @@
+LDFLAGS:remove:class-nativesdk = "-fuse-ld=lld"
+
+FILES:${PN} += "${libdir}/*"
+
+PACKAGECONFIG = ""
+LLVM_TARGETS_TO_BUILD = "RISCV;X86"
+
+EXTRA_OECMAKE:append:class-native = " \
+			-DCLANG_VENDOR="StarFive" \
+			-DCLANG_ENABLE_ARCMT=OFF \
+			-DCLANG_ENABLE_STATIC_ANALYZER=OFF \
+			-DCLANG_PLUGIN_SUPPORT=OFF \
+			-DCLANG_BUILD_TOOLS=ON \
+			-DCMAKE_BUILD_TYPE=Release \
+			-DLLVM_ENABLE_BINDINGS=OFF \
+			-DLLVM_ENABLE_PLUGINS=ON \
+			-DLLVM_ENABLE_OCAMLDOC=OFF \
+			-DLLVM_ENABLE_TERMINFO=OFF \
+			-DLLVM_INCLUDE_DOCS=OFF \
+			-DLLVM_INCLUDE_EXAMPLES=OFF \
+			-DLLVM_INCLUDE_TESTS=ON \
+			-DLLVM_ENABLE_WARNINGS=OFF \
+			-DLLVM_ENABLE_ASSERTIONS=TRUE \
+			-DLLVM_INCLUDE_UTILS=ON \
+			-DLLDB_PYTHON_EXE_RELATIVE_PATH="recipe-sysroot-native/usr/bin/python3-native/python3.9" \
+			-DLLDB_PYTHON_RELATIVE_PATH="recipe-sysroot-native/usr/bin/python3-native/" \
+                        -DLLDB_PYTHON_EXT_SUFFIX=".so" \
+			"

+ 0 - 63
recipes-devtools/clang/clang_git.bbappend

@@ -1,63 +0,0 @@
-MAJOR_VER = "15"
-MINOR_VER = "0"
-PATCH_VER = "0"
-
-LDFLAGS:remove:class-nativesdk = "-fuse-ld=lld"
-
-FILES:${PN} += "${libdir}/*"
-
-PACKAGECONFIG[bootstrap] = "-DCLANG_ENABLE_BOOTSTRAP=ON -DBOOTSTRAP_LLVM_ENABLE_LLD=ON,,,"
-BINPATHPREFIX = "${@bb.utils.contains('PACKAGECONFIG', 'bootstrap', '/tools/clang/stage2-bins', '', d)}"
-
-PACKAGECONFIG = ""
-PACKAGECONFIG:append:class-native = " bootstrap"
-
-LLVM_TARGETS_TO_BUILD = "RISCV;X86"
-
-EXTRA_OECMAKE:append:class-native = " \
-			-DCLANG_VENDOR="StarFive" \
-			-DCLANG_ENABLE_ARCMT=OFF \
-			-DCLANG_ENABLE_STATIC_ANALYZER=OFF \
-			-DCLANG_PLUGIN_SUPPORT=OFF \
-			-DCMAKE_BUILD_TYPE=Release \
-			-DLLVM_ENABLE_BINDINGS=OFF \
-			-DLLVM_ENABLE_PLUGINS=ON \
-			-DLLVM_ENABLE_OCAMLDOC=OFF \
-			-DLLVM_ENABLE_TERMINFO=OFF \
-			-DLLVM_INCLUDE_DOCS=OFF \
-			-DLLVM_INCLUDE_EXAMPLES=OFF \
-			-DLLVM_INCLUDE_TESTS=ON \
-			-DLLVM_ENABLE_WARNINGS=OFF \
-			-DLLVM_ENABLE_ASSERTIONS=TRUE \
-			-DLLVM_INCLUDE_UTILS=ON \
-			-DLLDB_PYTHON_EXE_RELATIVE_PATH="recipe-sysroot-native/usr/bin/python3-native/python3.9" \
-			-DLLDB_PYTHON_RELATIVE_PATH="recipe-sysroot-native/usr/bin/python3-native/" \
-                        -DLLDB_PYTHON_EXT_SUFFIX=".so" \
-                        -DBOOTSTRAP_CMAKE_BUILD_TYPE=Release \
-			-DBOOTSTRAP_LLVM_APPEND_VC_REV=OFF \
-			-DBOOTSTRAP_LLVM_INSTALL_TOOLCHAIN_ONLY=ON \
-			-DBOOTSTRAP_COMPILER_RT_USE_BUILTINS_LIBRARY=ON \
-			-DBOOTSTRAP_LLVM_TARGETS_TO_BUILD='${LLVM_TARGETS_TO_BUILD}' \
-			-DBOOTSTRAP_LLVM_INCLUDE_UTILS=ON \
-			-DBOOTSTRAP_LLVM_BUILD_TOOLS=ON \
-			-DBOOTSTRAP_LLVM_ENABLE_PROJECTS="clang" \
-			-DBOOTSTRAP_CLANG_ENABLE_ARCMT=OFF \
-			-DBOOTSTRAP_CLANG_ENABLE_STATIC_ANALYZER=OFF \
-			-DBOOTSTRAP_CLANG_PLUGIN_SUPPORT=OFF \
-			-DBOOTSTRAP_LLVM_ENABLE_BINDINGS=OFF \
-			-DBOOTSTRAP_LLVM_ENABLE_PLUGINS=ON \
-			-DBOOTSTRAP_LLVM_ENABLE_OCAMLDOC=OFF \
-			-DBOOTSTRAP_LLVM_ENABLE_TERMINFO=OFF \
-			-DBOOTSTRAP_LLVM_ENABLE_BACKTRACES=OFF \
-			-DBOOTSTRAP_LLVM_ENABLE_WARNINGS=OFF \
-			-DBOOTSTRAP_LLVM_INCLUDE_TESTS=OFF \
-			-DBOOTSTRAP_LLVM_INCLUDE_BENCHMARK=OFF \
-			-DBOOTSTRAP_LLVM_ENABLE_LIBCXX=ON \
-			-DBOOTSTRAP_LLVM_STATIC_LINK_CXX_STDLIB=ON \
-			-DBOOTSTRAP_LLVM_INCLUDE_DOCS=OFF \
-			-DBOOTSTRAP_LLVM_INCLUDE_EXAMPLES=OFF \
-			"
-
-do_install:append:class-native () {
-    install -Dm 0755 ${B}${BINPATHPREFIX}/bin/llvm-tblgen ${D}${bindir}/llvm-tblgen
-}

+ 17 - 0
recipes-devtools/clang/common-source.inc

@@ -0,0 +1,17 @@
+do_fetch() {
+        :
+}
+do_fetch[noexec] = "1"
+deltask do_unpack
+deltask do_patch
+
+SRC_URI = ""
+
+do_configure[depends] += "llvm-project-source-${PV}:do_patch"
+do_populate_lic[depends] += "llvm-project-source-${PV}:do_unpack"
+do_create_spdx[depends] += "llvm-project-source-${PV}:do_patch"
+
+# spdx shared workdir detection fails as not WORKDIR is altered but S and B
+# return always true to fix that
+def is_work_shared_spdx(d):
+    return True

+ 60 - 0
recipes-devtools/clang/common.inc

@@ -0,0 +1,60 @@
+FILESEXTRAPATHS =. "${FILE_DIRNAME}/clang:"
+
+LIC_FILES_CHKSUM = "file://llvm/LICENSE.TXT;md5=${LLVMMD5SUM} \
+                    file://clang/LICENSE.TXT;md5=${CLANGMD5SUM} \
+"
+LICENSE = "Apache-2.0-with-LLVM-exception"
+
+BASEURI ??= "${LLVM_GIT}/llvm-project;protocol=${LLVM_GIT_PROTOCOL};branch=${BRANCH}"
+SRC_URI = "\
+    ${BASEURI} \
+    file://llvm-config \
+    file://libunwind.pc.in \
+    file://0001-libcxxabi-Find-libunwind-headers-when-LIBCXXABI_LIBU.patch \
+    file://0002-compiler-rt-support-a-new-embedded-linux-target.patch \
+    file://0003-compiler-rt-Simplify-cross-compilation.-Don-t-use-na.patch \
+    file://0004-llvm-TargetLibraryInfo-Undefine-libc-functions-if-th.patch \
+    file://0005-llvm-allow-env-override-of-exe-and-libdir-path.patch \
+    file://0006-clang-driver-Check-sysroot-for-ldso-path.patch \
+    file://0007-clang-Driver-tools.cpp-Add-lssp_nonshared-on-musl.patch \
+    file://0008-clang-Prepend-trailing-to-sysroot.patch \
+    file://0009-clang-Look-inside-the-target-sysroot-for-compiler-ru.patch \
+    file://0010-clang-Define-releative-gcc-installation-dir.patch \
+    file://0011-clang-Add-lpthread-and-ldl-along-with-lunwind-for-st.patch \
+    file://0012-Pass-PYTHON_EXECUTABLE-when-cross-compiling-for-nati.patch \
+    file://0013-Check-for-atomic-double-intrinsics.patch \
+    file://0014-libcxx-Add-compiler-runtime-library-to-link-step-for.patch \
+    file://0015-clang-llvm-cmake-Fix-configure-for-packages-using-fi.patch \
+    file://0016-clang-Fix-resource-dir-location-for-cross-toolchains.patch \
+    file://0017-clang-driver-Add-dyld-prefix-when-checking-sysroot-f.patch \
+    file://0018-clang-Use-python3-in-python-scripts.patch \
+    file://0019-For-x86_64-set-Yocto-based-GCC-install-search-path.patch \
+    file://0020-llvm-Do-not-use-find_library-for-ncurses.patch \
+    file://0021-llvm-Insert-anchor-for-adding-OE-distro-vendor-names.patch \
+    file://0022-compiler-rt-Do-not-use-backtrace-APIs-on-non-glibc-l.patch \
+    file://0023-clang-Fix-x86-triple-for-non-debian-multiarch-linux-.patch \
+    file://0024-libunwind-Added-unw_backtrace-method.patch \
+    file://0025-clang-Do-not-use-install-relative-libc-headers.patch \
+    file://0026-clang-Fix-how-driver-finds-GCC-installation-path-on-.patch \
+    file://0027-Fix-lib-paths-for-OpenEmbedded-Host.patch \
+    file://0028-Correct-library-search-path-for-OpenEmbedded-Host.patch \
+    file://0029-lldb-Link-with-libatomic-on-x86.patch \
+    file://0030-clang-exclude-openembedded-distributions-from-settin.patch \
+    file://0031-compiler-rt-Enable-__int128-for-ppc32.patch \
+    file://0032-llvm-Do-not-use-cmake-infra-to-detect-libzstd.patch \
+    file://0033-build-Enable-64bit-off_t-on-32bit-glibc-systems.patch \
+    file://0034-compiler-rt-Undef-_TIME_BITS-along-with-_FILE_OFFSET.patch \
+    file://0035-compiler-rt-Fix-stat-struct-s-size-for-O32-ABI.patch \
+    file://0036-compiler-rt-Undef-_TIME_BITS-along-with-_FILE_OFFSET.patch \
+    file://0037-clang-Call-printName-to-get-name-of-Decl.patch \
+    "
+# Fallback to no-PIE if not set
+GCCPIE ??= ""
+
+S = "${TMPDIR}/work-shared/llvm-project-source-${PV}-${PR}/git"
+B = "${WORKDIR}/llvm-project-source-${PV}/build.${HOST_SYS}.${TARGET_SYS}"
+
+# We need to ensure that for the shared work directory, the do_patch signatures match
+# The real WORKDIR location isn't a dependency for the shared workdir.
+src_patches[vardepsexclude] = "WORKDIR"
+should_apply[vardepsexclude] += "PN"

+ 116 - 0
recipes-devtools/clang/compiler-rt-sanitizers_16.0.5.bb

@@ -0,0 +1,116 @@
+# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "LLVM based C/C++ compiler Runtime"
+HOMEPAGE = "http://compiler-rt.llvm.org/"
+SECTION = "base"
+
+require clang.inc
+require common-source.inc
+
+inherit cmake pkgconfig python3native
+
+
+LIC_FILES_CHKSUM = "file://compiler-rt/LICENSE.TXT;md5=d846d1d65baf322d4c485d6ee54e877a"
+
+TUNE_CCARGS:remove = "-no-integrated-as"
+
+DEPENDS += "ninja-native virtual/crypt"
+DEPENDS:append:class-native = " clang-native libxcrypt-native"
+DEPENDS:append:class-nativesdk = " clang-native clang-crosssdk-${SDK_ARCH} nativesdk-libxcrypt"
+
+PACKAGECONFIG ??= ""
+PACKAGECONFIG[crt] = "-DCOMPILER_RT_BUILD_CRT:BOOL=ON,-DCOMPILER_RT_BUILD_CRT:BOOL=OFF"
+PACKAGECONFIG[static-libcxx] = "-DSANITIZER_USE_STATIC_CXX_ABI=ON -DSANITIZER_USE_STATIC_LLVM_UNWINDER=ON -DCOMPILER_RT_ENABLE_STATIC_UNWINDER=ON,,"
+
+HF = ""
+HF:class-target = "${@ bb.utils.contains('TUNE_CCARGS_MFLOAT', 'hard', 'hf', '', d)}"
+HF[vardepvalue] = "${HF}"
+
+CXXFLAGS:append:libc-musl = " -D_LARGEFILE64_SOURCE"
+
+OECMAKE_TARGET_COMPILE = "compiler-rt"
+OECMAKE_TARGET_INSTALL = "install-compiler-rt install-compiler-rt-headers"
+OECMAKE_SOURCEPATH = "${S}/llvm"
+EXTRA_OECMAKE += "-DCMAKE_BUILD_TYPE=RelWithDebInfo \
+                  -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \
+                  -DCOMPILER_RT_STANDALONE_BUILD=OFF \
+                  -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \
+                  -DCOMPILER_RT_USE_BUILTINS_LIBRARY=ON \
+                  -DCMAKE_C_COMPILER_TARGET=${HOST_ARCH}${HF}${HOST_VENDOR}-${HOST_OS} \
+                  -DCOMPILER_RT_BUILD_BUILTINS=OFF \
+                  -DCOMPILER_RT_INCLUDE_TESTS=OFF \
+                  -DSANITIZER_CXX_ABI_LIBNAME=${@bb.utils.contains("RUNTIME", "llvm", "libc++", "libstdc++", d)} \
+                  -DCOMPILER_RT_BUILD_XRAY=ON \
+                  -DCOMPILER_RT_BUILD_SANITIZERS=ON \
+                  -DCOMPILER_RT_BUILD_LIBFUZZER=ON \
+                  -DCOMPILER_RT_BUILD_PROFILE=ON \
+                  -DCOMPILER_RT_BUILD_MEMPROF=ON \
+                  -DLLVM_ENABLE_PROJECTS='compiler-rt' \
+                  -DCMAKE_RANLIB=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ranlib \
+                  -DCMAKE_AR=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ar \
+                  -DCMAKE_NM=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-nm \
+                  -DLLVM_LIBDIR_SUFFIX=${LLVM_LIBDIR_SUFFIX} \
+"
+
+EXTRA_OECMAKE:append:class-nativesdk = "\
+               -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen \
+               -DCLANG_TABLEGEN=${STAGING_BINDIR_NATIVE}/clang-tblgen \
+"
+
+EXTRA_OECMAKE:append:class-target = "\
+               -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
+"
+
+EXTRA_OECMAKE:append:libc-musl = " -DLIBCXX_HAS_MUSL_LIBC=ON "
+EXTRA_OECMAKE:append:powerpc = " -DCOMPILER_RT_DEFAULT_TARGET_ARCH=powerpc "
+
+do_install:append () {
+    if [ -n "${LLVM_LIBDIR_SUFFIX}" ]; then
+        mkdir -p ${D}${nonarch_libdir}/clang
+        mv ${D}${libdir}/clang/${MAJOR_VER} ${D}${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}
+        rmdir --ignore-fail-on-non-empty ${D}${libdir}
+    else
+        mv ${D}${libdir}/clang/${MAJOR_VER} ${D}${libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}
+    fi
+    # Already shipped with compile-rt Orc support
+    rm -rf ${D}${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/libclang_rt.orc-*.a
+    rm -rf ${D}${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/include/orc/
+}
+
+FILES_SOLIBSDEV = ""
+FILES:${PN} += "${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/lib*${SOLIBSDEV} \
+                ${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/*.txt \
+                ${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/share/*.txt"
+FILES:${PN}-staticdev += "${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/*.a"
+FILES:${PN}-dev += "${datadir} ${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/*.syms \
+                    ${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/include \
+                    ${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/clang_rt.crt*.o \
+                    ${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/libclang_rt.asan-preinit*.a"
+INSANE_SKIP:${PN} = "dev-so libdir"
+INSANE_SKIP:${PN}-dbg = "libdir"
+
+#PROVIDES:append:class-target = "\
+#        virtual/${TARGET_PREFIX}compilerlibs \
+#        libgcc \
+#        libgcc-initial \
+#        libgcc-dev \
+#        libgcc-initial-dev \
+#        "
+#
+
+RDEPENDS:${PN}-dev += "${PN}-staticdev"
+
+BBCLASSEXTEND = "native nativesdk"
+
+ALLOW_EMPTY:${PN} = "1"
+ALLOW_EMPTY:${PN}-dev = "1"
+
+TOOLCHAIN:forcevariable = "clang"
+SYSROOT_DIRS:append:class-target = " ${nonarch_libdir}"
+
+# riscv and x86_64 Sanitizers work on musl too
+COMPATIBLE_HOST:libc-musl:x86-64 = "(.*)"
+COMPATIBLE_HOST:libc-musl:riscv64 = "(.*)"
+COMPATIBLE_HOST:libc-musl:riscv32 = "(.*)"
+COMPATIBLE_HOST:libc-musl = "null"

+ 129 - 0
recipes-devtools/clang/compiler-rt_16.0.5.bb

@@ -0,0 +1,129 @@
+# Copyright (C) 2015 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "LLVM based C/C++ compiler Runtime"
+HOMEPAGE = "http://compiler-rt.llvm.org/"
+SECTION = "base"
+
+require clang.inc
+require common-source.inc
+
+inherit cmake cmake-native pkgconfig python3native
+
+
+LIC_FILES_CHKSUM = "file://compiler-rt/LICENSE.TXT;md5=d846d1d65baf322d4c485d6ee54e877a"
+
+LIBCPLUSPLUS = ""
+COMPILER_RT = ""
+
+TUNE_CCARGS:remove = "-no-integrated-as"
+
+INHIBIT_DEFAULT_DEPS = "1"
+
+DEPENDS += "ninja-native libgcc"
+DEPENDS:append:class-target = " clang-cross-${TARGET_ARCH} virtual/${MLPREFIX}libc gcc-runtime"
+DEPENDS:append:class-nativesdk = " clang-native clang-crosssdk-${SDK_ARCH} nativesdk-gcc-runtime"
+DEPENDS:append:class-native = " clang-native"
+
+# Trick clang.bbclass into not creating circular dependencies
+UNWINDLIB:class-nativesdk = "--unwindlib=libgcc"
+COMPILER_RT:class-nativesdk:toolchain-clang:runtime-llvm = "-rtlib=libgcc --unwindlib=libgcc"
+LIBCPLUSPLUS:class-nativesdk:toolchain-clang:runtime-llvm = "-stdlib=libstdc++"
+
+CXXFLAGS += "-stdlib=libstdc++"
+LDFLAGS += "-unwindlib=libgcc -rtlib=libgcc -stdlib=libstdc++"
+BUILD_CXXFLAGS += "-stdlib=libstdc++"
+BUILD_LDFLAGS += "-unwindlib=libgcc -rtlib=libgcc -stdlib=libstdc++"
+BUILD_CPPFLAGS:remove = "-stdlib=libc++"
+BUILD_LDFLAGS:remove = "-stdlib=libc++ -lc++abi"
+
+BUILD_CC:toolchain-clang  = "${CCACHE}clang"
+BUILD_CXX:toolchain-clang = "${CCACHE}clang++"
+BUILD_CPP:toolchain-clang = "${CCACHE}clang -E"
+BUILD_CCLD:toolchain-clang = "${CCACHE}clang"
+BUILD_RANLIB:toolchain-clang = "llvm-ranlib"
+BUILD_AR:toolchain-clang = "llvm-ar"
+BUILD_NM:toolchain-clang = "llvm-nm"
+
+PACKAGECONFIG ??= ""
+PACKAGECONFIG[crt] = "-DCOMPILER_RT_BUILD_CRT:BOOL=ON,-DCOMPILER_RT_BUILD_CRT:BOOL=OFF"
+PACKAGECONFIG[profile] ="-DCOMPILER_RT_BUILD_PROFILE=ON,-DCOMPILER_RT_BUILD_PROFILE=OFF"
+
+HF = ""
+HF:class-target = "${@ bb.utils.contains('TUNE_CCARGS_MFLOAT', 'hard', 'hf', '', d)}"
+HF[vardepvalue] = "${HF}"
+
+OECMAKE_TARGET_COMPILE = "compiler-rt"
+OECMAKE_TARGET_INSTALL = "install-compiler-rt install-compiler-rt-headers"
+OECMAKE_SOURCEPATH = "${S}/llvm"
+EXTRA_OECMAKE += "-DCMAKE_BUILD_TYPE=RelWithDebInfo \
+                  -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \
+                  -DCOMPILER_RT_STANDALONE_BUILD=OFF \
+                  -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \
+                  -DCOMPILER_RT_INCLUDE_TESTS=OFF \
+                  -DCMAKE_C_COMPILER_TARGET=${HOST_ARCH}${HF}${HOST_VENDOR}-${HOST_OS} \
+                  -DCOMPILER_RT_BUILD_XRAY=OFF \
+                  -DCOMPILER_RT_BUILD_SANITIZERS=OFF \
+                  -DCOMPILER_RT_BUILD_MEMPROF=OFF \
+                  -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \
+                  -DLLVM_ENABLE_PROJECTS='compiler-rt' \
+                  -DLLVM_LIBDIR_SUFFIX=${LLVM_LIBDIR_SUFFIX} \
+"
+EXTRA_OECMAKE:append:class-target = "\
+               -DCMAKE_RANLIB=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ranlib \
+               -DCMAKE_AR=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ar \
+               -DCMAKE_NM=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-nm \
+               -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
+"
+
+EXTRA_OECMAKE:append:class-nativesdk = "\
+               -DCMAKE_RANLIB=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ranlib \
+               -DCMAKE_AR=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ar \
+               -DCMAKE_NM=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-nm \
+               -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen \
+               -DCLANG_TABLEGEN=${STAGING_BINDIR_NATIVE}/clang-tblgen \
+"
+EXTRA_OECMAKE:append:powerpc = " -DCOMPILER_RT_DEFAULT_TARGET_ARCH=powerpc "
+
+do_install:append () {
+    if [ -n "${LLVM_LIBDIR_SUFFIX}" ]; then
+        mkdir -p ${D}${nonarch_libdir}/clang
+        mv ${D}${libdir}/clang/${MAJOR_VER} ${D}${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}
+        rmdir --ignore-fail-on-non-empty ${D}${libdir}/clang ${D}${libdir}
+    else
+        mv ${D}${libdir}/clang/${MAJOR_VER} ${D}${libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}
+    fi
+}
+
+FILES_SOLIBSDEV = ""
+
+FILES:${PN} += "${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/lib*${SOLIBSDEV} \
+                ${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/*.txt \
+                ${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/share/*.txt"
+FILES:${PN}-staticdev += "${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/*.a"
+FILES:${PN}-dev += "${datadir} ${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/*.syms \
+                    ${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/include \
+                    ${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/clang_rt.crt*.o \
+                    ${nonarch_libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/libclang_rt.asan-preinit*.a"
+
+INSANE_SKIP:${PN} = "dev-so libdir"
+INSANE_SKIP:${PN}-dbg = "libdir"
+
+#PROVIDES:append:class-target = "\
+#        virtual/${TARGET_PREFIX}compilerlibs \
+#        libgcc \
+#        libgcc-initial \
+#        libgcc-dev \
+#        libgcc-initial-dev \
+#        "
+#
+
+RDEPENDS:${PN}-dev += "${PN}-staticdev"
+
+BBCLASSEXTEND = "native nativesdk"
+
+ALLOW_EMPTY:${PN} = "1"
+ALLOW_EMPTY:${PN}-dev = "1"
+
+TOOLCHAIN:forcevariable = "clang"
+SYSROOT_DIRS:append:class-target = " ${nonarch_libdir}"

+ 0 - 3
recipes-devtools/clang/compiler-rt_git.bbappend

@@ -1,3 +0,0 @@
-MAJOR_VER = "15"
-MINOR_VER = "0"
-PATCH_VER = "0"

+ 48 - 0
recipes-devtools/clang/libclc_16.0.5.bb

@@ -0,0 +1,48 @@
+DESCRIPTION = "LLVM based OpenCL runtime support library"
+HOMEPAGE = "http://libclc.llvm.org/"
+SECTION = "libs"
+
+require clang.inc
+require common-source.inc
+
+TOOLCHAIN = "clang"
+
+LIC_FILES_CHKSUM = "file://libclc/LICENSE.TXT;md5=7cc795f6cbb2d801d84336b83c8017db"
+
+inherit cmake pkgconfig python3native qemu
+
+DEPENDS += "qemu-native clang spirv-tools spirv-llvm-translator spirv-llvm-translator-native ncurses"
+
+OECMAKE_SOURCEPATH = "${S}/libclc"
+
+EXTRA_OECMAKE += " \
+                                -DCMAKE_BUILD_TYPE=RelWithDebInfo \
+                                -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \
+				-DCMAKE_CROSSCOMPILING_EMULATOR=${WORKDIR}/qemuwrapper \
+				-DLLVM_CLANG=${STAGING_BINDIR_NATIVE}/clang \
+				-DLLVM_AS=${STAGING_BINDIR_NATIVE}/llvm-as \
+				-DLLVM_LINK=${STAGING_BINDIR_NATIVE}/llvm-link \
+				-DLLVM_OPT=${STAGING_BINDIR_NATIVE}/opt \
+				-DLLVM_SPIRV=${STAGING_BINDIR_NATIVE}/llvm-spirv \
+				-Dclc_comp_in:FILEPATH=${OECMAKE_SOURCEPATH}/cmake/CMakeCLCCompiler.cmake.in \
+				-Dll_comp_in:FILEPATH=${OECMAKE_SOURCEPATH}/cmake/CMakeLLAsmCompiler.cmake.in \
+				-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
+			"
+
+do_configure:prepend () {
+	# Write out a qemu wrapper that will be used by cmake
+	# so that it can run target helper binaries through that.
+	qemu_binary="${@qemu_wrapper_cmdline(d, d.getVar('STAGING_DIR_HOST'), [d.expand('${STAGING_DIR_HOST}${libdir}'),d.expand('${STAGING_DIR_HOST}${base_libdir}')])}"
+	cat > ${WORKDIR}/qemuwrapper << EOF
+#!/bin/sh
+$qemu_binary "\$@"
+EOF
+	chmod +x ${WORKDIR}/qemuwrapper
+}
+
+FILES:${PN} += "${datadir}/clc"
+
+BBCLASSEXTEND = "native nativesdk"
+
+export YOCTO_ALTERNATE_EXE_PATH
+export YOCTO_ALTERNATE_LIBDIR

+ 115 - 0
recipes-devtools/clang/libcxx_16.0.5.bb

@@ -0,0 +1,115 @@
+# Copyright (C) 2015 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "libc++ is a new implementation of the C++ standard library, targeting C++11"
+HOMEPAGE = "http://libcxx.llvm.org/"
+SECTION = "base"
+
+require clang.inc
+require common-source.inc
+
+inherit cmake cmake-native python3native
+
+PACKAGECONFIG ??= "compiler-rt exceptions ${@bb.utils.contains("RUNTIME", "llvm", "unwind unwind-shared", "", d)}"
+PACKAGECONFIG:append:armv5 = " no-atomics"
+PACKAGECONFIG:remove:class-native = "compiler-rt"
+PACKAGECONFIG[unwind] = "-DLIBCXXABI_USE_LLVM_UNWINDER=ON -DLIBCXXABI_ENABLE_STATIC_UNWINDER=ON,-DLIBCXXABI_USE_LLVM_UNWINDER=OFF,,"
+PACKAGECONFIG[exceptions] = "-DLIBCXXABI_ENABLE_EXCEPTIONS=ON -DDLIBCXX_ENABLE_EXCEPTIONS=ON,-DLIBCXXABI_ENABLE_EXCEPTIONS=OFF -DLIBCXX_ENABLE_EXCEPTIONS=OFF -DCMAKE_REQUIRED_FLAGS='-fno-exceptions',"
+PACKAGECONFIG[no-atomics] = "-D_LIBCXXABI_HAS_ATOMIC_BUILTINS=OFF -DCMAKE_SHARED_LINKER_FLAGS='-latomic',,"
+PACKAGECONFIG[compiler-rt] = "-DLIBCXX_USE_COMPILER_RT=ON -DLIBCXXABI_USE_COMPILER_RT=ON -DLIBUNWIND_USE_COMPILER_RT=ON,,compiler-rt"
+PACKAGECONFIG[unwind-shared] = "-DLIBUNWIND_ENABLE_SHARED=ON,-DLIBUNWIND_ENABLE_SHARED=OFF,,"
+
+DEPENDS += "ninja-native"
+DEPENDS:append:class-target = " clang-cross-${TARGET_ARCH} virtual/${MLPREFIX}libc virtual/${TARGET_PREFIX}compilerlibs"
+DEPENDS:append:class-nativesdk = " clang-crosssdk-${SDK_ARCH} nativesdk-compiler-rt"
+DEPENDS:append:class-native = " clang-native"
+
+LIBCPLUSPLUS = ""
+COMPILER_RT ?= "-rtlib=compiler-rt"
+
+# Trick clang.bbclass into not creating circular dependencies
+UNWINDLIB:class-nativesdk = "--unwindlib=libgcc"
+COMPILER_RT:class-nativesdk = "-rtlib=libgcc --unwindlib=libgcc"
+LIBCPLUSPLUS:class-nativesdk = "-stdlib=libstdc++"
+
+CC:append:toolchain-clang:class-native = " -unwindlib=libgcc -rtlib=libgcc"
+CC:append:toolchain-clang:class-nativesdk = " -unwindlib=libgcc -rtlib=libgcc"
+
+CXXFLAGS += "-stdlib=libstdc++"
+LDFLAGS += "-unwindlib=libgcc -stdlib=libstdc++"
+BUILD_CXXFLAGS += "-stdlib=libstdc++"
+BUILD_LDFLAGS += "-unwindlib=libgcc -rtlib=libgcc -stdlib=libstdc++"
+BUILD_CPPFLAGS:remove = "-stdlib=libc++"
+BUILD_LDFLAGS:remove = "-stdlib=libc++ -lc++abi"
+
+INHIBIT_DEFAULT_DEPS = "1"
+
+LIC_FILES_CHKSUM = "file://libcxx/LICENSE.TXT;md5=55d89dd7eec8d3b4204b680e27da3953 \
+                    file://libcxxabi/LICENSE.TXT;md5=7b9334635b542c56868400a46b272b1e \
+                    file://libunwind/LICENSE.TXT;md5=f66970035d12f196030658b11725e1a1 \
+"
+
+OECMAKE_TARGET_COMPILE = "cxxabi cxx"
+OECMAKE_TARGET_INSTALL = "install-cxx install-cxxabi ${@bb.utils.contains("RUNTIME", "llvm", "install-unwind", "", d)}"
+
+OECMAKE_SOURCEPATH = "${S}/llvm"
+EXTRA_OECMAKE += "\
+                  -DCMAKE_BUILD_TYPE=RelWithDebInfo \
+                  -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \
+                  -DCMAKE_CROSSCOMPILING=ON \
+                  -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON \
+                  -DLLVM_ENABLE_RTTI=ON \
+                  -DLIBUNWIND_ENABLE_CROSS_UNWINDING=ON \
+                  -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON \
+                  -DLIBCXXABI_INCLUDE_TESTS=OFF \
+                  -DLIBCXXABI_ENABLE_SHARED=ON \
+                  -DLIBCXXABI_LIBCXX_INCLUDES=${S}/libcxx/include \
+                  -DLIBCXX_CXX_ABI=libcxxabi \
+                  -DLIBCXX_CXX_ABI_INCLUDE_PATHS=${S}/libcxxabi/include \
+                  -DLIBCXX_CXX_ABI_LIBRARY_PATH=${B}/lib${LLVM_LIBDIR_SUFFIX} \
+                  -S ${S}/runtimes \
+                  -DLLVM_ENABLE_RUNTIMES='libcxx;libcxxabi;libunwind' \
+                  -DLLVM_LIBDIR_SUFFIX=${LLVM_LIBDIR_SUFFIX} \
+                  -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \
+"
+
+EXTRA_OECMAKE:append:class-target = " \
+                  -DCMAKE_AR=${STAGING_BINDIR_TOOLCHAIN}/${AR} \
+                  -DCMAKE_NM=${STAGING_BINDIR_TOOLCHAIN}/${NM} \
+                  -DCMAKE_RANLIB=${STAGING_BINDIR_TOOLCHAIN}/${RANLIB} \
+                  -DLLVM_DEFAULT_TARGET_TRIPLE=${HOST_SYS} \
+                  -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
+"
+
+EXTRA_OECMAKE:append:class-nativesdk = " \
+                  -DCMAKE_AR=${STAGING_BINDIR_TOOLCHAIN}/${AR} \
+                  -DCMAKE_NM=${STAGING_BINDIR_TOOLCHAIN}/${NM} \
+                  -DCMAKE_RANLIB=${STAGING_BINDIR_TOOLCHAIN}/${RANLIB} \
+                  -DLLVM_DEFAULT_TARGET_TRIPLE=${HOST_SYS} \
+"
+
+EXTRA_OECMAKE:append:libc-musl = " -DLIBCXX_HAS_MUSL_LIBC=ON "
+
+CXXFLAGS:append:armv5 = " -mfpu=vfp2"
+
+ALLOW_EMPTY:${PN} = "1"
+
+PROVIDES:append:runtime-llvm = " libunwind"
+
+do_install:append() {
+    if ${@bb.utils.contains("RUNTIME", "llvm", "true", "false", d)}
+    then
+        for f in libunwind.h __libunwind_config.h unwind.h unwind_itanium.h unwind_arm_ehabi.h
+        do
+            install -Dm 0644 ${S}/libunwind/include/$f ${D}${includedir}/$f
+        done
+        install -d ${D}${libdir}/pkgconfig
+        sed -e 's,@LIBDIR@,${libdir},g;s,@VERSION@,${PV},g' ${S}/../libunwind.pc.in > ${D}${libdir}/pkgconfig/libunwind.pc
+    fi
+}
+
+PACKAGES:append:runtime-llvm = " libunwind"
+FILES:libunwind:runtime-llvm = "${libdir}/libunwind.so.*"
+
+BBCLASSEXTEND = "native nativesdk"
+TOOLCHAIN:forcevariable = "clang"

+ 0 - 4
recipes-devtools/clang/libcxx_git.bbappend → recipes-devtools/clang/libcxx_16.0.5.bbappend

@@ -1,7 +1,3 @@
-MAJOR_VER = "15"
-MINOR_VER = "0"
-PATCH_VER = "0"
-
 #Disable compiler-rt from packages
 PACKAGECONFIG:remove = "compiler-rt"
 

+ 10 - 0
recipes-devtools/clang/llvm-project-source.bb

@@ -0,0 +1,10 @@
+# Copyright (C) 2018 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+SUMMARY = "This is the canonical git mirror of the LLVM subversion repository."
+HOMEPAGE = "https://github.com/llvm/llvm-project"
+
+require llvm-project-source.inc
+require clang.inc
+
+EXCLUDE_FROM_WORLD = "1"

+ 29 - 27
recipes-devtools/clang/llvm-project-source.bbappend

@@ -1,26 +1,24 @@
 FILESEXTRAPATHS:prepend := "${THISDIR}/clang:"
 
-MAJOR_VER = "15"
-MINOR_VER = "0"
-PATCH_VER = "0"
-
-SRCREV = "d6cf181a8df6a7925660b2332e3ab7dbcfd08145"
-BRANCH = "main"
+SRCREV = "35bd94a4b791787e7f3938e10ce80f409831dd7e"
+BRANCH = "release/16.x"
 
 SRC_URI = "\
     ${BASEURI} \
     file://llvm-config \
     file://libunwind.pc.in \
-    file://0001-Merge-four-Custom-CSR-cache-instruction.patch \
-    file://0002-add-pref-instruction.patch \
-    file://0003-add-multilib-v-b-support-for-baremetal-toolchain.patch \
-    file://0004-set-default-march-to-rv64imafcd_zba_zbb_zbc_zbs-and-.patch \
-    file://0005-support-b-letter-in-march-string.patch \
-    file://0006-set-clang-default-dwarf-version-to-4.patch \
-    file://0007-set-clang-default-march-to-rv64gc.patch \
-    file://0008-change-baremetal-multilib-directory-name-to-align-wi.patch \
-    file://0001-libcxxabi-Find-libunwind-headers-when.patch \
+    file://0001-neon2rvv-support-type-convert-between-fixed-vector-a.patch \
+    file://0002-neon2rvv-Model-vxrm-in-LLVM-intrinsics-and-add-optim.patch \
+    file://0003-RISCV-Add-prefetch-instructions.patch \
+    file://0004-RISCV-Add-customer-cache-instructions.patch \
+    file://0005-RISCV-Add-multilib-v-b-support-for-baremetal-toolcha.patch \
+    file://0006-RISCV-Change-baremetal-multilib-directory-name-to-al.patch \
+    file://0007-Driver-Set-clang-default-dwarf-version-to-4.patch \
+    file://0008-RISCV-Support-b-letter-in-march-string.patch \
+    file://0009-RISCV-Align-default-march-with-dubhe-gcc-toolchain.patch \
+    file://0001-libcxxabi-Find-libunwind-headers-when-LIBCXXABI_LIBU.patch \
     file://0002-compiler-rt-support-a-new-embedded-linux-target.patch \
+    file://0003-compiler-rt-Simplify-cross-compilation.-Don-t-use-na.patch \
     file://0004-llvm-TargetLibraryInfo-Undefine-libc-functions-if-th.patch \
     file://0005-llvm-allow-env-override-of-exe-and-libdir-path.patch \
     file://0006-clang-driver-Check-sysroot-for-ldso-path.patch \
@@ -39,16 +37,20 @@ SRC_URI = "\
     file://0019-For-x86_64-set-Yocto-based-GCC-install-search-path.patch \
     file://0020-llvm-Do-not-use-find_library-for-ncurses.patch \
     file://0021-llvm-Insert-anchor-for-adding-OE-distro-vendor-names.patch \
-    file://0022-compiler-rt-Use-mcr-based-barrier-on-armv6.patch \
-    file://0023-compiler-rt-Do-not-use-backtrace-APIs-on-non-glibc-l.patch \
-    file://0024-clang-Fix-x86-triple-for-non-debian-multiarch-linux-.patch \
-    file://0025-compiler-rt-Link-scudo-with-SANITIZER_CXX_ABI_LIBRAR.patch \
-    file://0026-compiler-rt-Link-scudo-standalone-with-libatomic-on-.patch \
-    file://0027-libunwind-Added-unw_backtrace-method.patch \
-    file://0029-clang-Do-not-use-install-relative-libc-headers.patch \
-    file://0030-clang-Fix-how-driver-finds-GCC-installation-path-on-.patch \
-    file://0032-Correct-library-search-path-for-OpenEmbedded-Host.patch \
-    file://0033-lldb-Link-with-libatomic-on-x86.patch \
-    file://0034-clang-exclude-openembedded-distributions-from-settin.patch \
-    file://0035-compiler-rt-Enable-__int128-for-ppc32.patch \
+    file://0022-compiler-rt-Do-not-use-backtrace-APIs-on-non-glibc-l.patch \
+    file://0023-clang-Fix-x86-triple-for-non-debian-multiarch-linux-.patch \
+    file://0024-libunwind-Added-unw_backtrace-method.patch \
+    file://0025-clang-Do-not-use-install-relative-libc-headers.patch \
+    file://0026-clang-Fix-how-driver-finds-GCC-installation-path-on-.patch \
+    file://0027-Fix-lib-paths-for-OpenEmbedded-Host.patch \
+    file://0028-Correct-library-search-path-for-OpenEmbedded-Host.patch \
+    file://0029-lldb-Link-with-libatomic-on-x86.patch \
+    file://0030-clang-exclude-openembedded-distributions-from-settin.patch \
+    file://0031-compiler-rt-Enable-__int128-for-ppc32.patch \
+    file://0032-llvm-Do-not-use-cmake-infra-to-detect-libzstd.patch \
+    file://0033-build-Enable-64bit-off_t-on-32bit-glibc-systems.patch \
+    file://0034-compiler-rt-Undef-_TIME_BITS-along-with-_FILE_OFFSET.patch \
+    file://0035-compiler-rt-Fix-stat-struct-s-size-for-O32-ABI.patch \
+    file://0036-compiler-rt-Undef-_TIME_BITS-along-with-_FILE_OFFSET.patch \
+    file://0037-clang-Call-printName-to-get-name-of-Decl.patch \
     "

+ 96 - 0
recipes-devtools/clang/llvm-project-source.inc

@@ -0,0 +1,96 @@
+deltask do_configure
+deltask do_compile
+deltask do_install
+deltask do_populate_sysroot
+deltask do_populate_lic
+RM_WORK_EXCLUDE += "${PN}"
+
+inherit nopackages
+
+PN = "llvm-project-source-${PV}"
+WORKDIR = "${TMPDIR}/work-shared/llvm-project-source-${PV}-${PR}"
+SSTATE_SWSPEC = "sstate:llvm-project-source::${PV}:${PR}::${SSTATE_VERSION}:"
+
+STAMP = "${STAMPS_DIR}/work-shared/llvm-project-source-${PV}-${PR}"
+STAMPCLEAN = "${STAMPS_DIR}/work-shared/llvm-project-source-${PV}-*"
+
+INHIBIT_DEFAULT_DEPS = "1"
+DEPENDS = ""
+PACKAGES = ""
+TARGET_ARCH = "allarch"
+TARGET_AS_ARCH = "none"
+TARGET_CC_ARCH = "none"
+TARGET_LD_ARCH = "none"
+TARGET_OS = "linux"
+baselib = "lib"
+PACKAGE_ARCH = "all"
+
+# space separated list of additional distro vendor values we want to support e.g.
+# "yoe webos" or "-yoe -webos" '-' is optional
+CLANG_EXTRA_OE_VENDORS ?= "${TARGET_VENDOR} ${SDK_VENDOR}"
+# Extra OE DISTRO that want to support as build host. space separated list of additional distro.
+# ":" separated the ID in "/etc/os-release" and the triple for finding gcc on this OE DISTRO.
+# eg: "poky:poky wrlinux:wrs"
+CLANG_EXTRA_OE_DISTRO ?= "poky:poky"
+# Match with MULTILIB_GLOBAL_VARIANTS
+MULTILIB_VARIANTS = "lib32 lib64 libx32"
+python add_distro_vendor() {
+    import subprocess
+    case = ""
+    triple = ""
+    vendors = d.getVar('CLANG_EXTRA_OE_VENDORS')
+    multilib_variants = (d.getVar("MULTILIB_VARIANTS") or "").split()
+    vendors_to_add = []
+    for vendor in vendors.split():
+        # convert -yoe into yoe
+        vendor = vendor.lstrip('-')
+        # generate possible multilib vendor names for yoe
+        # such as yoemllib32
+        vendors_to_add.extend([vendor + 'ml' + variant for variant in multilib_variants])
+        # skip oe since already part of the cpp file
+        if vendor != "oe":
+            vendors_to_add.append(vendor)
+
+    for vendor_to_add in vendors_to_add:
+        case += '\\n    .Case("' + vendor_to_add + '", Triple::OpenEmbedded)'
+        triple += ' "x86_64-' + vendor_to_add + '-linux",'
+
+    bb.note("Adding support following TARGET_VENDOR values")
+    bb.note(str(vendors_to_add))
+    bb.note("in llvm/lib/TargetParser/Triple.cpp and ${S}/clang/lib/Driver/ToolChains/Gnu.cpp")
+    cmd = d.expand("sed -i 's#//CLANG_EXTRA_OE_VENDORS_TRIPLES#%s#g' ${S}/clang/lib/Driver/ToolChains/Gnu.cpp" % (triple))
+    subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
+    cmd = d.expand("sed -i 's#//CLANG_EXTRA_OE_VENDORS_CASES#%s#g' -i ${S}/llvm/lib/TargetParser/Triple.cpp" % (case))
+    subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
+
+
+    case = ""
+    triple = ""
+    name = ""
+    check = ""
+    oe_names = ""
+    distros = d.getVar('CLANG_EXTRA_OE_DISTRO')
+    for distro in distros.split():
+        distro_id = distro.split(":")[0].replace('-','_')
+        distro_triple = distro.split(":")[1]
+        case += '\\n    .Case("' + distro_id + '", Distro::' + distro_id.upper() + ')'
+        triple += '\\n   if (Distro.Is' + distro_id.upper() + '())\\n     return "x86_64-' + distro_triple + '-linux",'
+        name += '\\n    '+ distro_id.upper() + ','
+        check += '\\nbool Is' + distro_id.upper() + '() const { return DistroVal == ' + distro_id.upper() + '; }'
+        oe_names +=  distro_id.upper() + ' ||'
+
+    check += '\\nbool IsOpenEmbedded() const { return DistroVal == ' + oe_names[0:-3] + '; }'
+
+    cmd = d.expand("sed -i 's#//CLANG_EXTRA_OE_DISTRO_NAME#%s#g' ${S}/clang/include/clang/Driver/Distro.h" % (name))
+    subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
+    cmd = d.expand("sed -i 's#//CLANG_EXTRA_OE_DISTRO_CHECK#%s#g' ${S}/clang/include/clang/Driver/Distro.h" % (check))
+    subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
+    cmd = d.expand("sed -i 's#//CLANG_EXTRA_OE_DISTRO_TRIPLES#%s#g' ${S}/clang/lib/Driver/ToolChains/Linux.cpp" % (triple))
+    subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
+    cmd = d.expand("sed -i 's#//CLANG_EXTRA_OE_DISTRO_CASES#%s#g' -i ${S}/clang/lib/Driver/Distro.cpp" % (case))
+    subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
+}
+
+do_patch[postfuncs] += "add_distro_vendor"
+do_create_spdx[depends] += "${PN}:do_patch"
+

+ 35 - 0
recipes-devtools/clang/nativesdk-clang-glue.bb

@@ -0,0 +1,35 @@
+# Copyright (C) 2014 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "SDK Cross compiler wrappers for LLVM based C/C++ compiler"
+HOMEPAGE = "http://clang.llvm.org/"
+LICENSE = "Apache-2.0-with-LLVM-exception"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0-with-LLVM-exception;md5=0bcd48c3bdfef0c9d9fd17726e4b7dab"
+SECTION = "devel"
+
+inherit nativesdk
+DEPENDS += "nativesdk-clang"
+
+do_install() {
+    install -d ${D}${prefix_nativesdk}
+    cd ${D}${prefix_nativesdk}
+    ln -s ..${libdir} .
+    ln -s ..${includedir} .
+    cd ..
+    ln -s .${base_libdir} .
+}
+
+sysroot_stage_all () {
+	sysroot_stage_dir ${D} ${SYSROOT_DESTDIR}
+}
+
+FILES:${PN} += "${prefix_nativesdk} ${base_libdir_nativesdk}"
+FILES:${PN}-dbg = ""
+
+deltask do_configure
+deltask do_compile
+deltask do_patch
+deltask do_fetch
+deltask do_unpack
+deltask do_create_spdx
+deltask do_create_runtime_spdx

+ 65 - 0
recipes-devtools/clang/openmp_16.0.5.bb

@@ -0,0 +1,65 @@
+# Copyright (C) 2017 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "LLVM based C/C++ compiler Runtime"
+HOMEPAGE = "https://openmp.llvm.org/"
+SECTION = "libs"
+
+require clang.inc
+require common-source.inc
+
+TOOLCHAIN = "clang"
+
+LIC_FILES_CHKSUM = "file://openmp/LICENSE.TXT;md5=d75288d1ce0450b28b8d58a284c09c79"
+
+inherit cmake pkgconfig perlnative python3native python3targetconfig
+
+DEPENDS += "elfutils libffi clang"
+
+EXTRA_OECMAKE += "-DCMAKE_BUILD_TYPE=RelWithDebInfo \
+                  -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \
+                  -DOPENMP_LIBDIR_SUFFIX=${@d.getVar('baselib').replace('lib', '')} \
+                  -DOPENMP_STANDALONE_BUILD=ON \
+                  -DCLANG_TOOL=${STAGING_BINDIR_NATIVE}/clang \
+                  -DLINK_TOOL=${STAGING_BINDIR_NATIVE}/llvm-link \
+                  -DOPT_TOOL=${STAGING_BINDIR_NATIVE}/opt \
+                  -DOPENMP_LLVM_LIT_EXECUTABLE=${STAGING_BINDIR_NATIVE}/llvm-lit \
+                  -DEXTRACT_TOOL=${STAGING_BINDIR_NATIVE}/llvm-extract \
+                  -DPACKAGER_TOOL=${STAGING_BINDIR_NATIVE}/clang-offload-packager \
+                  -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
+                  "
+
+OECMAKE_SOURCEPATH = "${S}/openmp"
+
+PACKAGECONFIG ?= "ompt-tools offloading-plugin"
+
+PACKAGECONFIG:remove:arm = "ompt-tools offloading-plugin"
+PACKAGECONFIG:remove:powerpc = "ompt-tools offloading-plugin"
+
+PACKAGECONFIG:append:mipsarcho32 = " no-atomics"
+
+PACKAGECONFIG[ompt-tools] = "-DOPENMP_ENABLE_OMPT_TOOLS=ON,-DOPENMP_ENABLE_OMPT_TOOLS=OFF,"
+PACKAGECONFIG[aliases] = "-DLIBOMP_INSTALL_ALIASES=ON,-DLIBOMP_INSTALL_ALIASES=OFF,"
+PACKAGECONFIG[offloading-plugin] = ",,elfutils libffi,libelf libffi"
+PACKAGECONFIG[no-atomics] = "-DLIBOMP_HAVE_BUILTIN_ATOMIC=OFF -DLIBOMP_LIBFLAGS='-latomic',,"
+
+PACKAGES += "${PN}-libomptarget ${PN}-gdb-plugin"
+FILES_SOLIBSDEV = ""
+FILES:${PN} += "${libdir}/lib*${SOLIBSDEV}"
+FILES:${PN}-libomptarget = "${libdir}/libomptarget-*.bc"
+FILES:${PN}-gdb-plugin = "${datadir}/gdb/python/ompd"
+
+RDEPENDS:${PN}-gdb-plugin += "python3-core"
+
+INSANE_SKIP:${PN} = "dev-so"
+# Currently the static libraries contain buildpaths
+INSANE_SKIP:${PN}-staticdev += "buildpaths"
+
+COMPATIBLE_HOST:mips64 = "null"
+COMPATIBLE_HOST:riscv32 = "null"
+COMPATIBLE_HOST:powerpc = "null"
+
+BBCLASSEXTEND = "native nativesdk"
+
+# This appears to be specific to the Intel distribution before 2022.1
+CVE_CHECK_IGNORE += "CVE-2022-26345"