1 | use crate::alloc::{GlobalAlloc, Layout, System}; |
---|---|
2 | use crate::cmp; |
3 | use crate::ptr; |
4 | |
5 | // The minimum alignment guaranteed by the architecture. This value is used to |
6 | // add fast paths for low alignment values. |
7 | #[cfg(any( |
8 | target_arch = "x86", |
9 | target_arch = "arm", |
10 | target_arch = "m68k", |
11 | target_arch = "csky", |
12 | target_arch = "mips", |
13 | target_arch = "mips32r6", |
14 | target_arch = "powerpc", |
15 | target_arch = "powerpc64", |
16 | target_arch = "sparc", |
17 | target_arch = "wasm32", |
18 | target_arch = "hexagon", |
19 | all(target_arch = "riscv32", not(any(target_os = "espidf", target_os = "zkvm"))), |
20 | all(target_arch = "xtensa", not(target_os = "espidf")), |
21 | ))] |
22 | pub const MIN_ALIGN: usize = 8; |
23 | #[cfg(any( |
24 | target_arch = "x86_64", |
25 | target_arch = "aarch64", |
26 | target_arch = "arm64ec", |
27 | target_arch = "loongarch64", |
28 | target_arch = "mips64", |
29 | target_arch = "mips64r6", |
30 | target_arch = "s390x", |
31 | target_arch = "sparc64", |
32 | target_arch = "riscv64", |
33 | target_arch = "wasm64", |
34 | ))] |
35 | pub const MIN_ALIGN: usize = 16; |
36 | // The allocator on the esp-idf and zkvm platforms guarantee 4 byte alignment. |
37 | #[cfg(all(any( |
38 | all(target_arch = "riscv32", any(target_os = "espidf", target_os = "zkvm")), |
39 | all(target_arch = "xtensa", target_os = "espidf"), |
40 | )))] |
41 | pub const MIN_ALIGN: usize = 4; |
42 | |
43 | pub unsafe fn realloc_fallback( |
44 | alloc: &System, |
45 | ptr: *mut u8, |
46 | old_layout: Layout, |
47 | new_size: usize, |
48 | ) -> *mut u8 { |
49 | // Docs for GlobalAlloc::realloc require this to be valid: |
50 | let new_layout: Layout = Layout::from_size_align_unchecked(new_size, old_layout.align()); |
51 | |
52 | let new_ptr: *mut u8 = GlobalAlloc::alloc(self:alloc, new_layout); |
53 | if !new_ptr.is_null() { |
54 | let size: usize = cmp::min(v1:old_layout.size(), v2:new_size); |
55 | ptr::copy_nonoverlapping(src:ptr, dst:new_ptr, count:size); |
56 | GlobalAlloc::dealloc(self:alloc, ptr, old_layout); |
57 | } |
58 | new_ptr |
59 | } |
60 |
Definitions
Learn Rust with the experts
Find out more