diff --git a/src/stdlib/src/lib.rs b/src/stdlib/src/lib.rs index 9c948d6779a381db7afdb911fa20aad476e1f982..53d6d83f5216ca4018a3e8961efdefbb95015990 100644 --- a/src/stdlib/src/lib.rs +++ b/src/stdlib/src/lib.rs @@ -323,6 +323,24 @@ pub unsafe extern "C" fn malloc(size: size_t) -> *mut c_void { } } +#[no_mangle] +pub unsafe extern "C" fn memalign(alignment: size_t, size: size_t) -> *mut c_void { + let mut align = 16; + while align <= alignment { + 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 + } +} + #[no_mangle] pub extern "C" fn mblen(s: *const c_char, n: size_t) -> c_int { unimplemented!(); diff --git a/tests/alloc.c b/tests/alloc.c index 784125bcf6b0db7072fe55cf14f84da572bd81c5..6c1d04d045d06310b306f0b18556e05a62120cd8 100644 --- a/tests/alloc.c +++ b/tests/alloc.c @@ -10,11 +10,19 @@ int main(int argc, char ** argv) { } free(ptr); - char * ptrc = (char *)calloc(256,1); + char * ptrc = (char *)calloc(256, 1); printf("calloc %p\n", ptrc); for(i = 0; i < 256; i++) { ptrc[i] = (char)i; } free(ptrc); + + char * ptra = (char *)memalign(256, 256); + printf("memalign %p\n", ptra); + for(i = 0; i < 256; i++) { + ptra[i] = (char)i; + } + free(ptra); + return 0; }