about summary refs log tree commit diff
path: root/src/librustc_codegen_llvm/back/archive.rs
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-07-07 17:00:20 +0200
committerGitHub <noreply@github.com>2019-07-07 17:00:20 +0200
commita2500db8580eab2e1b0e5f85152a8f6f68dea913 (patch)
treece23f3fd2a867e26cb249b79ed193baab3420f83 /src/librustc_codegen_llvm/back/archive.rs
parentfe807fcf3e8c76fc54c19a1bb0570579a4ecfe95 (diff)
parent069c52fa111e592f65605c54f5e9b77be0676595 (diff)
downloadrust-a2500db8580eab2e1b0e5f85152a8f6f68dea913.tar.gz
rust-a2500db8580eab2e1b0e5f85152a8f6f68dea913.zip
Rollup merge of #62286 - petrhosek:rustc-no-duplicate-archives, r=cramertj
Check if the archive has already been added to avoid duplicates

This avoids adding archives multiple times, which results in duplicate
objects in the resulting rlib, leading to symbol collision and link
failures. This could happen when crate contains multiple link attributes
that all reference the same archive.
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) {