Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit a5dff3c

Browse files
committedFeb 11, 2025·
rustc_codegen_ssa: cleanup codegen attrs
1 parent 0c7868a commit a5dff3c

File tree

1 file changed

+55
-61
lines changed

1 file changed

+55
-61
lines changed
 

‎compiler/rustc_codegen_ssa/src/codegen_attrs.rs

+55-61
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::str::FromStr;
22

33
use rustc_abi::ExternAbi;
4-
use rustc_ast::attr::list_contains_name;
54
use rustc_ast::expand::autodiff_attrs::{
65
AutoDiffAttrs, DiffActivity, DiffMode, valid_input_activity, valid_ret_activity,
76
};
@@ -385,24 +384,20 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
385384
let segments =
386385
set.path.segments.iter().map(|x| x.ident.name).collect::<Vec<_>>();
387386
match segments.as_slice() {
388-
[sym::arm, sym::a32] | [sym::arm, sym::t32] => {
389-
if !tcx.sess.target.has_thumb_interworking {
390-
struct_span_code_err!(
391-
tcx.dcx(),
392-
attr.span,
393-
E0779,
394-
"target does not support `#[instruction_set]`"
395-
)
396-
.emit();
397-
None
398-
} else if segments[1] == sym::a32 {
399-
Some(InstructionSetAttr::ArmA32)
400-
} else if segments[1] == sym::t32 {
401-
Some(InstructionSetAttr::ArmT32)
402-
} else {
403-
unreachable!()
404-
}
387+
[sym::arm, sym::a32 | sym::t32]
388+
if !tcx.sess.target.has_thumb_interworking =>
389+
{
390+
struct_span_code_err!(
391+
tcx.dcx(),
392+
attr.span,
393+
E0779,
394+
"target does not support `#[instruction_set]`"
395+
)
396+
.emit();
397+
None
405398
}
399+
[sym::arm, sym::a32] => Some(InstructionSetAttr::ArmA32),
400+
[sym::arm, sym::t32] => Some(InstructionSetAttr::ArmT32),
406401
_ => {
407402
struct_span_code_err!(
408403
tcx.dcx(),
@@ -544,25 +539,27 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
544539
}
545540

546541
if attr.is_word() {
547-
InlineAttr::Hint
548-
} else if let Some(ref items) = attr.meta_item_list() {
549-
inline_span = Some(attr.span);
550-
if items.len() != 1 {
551-
struct_span_code_err!(tcx.dcx(), attr.span, E0534, "expected one argument").emit();
552-
InlineAttr::None
553-
} else if list_contains_name(items, sym::always) {
554-
InlineAttr::Always
555-
} else if list_contains_name(items, sym::never) {
556-
InlineAttr::Never
557-
} else {
558-
struct_span_code_err!(tcx.dcx(), items[0].span(), E0535, "invalid argument")
559-
.with_help("valid inline arguments are `always` and `never`")
560-
.emit();
542+
return InlineAttr::Hint;
543+
}
544+
let Some(ref items) = attr.meta_item_list() else {
545+
return ia;
546+
};
561547

562-
InlineAttr::None
563-
}
548+
inline_span = Some(attr.span);
549+
let [item] = &items[..] else {
550+
struct_span_code_err!(tcx.dcx(), attr.span, E0534, "expected one argument").emit();
551+
return InlineAttr::None;
552+
};
553+
if item.has_name(sym::always) {
554+
InlineAttr::Always
555+
} else if item.has_name(sym::never) {
556+
InlineAttr::Never
564557
} else {
565-
ia
558+
struct_span_code_err!(tcx.dcx(), item.span(), E0535, "invalid argument")
559+
.with_help("valid inline arguments are `always` and `never`")
560+
.emit();
561+
562+
InlineAttr::None
566563
}
567564
});
568565
codegen_fn_attrs.inline = attrs.iter().fold(codegen_fn_attrs.inline, |ia, attr| {
@@ -594,23 +591,25 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
594591
let err = |sp, s| struct_span_code_err!(tcx.dcx(), sp, E0722, "{}", s).emit();
595592
if attr.is_word() {
596593
err(attr.span, "expected one argument");
597-
ia
598-
} else if let Some(ref items) = attr.meta_item_list() {
599-
inline_span = Some(attr.span);
600-
if items.len() != 1 {
601-
err(attr.span, "expected one argument");
602-
OptimizeAttr::Default
603-
} else if list_contains_name(items, sym::size) {
604-
OptimizeAttr::Size
605-
} else if list_contains_name(items, sym::speed) {
606-
OptimizeAttr::Speed
607-
} else if list_contains_name(items, sym::none) {
608-
OptimizeAttr::DoNotOptimize
609-
} else {
610-
err(items[0].span(), "invalid argument");
611-
OptimizeAttr::Default
612-
}
594+
return ia;
595+
}
596+
let Some(ref items) = attr.meta_item_list() else {
597+
return OptimizeAttr::Default;
598+
};
599+
600+
inline_span = Some(attr.span);
601+
let [item] = &items[..] else {
602+
err(attr.span, "expected one argument");
603+
return OptimizeAttr::Default;
604+
};
605+
if item.has_name(sym::size) {
606+
OptimizeAttr::Size
607+
} else if item.has_name(sym::speed) {
608+
OptimizeAttr::Speed
609+
} else if item.has_name(sym::none) {
610+
OptimizeAttr::DoNotOptimize
613611
} else {
612+
err(item.span(), "invalid argument");
614613
OptimizeAttr::Default
615614
}
616615
});
@@ -762,18 +761,13 @@ fn should_inherit_track_caller(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
762761

763762
fn check_link_ordinal(tcx: TyCtxt<'_>, attr: &hir::Attribute) -> Option<u16> {
764763
use rustc_ast::{LitIntType, LitKind, MetaItemLit};
765-
let meta_item_list = attr.meta_item_list();
766-
let meta_item_list = meta_item_list.as_deref();
767-
let sole_meta_list = match meta_item_list {
768-
Some([item]) => item.lit(),
769-
Some(_) => {
770-
tcx.dcx().emit_err(errors::InvalidLinkOrdinalNargs { span: attr.span });
771-
return None;
772-
}
773-
_ => None,
764+
let meta_item_list = attr.meta_item_list()?;
765+
let [sole_meta_list] = &meta_item_list[..] else {
766+
tcx.dcx().emit_err(errors::InvalidLinkOrdinalNargs { span: attr.span });
767+
return None;
774768
};
775769
if let Some(MetaItemLit { kind: LitKind::Int(ordinal, LitIntType::Unsuffixed), .. }) =
776-
sole_meta_list
770+
sole_meta_list.lit()
777771
{
778772
// According to the table at
779773
// https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#import-header, the

0 commit comments

Comments
 (0)
Please sign in to comment.