Skip to content

Commit

Permalink
Auto merge of #85554 - 12101111:fix-dedup-native-libs, r=petrochenkov
Browse files Browse the repository at this point in the history
native lib: defer the duplicate check after relevant_lib check.

#84794 break code using conditional-compilation with `#[link]` attributes.

```rust
#[cfg(target_env = "musl")]
cfg_if::cfg_if! {
    if #[cfg(any(target_feature = "crt-static", feature = "llvm-libunwind"))] {
        #[link(name = "unwind", kind = "static", modifiers = "-bundle")]
        extern "C" {}
    } else {
        #[link(name = "unwind", cfg(feature = "system-llvm-libunwind"))]
        #[link(name = "gcc_s", cfg(not(feature = "system-llvm-libunwind")))]
        extern "C" {}
    }
}

```
  • Loading branch information
bors committed May 23, 2021
2 parents d8af907 + 8e42fa5 commit f64503e
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 6 deletions.
14 changes: 8 additions & 6 deletions compiler/rustc_codegen_ssa/src/back/link.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1805,13 +1805,14 @@ fn add_local_native_libraries(
let search_path = archive_search_paths(sess);
let mut last = (NativeLibKind::Unspecified, None);
for lib in relevant_libs {
// Skip if this library is the same as the last.
last = if (lib.kind, lib.name) == last { continue } else { (lib.kind, lib.name) };

let name = match lib.name {
Some(l) => l,
None => continue,
};

// Skip if this library is the same as the last.
last = if (lib.kind, lib.name) == last { continue } else { (lib.kind, lib.name) };

let verbatim = lib.verbatim.unwrap_or(false);
match lib.kind {
NativeLibKind::Dylib { as_needed } => {
Expand Down Expand Up @@ -2144,16 +2145,17 @@ fn add_upstream_native_libraries(
let mut last = (NativeLibKind::Unspecified, None);
for &(cnum, _) in crates {
for lib in codegen_results.crate_info.native_libraries[&cnum].iter() {
// Skip if this library is the same as the last.
last = if (lib.kind, lib.name) == last { continue } else { (lib.kind, lib.name) };

let name = match lib.name {
Some(l) => l,
None => continue,
};
if !relevant_lib(sess, &lib) {
continue;
}

// Skip if this library is the same as the last.
last = if (lib.kind, lib.name) == last { continue } else { (lib.kind, lib.name) };

let verbatim = lib.verbatim.unwrap_or(false);
match lib.kind {
NativeLibKind::Dylib { as_needed } => {
Expand Down
12 changes: 12 additions & 0 deletions src/test/run-make-fulldeps/link-dedup/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# ignore-msvc

-include ../tools.mk

all:
$(RUSTC) depa.rs
$(RUSTC) depb.rs
$(RUSTC) depc.rs
$(RUSTC) empty.rs --cfg bar 2>&1 | $(CGREP) '"-ltesta" "-ltestb" "-ltesta"'
$(RUSTC) empty.rs 2>&1 | $(CGREP) '"-ltesta"'
$(RUSTC) empty.rs 2>&1 | $(CGREP) -v '"-ltestb"'
$(RUSTC) empty.rs 2>&1 | $(CGREP) -v '"-ltesta" "-ltesta"'
7 changes: 7 additions & 0 deletions src/test/run-make-fulldeps/link-dedup/depa.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#![crate_type = "rlib"]

#[link(name = "testa")]
extern "C" {}

#[link(name = "testa")]
extern "C" {}
8 changes: 8 additions & 0 deletions src/test/run-make-fulldeps/link-dedup/depb.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#![feature(link_cfg)]
#![crate_type = "rlib"]

#[link(name = "testb", cfg(foo))]
extern "C" {}

#[link(name = "testb", cfg(bar))]
extern "C" {}
4 changes: 4 additions & 0 deletions src/test/run-make-fulldeps/link-dedup/depc.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#![crate_type = "rlib"]

#[link(name = "testa")]
extern "C" {}
5 changes: 5 additions & 0 deletions src/test/run-make-fulldeps/link-dedup/empty.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
extern crate depa;
extern crate depb;
extern crate depc;

fn main() {}

0 comments on commit f64503e

Please sign in to comment.