commit: 9607dc64a545cd8777f256f14ce330394e97effc Author: Michał Górny <mgorny <AT> gentoo <DOT> org> AuthorDate: Thu Aug 14 16:42:14 2025 +0000 Commit: Michał Górny <mgorny <AT> gentoo <DOT> org> CommitDate: Thu Aug 14 16:44:19 2025 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=9607dc64
dev-util/bpf-linker: Backport LLVM 21 upstream fix Signed-off-by: Michał Górny <mgorny <AT> gentoo.org> dev-util/bpf-linker/bpf-linker-0.9.14-r1.ebuild | 87 +++++++++++++++++ .../files/bpf-linker-0.9.14-llvm-21.patch | 107 +++++++++++++++++++++ 2 files changed, 194 insertions(+) diff --git a/dev-util/bpf-linker/bpf-linker-0.9.14-r1.ebuild b/dev-util/bpf-linker/bpf-linker-0.9.14-r1.ebuild new file mode 100644 index 000000000000..aec93a4d288e --- /dev/null +++ b/dev-util/bpf-linker/bpf-linker-0.9.14-r1.ebuild @@ -0,0 +1,87 @@ +# Copyright 2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +# Extra crates required at runtime via rustc-build-sysroot crate. +# Note: versions are locked in /usr/lib/rust/*/lib/rustlib/src/rust/library/Cargo.lock. +CRATES=" + [email protected] + [email protected] +" + +# Implied by crates above. +RUST_MIN_VER=1.86.0 +RUST_MAX_VER=1.88.0 + +declare -A GIT_CRATES=( + [compiletest_rs]='https://github.com/Manishearth/compiletest-rs;cb121796a041255ae0afcd9c2766bee4ebfd54f0;compiletest-rs-%commit%' +) + +# bpf-linker code specifically requires LLVM 21 right now +LLVM_COMPAT=( 21 ) +RUST_REQ_USE="llvm_targets_BPF(+),rust-src" + +inherit cargo llvm-r2 + +DESCRIPTION="Simple BPF static linker" +HOMEPAGE="https://github.com/aya-rs/bpf-linker/" +SRC_URI=" + https://github.com/aya-rs/bpf-linker/archive/v${PV}.tar.gz + -> ${P}.gh.tar.gz + https://github.com/gentoo-crate-dist/bpf-linker/releases/download/v${PV}/${P}-crates.tar.xz + ${CARGO_CRATE_URIS} +" + +LICENSE="|| ( MIT Apache-2.0 )" +# Dependent crate licenses +LICENSE+=" + ISC MIT Unicode-3.0 Unicode-DFS-2016 + || ( Apache-2.0 Boost-1.0 ) +" +SLOT="0" +IUSE="test" +RESTRICT="!test? ( test )" + +DEPEND=" + $(llvm_gen_dep ' + llvm-core/llvm:${LLVM_SLOT}=[llvm_targets_BPF] + ') +" +RDEPEND=" + ${DEPEND} + ${RUST_DEPEND} +" +BDEPEND=" + test? ( + dev-util/btfdump + ) +" + +QA_FLAGS_IGNORED=/usr/bin/bpf-linker + +pkg_setup() { + rust_pkg_setup +} + +src_prepare() { + local PATCHES=( + # https://github.com/aya-rs/bpf-linker/pull/289 + "${FILESDIR}/${P}-llvm-21.patch" + ) + + default + + # replace upstream crate substitution with our crate substitution, sigh + local ct_dep=$(grep ^compiletest_rs "${ECARGO_HOME}"/config.toml || die) + sed -i -e "/compiletest_rs/s;^.*$;${ct_dep};" Cargo.toml || die +} + +src_configure() { + cargo_src_configure --no-default-features + + # note: this needs to be updated to match llvm crate version + export LLVM_SYS_201_PREFIX="$(get_llvm_prefix -d)" + # the package requires BPF target that is only available in nightly + export RUSTC_BOOTSTRAP=1 +} diff --git a/dev-util/bpf-linker/files/bpf-linker-0.9.14-llvm-21.patch b/dev-util/bpf-linker/files/bpf-linker-0.9.14-llvm-21.patch new file mode 100644 index 000000000000..b8ef3f72cc31 --- /dev/null +++ b/dev-util/bpf-linker/files/bpf-linker-0.9.14-llvm-21.patch @@ -0,0 +1,107 @@ +From b1e6dcd3c8a75489329707709a14403e247e0fa0 Mon Sep 17 00:00:00 2001 +From: Michal Rostecki <[email protected]> +Date: Thu, 14 Aug 2025 13:36:12 +0200 +Subject: [PATCH 2/3] di: Update operand indices + +Operand indices in `DIType` and all children types were moved starting +from LLVM 21[0]. + +[0] llvm/llvm-project@3b90597c2ceaae86608214f6b62b43e55823102b +--- + src/llvm/types/di.rs | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/llvm/types/di.rs b/src/llvm/types/di.rs +index 76757cb1..c44252f0 100644 +--- a/src/llvm/types/di.rs ++++ b/src/llvm/types/di.rs +@@ -150,8 +150,8 @@ impl<'ctx> From<DIDerivedType<'ctx>> for DIType<'ctx> { + #[repr(u32)] + enum DIDerivedTypeOperand { + /// [`DIType`] representing a base type of the given derived type. +- /// [Reference in LLVM code](https://github.com/llvm/llvm-project/blob/llvmorg-17.0.3/llvm/include/llvm/IR/DebugInfoMetadata.h#L1032). +- BaseType = 3, ++ /// [Reference in LLVM code](https://github.com/llvm/llvm-project/blob/llvmorg-21.1.0-rc3/llvm/include/llvm/IR/DebugInfoMetadata.h#L1386). ++ BaseType = 5, + } + + /// Represents the debug information for a derived type in LLVM IR. +@@ -212,8 +212,8 @@ impl DIDerivedType<'_> { + #[repr(u32)] + enum DICompositeTypeOperand { + /// Elements of the composite type. +- /// [Reference in LLVM code](https://github.com/llvm/llvm-project/blob/llvmorg-17.0.3/llvm/include/llvm/IR/DebugInfoMetadata.h#L1230). +- Elements = 4, ++ /// [Reference in LLVM code](https://github.com/llvm/llvm-project/blob/llvmorg-21.1.0-rc3/llvm/include/llvm/IR/DebugInfoMetadata.h#L1813). ++ Elements = 6, + } + + /// Represents the debug info for a composite type in LLVM IR. + +From 9668fb5b6f9497a598de920a218d28d57b3e1917 Mon Sep 17 00:00:00 2001 +From: Michal Rostecki <[email protected]> +Date: Thu, 14 Aug 2025 14:20:20 +0200 +Subject: [PATCH 3/3] fix: Do not expect strictly sequential order when not + necessary + +We've noticed that ordering is different on different environments. +Let's relax the check with `CHECK-DAG`. What matters is that all +expected names/instructions are present. +--- + tests/assembly/di_generics.rs | 6 +++--- + tests/assembly/ignore-inline-never.rs | 4 ++-- + tests/btf/assembly/exported-symbols.rs | 8 ++++---- + 3 files changed, 9 insertions(+), 9 deletions(-) + +diff --git a/tests/assembly/di_generics.rs b/tests/assembly/di_generics.rs +index 08282d4c..0ec5a749 100644 +--- a/tests/assembly/di_generics.rs ++++ b/tests/assembly/di_generics.rs +@@ -63,6 +63,6 @@ pub fn my_function<T: Add<Output = T> + Copy>(x: T, y: T) -> T { + .add(y) + } + +-// CHECK: name: "Foo_3C_u32_3E_" +-// CHECK: name: "Bar_3C_di_generics_3A__3A_Foo_3C_u32_3E__3E_" +-// CHECK: name: "my_function_3C_u32_3E_" ++// CHECK-DAG: name: "Foo_3C_u32_3E_" ++// CHECK-DAG: name: "Bar_3C_di_generics_3A__3A_Foo_3C_u32_3E__3E_" ++// CHECK-DAG: name: "my_function_3C_u32_3E_" +diff --git a/tests/assembly/ignore-inline-never.rs b/tests/assembly/ignore-inline-never.rs +index 58a8e583..02bdbc25 100644 +--- a/tests/assembly/ignore-inline-never.rs ++++ b/tests/assembly/ignore-inline-never.rs +@@ -21,6 +21,6 @@ fn actually_inlined(a: u64) -> u64 { + pub extern "C" fn fun(a: u64) -> u64 { + // CHECK-LABEL: fun: + actually_inlined(a) +- // CHECK: r{{[0-9]}} = r{{[0-9]}} +- // CHECK-NEXT: r{{[0-9]}} += 42 ++ // CHECK-DAG: r{{[0-9]}} = r{{[0-9]}} ++ // CHECK-DAG: r{{[0-9]}} += 42 + } +diff --git a/tests/btf/assembly/exported-symbols.rs b/tests/btf/assembly/exported-symbols.rs +index a5b99bf0..921b2e68 100644 +--- a/tests/btf/assembly/exported-symbols.rs ++++ b/tests/btf/assembly/exported-symbols.rs +@@ -35,7 +35,7 @@ fn inline_function_2(v: u8) -> u8 { + } + + // #[no_mangle] functions keep linkage=global +-// CHECK: <FUNC> 'local_no_mangle' --> global [{{[0-9]+}} ++// CHECK-DAG: <FUNC> 'local_no_mangle' --> global [{{[0-9]+}} + + // check that parameter names are preserved + // CHECK: <FUNC_PROTO> +@@ -43,8 +43,8 @@ fn inline_function_2(v: u8) -> u8 { + // CHECK-NEXT: _arg2 + + // public functions get static linkage +-// CHECK: <FUNC> '{{.*}}local_public{{.*}}' --> static +-// CHECK: <FUNC> '{{.*}}dep_public_symbol{{.*}}' --> static ++// CHECK-DAG: <FUNC> '{{.*}}local_public{{.*}}' --> static ++// CHECK-DAG: <FUNC> '{{.*}}dep_public_symbol{{.*}}' --> static + + // #[no_mangle] is honored for dep functions +-// CHECK: <FUNC> 'dep_no_mangle' --> global ++// CHECK-DAG: <FUNC> 'dep_no_mangle' --> global
