Rollup merge of #127390 - Oneirical:rough-testimation, r=jieyouxu

Migrate `raw-dylib-inline-cross-dylib` and `raw-dylib-custom-dlltool` `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: i686-mingw
This commit is contained in:
Trevor Gross 2024-07-16 16:15:16 -05:00 committed by GitHub
commit d18a741569
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 86 additions and 44 deletions

View File

@ -99,9 +99,7 @@ run-make/print-target-list/Makefile
run-make/prune-link-args/Makefile
run-make/raw-dylib-alt-calling-convention/Makefile
run-make/raw-dylib-c/Makefile
run-make/raw-dylib-custom-dlltool/Makefile
run-make/raw-dylib-import-name-type/Makefile
run-make/raw-dylib-inline-cross-dylib/Makefile
run-make/raw-dylib-link-ordinal/Makefile
run-make/raw-dylib-stdcall-ordinal/Makefile
run-make/redundant-libs/Makefile

View File

@ -1,11 +0,0 @@
# Test using -Cdlltool to change where raw-dylib looks for the dlltool binary.
# only-windows
# only-gnu
# needs-dlltool
include ../tools.mk
all:
$(RUSTC) --crate-type lib --crate-name raw_dylib_test lib.rs -Cdlltool=$(CURDIR)/script.cmd
$(DIFF) output.txt "$(TMPDIR)"/output.txt

View File

@ -0,0 +1,24 @@
// Instead of using the default dlltool, the rust compiler can also accept a custom
// command file with the -C dlltool flag. This test uses it to compile some rust code
// with the raw_dylib Windows-exclusive feature, and checks that the output contains
// the string passed from the custom dlltool, confirming that the default dlltool was
// successfully overridden.
// See https://github.com/rust-lang/rust/pull/109677
//@ only-windows
//@ only-gnu
//@ needs-dlltool
// Reason: this test specifically checks the custom dlltool feature, only
// available on Windows-gnu.
use run_make_support::{diff, rustc};
fn main() {
let out = rustc()
.crate_type("lib")
.crate_name("raw_dylib_test")
.input("lib.rs")
.arg("-Cdlltool=script.cmd")
.run();
diff().expected_file("output.txt").actual_file("actual.txt").normalize(r#"\r"#, "").run();
}

View File

@ -1,2 +1,2 @@
echo Called dlltool via script.cmd> %TMPDIR%\output.txt
echo Called dlltool via script.cmd> actual.txt
dlltool.exe %*

View File

@ -1,30 +0,0 @@
# Regression test for calling an inline function that uses a raw-dylib function.
# only-windows
include ../tools.mk
# We'd be using the llvm-objdump instead of the system objdump to ensure compatibility
# with the LLVM bitcode generated by rustc but on Windows piping/IO redirection under MSYS2 is wonky with llvm-objdump.
OBJDUMP = objdump
all:
$(RUSTC) --crate-type dylib --crate-name raw_dylib_test lib.rs -C prefer-dynamic
$(RUSTC) --crate-type dylib --crate-name raw_dylib_test_wrapper lib_wrapper.rs -C prefer-dynamic
$(RUSTC) --crate-type bin driver.rs -L "$(TMPDIR)" -C prefer-dynamic
# Make sure we don't find an import to the functions we expect to be inlined.
$(OBJDUMP) -p $(TMPDIR)/driver.exe | $(CGREP) -v -e "inline_library_function"
$(OBJDUMP) -p $(TMPDIR)/driver.exe | $(CGREP) -v -e "inline_library_function_calls_inline"
# Make sure we do find an import to the functions we expect to be imported.
$(OBJDUMP) -p $(TMPDIR)/driver.exe | $(CGREP) -e "library_function"
$(call COMPILE_OBJ,"$(TMPDIR)"/extern_1.obj,extern_1.c)
$(call COMPILE_OBJ,"$(TMPDIR)"/extern_2.obj,extern_2.c)
ifdef IS_MSVC
$(CC) "$(TMPDIR)"/extern_1.obj -link -dll -out:"$(TMPDIR)"/extern_1.dll -noimplib
$(CC) "$(TMPDIR)"/extern_2.obj -link -dll -out:"$(TMPDIR)"/extern_2.dll -noimplib
else
$(CC) "$(TMPDIR)"/extern_1.obj -shared -o "$(TMPDIR)"/extern_1.dll
$(CC) "$(TMPDIR)"/extern_2.obj -shared -o "$(TMPDIR)"/extern_2.dll
endif
$(call RUN,driver) | tr -d '\r' > "$(TMPDIR)"/output.txt
$(RUSTC_TEST_OP) "$(TMPDIR)"/output.txt output.txt

View File

@ -0,0 +1,61 @@
// When we generate the import library for a dylib or bin crate, we should generate it
// for the symbols both for the current crate and all upstream crates. This allows for
// using the link kind `raw-dylib` inside inline functions successfully. This test checks
// that the import symbols in the object files match this convention, and that execution
// of the binary results in all function names exported successfully.
// See https://github.com/rust-lang/rust/pull/102988
//@ only-windows
use run_make_support::{cc, diff, is_msvc, llvm_objdump, run, rustc};
fn main() {
rustc()
.crate_type("dylib")
.crate_name("raw_dylib_test")
.input("lib.rs")
.arg("-Cprefer-dynamic")
.run();
rustc()
.crate_type("dylib")
.crate_name("raw_dylib_test_wrapper")
.input("lib_wrapper.rs")
.arg("-Cprefer-dynamic")
.run();
rustc().crate_type("bin").input("driver.rs").arg("-Cprefer-dynamic").run();
llvm_objdump()
.arg("--private-headers")
.input("driver.exe")
.run()
// Make sure we don't find an import to the functions we expect to be inlined.
.assert_stdout_not_contains("inline_library_function")
// Make sure we do find an import to the functions we expect to be imported.
.assert_stdout_contains("library_function");
if is_msvc() {
cc().arg("-c").out_exe("extern_1").input("extern_1.c").run();
cc().arg("-c").out_exe("extern_2").input("extern_2.c").run();
cc().input("extern_1.obj")
.arg("-link")
.arg("-dll")
.arg("-out:extern_1.dll")
.arg("-noimplib")
.run();
cc().input("extern_2.obj")
.arg("-link")
.arg("-dll")
.arg("-out:extern_2.dll")
.arg("-noimplib")
.run();
} else {
cc().arg("-v").arg("-c").out_exe("extern_1").input("extern_1.c").run();
cc().arg("-v").arg("-c").out_exe("extern_2").input("extern_2.c").run();
cc().input("extern_1").out_exe("extern_1.dll").arg("-shared").run();
cc().input("extern_2").out_exe("extern_2.dll").arg("-shared").run();
}
let out = run("driver").stdout_utf8();
diff()
.expected_file("output.txt")
.actual_text("actual_output", out)
.normalize(r#"\r"#, "")
.run();
}