From 62fbff93bc882b6e1c6da547f6a4007768fdb600 Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jackpot51@gmail.com> Date: Tue, 3 Apr 2018 19:51:50 -0600 Subject: [PATCH] Clean up malloc --- src/stdlib/src/lib.rs | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/stdlib/src/lib.rs b/src/stdlib/src/lib.rs index 53d6d83f5..330964f85 100644 --- a/src/stdlib/src/lib.rs +++ b/src/stdlib/src/lib.rs @@ -310,35 +310,33 @@ pub extern "C" fn lrand48() -> c_long { unimplemented!(); } -#[no_mangle] -pub unsafe extern "C" fn malloc(size: size_t) -> *mut c_void { - let align = 8; - let ptr = ralloc::alloc(size + 16, align); +unsafe fn malloc_inner(size: usize, offset: usize, align: usize) -> *mut c_void { + assert!(offset >= 16); + assert!(align >= 8); + + let ptr = ralloc::alloc(size + offset, align); if !ptr.is_null() { - *(ptr as *mut u64) = (size + 16) as u64; + *(ptr as *mut u64) = (size + offset) as u64; *(ptr as *mut u64).offset(1) = align as u64; - ptr.offset(16) as *mut c_void + ptr.offset(offset as isize) as *mut c_void } else { ptr as *mut c_void } } +#[no_mangle] +pub unsafe extern "C" fn malloc(size: size_t) -> *mut c_void { + malloc_inner(size, 16, 8) +} + #[no_mangle] pub unsafe extern "C" fn memalign(alignment: size_t, size: size_t) -> *mut c_void { let mut align = 16; - while align <= alignment { + while align <= alignment as usize { align *= 2; } - let offset = align/2; - let ptr = ralloc::alloc(size + offset, align); - if !ptr.is_null() { - *(ptr as *mut u64) = (size + offset) as u64; - *(ptr as *mut u64).offset(1) = align as u64; - ptr.offset(offset as isize) as *mut c_void - } else { - ptr as *mut c_void - } + malloc_inner(size, align/2, align) } #[no_mangle] -- GitLab