rustc_hir/
weak_lang_items.rs1use rustc_span::{Symbol, sym};
4
5use crate::LangItem;
6
7macro_rules! weak_lang_items {
8 ($($item:ident, $sym:ident;)*) => {
9 pub static WEAK_LANG_ITEMS: &[LangItem] = &[$(LangItem::$item,)*];
10
11 impl LangItem {
12 pub fn is_weak(self) -> bool {
13 matches!(self, $(LangItem::$item)|*)
14 }
15
16 pub fn link_name(self) -> Option<Symbol> {
17 match self {
18 $( LangItem::$item => Some(sym::$sym),)*
19 _ => None,
20 }
21 }
22 }
23 }
24}
25
26macro_rules! weak_only_lang_items {
27 ($($item:ident,)*) => {
28 impl LangItem {
29 pub fn is_weak_only(self) -> bool {
30 matches!(self, $(LangItem::$item)|*)
31 }
32 }
33 }
34}
35
36pub static WEAK_LANG_ITEMS: &[LangItem] =
&[LangItem::PanicImpl, LangItem::EhPersonality];
impl LangItem {
pub fn is_weak(self) -> bool {
#[allow(non_exhaustive_omitted_patterns)]
match self {
LangItem::PanicImpl | LangItem::EhPersonality => true,
_ => false,
}
}
pub fn link_name(self) -> Option<Symbol> {
match self {
LangItem::PanicImpl => Some(sym::rust_begin_unwind),
LangItem::EhPersonality => Some(sym::rust_eh_personality),
_ => None,
}
}
}weak_lang_items! {
37 PanicImpl, rust_begin_unwind;
38 EhPersonality, rust_eh_personality;
39}
40
41impl LangItem {
pub fn is_weak_only(self) -> bool {
#[allow(non_exhaustive_omitted_patterns)]
match self {
LangItem::MemCpy | LangItem::MemMove | LangItem::MemSet |
LangItem::MemCmp | LangItem::Bcmp | LangItem::StrLen => true,
_ => false,
}
}
}weak_only_lang_items! {
42 MemCpy,
43 MemMove,
44 MemSet,
45 MemCmp,
46 Bcmp,
47 StrLen,
48}