|
4 | 4 | //@ needs-rust-lld
|
5 | 5 | //@ ignore-s390x lld does not yet support s390x as target
|
6 | 6 |
|
7 |
| -use run_make_support::regex::Regex; |
8 |
| -use run_make_support::{is_msvc, rustc}; |
| 7 | +use run_make_support::linker::{assert_rustc_doesnt_use_lld, assert_rustc_uses_lld}; |
| 8 | +use run_make_support::rustc; |
9 | 9 |
|
10 | 10 | fn main() {
|
11 |
| - // lld-link is used if msvc, otherwise a gnu-compatible lld is used. |
12 |
| - let linker_version_flag = if is_msvc() { "--version" } else { "-Wl,-v" }; |
13 |
| - |
14 | 11 | // Opt-in to lld and the self-contained linker, to link with rust-lld. We'll check that by
|
15 | 12 | // asking the linker to display its version number with a link-arg.
|
16 |
| - let output = rustc() |
17 |
| - .arg("-Zlinker-features=+lld") |
18 |
| - .arg("-Clink-self-contained=+linker") |
19 |
| - .arg("-Zunstable-options") |
20 |
| - .arg("-Wlinker-messages") |
21 |
| - .link_arg(linker_version_flag) |
22 |
| - .input("main.rs") |
23 |
| - .run(); |
24 |
| - assert!( |
25 |
| - find_lld_version_in_logs(output.stderr_utf8()), |
26 |
| - "the LLD version string should be present in the output logs:\n{}", |
27 |
| - output.stderr_utf8() |
| 13 | + assert_rustc_uses_lld( |
| 14 | + rustc() |
| 15 | + .arg("-Zlinker-features=+lld") |
| 16 | + .arg("-Clink-self-contained=+linker") |
| 17 | + .arg("-Zunstable-options") |
| 18 | + .input("main.rs"), |
28 | 19 | );
|
29 | 20 |
|
30 |
| - // It should not be used when we explicitly opt-out of lld. |
31 |
| - let output = rustc() |
32 |
| - .link_arg(linker_version_flag) |
33 |
| - .arg("-Zlinker-features=-lld") |
34 |
| - .arg("-Wlinker-messages") |
35 |
| - .input("main.rs") |
36 |
| - .run(); |
37 |
| - assert!( |
38 |
| - !find_lld_version_in_logs(output.stderr_utf8()), |
39 |
| - "the LLD version string should not be present in the output logs:\n{}", |
40 |
| - output.stderr_utf8() |
41 |
| - ); |
| 21 | + // It should not be used when we explicitly opt out of lld. |
| 22 | + assert_rustc_doesnt_use_lld(rustc().arg("-Zlinker-features=-lld").input("main.rs")); |
42 | 23 |
|
43 | 24 | // While we're here, also check that the last linker feature flag "wins" when passed multiple
|
44 | 25 | // times to rustc.
|
45 |
| - let output = rustc() |
46 |
| - .link_arg(linker_version_flag) |
47 |
| - .arg("-Clink-self-contained=+linker") |
48 |
| - .arg("-Zunstable-options") |
49 |
| - .arg("-Zlinker-features=-lld") |
50 |
| - .arg("-Zlinker-features=+lld") |
51 |
| - .arg("-Zlinker-features=-lld,+lld") |
52 |
| - .arg("-Wlinker-messages") |
53 |
| - .input("main.rs") |
54 |
| - .run(); |
55 |
| - assert!( |
56 |
| - find_lld_version_in_logs(output.stderr_utf8()), |
57 |
| - "the LLD version string should be present in the output logs:\n{}", |
58 |
| - output.stderr_utf8() |
| 26 | + assert_rustc_uses_lld( |
| 27 | + rustc() |
| 28 | + .arg("-Clink-self-contained=+linker") |
| 29 | + .arg("-Zunstable-options") |
| 30 | + .arg("-Zlinker-features=-lld") |
| 31 | + .arg("-Zlinker-features=+lld") |
| 32 | + .arg("-Zlinker-features=-lld,+lld") |
| 33 | + .input("main.rs"), |
59 | 34 | );
|
60 | 35 | }
|
61 |
| - |
62 |
| -fn find_lld_version_in_logs(stderr: String) -> bool { |
63 |
| - // Strip the `-Wlinker-messages` wrappers prefixing the linker output. |
64 |
| - let stderr = Regex::new(r"warning: linker std(out|err):").unwrap().replace_all(&stderr, ""); |
65 |
| - let lld_version_re = Regex::new(r"^LLD [0-9]+\.[0-9]+\.[0-9]+").unwrap(); |
66 |
| - stderr.lines().any(|line| lld_version_re.is_match(line.trim())) |
67 |
| -} |
0 commit comments