Commit af0121c2 authored by Gary Guo's avatar Gary Guo Committed by Miguel Ojeda

kbuild: rust: add `CONFIG_RUSTC_LLVM_VERSION`

Each version of Rust supports a range of LLVM versions. There are cases where
we want to gate a config on the LLVM version instead of the Rust version.
Normalized cfi integer tags are one example [1].

The invocation of rustc-version is being moved from init/Kconfig to
scripts/Kconfig.include for consistency with cc-version.

Link: https://lore.kernel.org/all/20240925-cfi-norm-kasan-fix-v1-1-0328985cdf33@google.com/ [1]
Signed-off-by: default avatarGary Guo <gary@garyguo.net>
Link: https://lore.kernel.org/r/20241011114040.3900487-1-gary@garyguo.net
[ Added missing `-llvm` to the Usage documentation. - Miguel ]
Signed-off-by: default avatarMiguel Ojeda <ojeda@kernel.org>
parent e72a076c
...@@ -62,7 +62,7 @@ config LLD_VERSION ...@@ -62,7 +62,7 @@ config LLD_VERSION
config RUSTC_VERSION config RUSTC_VERSION
int int
default $(shell,$(srctree)/scripts/rustc-version.sh $(RUSTC)) default $(rustc-version)
help help
It does not depend on `RUST` since that one may need to use the version It does not depend on `RUST` since that one may need to use the version
in a `depends on`. in a `depends on`.
...@@ -78,6 +78,10 @@ config RUST_IS_AVAILABLE ...@@ -78,6 +78,10 @@ config RUST_IS_AVAILABLE
In particular, the Makefile target 'rustavailable' is useful to check In particular, the Makefile target 'rustavailable' is useful to check
why the Rust toolchain is not being detected. why the Rust toolchain is not being detected.
config RUSTC_LLVM_VERSION
int
default $(rustc-llvm-version)
config CC_CAN_LINK config CC_CAN_LINK
bool bool
default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(USERCFLAGS) $(USERLDFLAGS) $(m64-flag)) if 64BIT default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(USERCFLAGS) $(USERLDFLAGS) $(m64-flag)) if 64BIT
......
...@@ -65,6 +65,9 @@ cc-option-bit = $(if-success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null,$ ...@@ -65,6 +65,9 @@ cc-option-bit = $(if-success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null,$
m32-flag := $(cc-option-bit,-m32) m32-flag := $(cc-option-bit,-m32)
m64-flag := $(cc-option-bit,-m64) m64-flag := $(cc-option-bit,-m64)
rustc-version := $(shell,$(srctree)/scripts/rustc-version.sh $(RUSTC))
rustc-llvm-version := $(shell,$(srctree)/scripts/rustc-llvm-version.sh $(RUSTC))
# $(rustc-option,<flag>) # $(rustc-option,<flag>)
# Return y if the Rust compiler supports <flag>, n otherwise # Return y if the Rust compiler supports <flag>, n otherwise
# Calls to this should be guarded so that they are not evaluated if # Calls to this should be guarded so that they are not evaluated if
......
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
#
# Usage: $ ./rustc-llvm-version.sh rustc
#
# Print the LLVM version that the Rust compiler uses in a 6 digit form.
# Convert the version string x.y.z to a canonical up-to-6-digits form.
get_canonical_version()
{
IFS=.
set -- $1
echo $((10000 * $1 + 100 * $2 + $3))
}
if output=$("$@" --version --verbose 2>/dev/null | grep LLVM); then
set -- $output
get_canonical_version $3
else
echo 0
exit 1
fi
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment