Auto merge of #127778 - Oneirical:artificial-intestlligence, r=jieyouxu

Migrate `staticlib-blank-lib`, `rlib-format-packed-bundled-libs-3` and `issue-97463-abi-param-passing` `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: aarch64-gnu
try-job: armhf-gnu
try-job: test-various
try-job: x86_64-mingw
try-job: x86_64-msvc
try-job: x86_64-gnu-llvm-18
This commit is contained in:
bors 2024-07-23 01:51:57 +00:00
commit 8ded134198
10 changed files with 124 additions and 59 deletions

View File

@ -229,6 +229,8 @@ impl LlvmAr {
Self { cmd }
}
/// Automatically pass the commonly used arguments `rcus`, used for combining one or more
/// input object files into one output static library file.
pub fn obj_to_ar(&mut self) -> &mut Self {
self.cmd.arg("rcus");
self

View File

@ -34,7 +34,6 @@ run-make/issue-47551/Makefile
run-make/issue-69368/Makefile
run-make/issue-84395-lto-embed-bitcode/Makefile
run-make/issue-88756-default-output/Makefile
run-make/issue-97463-abi-param-passing/Makefile
run-make/jobserver-error/Makefile
run-make/libs-through-symlinks/Makefile
run-make/libtest-json/Makefile
@ -70,7 +69,6 @@ run-make/remap-path-prefix-dwarf/Makefile
run-make/reproducible-build-2/Makefile
run-make/reproducible-build/Makefile
run-make/rlib-format-packed-bundled-libs-2/Makefile
run-make/rlib-format-packed-bundled-libs-3/Makefile
run-make/rlib-format-packed-bundled-libs/Makefile
run-make/sanitizer-cdylib-link/Makefile
run-make/sanitizer-dylib-link/Makefile
@ -80,7 +78,6 @@ run-make/simd-ffi/Makefile
run-make/split-debuginfo/Makefile
run-make/stable-symbol-names/Makefile
run-make/static-dylib-by-default/Makefile
run-make/staticlib-blank-lib/Makefile
run-make/staticlib-dylib-linkage/Makefile
run-make/symbol-mangling-hashed/Makefile
run-make/symbol-visibility/Makefile

View File

@ -1,15 +0,0 @@
# ignore-cross-compile
include ../tools.mk
# ignore-msvc
# The issue exercised by this test, rust-lang/rust#97463, explicitly needs `-O`
# flags (like `-O3`) to reproduce. Thus, we call $(CC) instead of nicer
# alternatives provided by tools.mk like using `COMPILE_OBJ` or using a
# `NATIVE_STATICLIB` dependency.
all:
$(CC) -c -O3 -o $(TMPDIR)/bad.o bad.c
$(AR) rcs $(TMPDIR)/libbad.a $(TMPDIR)/bad.o
$(RUSTC) param_passing.rs -L$(TMPDIR) -lbad -C opt-level=3
$(call RUN,param_passing)

View File

@ -1,35 +0,0 @@
include ../tools.mk
# ignore-cross-compile
# only-linux
# Make sure -Zpacked_bundled_libs-like behavior activates with +bundle,+whole-archive.
# We're using the llvm-nm instead of the system nm to ensure it is compatible
# with the LLVM bitcode generated by rustc.
NM = "$(LLVM_BIN_DIR)"/llvm-nm
all: $(call NATIVE_STATICLIB,native_dep_1) $(call NATIVE_STATICLIB,native_dep_2) $(call NATIVE_STATICLIB,native_dep_3) $(call NATIVE_STATICLIB,native_dep_4)
# test cfg with packed bundle
$(RUSTC) rust_dep_cfg.rs --crate-type=rlib
$(RUSTC) main.rs --extern rust_dep=$(TMPDIR)/librust_dep_cfg.rlib --crate-type=staticlib --cfg should_add
$(AR) t $(TMPDIR)/librust_dep_cfg.rlib | $(CGREP) -e "libnative_dep_1.a"
$(AR) t $(TMPDIR)/librust_dep_cfg.rlib | $(CGREP) -e "libnative_dep_2.a"
$(AR) t $(TMPDIR)/libmain.a | $(CGREP) -e "libnative_dep_1.o"
$(AR) t $(TMPDIR)/libmain.a | $(CGREP) -ev "libnative_dep_2.o"
# test bundle with whole_archive
$(RUSTC) rust_dep.rs --crate-type=rlib
$(AR) t $(TMPDIR)/librust_dep.rlib | $(CGREP) -e "native_dep_1"
$(AR) t $(TMPDIR)/librust_dep.rlib | $(CGREP) -e "native_dep_3"
$(AR) t $(TMPDIR)/librust_dep.rlib | $(CGREP) -ev "native_dep_2"
$(AR) t $(TMPDIR)/librust_dep.rlib | $(CGREP) -ev "native_dep_4"
# Make sure compiler doesn't use files, that it shouldn't know about.
rm $(TMPDIR)/libnative_dep_1.a
rm $(TMPDIR)/libnative_dep_3.a
$(RUSTC) main.rs --extern rust_dep=$(TMPDIR)/librust_dep.rlib --print link-args > $(TMPDIR)/link_args
cat $(TMPDIR)/link_args | $(CGREP) -ev "native_dep_3"
cat $(TMPDIR)/link_args | $(CGREP) -e "--whole-archive.*native_dep_1.*--whole-archive.*lnative_dep_2.*no-whole-archive.*lnative_dep_4"

View File

@ -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.
// #105601 made it possible to have this behaviour without an unstable flag by
// passing +bundle in modifiers, and this test checks that this feature successfully
// compiles and includes only the static libraries, with no object files.
// See https://github.com/rust-lang/rust/pull/105601
use run_make_support::{
build_native_static_lib, is_msvc, llvm_ar, regex, rfs, rust_lib_name, rustc, static_lib_name,
};
//@ ignore-cross-compile
// Reason: Invalid library format (not ELF) causes compilation failure
// in the final `rustc` call.
//@ only-linux
// Reason: differences in the native lib compilation process causes differences
// in the --print link-args output
fn main() {
build_native_static_lib("native_dep_1");
build_native_static_lib("native_dep_2");
build_native_static_lib("native_dep_3");
build_native_static_lib("native_dep_4");
// Test cfg with packed bundle.
rustc().input("rust_dep_cfg.rs").crate_type("rlib").run();
rustc()
.input("main.rs")
.extern_("rust_dep", rust_lib_name("rust_dep_cfg"))
.crate_type("staticlib")
.cfg("should_add")
.run();
// Only static libraries should appear, no object files at all.
llvm_ar()
.arg("t")
.arg(rust_lib_name("rust_dep_cfg"))
.run()
.assert_stdout_contains(static_lib_name("native_dep_1"));
llvm_ar()
.arg("t")
.arg(rust_lib_name("rust_dep_cfg"))
.run()
.assert_stdout_contains(static_lib_name("native_dep_2"));
llvm_ar().arg("t").arg(static_lib_name("main")).run().assert_stdout_contains("native_dep_1.o");
llvm_ar()
.arg("t")
.arg(static_lib_name("main"))
.run()
.assert_stdout_not_contains("native_dep_2.o");
// Test bundle with whole archive.
rustc().input("rust_dep.rs").crate_type("rlib").run();
// Only deps with `+bundle` should appear.
llvm_ar().arg("t").arg(rust_lib_name("rust_dep")).run().assert_stdout_contains("native_dep_1");
llvm_ar().arg("t").arg(rust_lib_name("rust_dep")).run().assert_stdout_contains("native_dep_3");
llvm_ar()
.arg("t")
.arg(rust_lib_name("rust_dep"))
.run()
.assert_stdout_not_contains("native_dep_2");
llvm_ar()
.arg("t")
.arg(rust_lib_name("rust_dep"))
.run()
.assert_stdout_not_contains("native_dep_4");
// The compiler shouldn't use files which it doesn't know about.
rfs::remove_file(static_lib_name("native_dep_1"));
rfs::remove_file(static_lib_name("native_dep_3"));
let out = rustc()
.input("main.rs")
.extern_("rust_dep", rust_lib_name("rust_dep"))
.print("link-args")
.run()
.assert_stdout_not_contains("native_dep_3")
.stdout_utf8();
let re = regex::Regex::new(
"--whole-archive.*native_dep_1.*--whole-archive.*lnative_dep_2.*no-whole-archive.*lnative_dep_4"
).unwrap();
assert!(re.is_match(&out));
}

View File

@ -1,6 +0,0 @@
include ../tools.mk
all:
$(AR) crus $(TMPDIR)/libfoo.a foo.rs
$(AR) d $(TMPDIR)/libfoo.a foo.rs
$(RUSTC) foo.rs

View File

@ -0,0 +1,13 @@
// In this test, the static library foo is made blank, which used to cause
// a compilation error. As the compiler now returns Ok upon encountering a blank
// staticlib as of #12379, this test checks that compilation is successful despite
// the blank staticlib.
// See https://github.com/rust-lang/rust/pull/12379
use run_make_support::{llvm_ar, rustc, static_lib_name};
fn main() {
llvm_ar().obj_to_ar().output_input(static_lib_name("foo"), "foo.rs").run();
llvm_ar().arg("d").output_input(static_lib_name("foo"), "foo.rs").run();
rustc().input("foo.rs").run();
}

View File

@ -0,0 +1,25 @@
// This test was created in response to an obscure miscompilation bug, only
// visible with the -O3 flag passed to the cc compiler when trying to obtain
// a native static library for the sake of foreign function interface. This
// flag could cause certain integer types to fail to be zero-extended, resulting
// in type casting errors. After the fix in #97800, this test attempts integer casting
// while simultaneously interfacing with a C library and using the -O3 flag.
// See https://github.com/rust-lang/rust/issues/97463
//@ ignore-msvc
// Reason: the rustc compilation fails due to an unresolved external symbol
//@ ignore-cross-compile
// Reason: The compiled binary is executed.
use run_make_support::{cc, is_msvc, llvm_ar, run, rustc, static_lib_name};
fn main() {
// The issue exercised by this test specifically needs needs `-O`
// flags (like `-O3`) to reproduce. Thus, we call `cc()` instead of
// the nicer `build_native_static_lib`.
cc().arg("-c").arg("-O3").out_exe("bad.o").input("bad.c").run();
llvm_ar().obj_to_ar().output_input(static_lib_name("bad"), "bad.o").run();
rustc().input("param_passing.rs").arg("-lbad").opt_level("3").run();
run("param_passing");
}