Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable link-arg link kind inside of #[link] attribute #118448

Merged
merged 1 commit into from
Nov 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions compiler/rustc_feature/src/unstable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,9 @@ declare_features! (
(incomplete, lazy_type_alias, "1.72.0", Some(112792), None),
/// Allows `if/while p && let q = r && ...` chains.
(unstable, let_chains, "1.37.0", Some(53667), None),
/// Allows using `#[link(kind = "link-arg", name = "...")]`
/// to pass custom arguments to the linker.
(unstable, link_arg_attribute, "CURRENT_RUSTC_VERSION", Some(99427), None),
/// Allows using `reason` in lint attributes and the `#[expect(lint)]` lint check.
(unstable, lint_reasons, "1.31.0", Some(54503), None),
/// Give access to additional metadata about declarative macro meta-variables.
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_metadata/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ metadata_unknown_import_name_type =
unknown import name type `{$import_name_type}`, expected one of: decorated, noprefix, undecorated

metadata_unknown_link_kind =
unknown link kind `{$kind}`, expected one of: static, dylib, framework, raw-dylib
unknown link kind `{$kind}`, expected one of: static, dylib, framework, raw-dylib, link-arg
.label = unknown link kind

metadata_unknown_link_modifier =
Expand Down
12 changes: 12 additions & 0 deletions compiler/rustc_metadata/src/native_libs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,18 @@ impl<'tcx> Collector<'tcx> {
}
NativeLibKind::RawDylib
}
"link-arg" => {
if !features.link_arg_attribute {
feature_err(
&sess.parse_sess,
sym::link_arg_attribute,
span,
"link kind `link-arg` is unstable",
)
.emit();
}
NativeLibKind::LinkArg
}
kind => {
sess.emit_err(errors::UnknownLinkKind { span, kind });
continue;
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_span/src/symbol.rs
Original file line number Diff line number Diff line change
Expand Up @@ -934,6 +934,7 @@ symbols! {
likely,
line,
link,
link_arg_attribute,
link_args,
link_cfg,
link_llvm_intrinsics,
Expand Down
21 changes: 21 additions & 0 deletions src/doc/unstable-book/src/language-features/link-arg-attribute.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# `link_arg_attribute`

The tracking issue for this feature is: [#99427]

------

The `link_arg_attribute` feature allows passing arguments into the linker
from inside of the source code. Order is preserved for link attributes as
they were defined on a single extern block:

```rust,no_run
#![feature(link_arg_attribute)]

#[link(kind = "link-arg", name = "--start-group")]
#[link(kind = "static", name = "c")]
#[link(kind = "static", name = "gcc")]
#[link(kind = "link-arg", name = "--end-group")]
extern "C" {}
```

[#99427]: https://github.com/rust-lang/rust/issues/99427
9 changes: 6 additions & 3 deletions tests/run-make/pass-linker-flags-flavor/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
include ../tools.mk

all:
$(RUSTC) rs.rs -Z unstable-options -C linker-flavor=gnu-cc -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*-Wl,a1.*l2.*-Wl,a2.*d1.*-Wl,a3'
$(RUSTC) rs.rs -Z unstable-options -C linker-flavor=gnu-cc -l static=l1 -l link-arg:+verbatim=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*-Wl,a2.*d1.*-Wl,a3'
$(RUSTC) rs.rs -Z unstable-options -C linker-flavor=ld -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*"a2".*d1.*"a3"'
$(RUSTC) empty.rs -Z unstable-options -C linker-flavor=gnu-cc -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*-Wl,a1.*l2.*-Wl,a2.*d1.*-Wl,a3'
$(RUSTC) empty.rs -Z unstable-options -C linker-flavor=gnu-cc -l static=l1 -l link-arg:+verbatim=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*-Wl,a2.*d1.*-Wl,a3'
$(RUSTC) empty.rs -Z unstable-options -C linker-flavor=ld -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*"a2".*d1.*"a3"'
$(RUSTC) attribute.rs -Z unstable-options -C linker-flavor=gnu-cc --print link-args | $(CGREP) -e 'l1.*-Wl,a1.*l2.*-Wl,a2.*d1.*-Wl,a3'
$(RUSTC) --cfg 'feature="verbatim"' attribute.rs -Z unstable-options -C linker-flavor=gnu-cc --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*-Wl,a2.*d1.*-Wl,a3'
$(RUSTC) attribute.rs -C linker-flavor=ld --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*"a2".*d1.*"a3"'
12 changes: 12 additions & 0 deletions tests/run-make/pass-linker-flags-flavor/attribute.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#![feature(link_arg_attribute)]

#[link(kind = "static", name = "l1")]
#[cfg_attr(feature = "verbatim", link(kind = "link-arg", name = "a1", modifiers = "+verbatim"))]
#[cfg_attr(not(feature = "verbatim"), link(kind = "link-arg", name = "a1"))]
#[link(kind = "static", name = "l2")]
#[link(kind = "link-arg", name = "a2")]
#[link(kind = "dylib", name = "d1")]
#[link(kind = "link-arg", name = "a3")]
extern "C" {}

fn main() {}
6 changes: 4 additions & 2 deletions tests/run-make/pass-linker-flags-from-dep/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ all:
# Build deps
$(RUSTC) native_dep_1.rs --crate-type=staticlib
$(RUSTC) native_dep_2.rs --crate-type=staticlib
$(RUSTC) rust_dep.rs -l static:-bundle=native_dep_1 -l link-arg=some_flag -l static:-bundle=native_dep_2 --crate-type=lib -Z unstable-options
$(RUSTC) rust_dep_flag.rs -l static:-bundle=native_dep_1 -l link-arg=some_flag -l static:-bundle=native_dep_2 --crate-type=lib -Z unstable-options
$(RUSTC) rust_dep_attr.rs --crate-type=lib

# Check sequence of linker args
$(RUSTC) main.rs --extern lib=$(TMPDIR)/librust_dep.rlib --crate-type=bin --print link-args | $(CGREP) -e 'native_dep_1.*some_flag.*native_dep_2'
$(RUSTC) main.rs --extern lib=$(TMPDIR)/librust_dep_flag.rlib --crate-type=bin --print link-args | $(CGREP) -e 'native_dep_1.*some_flag.*native_dep_2'
$(RUSTC) main.rs --extern lib=$(TMPDIR)/librust_dep_attr.rlib --crate-type=bin --print link-args | $(CGREP) -e 'native_dep_1.*some_flag.*native_dep_2'
14 changes: 14 additions & 0 deletions tests/run-make/pass-linker-flags-from-dep/rust_dep_attr.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#![feature(link_arg_attribute)]

#[link(kind = "static", name = "native_dep_1", modifiers = "-bundle")]
#[link(kind = "link-arg", name = "some_flag")]
#[link(kind = "static", name = "native_dep_2", modifiers = "-bundle")]
extern "C" {
pub fn foo();
}

pub fn f() {
unsafe {
foo();
}
}
3 changes: 2 additions & 1 deletion tests/run-make/pass-linker-flags/Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
include ../tools.mk

all:
$(RUSTC) rs.rs -Z unstable-options -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*a1.*l2.*a2.*d1.*a3'
$(RUSTC) empty.rs -Z unstable-options -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*a1.*l2.*a2.*d1.*a3'
$(RUSTC) attribute.rs --print link-args | $(CGREP) -e 'l1.*a1.*l2.*a2.*d1.*a3'
11 changes: 11 additions & 0 deletions tests/run-make/pass-linker-flags/attribute.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#![feature(link_arg_attribute)]

#[link(kind = "static", name = "l1")]
#[link(kind = "link-arg", name = "a1")]
#[link(kind = "static", name = "l2")]
#[link(kind = "link-arg", name = "a2")]
#[link(kind = "dylib", name = "d1")]
#[link(kind = "link-arg", name = "a3")]
extern "C" {}

fn main() {}
2 changes: 1 addition & 1 deletion tests/ui/error-codes/E0458.stderr
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
error[E0458]: unknown link kind `wonderful_unicorn`, expected one of: static, dylib, framework, raw-dylib
error[E0458]: unknown link kind `wonderful_unicorn`, expected one of: static, dylib, framework, raw-dylib, link-arg
--> $DIR/E0458.rs:1:15
|
LL | #[link(kind = "wonderful_unicorn")] extern "C" {}
Expand Down
5 changes: 5 additions & 0 deletions tests/ui/feature-gates/feature-gate-link-arg-attribute.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#[link(kind = "link-arg", name = "foo")]
//~^ ERROR link kind `link-arg` is unstable
extern "C" {}

fn main() {}
12 changes: 12 additions & 0 deletions tests/ui/feature-gates/feature-gate-link-arg-attribute.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
error[E0658]: link kind `link-arg` is unstable
--> $DIR/feature-gate-link-arg-attribute.rs:1:15
|
LL | #[link(kind = "link-arg", name = "foo")]
| ^^^^^^^^^^
|
= note: see issue #99427 <https://github.com/rust-lang/rust/issues/99427> for more information
= help: add `#![feature(link_arg_attribute)]` to the crate attributes to enable

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0658`.
9 changes: 4 additions & 5 deletions tests/ui/native-library-link-flags/link-arg-from-rs.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
// link-arg is not supposed to be usable in #[link] attributes
#![feature(link_arg_attribute)]

// compile-flags:
// error-pattern: error[E0458]: unknown link kind `link-arg`, expected one of: static, dylib, framework, raw-dylib

#[link(kind = "link-arg")]
#[link(kind = "link-arg", name = "arg", modifiers = "+bundle")]
//~^ ERROR linking modifier `bundle` is only compatible with `static` linking kind
extern "C" {}

pub fn main() {}
18 changes: 5 additions & 13 deletions tests/ui/native-library-link-flags/link-arg-from-rs.stderr
Original file line number Diff line number Diff line change
@@ -1,16 +1,8 @@
error[E0458]: unknown link kind `link-arg`, expected one of: static, dylib, framework, raw-dylib
--> $DIR/link-arg-from-rs.rs:6:15
error: linking modifier `bundle` is only compatible with `static` linking kind
--> $DIR/link-arg-from-rs.rs:3:53
|
LL | #[link(kind = "link-arg")]
| ^^^^^^^^^^ unknown link kind
LL | #[link(kind = "link-arg", name = "arg", modifiers = "+bundle")]
| ^^^^^^^^^

error[E0459]: `#[link]` attribute requires a `name = "string"` argument
--> $DIR/link-arg-from-rs.rs:6:1
|
LL | #[link(kind = "link-arg")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `name` argument

error: aborting due to 2 previous errors
error: aborting due to 1 previous error

Some errors have detailed explanations: E0458, E0459.
For more information about an error, try `rustc --explain E0458`.
Loading