// When using the flag -C linker-plugin-lto, static libraries could lose their upstream object // files during compilation. This bug was fixed in #53031, and this test compiles a staticlib // dependent on upstream, checking that the upstream object file still exists after no LTO and // thin LTO. // See https://github.com/rust-lang/rust/pull/53031 use run_make_support::{ cwd, has_extension, has_prefix, has_suffix, llvm_ar, rfs, rustc, shallow_find_files, static_lib_name, }; fn main() { // The test starts with no LTO enabled. rustc().input("upstream.rs").arg("-Clinker-plugin-lto").codegen_units(1).run(); rustc() .input("staticlib.rs") .arg("-Clinker-plugin-lto") .codegen_units(1) .output(static_lib_name("staticlib")) .run(); llvm_ar().extract().arg(static_lib_name("staticlib")).run(); // Ensure the upstream object file was included. assert_eq!( shallow_find_files(cwd(), |path| { has_prefix(path, "upstream.") && has_suffix(path, ".rcgu.o") }) .len(), 1 ); // Remove all output files that are not source Rust code for cleanup. for file in shallow_find_files(cwd(), |path| !has_extension(path, "rs")) { rfs::remove_file(file) } // Check it again, with Thin LTO. rustc() .input("upstream.rs") .arg("-Clinker-plugin-lto") .codegen_units(1) .arg("-Clto=thin") .run(); rustc() .input("staticlib.rs") .arg("-Clinker-plugin-lto") .codegen_units(1) .arg("-Clto=thin") .output(static_lib_name("staticlib")) .run(); llvm_ar().extract().arg(static_lib_name("staticlib")).run(); assert_eq!( shallow_find_files(cwd(), |path| { has_prefix(path, "upstream.") && has_suffix(path, ".rcgu.o") }) .len(), 1 ); }