Skip to content

Commit 44d3217

Browse files
Rollup merge of #145323 - scrabsha:push-pqwvmznzzmpr, r=jdonszelmann
Port the `#[linkage]` attribute to the new attribute system r? `@jdonszelmann`
2 parents f493f80 + d435197 commit 44d3217

File tree

27 files changed

+207
-124
lines changed

27 files changed

+207
-124
lines changed

compiler/rustc_attr_parsing/src/attributes/link_attrs.rs

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use rustc_feature::{AttributeTemplate, template};
2-
use rustc_hir::attrs::AttributeKind;
32
use rustc_hir::attrs::AttributeKind::{LinkName, LinkOrdinal, LinkSection};
3+
use rustc_hir::attrs::{AttributeKind, Linkage};
44
use rustc_span::{Span, Symbol, sym};
55

66
use crate::attributes::{
@@ -129,3 +129,77 @@ impl<S: Stage> SingleAttributeParser<S> for LinkOrdinalParser {
129129
Some(LinkOrdinal { ordinal, span: cx.attr_span })
130130
}
131131
}
132+
133+
pub(crate) struct LinkageParser;
134+
135+
impl<S: Stage> SingleAttributeParser<S> for LinkageParser {
136+
const PATH: &[Symbol] = &[sym::linkage];
137+
138+
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
139+
140+
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
141+
142+
const TEMPLATE: AttributeTemplate = template!(NameValueStr: [
143+
"available_externally",
144+
"common",
145+
"extern_weak",
146+
"external",
147+
"internal",
148+
"linkonce",
149+
"linkonce_odr",
150+
"weak",
151+
"weak_odr",
152+
]);
153+
154+
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
155+
let Some(name_value) = args.name_value() else {
156+
cx.expected_name_value(cx.attr_span, Some(sym::linkage));
157+
return None;
158+
};
159+
160+
let Some(value) = name_value.value_as_str() else {
161+
cx.expected_string_literal(name_value.value_span, Some(name_value.value_as_lit()));
162+
return None;
163+
};
164+
165+
// Use the names from src/llvm/docs/LangRef.rst here. Most types are only
166+
// applicable to variable declarations and may not really make sense for
167+
// Rust code in the first place but allow them anyway and trust that the
168+
// user knows what they're doing. Who knows, unanticipated use cases may pop
169+
// up in the future.
170+
//
171+
// ghost, dllimport, dllexport and linkonce_odr_autohide are not supported
172+
// and don't have to be, LLVM treats them as no-ops.
173+
let linkage = match value {
174+
sym::available_externally => Linkage::AvailableExternally,
175+
sym::common => Linkage::Common,
176+
sym::extern_weak => Linkage::ExternalWeak,
177+
sym::external => Linkage::External,
178+
sym::internal => Linkage::Internal,
179+
sym::linkonce => Linkage::LinkOnceAny,
180+
sym::linkonce_odr => Linkage::LinkOnceODR,
181+
sym::weak => Linkage::WeakAny,
182+
sym::weak_odr => Linkage::WeakODR,
183+
184+
_ => {
185+
cx.expected_specific_argument(
186+
name_value.value_span,
187+
vec![
188+
"available_externally",
189+
"common",
190+
"extern_weak",
191+
"external",
192+
"internal",
193+
"linkonce",
194+
"linkonce_odr",
195+
"weak",
196+
"weak_odr",
197+
],
198+
);
199+
return None;
200+
}
201+
};
202+
203+
Some(AttributeKind::Linkage(linkage, cx.attr_span))
204+
}
205+
}

compiler/rustc_attr_parsing/src/context.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use crate::attributes::dummy::DummyParser;
2727
use crate::attributes::inline::{InlineParser, RustcForceInlineParser};
2828
use crate::attributes::link_attrs::{
2929
ExportStableParser, FfiConstParser, FfiPureParser, LinkNameParser, LinkOrdinalParser,
30-
LinkSectionParser, StdInternalSymbolParser,
30+
LinkSectionParser, LinkageParser, StdInternalSymbolParser,
3131
};
3232
use crate::attributes::lint_helpers::{
3333
AsPtrParser, AutomaticallyDerivedParser, PassByValueParser, PubTransparentParser,
@@ -167,6 +167,7 @@ attribute_parsers!(
167167
Single<LinkNameParser>,
168168
Single<LinkOrdinalParser>,
169169
Single<LinkSectionParser>,
170+
Single<LinkageParser>,
170171
Single<MustUseParser>,
171172
Single<OptimizeParser>,
172173
Single<PathAttributeParser>,

compiler/rustc_codegen_cranelift/src/constant.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -281,8 +281,8 @@ fn data_id_for_static(
281281
.abi
282282
.bytes();
283283

284-
let linkage = if import_linkage == rustc_middle::mir::mono::Linkage::ExternalWeak
285-
|| import_linkage == rustc_middle::mir::mono::Linkage::WeakAny
284+
let linkage = if import_linkage == rustc_hir::attrs::Linkage::ExternalWeak
285+
|| import_linkage == rustc_hir::attrs::Linkage::WeakAny
286286
{
287287
Linkage::Preemptible
288288
} else {
@@ -332,8 +332,8 @@ fn data_id_for_static(
332332

333333
let linkage = if definition {
334334
crate::linkage::get_static_linkage(tcx, def_id)
335-
} else if attrs.linkage == Some(rustc_middle::mir::mono::Linkage::ExternalWeak)
336-
|| attrs.linkage == Some(rustc_middle::mir::mono::Linkage::WeakAny)
335+
} else if attrs.linkage == Some(rustc_hir::attrs::Linkage::ExternalWeak)
336+
|| attrs.linkage == Some(rustc_hir::attrs::Linkage::WeakAny)
337337
{
338338
Linkage::Preemptible
339339
} else {

compiler/rustc_codegen_cranelift/src/driver/aot.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@ use rustc_codegen_ssa::{
1818
use rustc_data_structures::profiling::SelfProfilerRef;
1919
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
2020
use rustc_data_structures::sync::{IntoDynSyncSend, par_map};
21+
use rustc_hir::attrs::Linkage as RLinkage;
2122
use rustc_metadata::fs::copy_to_stdout;
2223
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
2324
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
24-
use rustc_middle::mir::mono::{
25-
CodegenUnit, Linkage as RLinkage, MonoItem, MonoItemData, Visibility,
26-
};
25+
use rustc_middle::mir::mono::{CodegenUnit, MonoItem, MonoItemData, Visibility};
2726
use rustc_session::Session;
2827
use rustc_session::config::{DebugInfo, OutFileName, OutputFilenames, OutputType};
2928

compiler/rustc_codegen_cranelift/src/linkage.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use rustc_middle::mir::mono::{Linkage as RLinkage, MonoItem, Visibility};
1+
use rustc_hir::attrs::Linkage as RLinkage;
2+
use rustc_middle::mir::mono::{MonoItem, Visibility};
23

34
use crate::prelude::*;
45

compiler/rustc_codegen_gcc/src/base.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use rustc_codegen_ssa::ModuleCodegen;
88
use rustc_codegen_ssa::base::maybe_create_entry_wrapper;
99
use rustc_codegen_ssa::mono_item::MonoItemExt;
1010
use rustc_codegen_ssa::traits::DebugInfoCodegenMethods;
11+
use rustc_hir::attrs::Linkage;
1112
use rustc_middle::dep_graph;
12-
use rustc_middle::mir::mono::Linkage;
1313
#[cfg(feature = "master")]
1414
use rustc_middle::mir::mono::Visibility;
1515
use rustc_middle::ty::TyCtxt;

compiler/rustc_codegen_gcc/src/consts.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ use rustc_abi::{self as abi, Align, HasDataLayout, Primitive, Size, WrappingRang
55
use rustc_codegen_ssa::traits::{
66
BaseTypeCodegenMethods, ConstCodegenMethods, StaticCodegenMethods,
77
};
8+
use rustc_hir::attrs::Linkage;
89
use rustc_hir::def::DefKind;
910
use rustc_hir::def_id::LOCAL_CRATE;
1011
use rustc_middle::middle::codegen_fn_attrs::{CodegenFnAttrFlags, CodegenFnAttrs};
1112
use rustc_middle::mir::interpret::{
1213
self, ConstAllocation, ErrorHandled, Scalar as InterpScalar, read_target_uint,
1314
};
14-
use rustc_middle::mir::mono::Linkage;
1515
use rustc_middle::ty::layout::LayoutOf;
1616
use rustc_middle::ty::{self, Instance};
1717
use rustc_middle::{bug, span_bug};

compiler/rustc_codegen_gcc/src/mono_item.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
#[cfg(feature = "master")]
22
use gccjit::{FnAttribute, VarAttribute};
33
use rustc_codegen_ssa::traits::PreDefineCodegenMethods;
4+
use rustc_hir::attrs::Linkage;
45
use rustc_hir::def::DefKind;
56
use rustc_hir::def_id::{DefId, LOCAL_CRATE};
67
use rustc_middle::bug;
78
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
8-
use rustc_middle::mir::mono::{Linkage, Visibility};
9+
use rustc_middle::mir::mono::Visibility;
910
use rustc_middle::ty::layout::{FnAbiOf, HasTypingEnv, LayoutOf};
1011
use rustc_middle::ty::{self, Instance, TypeVisitableExt};
1112

compiler/rustc_codegen_llvm/src/base.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ use rustc_codegen_ssa::base::maybe_create_entry_wrapper;
1818
use rustc_codegen_ssa::mono_item::MonoItemExt;
1919
use rustc_codegen_ssa::traits::*;
2020
use rustc_data_structures::small_c_str::SmallCStr;
21+
use rustc_hir::attrs::Linkage;
2122
use rustc_middle::dep_graph;
2223
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs;
23-
use rustc_middle::mir::mono::{Linkage, Visibility};
24+
use rustc_middle::mir::mono::Visibility;
2425
use rustc_middle::ty::TyCtxt;
2526
use rustc_session::config::DebugInfo;
2627
use rustc_span::Symbol;

compiler/rustc_codegen_llvm/src/consts.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ use rustc_abi::{Align, HasDataLayout, Primitive, Scalar, Size, WrappingRange};
44
use rustc_codegen_ssa::common;
55
use rustc_codegen_ssa::traits::*;
66
use rustc_hir::LangItem;
7+
use rustc_hir::attrs::Linkage;
78
use rustc_hir::def::DefKind;
89
use rustc_hir::def_id::{DefId, LOCAL_CRATE};
910
use rustc_middle::middle::codegen_fn_attrs::{CodegenFnAttrFlags, CodegenFnAttrs};
1011
use rustc_middle::mir::interpret::{
1112
Allocation, ConstAllocation, ErrorHandled, InitChunk, Pointer, Scalar as InterpScalar,
1213
read_target_uint,
1314
};
14-
use rustc_middle::mir::mono::{Linkage, MonoItem};
15+
use rustc_middle::mir::mono::MonoItem;
1516
use rustc_middle::ty::layout::{HasTypingEnv, LayoutOf};
1617
use rustc_middle::ty::{self, Instance};
1718
use rustc_middle::{bug, span_bug};

0 commit comments

Comments
 (0)