about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOneirical <manchot@videotron.ca>2024-07-05 16:25:28 -0400
committerOneirical <manchot@videotron.ca>2024-07-05 16:25:28 -0400
commitae144bfff0fa7e20edf75dd70251ede5f6831a1b (patch)
tree852f08b3c2f762554fa62d569043841a835c6458
parent9a21ac8e7efe9ea26a8065d0959a976ca32039bb (diff)
downloadrust-ae144bfff0fa7e20edf75dd70251ede5f6831a1b.tar.gz
rust-ae144bfff0fa7e20edf75dd70251ede5f6831a1b.zip
rewrite raw-dylib-inline-cross-dylib to rmake
-rw-r--r--src/tools/tidy/src/allowed_run_make_makefiles.txt1
-rw-r--r--tests/run-make/raw-dylib-inline-cross-dylib/Makefile30
-rw-r--r--tests/run-make/raw-dylib-inline-cross-dylib/rmake.rs61
3 files changed, 61 insertions, 31 deletions
diff --git a/src/tools/tidy/src/allowed_run_make_makefiles.txt b/src/tools/tidy/src/allowed_run_make_makefiles.txt
index 70c1b055c6e..6d65b2e24e1 100644
--- a/src/tools/tidy/src/allowed_run_make_makefiles.txt
+++ b/src/tools/tidy/src/allowed_run_make_makefiles.txt
@@ -121,7 +121,6 @@ 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
diff --git a/tests/run-make/raw-dylib-inline-cross-dylib/Makefile b/tests/run-make/raw-dylib-inline-cross-dylib/Makefile
deleted file mode 100644
index 6b44b40e253..00000000000
--- a/tests/run-make/raw-dylib-inline-cross-dylib/Makefile
+++ /dev/null
@@ -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
diff --git a/tests/run-make/raw-dylib-inline-cross-dylib/rmake.rs b/tests/run-make/raw-dylib-inline-cross-dylib/rmake.rs
new file mode 100644
index 00000000000..b0cdc0aa4af
--- /dev/null
+++ b/tests/run-make/raw-dylib-inline-cross-dylib/rmake.rs
@@ -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.obj").input("extern_1.c").run();
+        cc().arg("-c").out_exe("extern_2.obj").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.obj").input("extern_1.c").run();
+        cc().arg("-v").arg("-c").out_exe("extern_2.obj").input("extern_2.c").run();
+        cc().input("extern_1.obj").out_exe("extern_1.dll").arg("-shared").run();
+        cc().input("extern_2.obj").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();
+}