Use match instead of if in codegen_attrs
This commit is contained in:
parent
bd43458d4c
commit
e4ab642e8c
1 changed files with 313 additions and 279 deletions
|
@ -10,6 +10,7 @@ use rustc_middle::mir::mono::Linkage;
|
||||||
use rustc_middle::ty::query::Providers;
|
use rustc_middle::ty::query::Providers;
|
||||||
use rustc_middle::ty::{self as ty, TyCtxt};
|
use rustc_middle::ty::{self as ty, TyCtxt};
|
||||||
use rustc_session::{lint, parse::feature_err};
|
use rustc_session::{lint, parse::feature_err};
|
||||||
|
use rustc_span::symbol::Ident;
|
||||||
use rustc_span::{sym, Span};
|
use rustc_span::{sym, Span};
|
||||||
use rustc_target::spec::{abi, SanitizerSet};
|
use rustc_target::spec::{abi, SanitizerSet};
|
||||||
|
|
||||||
|
@ -84,33 +85,51 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: DefId) -> CodegenFnAttrs {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if attr.has_name(sym::cold) {
|
let Some(Ident { name, .. }) = attr.ident() else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
|
||||||
|
match name {
|
||||||
|
sym::cold => {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::COLD;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::COLD;
|
||||||
} else if attr.has_name(sym::rustc_allocator) {
|
}
|
||||||
|
sym::rustc_allocator => {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::ALLOCATOR;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::ALLOCATOR;
|
||||||
} else if attr.has_name(sym::ffi_returns_twice) {
|
}
|
||||||
|
sym::ffi_returns_twice => {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::FFI_RETURNS_TWICE;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::FFI_RETURNS_TWICE;
|
||||||
} else if attr.has_name(sym::ffi_pure) {
|
}
|
||||||
|
sym::ffi_pure => {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::FFI_PURE;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::FFI_PURE;
|
||||||
} else if attr.has_name(sym::ffi_const) {
|
}
|
||||||
|
sym::ffi_const => {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::FFI_CONST;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::FFI_CONST;
|
||||||
} else if attr.has_name(sym::rustc_nounwind) {
|
}
|
||||||
|
sym::rustc_nounwind => {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::NEVER_UNWIND;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::NEVER_UNWIND;
|
||||||
} else if attr.has_name(sym::rustc_reallocator) {
|
}
|
||||||
|
sym::rustc_reallocator => {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::REALLOCATOR;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::REALLOCATOR;
|
||||||
} else if attr.has_name(sym::rustc_deallocator) {
|
}
|
||||||
|
sym::rustc_deallocator => {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::DEALLOCATOR;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::DEALLOCATOR;
|
||||||
} else if attr.has_name(sym::rustc_allocator_zeroed) {
|
}
|
||||||
|
sym::rustc_allocator_zeroed => {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::ALLOCATOR_ZEROED;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::ALLOCATOR_ZEROED;
|
||||||
} else if attr.has_name(sym::naked) {
|
}
|
||||||
|
sym::naked => {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::NAKED;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::NAKED;
|
||||||
} else if attr.has_name(sym::no_mangle) {
|
}
|
||||||
|
sym::no_mangle => {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::NO_MANGLE;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::NO_MANGLE;
|
||||||
} else if attr.has_name(sym::no_coverage) {
|
}
|
||||||
|
sym::no_coverage => {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::NO_COVERAGE;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::NO_COVERAGE;
|
||||||
} else if attr.has_name(sym::rustc_std_internal_symbol) {
|
}
|
||||||
|
sym::rustc_std_internal_symbol => {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL;
|
||||||
} else if attr.has_name(sym::used) {
|
}
|
||||||
|
sym::used => {
|
||||||
let inner = attr.meta_item_list();
|
let inner = attr.meta_item_list();
|
||||||
match inner.as_deref() {
|
match inner.as_deref() {
|
||||||
Some([item]) if item.has_name(sym::linker) => {
|
Some([item]) if item.has_name(sym::linker) => {
|
||||||
|
@ -172,7 +191,8 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: DefId) -> CodegenFnAttrs {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if attr.has_name(sym::cmse_nonsecure_entry) {
|
}
|
||||||
|
sym::cmse_nonsecure_entry => {
|
||||||
if let Some(fn_sig) = fn_sig()
|
if let Some(fn_sig) = fn_sig()
|
||||||
&& !matches!(fn_sig.skip_binder().abi(), abi::Abi::C { .. })
|
&& !matches!(fn_sig.skip_binder().abi(), abi::Abi::C { .. })
|
||||||
{
|
{
|
||||||
|
@ -189,9 +209,11 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: DefId) -> CodegenFnAttrs {
|
||||||
.emit();
|
.emit();
|
||||||
}
|
}
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::CMSE_NONSECURE_ENTRY;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::CMSE_NONSECURE_ENTRY;
|
||||||
} else if attr.has_name(sym::thread_local) {
|
}
|
||||||
|
sym::thread_local => {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::THREAD_LOCAL;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::THREAD_LOCAL;
|
||||||
} else if attr.has_name(sym::track_caller) {
|
}
|
||||||
|
sym::track_caller => {
|
||||||
if !tcx.is_closure(did.to_def_id())
|
if !tcx.is_closure(did.to_def_id())
|
||||||
&& let Some(fn_sig) = fn_sig()
|
&& let Some(fn_sig) = fn_sig()
|
||||||
&& fn_sig.skip_binder().abi() != abi::Abi::Rust
|
&& fn_sig.skip_binder().abi() != abi::Abi::Rust
|
||||||
|
@ -209,7 +231,8 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: DefId) -> CodegenFnAttrs {
|
||||||
.emit();
|
.emit();
|
||||||
}
|
}
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::TRACK_CALLER;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::TRACK_CALLER;
|
||||||
} else if attr.has_name(sym::export_name) {
|
}
|
||||||
|
sym::export_name => {
|
||||||
if let Some(s) = attr.value_str() {
|
if let Some(s) = attr.value_str() {
|
||||||
if s.as_str().contains('\0') {
|
if s.as_str().contains('\0') {
|
||||||
// `#[export_name = ...]` will be converted to a null-terminated string,
|
// `#[export_name = ...]` will be converted to a null-terminated string,
|
||||||
|
@ -224,7 +247,8 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: DefId) -> CodegenFnAttrs {
|
||||||
}
|
}
|
||||||
codegen_fn_attrs.export_name = Some(s);
|
codegen_fn_attrs.export_name = Some(s);
|
||||||
}
|
}
|
||||||
} else if attr.has_name(sym::target_feature) {
|
}
|
||||||
|
sym::target_feature => {
|
||||||
if !tcx.is_closure(did.to_def_id())
|
if !tcx.is_closure(did.to_def_id())
|
||||||
&& let Some(fn_sig) = fn_sig()
|
&& let Some(fn_sig) = fn_sig()
|
||||||
&& fn_sig.skip_binder().unsafety() == hir::Unsafety::Normal
|
&& fn_sig.skip_binder().unsafety() == hir::Unsafety::Normal
|
||||||
|
@ -269,7 +293,8 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: DefId) -> CodegenFnAttrs {
|
||||||
supported_target_features,
|
supported_target_features,
|
||||||
&mut codegen_fn_attrs.target_features,
|
&mut codegen_fn_attrs.target_features,
|
||||||
);
|
);
|
||||||
} else if attr.has_name(sym::linkage) {
|
}
|
||||||
|
sym::linkage => {
|
||||||
if let Some(val) = attr.value_str() {
|
if let Some(val) = attr.value_str() {
|
||||||
let linkage = Some(linkage_by_name(tcx, did, val.as_str()));
|
let linkage = Some(linkage_by_name(tcx, did, val.as_str()));
|
||||||
if tcx.is_foreign_item(did) {
|
if tcx.is_foreign_item(did) {
|
||||||
|
@ -278,7 +303,8 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: DefId) -> CodegenFnAttrs {
|
||||||
codegen_fn_attrs.linkage = linkage;
|
codegen_fn_attrs.linkage = linkage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if attr.has_name(sym::link_section) {
|
}
|
||||||
|
sym::link_section => {
|
||||||
if let Some(val) = attr.value_str() {
|
if let Some(val) = attr.value_str() {
|
||||||
if val.as_str().bytes().any(|b| b == 0) {
|
if val.as_str().bytes().any(|b| b == 0) {
|
||||||
let msg = format!(
|
let msg = format!(
|
||||||
|
@ -291,14 +317,17 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: DefId) -> CodegenFnAttrs {
|
||||||
codegen_fn_attrs.link_section = Some(val);
|
codegen_fn_attrs.link_section = Some(val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if attr.has_name(sym::link_name) {
|
}
|
||||||
|
sym::link_name => {
|
||||||
codegen_fn_attrs.link_name = attr.value_str();
|
codegen_fn_attrs.link_name = attr.value_str();
|
||||||
} else if attr.has_name(sym::link_ordinal) {
|
}
|
||||||
|
sym::link_ordinal => {
|
||||||
link_ordinal_span = Some(attr.span);
|
link_ordinal_span = Some(attr.span);
|
||||||
if let ordinal @ Some(_) = check_link_ordinal(tcx, attr) {
|
if let ordinal @ Some(_) = check_link_ordinal(tcx, attr) {
|
||||||
codegen_fn_attrs.link_ordinal = ordinal;
|
codegen_fn_attrs.link_ordinal = ordinal;
|
||||||
}
|
}
|
||||||
} else if attr.has_name(sym::no_sanitize) {
|
}
|
||||||
|
sym::no_sanitize => {
|
||||||
no_sanitize_span = Some(attr.span);
|
no_sanitize_span = Some(attr.span);
|
||||||
if let Some(list) = attr.meta_item_list() {
|
if let Some(list) = attr.meta_item_list() {
|
||||||
for item in list.iter() {
|
for item in list.iter() {
|
||||||
|
@ -327,8 +356,10 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: DefId) -> CodegenFnAttrs {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if attr.has_name(sym::instruction_set) {
|
}
|
||||||
codegen_fn_attrs.instruction_set = attr.meta_item_list().and_then(|l| match &l[..] {
|
sym::instruction_set => {
|
||||||
|
codegen_fn_attrs.instruction_set =
|
||||||
|
attr.meta_item_list().and_then(|l| match &l[..] {
|
||||||
[NestedMetaItem::MetaItem(set)] => {
|
[NestedMetaItem::MetaItem(set)] => {
|
||||||
let segments =
|
let segments =
|
||||||
set.path.segments.iter().map(|x| x.ident.name).collect::<Vec<_>>();
|
set.path.segments.iter().map(|x| x.ident.name).collect::<Vec<_>>();
|
||||||
|
@ -384,7 +415,8 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: DefId) -> CodegenFnAttrs {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else if attr.has_name(sym::repr) {
|
}
|
||||||
|
sym::repr => {
|
||||||
codegen_fn_attrs.alignment = match attr.meta_item_list() {
|
codegen_fn_attrs.alignment = match attr.meta_item_list() {
|
||||||
Some(items) => match items.as_slice() {
|
Some(items) => match items.as_slice() {
|
||||||
[item] => match item.name_value_literal() {
|
[item] => match item.name_value_literal() {
|
||||||
|
@ -415,6 +447,8 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: DefId) -> CodegenFnAttrs {
|
||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
codegen_fn_attrs.inline = attrs.iter().fold(InlineAttr::None, |ia, attr| {
|
codegen_fn_attrs.inline = attrs.iter().fold(InlineAttr::None, |ia, attr| {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue