Skip to content

Commit

Permalink
Auto merge of #129018 - Oneirical:nmemonic-artifice, r=<try>
Browse files Browse the repository at this point in the history
Migrate `rlib-format-packed-bundled-libs` and `native-link-modifier-bundle` `run-make` tests to rmake

Part of #121876 and the associated [Google Summer of Code project](https://blog.rust-lang.org/2024/05/01/gsoc-2024-selected-projects.html).

Please try:

// try-job: test-various (ATTEMPTED: IGNORE RESTORED)
try-job: x86_64-msvc
try-job: aarch64-apple
try-job: aarch64-gnu
try-job: x86_64-mingw
try-job: i686-mingw
  • Loading branch information
bors committed Aug 14, 2024
2 parents 355a307 + 30fa7f6 commit e555647
Show file tree
Hide file tree
Showing 6 changed files with 180 additions and 79 deletions.
6 changes: 6 additions & 0 deletions src/tools/run-make-support/src/external_deps/llvm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,12 @@ impl LlvmAr {
self
}

/// Print the table of contents.
pub fn table_of_contents(&mut self) -> &mut Self {
self.cmd.arg("t");
self
}

/// Provide an output, then an input file. Bundled in one function, as llvm-ar has
/// no "--output"-style flag.
pub fn output_input(&mut self, out: impl AsRef<Path>, input: impl AsRef<Path>) -> &mut Self {
Expand Down
2 changes: 0 additions & 2 deletions src/tools/tidy/src/allowed_run_make_makefiles.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,8 @@ run-make/libtest-junit/Makefile
run-make/libtest-thread-limit/Makefile
run-make/macos-deployment-target/Makefile
run-make/min-global-align/Makefile
run-make/native-link-modifier-bundle/Makefile
run-make/no-alloc-shim/Makefile
run-make/reproducible-build/Makefile
run-make/rlib-format-packed-bundled-libs/Makefile
run-make/split-debuginfo/Makefile
run-make/symbol-mangling-hashed/Makefile
run-make/translation/Makefile
Expand Down
38 changes: 0 additions & 38 deletions tests/run-make/native-link-modifier-bundle/Makefile

This file was deleted.

90 changes: 90 additions & 0 deletions tests/run-make/native-link-modifier-bundle/rmake.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
// This test exercises the `bundle` link argument, which can be turned on or off.

// When building a rlib or staticlib, +bundle means that all object files from the native static
// library will be added to the rlib or staticlib archive, and then used from it during linking of
// the final binary.

// When building a rlib -bundle means that the native static library is registered as a dependency
// of that rlib "by name", and object files from it are included only during linking of the final
// binary, the file search by that name is also performed during final linking.
// When building a staticlib -bundle means that the native static library is simply not included
// into the archive and some higher level build system will need to add it later during linking of
// the final binary.

// This modifier has no effect when building other targets like executables or dynamic libraries.

// The default for this modifier is +bundle.
// See https://github.com/rust-lang/rust/pull/95818

//@ ignore-cross-compile
// Reason: cross-compilation fails to export native symbols

use run_make_support::{
build_native_static_lib, dynamic_lib_name, is_msvc, llvm_nm, rust_lib_name, rustc,
static_lib_name,
};

fn main() {
build_native_static_lib("native-staticlib");
// Build a staticlib and a rlib, the `native_func` symbol will be bundled into them
rustc().input("bundled.rs").crate_type("staticlib").crate_type("rlib").run();
llvm_nm()
.input(static_lib_name("bundled"))
.run()
.assert_stdout_contains_regex("T _*native_func");
llvm_nm()
.input(static_lib_name("bundled"))
.run()
.assert_stdout_contains_regex("U _*native_func");
llvm_nm().input(rust_lib_name("bundled")).run().assert_stdout_contains_regex("T _*native_func");
llvm_nm().input(rust_lib_name("bundled")).run().assert_stdout_contains_regex("U _*native_func");

// Build a staticlib and a rlib, the `native_func` symbol will not be bundled into it
build_native_static_lib("native-staticlib");
rustc().input("non-bundled.rs").crate_type("staticlib").crate_type("rlib").run();
llvm_nm()
.input(static_lib_name("non_bundled"))
.run()
.assert_stdout_not_contains_regex("T _*native_func");
llvm_nm()
.input(static_lib_name("non_bundled"))
.run()
.assert_stdout_contains_regex("U _*native_func");
llvm_nm()
.input(rust_lib_name("non_bundled"))
.run()
.assert_stdout_not_contains_regex("T _*native_func");
llvm_nm()
.input(rust_lib_name("non_bundled"))
.run()
.assert_stdout_contains_regex("U _*native_func");

// This part of the test does not function on Windows MSVC - no symbols are printed.
if !is_msvc() {
// Build a cdylib, `native-staticlib` will not appear on the linker line because it was
// bundled previously. The cdylib will contain the `native_func` symbol in the end.
rustc()
.input("cdylib-bundled.rs")
.crate_type("cdylib")
.print("link-args")
.run()
.assert_stdout_not_contains(r#"-l[" ]*native-staticlib"#);
llvm_nm()
.input(dynamic_lib_name("cdylib_bundled"))
.run()
.assert_stdout_contains_regex("[Tt] _*native_func");

// Build a cdylib, `native-staticlib` will appear on the linker line because it was not
// bundled previously. The cdylib will contain the `native_func` symbol in the end
rustc()
.input("cdylib-non-bundled.rs")
.crate_type("cdylib")
.print("link-args")
.run()
.assert_stdout_contains_regex(r#"-l[" ]*native-staticlib"#);
llvm_nm()
.input(dynamic_lib_name("cdylib_non_bundled"))
.run()
.assert_stdout_contains_regex("[Tt] _*native_func");
}
}
39 changes: 0 additions & 39 deletions tests/run-make/rlib-format-packed-bundled-libs/Makefile

This file was deleted.

84 changes: 84 additions & 0 deletions tests/run-make/rlib-format-packed-bundled-libs/rmake.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// `-Z packed_bundled_libs` is an unstable rustc flag that makes the compiler
// only require a native library and no supplementary object files to compile.
// Output files compiled with this flag should still contain all expected symbols -
// that is what this test checks.
// See https://github.com/rust-lang/rust/pull/100101

//@ ignore-cross-compile
// Reason: cross-compilation fails to export native symbols

use run_make_support::{
bin_name, build_native_static_lib, cwd, filename_contains, is_msvc, llvm_ar, llvm_nm, rfs,
rust_lib_name, rustc, shallow_find_files,
};

fn main() {
build_native_static_lib("native_dep_1");
build_native_static_lib("native_dep_2");
build_native_static_lib("native_dep_3");
rustc().input("rust_dep_up.rs").crate_type("rlib").arg("-Zpacked_bundled_libs").run();
llvm_nm()
.input(rust_lib_name("rust_dep_up"))
.run()
.assert_stdout_contains_regex("U.*native_f2");
llvm_nm()
.input(rust_lib_name("rust_dep_up"))
.run()
.assert_stdout_contains_regex("U.*native_f3");
llvm_nm()
.input(rust_lib_name("rust_dep_up"))
.run()
.assert_stdout_contains_regex("T.*rust_dep_up");
llvm_ar()
.table_of_contents()
.arg(rust_lib_name("rust_dep_up"))
.run()
.assert_stdout_contains("native_dep_2");
llvm_ar()
.table_of_contents()
.arg(rust_lib_name("rust_dep_up"))
.run()
.assert_stdout_contains("native_dep_3");
rustc()
.input("rust_dep_local.rs")
.extern_("rlib", rust_lib_name("rust_dep_up"))
.arg("-Zpacked_bundled_libs")
.crate_type("rlib")
.run();
llvm_nm()
.input(rust_lib_name("rust_dep_local"))
.run()
.assert_stdout_contains_regex("U.*native_f1");
llvm_nm()
.input(rust_lib_name("rust_dep_local"))
.run()
.assert_stdout_contains_regex("T.*rust_dep_local");
llvm_ar()
.table_of_contents()
.arg(rust_lib_name("rust_dep_local"))
.run()
.assert_stdout_contains("native_dep_1");

// Ensure the compiler will not use files it should not know about.
for file in shallow_find_files(cwd(), |path| filename_contains(path, "native_dep_")) {
rfs::remove_file(file);
}

rustc()
.input("main.rs")
.extern_("lib", rust_lib_name("rust_dep_local"))
.output(bin_name("main"))
.arg("-Zpacked_bundled_libs")
.print("link-args")
.run()
.assert_stdout_contains_regex("native_dep_1.*native_dep_2.*native_dep_3");

// The binary "main" will not contain any symbols on MSVC.
if !is_msvc() {
llvm_nm().input(bin_name("main")).run().assert_stdout_contains_regex("T.*native_f1");
llvm_nm().input(bin_name("main")).run().assert_stdout_contains_regex("T.*native_f2");
llvm_nm().input(bin_name("main")).run().assert_stdout_contains_regex("T.*native_f3");
llvm_nm().input(bin_name("main")).run().assert_stdout_contains_regex("T.*rust_dep_local");
llvm_nm().input(bin_name("main")).run().assert_stdout_contains_regex("T.*rust_dep_up");
}
}

0 comments on commit e555647

Please sign in to comment.