mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
port native_libs.rs to SessionDiagnostics
This commit is contained in:
parent
54645e880f
commit
3ed93107ff
@ -19,3 +19,105 @@ metadata_required_panic_strategy =
|
||||
|
||||
metadata_incompatible_panic_in_drop_strategy =
|
||||
the crate `{$crate_name}` is compiled with the panic-in-drop strategy `{$found_strategy}` which is incompatible with this crate's strategy of `{$desired_strategy}`
|
||||
|
||||
metadata_multiple_names_in_link =
|
||||
multiple `name` arguments in a single `#[link]` attribute
|
||||
|
||||
metadata_multiple_kinds_in_link =
|
||||
multiple `kind` arguments in a single `#[link]` attribute
|
||||
|
||||
metadata_link_name_form =
|
||||
link name must be of the form `name = "string"`
|
||||
|
||||
metadata_link_kind_form =
|
||||
link kind must be of the form `kind = "string"`
|
||||
|
||||
metadata_link_modifiers_form =
|
||||
link modifiers must be of the form `modifiers = "string"`
|
||||
|
||||
metadata_link_cfg_form =
|
||||
link cfg must be of the form `cfg(/* predicate */)`
|
||||
|
||||
metadata_wasm_import_form =
|
||||
wasm import module must be of the form `wasm_import_module = "string"`
|
||||
|
||||
metadata_empty_link_name =
|
||||
link name must not be empty
|
||||
.label = empty link name
|
||||
|
||||
metadata_link_framework_apple =
|
||||
link kind `framework` is only supported on Apple targets
|
||||
|
||||
metadata_framework_only_windows =
|
||||
link kind `raw-dylib` is only supported on Windows targets
|
||||
|
||||
metadata_unknown_link_kind =
|
||||
unknown link kind `{$kind}`, expected one of: static, dylib, framework, raw-dylib
|
||||
.label = unknown link kind
|
||||
|
||||
metadata_multiple_link_modifiers =
|
||||
multiple `modifiers` arguments in a single `#[link]` attribute
|
||||
|
||||
metadata_multiple_cfgs =
|
||||
multiple `cfg` arguments in a single `#[link]` attribute
|
||||
|
||||
metadata_link_cfg_single_predicate =
|
||||
link cfg must have a single predicate argument
|
||||
|
||||
metadata_multiple_wasm_import =
|
||||
multiple `wasm_import_module` arguments in a single `#[link]` attribute
|
||||
|
||||
metadata_unexpected_link_arg =
|
||||
unexpected `#[link]` argument, expected one of: name, kind, modifiers, cfg, wasm_import_module, import_name_type
|
||||
|
||||
metadata_invalid_link_modifier =
|
||||
invalid linking modifier syntax, expected '+' or '-' prefix before one of: bundle, verbatim, whole-archive, as-needed
|
||||
|
||||
metadata_multiple_modifiers =
|
||||
multiple `{$modifier}` modifiers in a single `modifiers` argument
|
||||
|
||||
metadata_bundle_needs_static =
|
||||
linking modifier `bundle` is only compatible with `static` linking kind
|
||||
|
||||
metadata_whole_archive_needs_static =
|
||||
linking modifier `whole-archive` is only compatible with `static` linking kind
|
||||
|
||||
metadata_as_needed_compatibility =
|
||||
linking modifier `as-needed` is only compatible with `dylib` and `framework` linking kinds
|
||||
|
||||
metadata_unknown_link_modifier =
|
||||
unknown linking modifier `{$modifier}`, expected one of: bundle, verbatim, whole-archive, as-needed
|
||||
|
||||
metadata_incompatible_wasm_link =
|
||||
`wasm_import_module` is incompatible with other arguments in `#[link]` attributes
|
||||
|
||||
metadata_link_requires_name =
|
||||
`#[link]` attribute requires a `name = "string"` argument
|
||||
.label = missing `name` argument
|
||||
|
||||
metadata_raw_dylib_no_nul =
|
||||
link name must not contain NUL characters if link kind is `raw-dylib`
|
||||
|
||||
metadata_link_ordinal_raw_dylib =
|
||||
`#[link_ordinal]` is only supported if link kind is `raw-dylib`
|
||||
|
||||
metadata_lib_framework_apple =
|
||||
library kind `framework` is only supported on Apple targets
|
||||
|
||||
metadata_empty_renaming_target =
|
||||
an empty renaming target was specified for library `{$lib_name}`
|
||||
|
||||
metadata_renaming_no_link =
|
||||
renaming of the library `{$lib_name}` was specified, however this crate contains no `#[link(...)]` attributes referencing this library
|
||||
|
||||
metadata_multiple_renamings =
|
||||
multiple renamings were specified for library `{$lib_name}`
|
||||
|
||||
metadata_no_link_mod_override =
|
||||
overriding linking modifiers from command line is not supported
|
||||
|
||||
metadata_unsupported_abi_i686 =
|
||||
ABI not supported by `#[link(kind = "raw-dylib")]` on i686
|
||||
|
||||
metadata_unsupported_abi =
|
||||
ABI not supported by `#[link(kind = "raw-dylib")]` on this architecture
|
||||
|
@ -1,5 +1,6 @@
|
||||
// use rustc_errors::ErrorGuaranteed;
|
||||
use rustc_macros::SessionDiagnostic;
|
||||
use rustc_span::Span;
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::rlib_required)]
|
||||
@ -50,3 +51,234 @@ pub struct IncompatiblePanicInDropStrategy {
|
||||
pub found_strategy: String,
|
||||
pub desired_strategy: String,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::multiple_names_in_link)]
|
||||
pub struct MultipleNamesInLink {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::multiple_kinds_in_link)]
|
||||
pub struct MultipleKindsInLink {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::link_name_form)]
|
||||
pub struct LinkNameForm {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::link_kind_form)]
|
||||
pub struct LinkKindForm {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::link_modifiers_form)]
|
||||
pub struct LinkModifiersForm {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::link_cfg_form)]
|
||||
pub struct LinkCfgForm {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::wasm_import_form)]
|
||||
pub struct WasmImportForm {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::empty_link_name, code = "E0454")]
|
||||
pub struct EmptyLinkName {
|
||||
#[label]
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::link_framework_apple, code = "E0455")]
|
||||
pub struct LinkFrameworkApple {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::framework_only_windows, code = "E0455")]
|
||||
pub struct FrameworkOnlyWindows {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::unknown_link_kind, code = "E0458")]
|
||||
pub struct UnknownLinkKind {
|
||||
#[label]
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
pub kind: String,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::multiple_link_modifiers)]
|
||||
pub struct MultipleLinkModifiers {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::multiple_cfgs)]
|
||||
pub struct MultipleCfgs {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::link_cfg_single_predicate)]
|
||||
pub struct LinkCfgSinglePredicate {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::multiple_wasm_import)]
|
||||
pub struct MultipleWasmImport {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::unexpected_link_arg)]
|
||||
pub struct UnexpectedLinkArg {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::invalid_link_modifier)]
|
||||
pub struct InvalidLinkModifier {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::multiple_modifiers)]
|
||||
pub struct MultipleModifiers {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
pub modifier: String,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::bundle_needs_static)]
|
||||
pub struct BundleNeedsStatic {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::whole_archive_needs_static)]
|
||||
pub struct WholeArchiveNeedsStatic {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::as_needed_compatibility)]
|
||||
pub struct AsNeededCompatibility {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::unknown_link_modifier)]
|
||||
pub struct UnknownLinkModifier {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
pub modifier: String,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::incompatible_wasm_link)]
|
||||
pub struct IncompatibleWasmLink {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::link_requires_name, code = "E0459")]
|
||||
pub struct LinkRequiresName {
|
||||
#[label]
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::raw_dylib_no_nul)]
|
||||
pub struct RawDylibNoNul {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::link_ordinal_raw_dylib)]
|
||||
pub struct LinkOrdinalRawDylib {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::lib_framework_apple)]
|
||||
pub struct LibFrameworkApple;
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::empty_renaming_target)]
|
||||
pub struct EmptyRenamingTarget {
|
||||
pub lib_name: String,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::renaming_no_link)]
|
||||
pub struct RenamingNoLink {
|
||||
pub lib_name: String,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::multiple_renamings)]
|
||||
pub struct MultipleRenamings {
|
||||
pub lib_name: String,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::no_link_mod_override)]
|
||||
pub struct NoLinkModOverride {
|
||||
#[primary_span]
|
||||
pub span: Option<Span>,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::unsupported_abi_i686)]
|
||||
pub struct UnsupportedAbiI686 {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
#[diag(metadata::unsupported_abi)]
|
||||
pub struct UnsupportedAbi {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
@ -12,6 +12,17 @@ use rustc_session::Session;
|
||||
use rustc_span::symbol::{sym, Symbol};
|
||||
use rustc_target::spec::abi::Abi;
|
||||
|
||||
use crate::errors::{
|
||||
AsNeededCompatibility, BundleNeedsStatic, EmptyLinkName, EmptyRenamingTarget,
|
||||
FrameworkOnlyWindows, IncompatibleWasmLink, InvalidLinkModifier, LibFrameworkApple,
|
||||
LinkCfgForm, LinkCfgSinglePredicate, LinkFrameworkApple, LinkKindForm, LinkModifiersForm,
|
||||
LinkNameForm, LinkOrdinalRawDylib, LinkRequiresName, MultipleCfgs, MultipleKindsInLink,
|
||||
MultipleLinkModifiers, MultipleModifiers, MultipleNamesInLink, MultipleRenamings,
|
||||
MultipleWasmImport, NoLinkModOverride, RawDylibNoNul, RenamingNoLink, UnexpectedLinkArg,
|
||||
UnknownLinkKind, UnknownLinkModifier, UnsupportedAbi, UnsupportedAbiI686, WasmImportForm,
|
||||
WholeArchiveNeedsStatic,
|
||||
};
|
||||
|
||||
pub(crate) fn collect(tcx: TyCtxt<'_>) -> Vec<NativeLib> {
|
||||
let mut collector = Collector { tcx, libs: Vec::new() };
|
||||
for id in tcx.hir().items() {
|
||||
@ -66,32 +77,26 @@ impl<'tcx> Collector<'tcx> {
|
||||
match item.name_or_empty() {
|
||||
sym::name => {
|
||||
if name.is_some() {
|
||||
let msg = "multiple `name` arguments in a single `#[link]` attribute";
|
||||
sess.span_err(item.span(), msg);
|
||||
sess.emit_err(MultipleNamesInLink { span: item.span() });
|
||||
continue;
|
||||
}
|
||||
let Some(link_name) = item.value_str() else {
|
||||
let msg = "link name must be of the form `name = \"string\"`";
|
||||
sess.span_err(item.span(), msg);
|
||||
sess.emit_err(LinkNameForm { span: item.span() });
|
||||
continue;
|
||||
};
|
||||
let span = item.name_value_literal_span().unwrap();
|
||||
if link_name.is_empty() {
|
||||
struct_span_err!(sess, span, E0454, "link name must not be empty")
|
||||
.span_label(span, "empty link name")
|
||||
.emit();
|
||||
sess.emit_err(EmptyLinkName { span });
|
||||
}
|
||||
name = Some((link_name, span));
|
||||
}
|
||||
sym::kind => {
|
||||
if kind.is_some() {
|
||||
let msg = "multiple `kind` arguments in a single `#[link]` attribute";
|
||||
sess.span_err(item.span(), msg);
|
||||
sess.emit_err(MultipleKindsInLink { span: item.span() });
|
||||
continue;
|
||||
}
|
||||
let Some(link_kind) = item.value_str() else {
|
||||
let msg = "link kind must be of the form `kind = \"string\"`";
|
||||
sess.span_err(item.span(), msg);
|
||||
sess.emit_err(LinkKindForm { span: item.span() });
|
||||
continue;
|
||||
};
|
||||
|
||||
@ -101,25 +106,13 @@ impl<'tcx> Collector<'tcx> {
|
||||
"dylib" => NativeLibKind::Dylib { as_needed: None },
|
||||
"framework" => {
|
||||
if !sess.target.is_like_osx {
|
||||
struct_span_err!(
|
||||
sess,
|
||||
span,
|
||||
E0455,
|
||||
"link kind `framework` is only supported on Apple targets"
|
||||
)
|
||||
.emit();
|
||||
sess.emit_err(LinkFrameworkApple { span });
|
||||
}
|
||||
NativeLibKind::Framework { as_needed: None }
|
||||
}
|
||||
"raw-dylib" => {
|
||||
if !sess.target.is_like_windows {
|
||||
struct_span_err!(
|
||||
sess,
|
||||
span,
|
||||
E0455,
|
||||
"link kind `raw-dylib` is only supported on Windows targets"
|
||||
)
|
||||
.emit();
|
||||
sess.emit_err(FrameworkOnlyWindows { span });
|
||||
} else if !features.raw_dylib {
|
||||
feature_err(
|
||||
&sess.parse_sess,
|
||||
@ -132,13 +125,7 @@ impl<'tcx> Collector<'tcx> {
|
||||
NativeLibKind::RawDylib
|
||||
}
|
||||
kind => {
|
||||
let msg = format!(
|
||||
"unknown link kind `{kind}`, expected one of: \
|
||||
static, dylib, framework, raw-dylib"
|
||||
);
|
||||
struct_span_err!(sess, span, E0458, "{}", msg)
|
||||
.span_label(span, "unknown link kind")
|
||||
.emit();
|
||||
sess.emit_err(UnknownLinkKind { span, kind: kind.to_string() });
|
||||
continue;
|
||||
}
|
||||
};
|
||||
@ -146,32 +133,26 @@ impl<'tcx> Collector<'tcx> {
|
||||
}
|
||||
sym::modifiers => {
|
||||
if modifiers.is_some() {
|
||||
let msg =
|
||||
"multiple `modifiers` arguments in a single `#[link]` attribute";
|
||||
sess.span_err(item.span(), msg);
|
||||
sess.emit_err(MultipleLinkModifiers { span: item.span() });
|
||||
continue;
|
||||
}
|
||||
let Some(link_modifiers) = item.value_str() else {
|
||||
let msg = "link modifiers must be of the form `modifiers = \"string\"`";
|
||||
sess.span_err(item.span(), msg);
|
||||
sess.emit_err(LinkModifiersForm { span: item.span() });
|
||||
continue;
|
||||
};
|
||||
modifiers = Some((link_modifiers, item.name_value_literal_span().unwrap()));
|
||||
}
|
||||
sym::cfg => {
|
||||
if cfg.is_some() {
|
||||
let msg = "multiple `cfg` arguments in a single `#[link]` attribute";
|
||||
sess.span_err(item.span(), msg);
|
||||
sess.emit_err(MultipleCfgs { span: item.span() });
|
||||
continue;
|
||||
}
|
||||
let Some(link_cfg) = item.meta_item_list() else {
|
||||
let msg = "link cfg must be of the form `cfg(/* predicate */)`";
|
||||
sess.span_err(item.span(), msg);
|
||||
sess.emit_err(LinkCfgForm { span: item.span() });
|
||||
continue;
|
||||
};
|
||||
let [NestedMetaItem::MetaItem(link_cfg)] = link_cfg else {
|
||||
let msg = "link cfg must have a single predicate argument";
|
||||
sess.span_err(item.span(), msg);
|
||||
sess.emit_err(LinkCfgSinglePredicate { span: item.span() });
|
||||
continue;
|
||||
};
|
||||
if !features.link_cfg {
|
||||
@ -187,15 +168,11 @@ impl<'tcx> Collector<'tcx> {
|
||||
}
|
||||
sym::wasm_import_module => {
|
||||
if wasm_import_module.is_some() {
|
||||
let msg = "multiple `wasm_import_module` arguments \
|
||||
in a single `#[link]` attribute";
|
||||
sess.span_err(item.span(), msg);
|
||||
sess.emit_err(MultipleWasmImport { span: item.span() });
|
||||
continue;
|
||||
}
|
||||
let Some(link_wasm_import_module) = item.value_str() else {
|
||||
let msg = "wasm import module must be of the form \
|
||||
`wasm_import_module = \"string\"`";
|
||||
sess.span_err(item.span(), msg);
|
||||
sess.emit_err(WasmImportForm { span: item.span() });
|
||||
continue;
|
||||
};
|
||||
wasm_import_module = Some((link_wasm_import_module, item.span()));
|
||||
@ -243,9 +220,7 @@ impl<'tcx> Collector<'tcx> {
|
||||
import_name_type = Some((link_import_name_type, item.span()));
|
||||
}
|
||||
_ => {
|
||||
let msg = "unexpected `#[link]` argument, expected one of: \
|
||||
name, kind, modifiers, cfg, wasm_import_module, import_name_type";
|
||||
sess.span_err(item.span(), msg);
|
||||
sess.emit_err(UnexpectedLinkArg { span: item.span() });
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -257,11 +232,7 @@ impl<'tcx> Collector<'tcx> {
|
||||
let (modifier, value) = match modifier.strip_prefix(&['+', '-']) {
|
||||
Some(m) => (m, modifier.starts_with('+')),
|
||||
None => {
|
||||
sess.span_err(
|
||||
span,
|
||||
"invalid linking modifier syntax, expected '+' or '-' prefix \
|
||||
before one of: bundle, verbatim, whole-archive, as-needed",
|
||||
);
|
||||
sess.emit_err(InvalidLinkModifier { span });
|
||||
continue;
|
||||
}
|
||||
};
|
||||
@ -279,10 +250,10 @@ impl<'tcx> Collector<'tcx> {
|
||||
}
|
||||
let assign_modifier = |dst: &mut Option<bool>| {
|
||||
if dst.is_some() {
|
||||
let msg = format!(
|
||||
"multiple `{modifier}` modifiers in a single `modifiers` argument"
|
||||
);
|
||||
sess.span_err(span, &msg);
|
||||
sess.emit_err(MultipleModifiers {
|
||||
span,
|
||||
modifier: modifier.to_string(),
|
||||
});
|
||||
} else {
|
||||
*dst = Some(value);
|
||||
}
|
||||
@ -292,11 +263,7 @@ impl<'tcx> Collector<'tcx> {
|
||||
assign_modifier(bundle)
|
||||
}
|
||||
("bundle", _) => {
|
||||
sess.span_err(
|
||||
span,
|
||||
"linking modifier `bundle` is only compatible with \
|
||||
`static` linking kind",
|
||||
);
|
||||
sess.emit_err(BundleNeedsStatic { span });
|
||||
}
|
||||
|
||||
("verbatim", _) => {
|
||||
@ -308,11 +275,7 @@ impl<'tcx> Collector<'tcx> {
|
||||
assign_modifier(whole_archive)
|
||||
}
|
||||
("whole-archive", _) => {
|
||||
sess.span_err(
|
||||
span,
|
||||
"linking modifier `whole-archive` is only compatible with \
|
||||
`static` linking kind",
|
||||
);
|
||||
sess.emit_err(WholeArchiveNeedsStatic { span });
|
||||
}
|
||||
|
||||
("as-needed", Some(NativeLibKind::Dylib { as_needed }))
|
||||
@ -321,21 +284,14 @@ impl<'tcx> Collector<'tcx> {
|
||||
assign_modifier(as_needed)
|
||||
}
|
||||
("as-needed", _) => {
|
||||
sess.span_err(
|
||||
span,
|
||||
"linking modifier `as-needed` is only compatible with \
|
||||
`dylib` and `framework` linking kinds",
|
||||
);
|
||||
sess.emit_err(AsNeededCompatibility { span });
|
||||
}
|
||||
|
||||
_ => {
|
||||
sess.span_err(
|
||||
sess.emit_err(UnknownLinkModifier {
|
||||
span,
|
||||
format!(
|
||||
"unknown linking modifier `{modifier}`, expected one of: \
|
||||
bundle, verbatim, whole-archive, as-needed"
|
||||
),
|
||||
);
|
||||
modifier: modifier.to_string(),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -343,19 +299,10 @@ impl<'tcx> Collector<'tcx> {
|
||||
|
||||
if let Some((_, span)) = wasm_import_module {
|
||||
if name.is_some() || kind.is_some() || modifiers.is_some() || cfg.is_some() {
|
||||
let msg = "`wasm_import_module` is incompatible with \
|
||||
other arguments in `#[link]` attributes";
|
||||
sess.span_err(span, msg);
|
||||
sess.emit_err(IncompatibleWasmLink { span });
|
||||
}
|
||||
} else if name.is_none() {
|
||||
struct_span_err!(
|
||||
sess,
|
||||
m.span,
|
||||
E0459,
|
||||
"`#[link]` attribute requires a `name = \"string\"` argument"
|
||||
)
|
||||
.span_label(m.span, "missing `name` argument")
|
||||
.emit();
|
||||
sess.emit_err(LinkRequiresName { span: m.span });
|
||||
}
|
||||
|
||||
// Do this outside of the loop so that `import_name_type` can be specified before `kind`.
|
||||
@ -369,10 +316,7 @@ impl<'tcx> Collector<'tcx> {
|
||||
let dll_imports = match kind {
|
||||
Some(NativeLibKind::RawDylib) => {
|
||||
if let Some((name, span)) = name && name.as_str().contains('\0') {
|
||||
sess.span_err(
|
||||
span,
|
||||
"link name must not contain NUL characters if link kind is `raw-dylib`",
|
||||
);
|
||||
sess.emit_err(RawDylibNoNul { span });
|
||||
}
|
||||
foreign_mod_items
|
||||
.iter()
|
||||
@ -401,10 +345,7 @@ impl<'tcx> Collector<'tcx> {
|
||||
.iter()
|
||||
.find(|a| a.has_name(sym::link_ordinal))
|
||||
.unwrap();
|
||||
sess.span_err(
|
||||
link_ordinal_attr.span,
|
||||
"`#[link_ordinal]` is only supported if link kind is `raw-dylib`",
|
||||
);
|
||||
sess.emit_err(LinkOrdinalRawDylib { span: link_ordinal_attr.span });
|
||||
}
|
||||
}
|
||||
|
||||
@ -430,7 +371,7 @@ impl<'tcx> Collector<'tcx> {
|
||||
for lib in &self.tcx.sess.opts.libs {
|
||||
if let NativeLibKind::Framework { .. } = lib.kind && !self.tcx.sess.target.is_like_osx {
|
||||
// Cannot check this when parsing options because the target is not yet available.
|
||||
self.tcx.sess.err("library kind `framework` is only supported on Apple targets");
|
||||
self.tcx.sess.emit_err(LibFrameworkApple);
|
||||
}
|
||||
if let Some(ref new_name) = lib.new_name {
|
||||
let any_duplicate = self
|
||||
@ -439,23 +380,11 @@ impl<'tcx> Collector<'tcx> {
|
||||
.filter_map(|lib| lib.name.as_ref())
|
||||
.any(|n| n.as_str() == lib.name);
|
||||
if new_name.is_empty() {
|
||||
self.tcx.sess.err(format!(
|
||||
"an empty renaming target was specified for library `{}`",
|
||||
lib.name
|
||||
));
|
||||
self.tcx.sess.emit_err(EmptyRenamingTarget { lib_name: lib.name.clone() });
|
||||
} else if !any_duplicate {
|
||||
self.tcx.sess.err(format!(
|
||||
"renaming of the library `{}` was specified, \
|
||||
however this crate contains no `#[link(...)]` \
|
||||
attributes referencing this library",
|
||||
lib.name
|
||||
));
|
||||
self.tcx.sess.emit_err(RenamingNoLink { lib_name: lib.name.clone() });
|
||||
} else if !renames.insert(&lib.name) {
|
||||
self.tcx.sess.err(format!(
|
||||
"multiple renamings were \
|
||||
specified for library `{}`",
|
||||
lib.name
|
||||
));
|
||||
self.tcx.sess.emit_err(MultipleRenamings { lib_name: lib.name.clone() });
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -480,10 +409,13 @@ impl<'tcx> Collector<'tcx> {
|
||||
// involved or not, library reordering and kind overriding without
|
||||
// explicit `:rename` in particular.
|
||||
if lib.has_modifiers() || passed_lib.has_modifiers() {
|
||||
let msg = "overriding linking modifiers from command line is not supported";
|
||||
match lib.foreign_module {
|
||||
Some(def_id) => self.tcx.sess.span_err(self.tcx.def_span(def_id), msg),
|
||||
None => self.tcx.sess.err(msg),
|
||||
Some(def_id) => self.tcx.sess.emit_err(NoLinkModOverride {
|
||||
span: Some(self.tcx.def_span(def_id)),
|
||||
}),
|
||||
None => {
|
||||
self.tcx.sess.emit_err(NoLinkModOverride { span: None })
|
||||
}
|
||||
};
|
||||
}
|
||||
if passed_lib.kind != NativeLibKind::Unspecified {
|
||||
@ -562,20 +494,14 @@ impl<'tcx> Collector<'tcx> {
|
||||
DllCallingConvention::Vectorcall(self.i686_arg_list_size(item))
|
||||
}
|
||||
_ => {
|
||||
self.tcx.sess.span_fatal(
|
||||
item.span,
|
||||
r#"ABI not supported by `#[link(kind = "raw-dylib")]` on i686"#,
|
||||
);
|
||||
self.tcx.sess.emit_fatal(UnsupportedAbiI686 { span: item.span });
|
||||
}
|
||||
}
|
||||
} else {
|
||||
match abi {
|
||||
Abi::C { .. } | Abi::Win64 { .. } | Abi::System { .. } => DllCallingConvention::C,
|
||||
_ => {
|
||||
self.tcx.sess.span_fatal(
|
||||
item.span,
|
||||
r#"ABI not supported by `#[link(kind = "raw-dylib")]` on this architecture"#,
|
||||
);
|
||||
self.tcx.sess.emit_fatal(UnsupportedAbi { span: item.span });
|
||||
}
|
||||
}
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user