llvm: add SPIRV-LLVM-Translator support

Mesa builds require SPIRV-LLVM-Translator in order to build CLC support.
While it is possible to build it separately (like meta-clang does), it
also requires a separate clang compiler (which OE-Core doesn't provide).

Use an alternative path and build SPIRV-LLVM-Translator as a part of the
LLVM build process, lifting the requirement for the separate clang. Once
Clang is properly integrated into the OE-Core layer, this can be split
to a separate package and dropped. In order to ease migration from
meta-clang and to ease future split, PROVIDE the spirv-llvm-translator
and make the llvm-spirv package RPROVIDE spirv-llvm-translator.

(From OE-Core rev: a617aaf3ac6b1ef2f4b0aaf6ca60122425ea6a7e)

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Dmitry Baryshkov 2025-04-10 05:54:47 +03:00 committed by Richard Purdie
parent c3a1f9b863
commit 377a1cd823
3 changed files with 89 additions and 5 deletions

View File

@ -0,0 +1,30 @@
From e94e529aefb28b65165e978daa2bfd89867ee8d0 Mon Sep 17 00:00:00 2001
From: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Date: Fri, 21 Mar 2025 17:17:52 +0200
Subject: [PATCH] SPIRV-LLVM-Translator: fix handling of built-in SPIRV targer
If the SPIRV-LLVM-Translator is being built together with the LLVM, set
the defines declaring whether SPIRV target is also included into the
LLVM library or not. Otherwise llvm-spirv execution fails because
spirv-ext option is registered twice.
Upstream-Status: Pending [will be submitted upstream after internal clearance]
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Index: llvm-project-20.1.0.src/llvm/projects/SPIRV-LLVM-Translator/CMakeLists.txt
===================================================================
--- llvm-project-20.1.0.src.orig/llvm/projects/SPIRV-LLVM-Translator/CMakeLists.txt
+++ llvm-project-20.1.0.src/llvm/projects/SPIRV-LLVM-Translator/CMakeLists.txt
@@ -116,6 +116,12 @@ if(LLVM_SPIRV_BUILD_EXTERNAL)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif()
+else()
+ is_llvm_target_library("SPIRV" spirv_present_result INCLUDED_TARGETS)
+ if(spirv_present_result)
+ set(SPIRV_BACKEND_FOUND TRUE)
+ add_compile_definitions(LLVM_SPIRV_BACKEND_TARGET_PRESENT)
+ endif()
endif()
set(LLVM_SPIRV_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include)

View File

@ -0,0 +1,25 @@
From e94e529aefb28b65165e978daa2bfd89867ee8d0 Mon Sep 17 00:00:00 2001
From: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Date: Thu, 9 Apr 2025 15:20:32 +0200
Subject: [PATCH] SPIRV-LLVM-Translator: build shared library
By default SPIRV-LLVM-Translator builds only a static version of the library.
Unfortunately this might result in linking erros when uninative is in play, if
libLLVMSPIRV uses symbols which are provided only by the uninative libc and are
not provided by the host libc.
Upstream-Status: Inappropriate [OE-Specific]
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Index: llvm-project-20.1.1.src/llvm/projects/SPIRV-LLVM-Translator/lib/SPIRV/CMakeLists.txt
===================================================================
--- llvm-project-20.1.1.src.orig/llvm/projects/SPIRV-LLVM-Translator/lib/SPIRV/CMakeLists.txt
+++ llvm-project-20.1.1.src/llvm/projects/SPIRV-LLVM-Translator/lib/SPIRV/CMakeLists.txt
@@ -42,6 +42,7 @@ set(SRC_LIST
)
add_llvm_library(LLVMSPIRVLib
${SRC_LIST}
+ SHARED
LINK_COMPONENTS
Analysis
BitWriter

View File

@ -23,9 +23,23 @@ MAJ_MIN_VERSION = "${@oe.utils.trim_version("${PV}", 2)}"
LLVM_RELEASE = "${PV}"
SRCREV_spirv = "68edc9d3d10ff6ec6353803a1bc60a5c25e7b715"
# pattern: llvm_branch_200, currently there are no minor releases, so, no llvm_branch_201
SPIRV_BRANCH = "llvm_release_${@oe.utils.trim_version('${PV}', 1).replace('.', '')}0"
SRC_URI_SPIRV = " \
git://github.com/KhronosGroup/SPIRV-LLVM-Translator;protocol=https;name=spirv;branch=${SPIRV_BRANCH};destsuffix=llvm-project-${PV}.src/llvm/projects/SPIRV-LLVM-Translator \
file://spirv-internal-build.patch \
"
SRC_URI_SPIRV:append:class-native = " \
file://spirv-shared-library.patch \
"
SRC_URI = "https://github.com/llvm/llvm-project/releases/download/llvmorg-${PV}/llvm-project-${PV}.src.tar.xz \
file://0007-llvm-allow-env-override-of-exe-path.patch \
file://0001-AsmMatcherEmitter-sort-ClassInfo-lists-by-name-as-we.patch \
${@bb.utils.contains('PACKAGECONFIG', 'spirv-llvm-translator', '${SRC_URI_SPIRV}', '', d)} \
file://llvm-config \
"
SRC_URI[sha256sum] = "f0a4a240aabc9b056142d14d5478bb6d962aeac549cbd75b809f5499240a8b38"
@ -58,11 +72,12 @@ def get_llvm_arch(bb, d, arch_var):
def get_llvm_host_arch(bb, d):
return get_llvm_arch(bb, d, 'HOST_ARCH')
PACKAGECONFIG ??= "libllvm libclc"
PACKAGECONFIG ??= "libllvm libclc spirv-llvm-translator"
# if optviewer OFF, force the modules to be not found or the ones on the host would be found
PACKAGECONFIG[optviewer] = ",-DPY_PYGMENTS_FOUND=OFF -DPY_PYGMENTS_LEXERS_C_CPP_FOUND=OFF -DPY_YAML_FOUND=OFF,python3-pygments python3-pyyaml,python3-pygments python3-pyyaml"
PACKAGECONFIG[libllvm] = ""
PACKAGECONFIG[libclc] = ""
PACKAGECONFIG[spirv-llvm-translator] = "-DLLVM_EXTERNAL_SPIRV_HEADERS_SOURCE_DIR=${STAGING_INCDIR}/.. ,,spirv-tools-native spirv-headers"
#
# Default to build all OE-Core supported target arches (user overridable).
@ -72,7 +87,9 @@ LLVM_TARGETS ?= "AMDGPU;NVPTX;SPIRV;${@get_llvm_host_arch(bb, d)}"
ARM_INSTRUCTION_SET:armv5 = "arm"
ARM_INSTRUCTION_SET:armv4t = "arm"
LLVM_PROJECTS = "${@bb.utils.contains('PACKAGECONFIG', 'libclc', 'clang;libclc', '', d)}"
LLVM_PROJECTS_CLANG = "${@bb.utils.contains_any('PACKAGECONFIG', 'libclc spirv-llvm-translator', 'clang', '', d)}"
LLVM_PROJECTS_CLC = "${@bb.utils.contains('PACKAGECONFIG', 'libclc', ';libclc', '', d)}"
LLVM_PROJECTS = "${LLVM_PROJECTS_CLANG}${LLVM_PROJECTS_CLC}"
EXTRA_OECMAKE += "-DLLVM_ENABLE_ASSERTIONS=OFF \
-DLLVM_ENABLE_EXPENSIVE_CHECKS=OFF \
@ -138,7 +155,7 @@ do_install() {
fi
# Remove clang bits from target packages, we are not providing it for the system
if ${@bb.utils.contains('PACKAGECONFIG', 'libclc', 'true', 'false', d)} &&
if ${@bb.utils.contains_any('PACKAGECONFIG', 'libclc spirv-llvm-translator', 'true', 'false', d)} &&
[ "${CLASSOVERRIDE}" != "class-native" ] ; then
rm -f ${D}${bindir}/clang*
rm -fr ${D}${libdir}/clang
@ -176,11 +193,12 @@ llvm_sysroot_preprocess() {
ln -sf llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/llvm-config${PV}
}
PACKAGES =+ "${PN}-bugpointpasses ${PN}-llvmhello ${PN}-libllvm ${PN}-liboptremarks ${PN}-liblto ${PN}-clc"
PROVIDES = "${@bb.utils.filter('PACKAGECONFIG', 'libclc', d)}"
PACKAGES =+ "${PN}-bugpointpasses ${PN}-llvmhello ${PN}-libllvm ${PN}-liboptremarks ${PN}-liblto ${PN}-clc ${PN}-spirv"
PROVIDES = "${@bb.utils.filter('PACKAGECONFIG', 'libclc spirv-llvm-translator', d)}"
RRECOMMENDS:${PN}-dev += "${PN}-bugpointpasses ${PN}-llvmhello ${PN}-liboptremarks"
RPROVIDES:${PN}-clc = "${@bb.utils.filter('PACKAGECONFIG', 'libclc', d)}"
RPROVIDES:${PN}-spirv = "${@bb.utils.filter('PACKAGECONFIG', 'spirv-llvm-translator', d)}"
FILES:${PN}-bugpointpasses = "\
${libdir}/BugpointPasses.so \
@ -215,6 +233,17 @@ FILES:${PN}-staticdev += "\
FILES:${PN}-clc += "${datadir}/clc"
FILES:${PN}-spirv = " \
${bindir}/llvm-spirv \
${includedir}/LLVMSPIRVLib \
${libdir}/pkgconfig/LLVMSPIRVLib.pc \
${libdir}/libLLVMSPIRV* \
"
INSANE_SKIP:${PN}-libllvm += "dev-so"
# SPIRV-LLVM-Translator provides only static libraries, they are included into
# the llvm-spirv package.
INSANE_SKIP:${PN}-spirv += "staticdev"
BBCLASSEXTEND = "native nativesdk"