about summary refs log tree commit diff
path: root/src/librustc_codegen_llvm/back/archive.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/librustc_codegen_llvm/back/archive.rs')
-rw-r--r--src/librustc_codegen_llvm/back/archive.rs19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/librustc_codegen_llvm/back/archive.rs b/src/librustc_codegen_llvm/back/archive.rs
index ca3b2b84655..e3b7cb235c6 100644
--- a/src/librustc_codegen_llvm/back/archive.rs
+++ b/src/librustc_codegen_llvm/back/archive.rs
@@ -36,11 +36,20 @@ enum Addition {
         name_in_archive: String,
     },
     Archive {
+        path: PathBuf,
         archive: ArchiveRO,
         skip: Box<dyn FnMut(&str) -> bool>,
     },
 }
 
+impl Addition {
+    fn path(&self) -> &Path {
+        match self {
+            Addition::File { path, .. } | Addition::Archive { path, .. } => path,
+        }
+    }
+}
+
 fn is_relevant_child(c: &Child<'_>) -> bool {
     match c.name() {
         Some(name) => !name.contains("SYMDEF"),
@@ -188,12 +197,16 @@ impl<'a> LlvmArchiveBuilder<'a> {
                       -> io::Result<()>
         where F: FnMut(&str) -> bool + 'static
     {
-        let archive = match ArchiveRO::open(archive) {
+        let archive_ro = match ArchiveRO::open(archive) {
             Ok(ar) => ar,
             Err(e) => return Err(io::Error::new(io::ErrorKind::Other, e)),
         };
+        if self.additions.iter().any(|ar| ar.path() == archive) {
+            return Ok(())
+        }
         self.additions.push(Addition::Archive {
-            archive,
+            path: archive.to_path_buf(),
+            archive: archive_ro,
             skip: Box::new(skip),
         });
         Ok(())
@@ -243,7 +256,7 @@ impl<'a> LlvmArchiveBuilder<'a> {
                         strings.push(path);
                         strings.push(name);
                     }
-                    Addition::Archive { archive, skip } => {
+                    Addition::Archive { archive, skip, .. } => {
                         for child in archive.iter() {
                             let child = child.map_err(string_to_io_error)?;
                             if !is_relevant_child(&child) {