From 2f0d109bd95eb5138b820765695e201186b1edbb Mon Sep 17 00:00:00 2001 From: Gary Guo Date: Fri, 8 May 2026 14:17:38 +0100 Subject: [PATCH] tests: add test for symbol length `__pinned_init` or `__init` functions are natural inline boundaries. Things within them calling into helper functions should be inlined, and wrapping functions that forwarding call to them should be, too. But these functions themselves can contain complex initialization, so it's best to leave it to the compilers to decide if they're inlineable. As a result, these symbols do show up in the symbol table when they're not inlined. Linux kernel has 512 byte symbol length limit, so we need to keep them small. Add a test to ensure that any growth of them are being considered and not accidental. Signed-off-by: Gary Guo --- Cargo.lock | 83 +++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 3 ++ tests/symbol_length.rs | 30 +++++++++++++++ 3 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 tests/symbol_length.rs diff --git a/Cargo.lock b/Cargo.lock index 7676eb8e..72edae90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,42 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + [[package]] name = "diff" version = "0.1.13" @@ -26,6 +62,12 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + [[package]] name = "glob" version = "0.3.1" @@ -56,9 +98,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "macrotest" @@ -77,10 +119,35 @@ dependencies = [ "toml", ] +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + [[package]] name = "pin-init" version = "0.3.0" dependencies = [ + "backtrace", "libc", "macrotest", "pin-init-internal", @@ -126,6 +193,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + [[package]] name = "rustc_version" version = "0.4.1" @@ -305,6 +378,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "winnow" version = "0.7.12" diff --git a/Cargo.toml b/Cargo.toml index 41e7c477..44cd0ffa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,9 @@ libc = "0.2" trybuild = { version = "1.0", features = ["diff"] } macrotest = "1.0" +# For capturing symbol names +backtrace = "0.3" + [lints.rust] stable_features = "allow" unused_features = "allow" diff --git a/tests/symbol_length.rs b/tests/symbol_length.rs new file mode 100644 index 00000000..747a6da5 --- /dev/null +++ b/tests/symbol_length.rs @@ -0,0 +1,30 @@ +use std::ffi::c_void; + +use pin_init::*; + +#[pin_data] +pub struct Test {} + +pub fn init() -> impl PinInit { + pin_init!(Test {}) +} + +fn init_fn_ptr>(_: &I) -> *mut c_void { + I::__pinned_init as _ +} + +#[test] +fn type_name() { + let init = init(); + let init_fn = init_fn_ptr(&init); + + let mut symbol = None; + // Add 1 to the address so it cannot be confused as the end of last function. + backtrace::resolve(init_fn.wrapping_add(1), |s| { + symbol = s.name().and_then(|n| n.as_str().map(|s| s.to_owned())); + }); + let symbol = symbol.unwrap(); + + eprintln!("{}: {}", symbol.len(), symbol); + assert!(symbol.len() < 200); +}