From 742339ca9e2f8285fdf2a340eae01d9e9f370b0b Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Tue, 3 Apr 2018 19:45:36 -0600
Subject: [PATCH] Hacky version of memalign

---
 src/stdlib/src/lib.rs | 18 ++++++++++++++++++
 tests/alloc.c         | 10 +++++++++-
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/src/stdlib/src/lib.rs b/src/stdlib/src/lib.rs
index 9c948d677..53d6d83f5 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 784125bcf..6c1d04d04 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;
 }
-- 
GitLab