From: Alexander Kanavin <[email protected]>

The original reproducibility fix was problematic for a couple reasons:

- disabling both lto and parallel builds had an unfortunate effect of nearly
doubling rust-native and rust build times (which are slow to begin with).
Disabling lto hurts runtime performance too.

- both of these things were done for the *entire build*, while the only
problematic item is the librustdoc crate.

- lto=off option in config.toml has an effect only on building rustc
(the compiler itself), and doesn't help with rustdoc reproducibility.
Actual fix is the codegen-units setting, which indirectly disables
lto via giving llvm only one unit to work with at a time.

After some digging, here's a more targeted fix for the problem.

Why librustdoc is non-reproducible, but not anything else
remains a mystery, hidden deep in rust-llvm's lto optimization code.

Signed-off-by: Alexander Kanavin <[email protected]>
---
 ...teps-tool.rs-switch-off-lto-for-rust.patch | 46 +++++++++++++++++++
 ...ue-fix-cargo-config-for-codegenunits.patch | 26 -----------
 meta/recipes-devtools/rust/rust-source.inc    |  2 +-
 meta/recipes-devtools/rust/rust_1.81.0.bb     |  1 -
 4 files changed, 47 insertions(+), 28 deletions(-)
 create mode 100644 
meta/recipes-devtools/rust/files/0001-src-core-build_steps-tool.rs-switch-off-lto-for-rust.patch
 delete mode 100644 
meta/recipes-devtools/rust/files/rustdoc-repro-issue-fix-cargo-config-for-codegenunits.patch

diff --git 
a/meta/recipes-devtools/rust/files/0001-src-core-build_steps-tool.rs-switch-off-lto-for-rust.patch
 
b/meta/recipes-devtools/rust/files/0001-src-core-build_steps-tool.rs-switch-off-lto-for-rust.patch
new file mode 100644
index 00000000000..e63cfb07198
--- /dev/null
+++ 
b/meta/recipes-devtools/rust/files/0001-src-core-build_steps-tool.rs-switch-off-lto-for-rust.patch
@@ -0,0 +1,46 @@
+From ce68809d41291f671b440abce41f8f71c95428aa Mon Sep 17 00:00:00 2001
+From: Alexander Kanavin <[email protected]>
+Date: Mon, 3 Feb 2025 20:06:46 +0100
+Subject: [PATCH] src/core/build_steps/tool.rs: switch off lto for rustdoc
+
+For reasons currently unknown, librustdoc binary ends up with
+non-reproducible .llvm.<number> suffixes in its symbols - but
+not any other binary.
+
+Disabling lto avoids creating these suffixes. More info about the option:
+https://doc.rust-lang.org/rustc/codegen-options/index.html#lto
+
+As seen below, there's a comment in the source tree saying not to tweak the 
options
+but this only creates a mix of lto and non-lto optimized binary objects from
+various crates, which should be safe to mix.
+
+Upstream-Status: Inappropriate [reported at 
https://github.com/rust-lang/rust/issues/134589]
+Signed-off-by: Alexander Kanavin <[email protected]>
+---
+ src/bootstrap/src/core/build_steps/tool.rs | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/bootstrap/src/core/build_steps/tool.rs 
b/src/bootstrap/src/core/build_steps/tool.rs
+index 087df2f8a..00790affb 100644
+--- a/src/bootstrap/src/core/build_steps/tool.rs
++++ b/src/bootstrap/src/core/build_steps/tool.rs
+@@ -635,7 +635,7 @@ impl Step for Rustdoc {
+         }
+ 
+         // NOTE: Never modify the rustflags here, it breaks the build cache 
for other tools!
+-        let cargo = prepare_tool_cargo(
++        let mut cargo = prepare_tool_cargo(
+             builder,
+             build_compiler,
+             Mode::ToolRustc,
+@@ -645,6 +645,7 @@ impl Step for Rustdoc {
+             SourceType::InTree,
+             features.as_slice(),
+         );
++        cargo.rustflag("-Clto=off");
+ 
+         let _guard = builder.msg_tool(
+             Kind::Build,
+-- 
+2.39.5
+
diff --git 
a/meta/recipes-devtools/rust/files/rustdoc-repro-issue-fix-cargo-config-for-codegenunits.patch
 
b/meta/recipes-devtools/rust/files/rustdoc-repro-issue-fix-cargo-config-for-codegenunits.patch
deleted file mode 100644
index 0aab8772eb2..00000000000
--- 
a/meta/recipes-devtools/rust/files/rustdoc-repro-issue-fix-cargo-config-for-codegenunits.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-rust: rustdoc reproducibility issue fix
-
-rust: rustdoc reproducibility issue fix
-
-The 'codegen-units' option split the crate into multiple compilation units for 
parallel compilation. Currently, this split is causing the rustdoc to generate 
differnt binary between the builds.
-To fix this the codegen-units & the lto options are disabled.
-
-More info about options:
-https://doc.rust-lang.org/cargo/reference/profiles.html#codegen-units
-https://doc.rust-lang.org/rustc/codegen-options/index.html#lto
-
-Upstream-Status: Inappropriate [oe specific]
-
-Signed-off-by: Sundeep KOKKONDA <[email protected]>
----
---- a/.cargo/config.toml
-+++ b/.cargo/config.toml
-@@ -3,3 +3,7 @@
-
- [source.vendored-sources]
- directory = "vendor"
-+
-+[profile.release]
-+codegen-units = 1
-+
-
diff --git a/meta/recipes-devtools/rust/rust-source.inc 
b/meta/recipes-devtools/rust/rust-source.inc
index 8484c94ef8b..83355935fcc 100644
--- a/meta/recipes-devtools/rust/rust-source.inc
+++ b/meta/recipes-devtools/rust/rust-source.inc
@@ -4,10 +4,10 @@ SRC_URI += 
"https://static.rust-lang.org/dist/rustc-${RUST_VERSION}-src.tar.xz;n
             file://zlib-off64_t.patch;patchdir=${RUSTSRC} \
             file://rv32-rustix-libc-backend.patch;patchdir=${RUSTSRC} \
             file://rv32-cargo-rustix-0.38.28-fix.patch;patchdir=${RUSTSRC} \
-            
file://rustdoc-repro-issue-fix-cargo-config-for-codegenunits.patch;patchdir=${RUSTSRC}
 \
             file://rust-oe-selftest.patch;patchdir=${RUSTSRC} \
             
file://repro-issue-fix-with-cc-crate-hashmap.patch;patchdir=${RUSTSRC} \
             
file://oeqa-selftest-Increase-timeout-in-process-sigpipe-ru.patch;patchdir=${RUSTSRC}
 \
+            
file://0001-src-core-build_steps-tool.rs-switch-off-lto-for-rust.patch;patchdir=${RUSTSRC}
 \
 "
 SRC_URI[rust.sha256sum] = 
"36217ef7e32f40a180e3d79bd666b4dfdaed49dd381023a5fb765fd12d0092ce"
 
diff --git a/meta/recipes-devtools/rust/rust_1.81.0.bb 
b/meta/recipes-devtools/rust/rust_1.81.0.bb
index 288b0fbb443..1038c275f6d 100644
--- a/meta/recipes-devtools/rust/rust_1.81.0.bb
+++ b/meta/recipes-devtools/rust/rust_1.81.0.bb
@@ -136,7 +136,6 @@ python do_configure() {
     config.add_section("rust")
     config.set("rust", "rpath", e(True))
     config.set("rust", "remap-debuginfo", e(True))
-    config.set("rust", "lto", "\"off\"")
     config.set("rust", "channel", e(d.expand("${RUST_CHANNEL}")))
 
     # Whether or not to optimize the compiler and standard library
-- 
2.39.5

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#210763): 
https://lists.openembedded.org/g/openembedded-core/message/210763
Mute This Topic: https://lists.openembedded.org/mt/110989647/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to