2024-06-13 15:36:35 -05:00
|
|
|
// ignore-tidy-tab
|
2024-06-13 15:10:49 -05:00
|
|
|
// Staticlibs don't include Rust object files from upstream crates if the same
|
|
|
|
// code was already pulled into the lib via LTO. However, the bug described in
|
|
|
|
// https://github.com/rust-lang/rust/issues/64153 lead to this exclusion not
|
|
|
|
// working properly if the upstream crate was compiled with an explicit filename
|
|
|
|
// (via `-o`).
|
|
|
|
|
|
|
|
// This test makes sure that functions defined in the upstream crates do not
|
|
|
|
// appear twice in the final staticlib when listing all the symbols from it.
|
|
|
|
|
|
|
|
//@ ignore-windows
|
|
|
|
// Reason: `llvm-objdump`'s output looks different on windows than on other platforms.
|
|
|
|
// Only checking on Unix platforms should suffice.
|
2024-06-13 15:36:35 -05:00
|
|
|
//FIXME(Oneirical): This could be adapted to work on Windows by checking how
|
|
|
|
// that output differs.
|
2024-06-13 15:10:49 -05:00
|
|
|
|
|
|
|
use run_make_support::{llvm_objdump, regex, rust_lib_name, rustc, static_lib_name};
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
rustc()
|
|
|
|
.crate_type("rlib")
|
|
|
|
.input("upstream.rs")
|
|
|
|
.output(rust_lib_name("upstream"))
|
|
|
|
.codegen_units(1)
|
|
|
|
.run();
|
|
|
|
rustc()
|
|
|
|
.crate_type("staticlib")
|
|
|
|
.input("downstream.rs")
|
|
|
|
.arg("-Clto")
|
|
|
|
.output(static_lib_name("downstream"))
|
|
|
|
.codegen_units(1)
|
|
|
|
.run();
|
|
|
|
let syms = llvm_objdump().arg("-t").input(static_lib_name("downstream")).run().stdout_utf8();
|
2024-06-13 15:36:35 -05:00
|
|
|
let re = regex::Regex::new(r#"\s*g\s*F\s.*issue64153_test_function"#).unwrap();
|
2024-06-13 15:10:49 -05:00
|
|
|
// Count the global instances of `issue64153_test_function`. There'll be 2
|
|
|
|
// if the `upstream` object file got erroneously included twice.
|
|
|
|
// The line we are testing for with the regex looks something like:
|
|
|
|
// 0000000000000000 g F .text.issue64153_test_function 00000023 issue64153_test_function
|
|
|
|
assert_eq!(re.find_iter(syms.as_str()).count(), 1);
|
|
|
|
}
|