Skip to content

Commit e360934

Browse files
committed
internal: use loop {} to produce never value
In the `init!`/`pin_init!` macros, we rely on a trick that assigns never (`!`) values to all mentioned fields in never-executed code to let the compiler check that all fields have been initialized. Currently we use `::core::panic!()` to produce this value, but before Rust 1.91.0, it creates outlined `panic_cold_explicit` functions which do not get removed by the optimizer, thus leaving dead code behind in the binary. This has been fixed by [1], which lands in Rust 1.91.0+, higher than the kernel minimum version 1.85.0. This causes ~200 dead `panic_cold_explicit` instances being included in the binary, with ~90 of them from nova-core's usage of pin-init. Work around the issue by using `loop {}` which creates the never value without macro expansion or function call at all. All instances of `panic_cold_explicit` outside libcore are removed by this change in my kernel build. Link: rust-lang/rust#145304 [1] Signed-off-by: Gary Guo <gary@garyguo.net>
1 parent c36ba14 commit e360934

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

internal/src/init.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ fn make_field_check(
389389
::core::ptr::write(slot, #path {
390390
#(
391391
#(#field_attrs)*
392-
#field_name: ::core::panic!(),
392+
#field_name: loop {},
393393
)*
394394
#zeroing_trailer
395395
})

0 commit comments

Comments
 (0)