jit-allocator

Crates.iojit-allocator
lib.rsjit-allocator
version0.2.8
sourcesrc
created_at2023-06-25 13:51:13.872548
updated_at2023-07-06 18:34:17.033035
descriptionAn executable code allocator
homepage
repositoryhttps://github.com/playxe/jit-allocator
max_upload_size
id899493
size96,774
playX (playXE)

documentation

https://docs.rs/jit-allocator

README

jit-allocator

A simple memory allocator for executable code. Use JitAllocator type to allocate/release memory and virtual_memory module functions to enable proper access for executable code. So if you want to allocate a new code to execute it is usually done like this:

use jit_allocator::*;
let compiled_code = ...;
let compiled_code_size = ...;

let mut jit_allocator = JitAllocator::new(Default::default());
let (rx, rw) = jit_allocator.alloc(size)?;

protect_jit_memory(ProtectJitAccess::ReadWrite); // allows to write to RWX code in current thread,
                                                 // it is no-op on all platforms except macOS AArch64
unsafe { copy_nonoverlapping(compiled_code, rw, compiled_code_size);  }
protect_jit_memory(ProtectJitAccess::ReadExecute); // disables writes to RWX code in current thread, 
                                                   // it is no-op on all platforms except macOS AArch64
flush_instruction_cache(rx, compiled_code_size); // flush icache, not required on x86-64 
                                                 // but required on other platforms due 
                                                 // to lack of coherent dcache/icache.

// When you're done with your machine code you can release it:
unsafe { 
    jit_allocator.release(rx)?;
}
Commit count: 23

cargo fmt