Rewrite implementation of #[alloc_error_handler]
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).
This commit is contained in:
parent
2afca78a0b
commit
56074b5231
40 changed files with 441 additions and 166 deletions
|
@ -1511,6 +1511,17 @@ pub(crate) mod builtin {
|
|||
/* compiler built-in */
|
||||
}
|
||||
|
||||
/// Attribute macro applied to a function to register it as a handler for allocation failure.
|
||||
///
|
||||
/// See also [`std::alloc::handle_alloc_error`](../../../std/alloc/fn.handle_alloc_error.html).
|
||||
#[cfg(not(bootstrap))]
|
||||
#[unstable(feature = "alloc_error_handler", issue = "51540")]
|
||||
#[allow_internal_unstable(rustc_attrs)]
|
||||
#[rustc_builtin_macro]
|
||||
pub macro alloc_error_handler($item:item) {
|
||||
/* compiler built-in */
|
||||
}
|
||||
|
||||
/// Keeps the item it's applied to if the passed path is accessible, and removes it otherwise.
|
||||
#[unstable(
|
||||
feature = "cfg_accessible",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue