about summary refs log tree commit diff
path: root/library/alloc
diff options
context:
space:
mode:
authorAmanieu d'Antras <amanieu@gmail.com>2022-10-14 02:24:58 +0100
committerAmanieu d'Antras <amanieu@gmail.com>2022-10-31 16:32:57 +0000
commit56074b5231ceef266a1097ea355f62c951e1b468 (patch)
tree054030cdf3133c8b3bd6466ae143c1be8c769c13 /library/alloc
parent2afca78a0b03db144c5d8b9f8868feebfe096309 (diff)
downloadrust-56074b5231ceef266a1097ea355f62c951e1b468.tar.gz
rust-56074b5231ceef266a1097ea355f62c951e1b468.zip
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).
Diffstat (limited to 'library/alloc')
-rw-r--r--library/alloc/src/alloc.rs11
1 files changed, 5 insertions, 6 deletions
diff --git a/library/alloc/src/alloc.rs b/library/alloc/src/alloc.rs
index 8187517ccfb..8c6663569a5 100644
--- a/library/alloc/src/alloc.rs
+++ b/library/alloc/src/alloc.rs
@@ -402,19 +402,18 @@ pub use std::alloc::handle_alloc_error;
 #[allow(unused_attributes)]
 #[unstable(feature = "alloc_internals", issue = "none")]
 pub mod __alloc_error_handler {
-    use crate::alloc::Layout;
-
-    // called via generated `__rust_alloc_error_handler`
-
-    // if there is no `#[alloc_error_handler]`
+    // called via generated `__rust_alloc_error_handler` if there is no
+    // `#[alloc_error_handler]`.
     #[rustc_std_internal_symbol]
     pub unsafe fn __rdl_oom(size: usize, _align: usize) -> ! {
         panic!("memory allocation of {size} bytes failed")
     }
 
-    // if there is an `#[alloc_error_handler]`
+    #[cfg(bootstrap)]
     #[rustc_std_internal_symbol]
     pub unsafe fn __rg_oom(size: usize, align: usize) -> ! {
+        use crate::alloc::Layout;
+
         let layout = unsafe { Layout::from_size_align_unchecked(size, align) };
         extern "Rust" {
             #[lang = "oom"]