mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	 56074b5231
			
		
	
	
		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;
 | |
| }
 |