Skip to content

Commit d39ecc0

Browse files
committed
rustc_codegen_ssa: check whether add_archive argument is a rlib
1 parent 0e1bd7c commit d39ecc0

2 files changed

Lines changed: 23 additions & 20 deletions

File tree

compiler/rustc_codegen_ssa/src/back/archive.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -308,14 +308,15 @@ fn find_binutils_dlltool(sess: &Session) -> OsString {
308308
tool_name
309309
}
310310

311+
pub enum AddArchiveKind<'a> {
312+
Rlib(/*skip*/ &'a dyn Fn(&str, ArchiveEntryKind) -> bool),
313+
Other,
314+
}
315+
311316
pub trait ArchiveBuilder {
312317
fn add_file(&mut self, path: &Path, kind: ArchiveEntryKind);
313318

314-
fn add_archive(
315-
&mut self,
316-
archive: &Path,
317-
skip: Option<Box<dyn FnMut(&str, ArchiveEntryKind) -> bool + 'static>>,
318-
) -> io::Result<()>;
319+
fn add_archive(&mut self, archive: &Path, kind: AddArchiveKind<'_>) -> io::Result<()>;
319320

320321
fn build(self: Box<Self>, output: &Path) -> bool;
321322
}
@@ -458,11 +459,7 @@ pub fn try_extract_macho_fat_archive(
458459
}
459460

460461
impl<'a> ArchiveBuilder for ArArchiveBuilder<'a> {
461-
fn add_archive(
462-
&mut self,
463-
archive_path: &Path,
464-
mut skip: Option<Box<dyn FnMut(&str, ArchiveEntryKind) -> bool + 'static>>,
465-
) -> io::Result<()> {
462+
fn add_archive(&mut self, archive_path: &Path, ar_kind: AddArchiveKind<'_>) -> io::Result<()> {
466463
let mut archive_path = archive_path.to_path_buf();
467464
if self.sess.target.llvm_target.contains("-apple-macosx")
468465
&& let Some(new_archive_path) = try_extract_macho_fat_archive(self.sess, &archive_path)?
@@ -477,7 +474,10 @@ impl<'a> ArchiveBuilder for ArArchiveBuilder<'a> {
477474
let archive_map = unsafe { Mmap::map(File::open(&archive_path)?)? };
478475
let archive = ArchiveFile::parse(&*archive_map)
479476
.map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err))?;
480-
let metadata_link = rmeta_link::read(&archive, &archive_map, &archive_path);
477+
let metadata_link = match ar_kind {
478+
AddArchiveKind::Rlib(..) => rmeta_link::read(&archive, &archive_map, &archive_path),
479+
AddArchiveKind::Other => None,
480+
};
481481
let archive_index = self.src_archives.len();
482482

483483
if let Some(expected_kind) =
@@ -505,7 +505,10 @@ impl<'a> ArchiveBuilder for ArArchiveBuilder<'a> {
505505
} else {
506506
ArchiveEntryKind::Other
507507
};
508-
let drop = skip.as_mut().is_some_and(|f| f(&file_name, kind));
508+
let drop = match ar_kind {
509+
AddArchiveKind::Rlib(skip) => skip(&file_name, kind),
510+
AddArchiveKind::Other => false,
511+
};
509512
if !drop {
510513
let source = if entry.is_thin() {
511514
let member_path = archive_path.parent().unwrap().join(Path::new(&file_name));

compiler/rustc_codegen_ssa/src/back/link.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ use rustc_target::spec::{
5353
};
5454
use tracing::{debug, info, warn};
5555

56-
use super::archive::{ArchiveBuilder, ArchiveBuilderBuilder, ArchiveEntryKind};
56+
use super::archive::{AddArchiveKind, ArchiveBuilder, ArchiveBuilderBuilder, ArchiveEntryKind};
5757
use super::command::Command;
5858
use super::linker::{self, Linker};
5959
use super::metadata::{MetadataPosition, create_wrapper_file};
@@ -419,7 +419,7 @@ fn link_rlib<'a>(
419419
packed_bundled_libs.push(wrapper_file);
420420
} else {
421421
let path = find_native_static_library(lib.name.as_str(), lib.verbatim, sess);
422-
ab.add_archive(&path, None).unwrap_or_else(|error| {
422+
ab.add_archive(&path, AddArchiveKind::Other).unwrap_or_else(|error| {
423423
sess.dcx().emit_fatal(errors::AddNativeLibrary { library_path: path, error })
424424
});
425425
}
@@ -436,7 +436,7 @@ fn link_rlib<'a>(
436436
tmpdir.as_ref(),
437437
true,
438438
) {
439-
ab.add_archive(&output_path, None).unwrap_or_else(|error| {
439+
ab.add_archive(&output_path, AddArchiveKind::Other).unwrap_or_else(|error| {
440440
sess.dcx()
441441
.emit_fatal(errors::AddNativeLibrary { library_path: output_path, error });
442442
});
@@ -529,7 +529,7 @@ fn link_staticlib(
529529
let bundled_libs: FxIndexSet<_> = native_libs.filter_map(|lib| lib.filename).collect();
530530
ab.add_archive(
531531
path,
532-
Some(Box::new(move |fname: &str, entry_kind| {
532+
AddArchiveKind::Rlib(&|fname: &str, entry_kind| {
533533
// Ignore metadata and rmeta-link files.
534534
if fname == METADATA_FILENAME || fname == rmeta_link::FILENAME {
535535
return true;
@@ -546,7 +546,7 @@ fn link_staticlib(
546546
}
547547

548548
false
549-
})),
549+
}),
550550
)
551551
.unwrap();
552552

@@ -557,7 +557,7 @@ fn link_staticlib(
557557
for filename in relevant_libs.iter() {
558558
let joined = tempdir.as_ref().join(filename.as_str());
559559
let path = joined.as_path();
560-
ab.add_archive(path, None).unwrap();
560+
ab.add_archive(path, AddArchiveKind::Other).unwrap();
561561
}
562562

563563
all_native_libs.extend(crate_info.native_libraries[&cnum].iter().cloned());
@@ -3240,7 +3240,7 @@ fn add_static_crate(
32403240
let mut archive = archive_builder_builder.new_archive_builder(sess);
32413241
if let Err(error) = archive.add_archive(
32423242
cratepath,
3243-
Some(Box::new(move |f, entry_kind| {
3243+
AddArchiveKind::Rlib(&|f, entry_kind| {
32443244
if f == METADATA_FILENAME || f == rmeta_link::FILENAME {
32453245
return true;
32463246
}
@@ -3266,7 +3266,7 @@ fn add_static_crate(
32663266
}
32673267

32683268
false
3269-
})),
3269+
}),
32703270
) {
32713271
sess.dcx()
32723272
.emit_fatal(errors::RlibArchiveBuildFailure { path: cratepath.clone(), error });

0 commit comments

Comments
 (0)