|  | // 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_windows_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_windows_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(); | 
|  | } |