diff options
| author | bors <bors@rust-lang.org> | 2024-08-28 05:47:59 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-08-28 05:47:59 +0000 |
| commit | 3a655aa4cbdea7f19b888db5d3b45c49720984b4 (patch) | |
| tree | fcd6a49c72ffdeee7275d9b8259ee7441ef69104 /library/std/src/sys/alloc/mod.rs | |
| parent | 2d69baa6e361c2ac76ae6c013b0ab126fa25d8b3 (diff) | |
| parent | f4f3447c5748c4699ef4bfe6c09efab4997aff94 (diff) | |
| download | rust-3a655aa4cbdea7f19b888db5d3b45c49720984b4.tar.gz rust-3a655aa4cbdea7f19b888db5d3b45c49720984b4.zip | |
Auto merge of #3850 - rust-lang:rustup-2024-08-28, r=RalfJung
Automatic Rustup
Diffstat (limited to 'library/std/src/sys/alloc/mod.rs')
| -rw-r--r-- | library/std/src/sys/alloc/mod.rs | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/library/std/src/sys/alloc/mod.rs b/library/std/src/sys/alloc/mod.rs new file mode 100644 index 00000000000..2c0b533a570 --- /dev/null +++ b/library/std/src/sys/alloc/mod.rs @@ -0,0 +1,94 @@ +#![forbid(unsafe_op_in_unsafe_fn)] + +use crate::alloc::{GlobalAlloc, Layout, System}; +use crate::ptr; + +// The minimum alignment guaranteed by the architecture. This value is used to +// add fast paths for low alignment values. +#[allow(dead_code)] +const MIN_ALIGN: usize = if cfg!(any( + all(target_arch = "riscv32", any(target_os = "espidf", target_os = "zkvm")), + all(target_arch = "xtensa", target_os = "espidf"), +)) { + // The allocator on the esp-idf and zkvm platforms guarantees 4 byte alignment. + 4 +} else if cfg!(any( + target_arch = "x86", + target_arch = "arm", + target_arch = "m68k", + target_arch = "csky", + target_arch = "mips", + target_arch = "mips32r6", + target_arch = "powerpc", + target_arch = "powerpc64", + target_arch = "sparc", + target_arch = "wasm32", + target_arch = "hexagon", + target_arch = "riscv32", + target_arch = "xtensa", +)) { + 8 +} else if cfg!(any( + target_arch = "x86_64", + target_arch = "aarch64", + target_arch = "arm64ec", + target_arch = "loongarch64", + target_arch = "mips64", + target_arch = "mips64r6", + target_arch = "s390x", + target_arch = "sparc64", + target_arch = "riscv64", + target_arch = "wasm64", +)) { + 16 +} else { + panic!("add a value for MIN_ALIGN") +}; + +#[allow(dead_code)] +unsafe fn realloc_fallback( + alloc: &System, + ptr: *mut u8, + old_layout: Layout, + new_size: usize, +) -> *mut u8 { + // SAFETY: Docs for GlobalAlloc::realloc require this to be valid + unsafe { + let new_layout = Layout::from_size_align_unchecked(new_size, old_layout.align()); + + let new_ptr = GlobalAlloc::alloc(alloc, new_layout); + if !new_ptr.is_null() { + let size = usize::min(old_layout.size(), new_size); + ptr::copy_nonoverlapping(ptr, new_ptr, size); + GlobalAlloc::dealloc(alloc, ptr, old_layout); + } + + new_ptr + } +} + +cfg_if::cfg_if! { + if #[cfg(any( + target_family = "unix", + target_os = "wasi", + target_os = "teeos", + ))] { + mod unix; + } else if #[cfg(target_os = "windows")] { + mod windows; + } else if #[cfg(target_os = "hermit")] { + mod hermit; + } else if #[cfg(all(target_vendor = "fortanix", target_env = "sgx"))] { + mod sgx; + } else if #[cfg(target_os = "solid_asp3")] { + mod solid; + } else if #[cfg(target_os = "uefi")] { + mod uefi; + } else if #[cfg(target_family = "wasm")] { + mod wasm; + } else if #[cfg(target_os = "xous")] { + mod xous; + } else if #[cfg(target_os = "zkvm")] { + mod zkvm; + } +} |
