Skip to content

Commit 1f4c5a6

Browse files
committed
ADD - ExtractBundledLibsError. Migrated extract_bundled_libs to translatable diagnostics
1 parent 4c80f50 commit 1f4c5a6

File tree

4 files changed

+98
-19
lines changed

4 files changed

+98
-19
lines changed

compiler/rustc_codegen_ssa/src/back/archive.rs

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ use rustc_span::symbol::Symbol;
66

77
use object::read::archive::ArchiveFile;
88

9-
use std::fmt::Display;
109
use std::fs::File;
1110
use std::io;
1211
use std::path::{Path, PathBuf};
1312

13+
use crate::errors::{ExtractBundledLibsError, ExtractBundledLibsErrorKind::*};
14+
1415
pub trait ArchiveBuilderBuilder {
1516
fn new_archive_builder<'a>(&self, sess: &'a Session) -> Box<dyn ArchiveBuilder<'a> + 'a>;
1617

@@ -28,32 +29,54 @@ pub trait ArchiveBuilderBuilder {
2829
is_direct_dependency: bool,
2930
) -> PathBuf;
3031

31-
fn extract_bundled_libs(
32-
&self,
33-
rlib: &Path,
32+
fn extract_bundled_libs<'a>(
33+
&'a self,
34+
rlib: &'a Path,
3435
outdir: &Path,
3536
bundled_lib_file_names: &FxHashSet<Symbol>,
36-
) -> Result<(), String> {
37-
let message = |msg: &str, e: &dyn Display| format!("{} '{}': {}", msg, &rlib.display(), e);
37+
) -> Result<(), ExtractBundledLibsError<'_>> {
3838
let archive_map = unsafe {
39-
Mmap::map(File::open(rlib).map_err(|e| message("failed to open file", &e))?)
40-
.map_err(|e| message("failed to mmap file", &e))?
39+
Mmap::map(File::open(rlib).map_err(|e| ExtractBundledLibsError {
40+
kind: OpenFile,
41+
rlib,
42+
error: e.to_string(),
43+
})?)
44+
.map_err(|e| ExtractBundledLibsError {
45+
kind: MmapFile,
46+
rlib,
47+
error: e.to_string(),
48+
})?
4149
};
42-
let archive = ArchiveFile::parse(&*archive_map)
43-
.map_err(|e| message("failed to parse archive", &e))?;
50+
let archive = ArchiveFile::parse(&*archive_map).map_err(|e| ExtractBundledLibsError {
51+
kind: ParseArchive,
52+
rlib,
53+
error: e.to_string(),
54+
})?;
4455

4556
for entry in archive.members() {
46-
let entry = entry.map_err(|e| message("failed to read entry", &e))?;
47-
let data = entry
48-
.data(&*archive_map)
49-
.map_err(|e| message("failed to get data from archive member", &e))?;
50-
let name = std::str::from_utf8(entry.name())
51-
.map_err(|e| message("failed to convert name", &e))?;
57+
let entry = entry.map_err(|e| ExtractBundledLibsError {
58+
kind: ReadEntry,
59+
rlib,
60+
error: e.to_string(),
61+
})?;
62+
let data = entry.data(&*archive_map).map_err(|e| ExtractBundledLibsError {
63+
kind: ArchiveMember,
64+
rlib,
65+
error: e.to_string(),
66+
})?;
67+
let name = std::str::from_utf8(entry.name()).map_err(|e| ExtractBundledLibsError {
68+
kind: ConvertName,
69+
rlib,
70+
error: e.to_string(),
71+
})?;
5272
if !bundled_lib_file_names.contains(&Symbol::intern(name)) {
5373
continue; // We need to extract only native libraries.
5474
}
55-
std::fs::write(&outdir.join(&name), data)
56-
.map_err(|e| message("failed to write file", &e))?;
75+
std::fs::write(&outdir.join(&name), data).map_err(|e| ExtractBundledLibsError {
76+
kind: WriteFile,
77+
rlib,
78+
error: e.to_string(),
79+
})?;
5780
}
5881
Ok(())
5982
}

compiler/rustc_codegen_ssa/src/back/link.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2447,7 +2447,7 @@ fn add_upstream_rust_crates<'a>(
24472447
let rlib = &src.rlib.as_ref().unwrap().0;
24482448
archive_builder_builder
24492449
.extract_bundled_libs(rlib, tmpdir, &bundled_libs)
2450-
.unwrap_or_else(|e| sess.fatal(e));
2450+
.unwrap_or_else(|e| sess.emit_fatal(e));
24512451
}
24522452

24532453
let mut last = (None, NativeLibKind::Unspecified, None);

compiler/rustc_codegen_ssa/src/errors.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,3 +484,51 @@ pub struct RlibArchiveBuildFailure {
484484
#[derive(Diagnostic)]
485485
#[diag(codegen_ssa_option_gcc_only)]
486486
pub struct OptionGccOnly;
487+
488+
pub struct ExtractBundledLibsError<'a> {
489+
pub kind: ExtractBundledLibsErrorKind,
490+
pub rlib: &'a Path,
491+
pub error: String,
492+
}
493+
494+
pub enum ExtractBundledLibsErrorKind {
495+
OpenFile,
496+
MmapFile,
497+
ParseArchive,
498+
ReadEntry,
499+
ArchiveMember,
500+
ConvertName,
501+
WriteFile,
502+
}
503+
504+
impl IntoDiagnostic<'_, !> for ExtractBundledLibsError<'_> {
505+
fn into_diagnostic(self, handler: &'_ Handler) -> DiagnosticBuilder<'_, !> {
506+
let mut diag = match self.kind {
507+
ExtractBundledLibsErrorKind::OpenFile => {
508+
handler.struct_fatal(fluent::codegen_ssa_extract_bundled_libs_open_file)
509+
}
510+
ExtractBundledLibsErrorKind::MmapFile => {
511+
handler.struct_fatal(fluent::codegen_ssa_extract_bundled_libs_mmap_file)
512+
}
513+
ExtractBundledLibsErrorKind::ParseArchive => {
514+
handler.struct_fatal(fluent::codegen_ssa_extract_bundled_libs_parse_archive)
515+
}
516+
ExtractBundledLibsErrorKind::ReadEntry => {
517+
handler.struct_fatal(fluent::codegen_ssa_extract_bundled_libs_read_entry)
518+
}
519+
ExtractBundledLibsErrorKind::ArchiveMember => {
520+
handler.struct_fatal(fluent::codegen_ssa_extract_bundled_libs_archive_member)
521+
}
522+
ExtractBundledLibsErrorKind::ConvertName => {
523+
handler.struct_fatal(fluent::codegen_ssa_extract_bundled_libs_convert_name)
524+
}
525+
ExtractBundledLibsErrorKind::WriteFile => {
526+
handler.struct_fatal(fluent::codegen_ssa_extract_bundled_libs_write_file)
527+
}
528+
};
529+
530+
diag.set_arg("rlib", self.rlib);
531+
diag.set_arg("error", self.error);
532+
diag
533+
}
534+
}

compiler/rustc_error_messages/locales/en-US/codegen_ssa.ftl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,11 @@ codegen_ssa_unable_to_write_debugger_visualizer = Unable to write debugger visua
170170
codegen_ssa_rlib_archive_build_failure = failed to build archive from rlib: {$error}
171171
172172
codegen_ssa_option_gcc_only = option `-Z gcc-ld` is used even though linker flavor is not gcc
173+
174+
codegen_ssa_extract_bundled_libs_open_file = failed to open file '{$rlib}': {$error}
175+
codegen_ssa_extract_bundled_libs_mmap_file = failed to mmap file '{$rlib}': {$error}
176+
codegen_ssa_extract_bundled_libs_parse_archive = failed to parse archive '{$rlib}': {$error}
177+
codegen_ssa_extract_bundled_libs_read_entry = failed to read entry '{$rlib}': {$error}
178+
codegen_ssa_extract_bundled_libs_archive_member = failed to get data from archive member '{$rlib}': {$error}
179+
codegen_ssa_extract_bundled_libs_convert_name = failed to convert name '{$rlib}': {$error}
180+
codegen_ssa_extract_bundled_libs_write_file = failed to write file '{$rlib}': {$error}

0 commit comments

Comments
 (0)