| // ignore-tidy-tab |
| // 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. |
| //FIXME(Oneirical): This could be adapted to work on Windows by checking how |
| // that output differs. |
| |
| 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(); |
| let re = regex::Regex::new(r#"\s*g\s*F\s.*issue64153_test_function"#).unwrap(); |
| // 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); |
| } |