56074b5231
The new implementation doesn't use weak lang items and instead changes `#[alloc_error_handler]` to an attribute macro just like `#[global_allocator]`. The attribute will generate the `__rg_oom` function which is called by the compiler-generated `__rust_alloc_error_handler`. If no `__rg_oom` function is defined in any crate then the compiler shim will call `__rdl_oom` in the alloc crate which will simply panic. This also fixes link errors with `-C link-dead-code` with `default_alloc_error_handler`: `__rg_oom` was previously defined in the alloc crate and would attempt to reference the `oom` lang item, even if it didn't exist. This worked as long as `__rg_oom` was excluded from linking since it was not called. This is a prerequisite for the stabilization of `default_alloc_error_handler` (#102318).
31 lines
771 B
Rust
31 lines
771 B
Rust
//! Validity checking for weak lang items
|
|
|
|
use crate::LangItem;
|
|
|
|
use rustc_span::symbol::{sym, Symbol};
|
|
|
|
macro_rules! weak_lang_items {
|
|
($($item:ident, $sym:ident;)*) => {
|
|
pub static WEAK_LANG_ITEMS: &[LangItem] = &[$(LangItem::$item,)*];
|
|
|
|
impl LangItem {
|
|
pub fn is_weak(self) -> bool {
|
|
matches!(self, $(LangItem::$item)|*)
|
|
}
|
|
|
|
pub fn link_name(self) -> Option<Symbol> {
|
|
match self {
|
|
$( LangItem::$item => Some(sym::$sym),)*
|
|
_ => None,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
weak_lang_items! {
|
|
PanicImpl, rust_begin_unwind;
|
|
EhPersonality, rust_eh_personality;
|
|
EhCatchTypeinfo, rust_eh_catch_typeinfo;
|
|
}
|