Skip to content

Commit db0b491

Browse files
committed
Fix short linker error output
This PR does 2 things: - It removes the braces when there's a single element. This is required since brace expansion (at least in bash and zsh) only triggers if there's at least 2 elements. - It removes the extra `.rlib` suffixes of the elements. See rust-lang#135707 (comment) for context. Running `cargo +stage1 build` on the following program: ```rust unsafe extern "C" { fn foo() -> libc::c_int; } fn main() { let x = unsafe { foo() } as u32; // println!("{}", data_encoding::BASE64.encode(&x.to_le_bytes())); } ``` Gives the following diff before and after the PR: ```diff -/tmp/foo/target/debug/deps/{liblibc-faf416f178830595.rlib}.rlib +/tmp/foo/target/debug/deps/liblibc-faf416f178830595.rlib ``` Running on the same program with the additional dependency, we get the following diff: ```diff -/tmp/foo/target/debug/deps/{liblibc-faf416f178830595.rlib,libdata_encoding-84bb5aadfa9e8839.rlib}.rlib +/tmp/foo/target/debug/deps/{liblibc-faf416f178830595,libdata_encoding-84bb5aadfa9e8839}.rlib ``` Do we want to add a UI test?
1 parent 733b47e commit db0b491

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

compiler/rustc_codegen_ssa/src/errors.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ impl<G: EmissionGuarantee> Diagnostic<'_, G> for LinkingFailed<'_> {
457457
} else if arg.as_encoded_bytes().ends_with(b".rlib") {
458458
let rlib_path = Path::new(&arg);
459459
let dir = rlib_path.parent().unwrap();
460-
let filename = rlib_path.file_name().unwrap().to_owned();
460+
let filename = rlib_path.file_stem().unwrap().to_owned();
461461
if let Some(ArgGroup::Rlibs(parent, rlibs)) = args.last_mut() {
462462
if parent == dir {
463463
rlibs.push(filename);
@@ -471,7 +471,7 @@ impl<G: EmissionGuarantee> Diagnostic<'_, G> for LinkingFailed<'_> {
471471
args.push(ArgGroup::Regular(arg));
472472
}
473473
}
474-
let crate_hash = regex::bytes::Regex::new(r"-[0-9a-f]+\.rlib$").unwrap();
474+
let crate_hash = regex::bytes::Regex::new(r"-[0-9a-f]+").unwrap();
475475
self.command.args(args.into_iter().map(|arg_group| {
476476
match arg_group {
477477
// SAFETY: we are only matching on ASCII, not any surrogate pairs, so any replacements we do will still be valid.
@@ -494,7 +494,11 @@ impl<G: EmissionGuarantee> Diagnostic<'_, G> for LinkingFailed<'_> {
494494
Err(_) => false,
495495
};
496496
let mut arg = dir.into_os_string();
497-
arg.push("/{");
497+
arg.push("/");
498+
let needs_braces = 2 <= rlibs.len();
499+
if needs_braces {
500+
arg.push("{");
501+
}
498502
let mut first = true;
499503
for mut rlib in rlibs {
500504
if !first {
@@ -513,7 +517,10 @@ impl<G: EmissionGuarantee> Diagnostic<'_, G> for LinkingFailed<'_> {
513517
}
514518
arg.push(rlib);
515519
}
516-
arg.push("}.rlib");
520+
if needs_braces {
521+
arg.push("}");
522+
}
523+
arg.push(".rlib");
517524
arg
518525
}
519526
}

0 commit comments

Comments
 (0)