forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of rust-lang#135768 - jieyouxu:migrate-symbol-mangling-has…
…hed, r=<try> tests: Port `symbol-mangling-hashed` to rmake.rs Part of rust-lang#121876. This PR supersedes rust-lang#128567 and is co-authored with `@lolbinarycat.` ### Summary This PR ports `tests/run-make/symbol-mangling-hashed` to rmake.rs. Notable differences when compared to the Makefile version includes: - It's no longer limited to linux + x86_64 only. In particular, this now is exercised on darwin and windows (esp. msvc) too. - The test uses `object` crate to be more precise in the filtering, and avoids relying on parsing the human-readable `nm` output for *some* `nm` in the given environment (which isn't really a thing on msvc anyway, and `llvm-nm` doesn't handle msvc dylibs AFAICT). - Dump the symbols satisfying various criteria on test failure to make it hopefully less of a pain to debug if it ever fails in CI. ### Review advice - Best reviewed commit-by-commit. - I'm not *super* sure about the msvc logic, would benefit from a MSVC (PE/COFF) expert taking a look. --- try-job: x86_64-msvc try-job: i686-msvc-1 try-job: i686-mingw try-job: x86_64-mingw-1 try-job: x86_64-apple-1 try-job: aarch64-apple try-job: test-various
- Loading branch information
Showing
7 changed files
with
161 additions
and
57 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,4 @@ | ||
run-make/cat-and-grep-sanity-check/Makefile | ||
run-make/jobserver-error/Makefile | ||
run-make/split-debuginfo/Makefile | ||
run-make/symbol-mangling-hashed/Makefile | ||
run-make/translation/Makefile |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
// ignore-tidy-linelength | ||
//! Basic smoke test for the unstable option `-C symbol_mangling_version=hashed` which aims to | ||
//! replace full symbol mangling names based on hash digests to shorten symbol name lengths in | ||
//! dylibs for space savings. | ||
//! | ||
//! # References | ||
//! | ||
//! - MCP #705: Provide option to shorten symbol names by replacing them with a digest: | ||
//! <https://github.com/rust-lang/compiler-team/issues/705>. | ||
//! - Implementation PR: <https://github.com/rust-lang/rust/pull/118636>. | ||
//! - PE format: <https://learn.microsoft.com/en-us/windows/win32/debug/pe-format>. | ||
//@ ignore-cross-compile | ||
|
||
#![deny(warnings)] | ||
|
||
use run_make_support::symbols::exported_dynamic_symbol_names; | ||
use run_make_support::{bin_name, cwd, dynamic_lib_name, object, rfs, rustc}; | ||
|
||
fn main() { | ||
rustc() | ||
.input("a_dylib.rs") | ||
.prefer_dynamic() | ||
.arg("-Zunstable-options") | ||
.symbol_mangling_version("hashed") | ||
.metadata("foo") | ||
.run(); | ||
|
||
rustc() | ||
.input("a_rlib.rs") | ||
.prefer_dynamic() | ||
.arg("-Zunstable-options") | ||
.symbol_mangling_version("hashed") | ||
.metadata("bar") | ||
.run(); | ||
|
||
rustc().input("b_dylib.rs").library_search_path(cwd()).prefer_dynamic().run(); | ||
rustc().input("b_bin.rs").library_search_path(cwd()).prefer_dynamic().run(); | ||
|
||
// Check hashed symbol name | ||
|
||
{ | ||
let dylib_filename = dynamic_lib_name("a_dylib"); | ||
println!("checking dylib `{dylib_filename}`"); | ||
|
||
let dylib_blob = rfs::read(&dylib_filename); | ||
let dylib_file = object::File::parse(&*dylib_blob) | ||
.unwrap_or_else(|e| panic!("failed to parse `{dylib_filename}`: {e}")); | ||
|
||
let dynamic_symbols = exported_dynamic_symbol_names(&dylib_file); | ||
|
||
if dynamic_symbols.iter().filter(|sym| sym.contains("hello")).count() != 0 { | ||
eprintln!("exported dynamic symbols: {:#?}", dynamic_symbols); | ||
panic!("expected no occurrence of `hello`"); | ||
} | ||
|
||
if dynamic_symbols.iter().filter(|sym| sym.starts_with("_RNxC7a_dylib")).count() != 2 { | ||
eprintln!("exported dynamic symbols: {:#?}", dynamic_symbols); | ||
panic!("expected two dynamic symbols starting with `_RNxC7a_dylib`"); | ||
} | ||
} | ||
|
||
{ | ||
let so_filename = dynamic_lib_name("b_dylib"); | ||
println!("checking so `{so_filename}`"); | ||
|
||
let so_blob = rfs::read(&so_filename); | ||
let so_file = object::File::parse(&*so_blob) | ||
.unwrap_or_else(|e| panic!("failed to parse `{so_filename}`: {e}")); | ||
|
||
let dynamic_symbols = exported_dynamic_symbol_names(&so_file); | ||
|
||
if dynamic_symbols | ||
.iter() | ||
.filter(|sym| sym.contains("b_dylib") && sym.contains("hello")) | ||
.count() | ||
!= 1 | ||
{ | ||
eprintln!("exported dynamic symbols: {:#?}", dynamic_symbols); | ||
panic!("expected one occurrence of mangled `hello`"); | ||
} | ||
|
||
if dynamic_symbols.iter().filter(|sym| sym.starts_with("_RNxC6a_rlib")).count() != 2 { | ||
eprintln!("exported dynamic symbols: {:#?}", dynamic_symbols); | ||
panic!("expected two exported symbols starting with `_RNxC6a_rlib`"); | ||
} | ||
|
||
if dynamic_symbols.iter().any(|sym| sym.starts_with("_RNxC7a_dylib")) { | ||
eprintln!("exported dynamic symbols: {:#?}", dynamic_symbols); | ||
panic!("did not expect any symbols starting with `_RNxC7a_dylib`"); | ||
} | ||
} | ||
|
||
{ | ||
let bin_filename = bin_name("b_bin"); | ||
println!("checking bin `{bin_filename}`"); | ||
|
||
let bin_blob = rfs::read(&bin_filename); | ||
let bin_file = object::File::parse(&*bin_blob) | ||
.unwrap_or_else(|e| panic!("failed to parse `{bin_filename}`: {e}")); | ||
|
||
let dynamic_symbols = exported_dynamic_symbol_names(&bin_file); | ||
|
||
if dynamic_symbols.iter().any(|sym| { | ||
sym.starts_with("_RNxC6a_rlib") | ||
|| sym.starts_with("_RNxC7a_dylib") | ||
|| (sym.contains("b_dylib") && sym.contains("hello")) | ||
}) { | ||
eprintln!("dynamic symbols: {:#?}", dynamic_symbols); | ||
panic!( | ||
"did not expect any symbols to (1) start with `_RNxC6a_rlib` or (2) start with \ | ||
`_RNxC7a_dylib` or (3) to be of the form `*b_dylib*hello*`" | ||
); | ||
} | ||
} | ||
} |