Skip to content

Encode DefId-keyed maps in metadata in a deterministic order - #164046

Draft
zanville wants to merge 1 commit into
rust-lang:mainfrom
zanville:generics-of-deterministic-encoding
Draft

zanville wants to merge 1 commit into
rust-lang:mainfrom
zanville:generics-of-deterministic-encoding

Conversation

@zanville

@zanville zanville commented Oct 9, 2026 •

Copy link
Copy Markdown

Fixes #163878

cc @aerooneqq @susitsm

Generics::param_def_id_to_index is an FxHashMap<DefId, u32>, and it was getting encoded into metadata in whatever order the map happened to iterate. With -Zthreads the DefIndexes come out in a different order each run, so the keys hash differently and the rmeta bytes flip around

Went through a few ways to fix this and landed on letting the encoder decide the order: I added a new TyEncoder::encode_def_id_map. EncodeContext sorts the entries by DefPathHash before writing, while the incremental cache and offload manifest just pass through, so they shouldn't cost anything?

There's also a new ParamDefIdToIndex wrapper around the map so the TyEncodable derive routes the field through that method. It implements Deref + FromIterator so none of the callers change. And decoding is untouched as well

I picked this over the others attemps I had:

  • No specialization. My first attempt used default fn, but per the feedback on Use LocalDefId as an index in metadata encoding #163321 that's not wanted in encoding code, so I followed the SpanEncoder::encode_span pattern instead

  • I use DefPathHash as the key because it's stable across runs and crates, works for foreign DefIds (the RPITIT-in-impl case can pull in trait params from another crate), and it's what Remap local def ids for deterministic metadata encoding #162809 sorts by anyway when building its remap table

  • I didn't go with IndexMap or dropping Encodable for HashMap, since that touches every map in the compiler for one field

  • I didn't special-case Generics. That would fix this field but leave no mechanism for the next DefId-keyed map in metadata

I verified locally on top of #162809: the repro from the issue gives the same md5 across 10 runs with -Zthreads=2, and the new run-make test passes. On main alone it still varies, because the DefIndex values themselves aren't stable yet. So this is blocked on #162809, and the new generics-of-issue-163878 run-make test will be red until that gets merged

Would appreciate a perf run if possible :)

@rustbot rustbot added A-run-make Area: port run-make Makefiles to rmake.rs S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Oct 9, 2026
@zanville

zanville commented Oct 9, 2026 •

Copy link
Copy Markdown
Author

@rustbot blocked by #162809

@rustbot rustbot added S-blocked Status: Blocked on something else such as an RFC or other implementation work. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Oct 9, 2026
@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job test-aarch64-gnu-llvm-22-1 failed! Check out the build log: (web) (plain enhanced) (plain)

Click to see the possible cause of the failure (guessed by this bot)
---- [run-make] tests/run-make/parallel-reproducible-build stdout ----

error: rmake recipe failed to complete
status: exit status: 101
command: cd "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/rmake_out" && env -u RUSTFLAGS -u __STD_REMAP_DEBUGINFO_ENABLED AR="ar" BUILD_ROOT="/checkout/obj/build/aarch64-unknown-linux-gnu" CC="cc" CC_DEFAULT_FLAGS="-ffunction-sections -fdata-sections -fPIC -w" CXX="c++" CXX_DEFAULT_FLAGS="-ffunction-sections -fdata-sections -fPIC -w" HOST_RUSTC_DYLIB_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib" LD_LIBRARY_PATH=":/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" LD_LIB_PATH_ENVVAR="LD_LIBRARY_PATH" LLVM_BIN_DIR="/usr/lib/llvm-22/bin" LLVM_COMPONENTS="aarch64 aarch64asmparser aarch64codegen aarch64desc aarch64disassembler aarch64info aarch64utils abi aggressiveinstcombine all all-targets amdgpu amdgpuasmparser amdgpucodegen amdgpudesc amdgpudisassembler amdgpuinfo amdgputargetmca amdgpuutils analysis arm armasmparser armcodegen armdesc armdisassembler arminfo armutils asmparser asmprinter avr avrasmparser avrcodegen avrdesc avrdisassembler avrinfo binaryformat bitreader bitstreamreader bitwriter bpf bpfasmparser bpfcodegen bpfdesc bpfdisassembler bpfinfo cas cfguard cgdata codegen codegentypes core coroutines coverage debuginfobtf debuginfocodeview debuginfodwarf debuginfodwarflowlevel debuginfogsym debuginfologicalview debuginfomsf debuginfopdb demangle dlltooldriver dtlto dwarfcfichecker dwarflinker dwarflinkerclassic dwarflinkerparallel dwp engine executionengine extensions filecheck frontendatomic frontenddirective frontenddriver frontendhlsl frontendoffloading frontendopenacc frontendopenmp fuzzercli fuzzmutate globalisel hexagon hexagonasmparser hexagoncodegen hexagondesc hexagondisassembler hexagoninfo hipstdpar instcombine instrumentation interfacestub interpreter ipo irprinter irreader jitlink lanai lanaiasmparser lanaicodegen lanaidesc lanaidisassembler lanaiinfo libdriver lineeditor linker loongarch loongarchasmparser loongarchcodegen loongarchdesc loongarchdisassembler loongarchinfo lto m68k m68kasmparser m68kcodegen m68kdesc m68kdisassembler m68kinfo mc mca mcdisassembler mcjit mcparser mips mipsasmparser mipscodegen mipsdesc mipsdisassembler mipsinfo mirparser msp430 msp430asmparser msp430codegen msp430desc msp430disassembler msp430info native nativecodegen nvptx nvptxcodegen nvptxdesc nvptxinfo objcarcopts objcopy object objectyaml option orcdebugging orcjit orcshared orctargetprocess passes perfjitevents plugins powerpc powerpcasmparser powerpccodegen powerpcdesc powerpcdisassembler powerpcinfo profiledata remarks riscv riscvasmparser riscvcodegen riscvdesc riscvdisassembler riscvinfo riscvtargetmca runtimedyld sandboxir scalaropts selectiondag sparc sparcasmparser sparccodegen sparcdesc sparcdisassembler sparcinfo spirv spirvanalysis spirvcodegen spirvdesc spirvinfo support supportlsp symbolize systemz systemzasmparser systemzcodegen systemzdesc systemzdisassembler systemzinfo tablegen target targetparser telemetry textapi textapibinaryreader transformutils ve veasmparser vecodegen vectorize vedesc vedisassembler veinfo webassembly webassemblyasmparser webassemblycodegen webassemblydesc webassemblydisassembler webassemblyinfo webassemblyutils windowsdriver windowsmanifest x86 x86asmparser x86codegen x86desc x86disassembler x86info x86targetmca xcore xcorecodegen xcoredesc xcoredisassembler xcoreinfo xray xtensa xtensaasmparser xtensacodegen xtensadesc xtensadisassembler xtensainfo" LLVM_FILECHECK="/usr/lib/llvm-22/bin/FileCheck" NODE="/usr/bin/node" PYTHON="/usr/bin/python3" RUSTC="/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" RUSTDOC="/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustdoc" SOURCE_ROOT="/checkout" TARGET="aarch64-unknown-linux-gnu" TARGET_EXE_DYLIB_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib/rustlib/aarch64-unknown-linux-gnu/lib" __BOOTSTRAP_JOBS="4" __RMAKE_VERBOSE_SUBPROCESS_OUTPUT="1" __RUSTC_DEBUG_ASSERTIONS_ENABLED="1" __STD_DEBUG_ASSERTIONS_ENABLED="1" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/rmake"
stdout: none
--- stderr -------------------------------
LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "static-muts-issue-140413.rs" "-o" "static-muts-issue-140413" "-Zthreads=50" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===



LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "static-muts-issue-140413.rs" "-o" "static-muts-issue-140413" "-Zthreads=50" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===



LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "static-muts-issue-140413.rs" "-o" "static-muts-issue-140413" "-Zthreads=50" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===



LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "static-muts-issue-140413.rs" "-o" "static-muts-issue-140413" "-Zthreads=50" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===



LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "static-muts-issue-140413.rs" "-o" "static-muts-issue-140413" "-Zthreads=50" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===



LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "static-muts-issue-140413.rs" "-o" "static-muts-issue-140413" "-Zthreads=50" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===



LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "static-muts-issue-140413.rs" "-o" "static-muts-issue-140413" "-Zthreads=50" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===



LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "static-muts-issue-140413.rs" "-o" "static-muts-issue-140413" "-Zthreads=50" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===



LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "static-muts-issue-140413.rs" "-o" "static-muts-issue-140413" "-Zthreads=50" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===



LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "static-muts-issue-140413.rs" "-o" "static-muts-issue-140413" "-Zthreads=50" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===



LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "derives-issue-129094.rs" "-o" "derives-issue-129094" "-Zthreads=16" "-Copt-level=3" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===
warning: struct `PackedPoint` is never constructed
---




LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "derives-issue-129094.rs" "-o" "derives-issue-129094" "-Zthreads=16" "-Copt-level=3" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===
warning: struct `PackedPoint` is never constructed
---




LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "derives-issue-129094.rs" "-o" "derives-issue-129094" "-Zthreads=16" "-Copt-level=3" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===
warning: struct `PackedPoint` is never constructed
---




LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "derives-issue-129094.rs" "-o" "derives-issue-129094" "-Zthreads=16" "-Copt-level=3" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===
warning: struct `PackedPoint` is never constructed
---




LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "derives-issue-129094.rs" "-o" "derives-issue-129094" "-Zthreads=16" "-Copt-level=3" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===
warning: struct `PackedPoint` is never constructed
---




LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "derives-issue-129094.rs" "-o" "derives-issue-129094" "-Zthreads=16" "-Copt-level=3" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===
warning: struct `PackedPoint` is never constructed
---




LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "derives-issue-129094.rs" "-o" "derives-issue-129094" "-Zthreads=16" "-Copt-level=3" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===
warning: struct `PackedPoint` is never constructed
---




LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "derives-issue-129094.rs" "-o" "derives-issue-129094" "-Zthreads=16" "-Copt-level=3" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===
warning: struct `PackedPoint` is never constructed
---




LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "derives-issue-129094.rs" "-o" "derives-issue-129094" "-Zthreads=16" "-Copt-level=3" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===
warning: struct `PackedPoint` is never constructed
---




LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "derives-issue-129094.rs" "-o" "derives-issue-129094" "-Zthreads=16" "-Copt-level=3" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===
warning: struct `PackedPoint` is never constructed
---




LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "generics-of-issue-163878.rs" "-o" "generics-of-issue-163878" "-Zthreads=30" "--crate-type=lib" "--crate-name=test" "-Ccodegen-units=1" "-Zremap-cwd-prefix=reproducible_dir" "--edition=2024" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===



LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "generics-of-issue-163878.rs" "-o" "generics-of-issue-163878" "-Zthreads=30" "--crate-type=lib" "--crate-name=test" "-Ccodegen-units=1" "-Zremap-cwd-prefix=reproducible_dir" "--edition=2024" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===



LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "generics-of-issue-163878.rs" "-o" "generics-of-issue-163878" "-Zthreads=30" "--crate-type=lib" "--crate-name=test" "-Ccodegen-units=1" "-Zremap-cwd-prefix=reproducible_dir" "--edition=2024" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===



LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "generics-of-issue-163878.rs" "-o" "generics-of-issue-163878" "-Zthreads=30" "--crate-type=lib" "--crate-name=test" "-Ccodegen-units=1" "-Zremap-cwd-prefix=reproducible_dir" "--edition=2024" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===



LD_LIBRARY_PATH="/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory:/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/lib::/checkout/obj/build/aarch64-unknown-linux-gnu/stage0/lib/rustlib/aarch64-unknown-linux-gnu/lib" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "-L" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/run-make/parallel-reproducible-build/temporary-directory" "generics-of-issue-163878.rs" "-o" "generics-of-issue-163878" "-Zthreads=30" "--crate-type=lib" "--crate-name=test" "-Ccodegen-units=1" "-Zremap-cwd-prefix=reproducible_dir" "--edition=2024" "--target=aarch64-unknown-linux-gnu"
output status: `exit status: 0`
=== STDOUT ===



=== STDERR ===

/// Reverse map to the `index` field of each `GenericParamDef`.
#[stable_hash(ignore)]
pub param_def_id_to_index: FxHashMap<DefId, u32>,
pub param_def_id_to_index: ParamDefIdToIndex,

@aerooneqq aerooneqq Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we apply deterministic sorting for all hash maps during metadata encoding (or as a start to all hash maps with keys DefId or LocalDefId)? This solution will fix the issue, however it is not scalable as if other developer will add FxHashMap with DefId key it will be encoded non-determinisitcally.

If there is no good solution except specializations lets use it, maybe we can implement Encodable only for HashMaps with key that implements for example StableHashForMetadata (maybe there is exising trait like StableHash that can be reused) trait and in this case we can apply deterministic encoding for all hashmaps/hashsets.

cc @petrochenkov

View changes since the review

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

open to any changes

I tried to make it automatic and hit coherence. The blanket Encodable for HashMap impl in
rustc_serialize always wins, so I tried out some other things like specialization, default fn on the blanket impl + impls for FxHashMap<DefId, _> and FxHashMap<LocalDefId, _> on EncodeContext, but I saw the feedback on #163321 and stopped, I do think the trait would work alot better in the long run

@susitsm

susitsm commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

I think you could try something along the lines of

trait TyEncoder {
    ...
    fn encode_hashmap<K: TcxStableOrd, V>(&mut self, map: &HashMap<K, V>);
}

trait TcxStableOrd {
     fn tcx_stable_cmp<'tcx>(tcx: TyCtxt<'tcx>) -> impl FnMut(&Self, &Self) -> std::cmp::Ordering;
}

Then the compiler will complain everywhere where we try to encode a HashMap with key that does not implement the TcxStableOrd. The metadata encoder can use Key::tcx_stable_cmp(self.tcx) to create a compare function for the key and sort it, the other encoders can just ignore it, and encode as before

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-run-make Area: port run-make Makefiles to rmake.rs S-blocked Status: Blocked on something else such as an RFC or other implementation work. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

parallel compiler: generics_of encoding not reproducible

5 participants