rewrite rlib-format-packed-bundled-libs to rmake

This commit is contained in:
Oneirical 2024-08-12 13:26:25 -04:00
parent 3139ff09e9
commit 2e4d5bbba7
4 changed files with 87 additions and 40 deletions

View File

@ -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 {

View File

@ -15,7 +15,6 @@ run-make/libtest-thread-limit/Makefile
run-make/macos-deployment-target/Makefile
run-make/native-link-modifier-bundle/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

View File

@ -1,39 +0,0 @@
include ../tools.mk
# ignore-cross-compile
# Make sure rlib format with -Zpacked_bundled_libs is correct.
# We're using the llvm-nm instead of the system nm to ensure it is compatible
# with the LLVM bitcode generated by rustc.
# Except on Windows where piping/IO redirection under MSYS2 is wonky with llvm-nm.
ifndef IS_WINDOWS
NM = "$(LLVM_BIN_DIR)"/llvm-nm
else
NM = nm
endif
all: $(call NATIVE_STATICLIB,native_dep_1) $(call NATIVE_STATICLIB,native_dep_2) $(call NATIVE_STATICLIB,native_dep_3)
$(RUSTC) rust_dep_up.rs --crate-type=rlib -Zpacked_bundled_libs
$(NM) $(TMPDIR)/librust_dep_up.rlib | $(CGREP) -e "U.*native_f2"
$(NM) $(TMPDIR)/librust_dep_up.rlib | $(CGREP) -e "U.*native_f3"
$(NM) $(TMPDIR)/librust_dep_up.rlib | $(CGREP) -e "T.*rust_dep_up"
$(AR) t $(TMPDIR)/librust_dep_up.rlib | $(CGREP) "native_dep_2"
$(AR) t $(TMPDIR)/librust_dep_up.rlib | $(CGREP) "native_dep_3"
$(RUSTC) rust_dep_local.rs --extern rlib=$(TMPDIR)/librust_dep_up.rlib -Zpacked_bundled_libs --crate-type=rlib
$(NM) $(TMPDIR)/librust_dep_local.rlib | $(CGREP) -e "U.*native_f1"
$(NM) $(TMPDIR)/librust_dep_local.rlib | $(CGREP) -e "T.*rust_dep_local"
$(AR) t $(TMPDIR)/librust_dep_local.rlib | $(CGREP) "native_dep_1"
# Make sure compiler doesn't use files, that it shouldn't know about.
rm $(TMPDIR)/*native_dep_*
$(RUSTC) main.rs --extern lib=$(TMPDIR)/librust_dep_local.rlib -o $(TMPDIR)/main.exe -Zpacked_bundled_libs --print link-args | $(CGREP) -e "native_dep_1.*native_dep_2.*native_dep_3"
ifndef IS_MSVC
$(NM) $(TMPDIR)/main.exe | $(CGREP) -e "T.*native_f1"
$(NM) $(TMPDIR)/main.exe | $(CGREP) -e "T.*native_f2"
$(NM) $(TMPDIR)/main.exe | $(CGREP) -e "T.*native_f3"
$(NM) $(TMPDIR)/main.exe | $(CGREP) -e "T.*rust_dep_local"
$(NM) $(TMPDIR)/main.exe | $(CGREP) -e "T.*rust_dep_up"
endif

View File

@ -0,0 +1,81 @@
// `-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
// FIXME(Oneirical): MSVC and cross-compile
use run_make_support::{
bin_name, build_native_static_lib, cwd, filename_contains, 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");
//FIXME(Oneirical): This part will apparently fail on 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");
}