Skip to content

Commit f7e773e

Browse files
committed
Use new style attribute
1 parent dd69d7e commit f7e773e

File tree

9 files changed

+41
-19
lines changed

9 files changed

+41
-19
lines changed

compiler/rustc_attr_parsing/src/attributes/rustc_internal.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use rustc_hir::limit::Limit;
2+
13
use super::prelude::*;
24
use super::util::parse_single_integer;
35

@@ -49,3 +51,18 @@ impl<S: Stage> SingleAttributeParser<S> for RustcObjectLifetimeDefaultParser {
4951
Some(AttributeKind::RustcObjectLifetimeDefault)
5052
}
5153
}
54+
55+
pub(crate) struct RustcSimdMonomorphizeLaneLimitParser;
56+
57+
impl<S: Stage> SingleAttributeParser<S> for RustcSimdMonomorphizeLaneLimitParser {
58+
const PATH: &[Symbol] = &[sym::rustc_simd_monomorphize_lane_limit];
59+
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
60+
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
61+
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Struct)]);
62+
const TEMPLATE: AttributeTemplate = template!(List: &["N"]);
63+
64+
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
65+
parse_single_integer(cx, args)
66+
.map(|n| AttributeKind::RustcSimdMonomorphizeLaneLimit(Limit::new(n as usize)))
67+
}
68+
}

compiler/rustc_attr_parsing/src/context.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ use crate::attributes::prototype::CustomMirParser;
5353
use crate::attributes::repr::{AlignParser, AlignStaticParser, ReprParser};
5454
use crate::attributes::rustc_internal::{
5555
RustcLayoutScalarValidRangeEnd, RustcLayoutScalarValidRangeStart,
56-
RustcObjectLifetimeDefaultParser,
56+
RustcObjectLifetimeDefaultParser, RustcSimdMonomorphizeLaneLimitParser,
5757
};
5858
use crate::attributes::semantics::MayDangleParser;
5959
use crate::attributes::stability::{
@@ -195,6 +195,7 @@ attribute_parsers!(
195195
Single<RustcLayoutScalarValidRangeEnd>,
196196
Single<RustcLayoutScalarValidRangeStart>,
197197
Single<RustcObjectLifetimeDefaultParser>,
198+
Single<RustcSimdMonomorphizeLaneLimitParser>,
198199
Single<SanitizeParser>,
199200
Single<ShouldPanicParser>,
200201
Single<SkipDuringMethodDispatchParser>,

compiler/rustc_hir/src/attrs/data_structures.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,9 @@ pub enum AttributeKind {
642642
/// Represents `#[rustc_object_lifetime_default]`.
643643
RustcObjectLifetimeDefault,
644644

645+
/// Represents `#[rustc_simd_monomorphize_lane_limit(N)]`.
646+
RustcSimdMonomorphizeLaneLimit(Limit),
647+
645648
/// Represents `#[sanitize]`
646649
///
647650
/// the on set and off set are distjoint since there's a third option: unset.

compiler/rustc_hir/src/attrs/encode_cross_crate.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ impl AttributeKind {
8585
RustcLayoutScalarValidRangeEnd(..) => Yes,
8686
RustcLayoutScalarValidRangeStart(..) => Yes,
8787
RustcObjectLifetimeDefault => No,
88+
RustcSimdMonomorphizeLaneLimit(..) => Yes,
8889
Sanitize { .. } => No,
8990
ShouldPanic { .. } => No,
9091
SkipDuringMethodDispatch { .. } => No,

compiler/rustc_passes/src/check_attr.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
254254
| AttributeKind::MacroEscape( .. )
255255
| AttributeKind::RustcLayoutScalarValidRangeStart(..)
256256
| AttributeKind::RustcLayoutScalarValidRangeEnd(..)
257+
| AttributeKind::RustcSimdMonomorphizeLaneLimit(..)
257258
| AttributeKind::ExportStable
258259
| AttributeKind::FfiConst(..)
259260
| AttributeKind::UnstableFeatureBound(..)

compiler/rustc_ty_utils/src/layout.rs

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ use rustc_abi::{
77
VariantIdx, Variants, WrappingRange,
88
};
99
use rustc_hashes::Hash64;
10+
use rustc_hir::attrs::AttributeKind;
11+
use rustc_hir::find_attr;
1012
use rustc_index::IndexVec;
1113
use rustc_middle::bug;
1214
use rustc_middle::query::Providers;
@@ -562,21 +564,18 @@ fn layout_of_uncached<'tcx>(
562564
let e_ly = cx.layout_of(e_ty)?;
563565

564566
// Check for the rustc_simd_monomorphize_lane_limit attribute and check the lane limit
565-
if let Some(attr) =
566-
tcx.get_attrs_by_path(def.did(), &[sym::rustc_simd_monomorphize_lane_limit]).next()
567-
{
568-
if let Some(lit) = attr.value_lit() {
569-
if let Ok(limit) = lit.symbol.as_str().parse::<u64>() {
570-
if e_len > limit {
571-
return Err(map_error(
572-
&cx,
573-
ty,
574-
rustc_abi::LayoutCalculatorError::OversizedSimdType {
575-
max_lanes: limit,
576-
},
577-
));
578-
}
579-
}
567+
if let Some(limit) = find_attr!(
568+
tcx.get_all_attrs(def.did()),
569+
AttributeKind::RustcSimdMonomorphizeLaneLimit(limit) => limit
570+
) {
571+
if !limit.value_within_limit(e_len as usize) {
572+
return Err(map_error(
573+
&cx,
574+
ty,
575+
rustc_abi::LayoutCalculatorError::OversizedSimdType {
576+
max_lanes: limit.0 as u64,
577+
},
578+
));
580579
}
581580
}
582581

tests/ui/simd/simd-lane-limit-err-npow2.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
//@ build-fail
44

55
#[repr(simd, packed)]
6-
#[rustc_simd_monomorphize_lane_limit = "4"]
6+
#[rustc_simd_monomorphize_lane_limit(4)]
77
struct V<T, const N: usize>([T; N]);
88

99
fn main() {

tests/ui/simd/simd-lane-limit-err.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
//@ build-fail
44

55
#[repr(simd, packed)]
6-
#[rustc_simd_monomorphize_lane_limit = "4"]
6+
#[rustc_simd_monomorphize_lane_limit(4)]
77
struct V<T, const N: usize>([T; N]);
88

99
fn main() {

tests/ui/simd/simd-lane-limit-ok.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
//@ build-pass
44

55
#[repr(simd, packed)]
6-
#[rustc_simd_monomorphize_lane_limit = "8"]
6+
#[rustc_simd_monomorphize_lane_limit(8)]
77
struct V<T, const N: usize>([T; N]);
88

99
const LANES: usize = 4;

0 commit comments

Comments
 (0)