diff options
author | U.Nakamura <[email protected]> | 2021-12-27 15:56:23 +0900 |
---|---|---|
committer | U.Nakamura <[email protected]> | 2021-12-27 15:56:23 +0900 |
commit | 85a426dc8678f04a78ffd799943b690ce2984c49 () | |
tree | db4a2ccd3de67b69651ccbe66830ff313150072e | |
parent | f486566f133ae191c6f9d5ff0001abf8efc9984f (diff) |
Tiny mmap emulation for Windows
- prerequisite of supporting YJIT with VC++. - note that now can specfily `--yjit` on mswin64, but not enabled YJIT'ed code because of YJIT requires `OPT_DIRECT_THREADED_CODE` or `OPT_CALL_THREADED_CODE` in `rb_yjit_compile_iseq`.
-rw-r--r-- | include/ruby/win32.h | 19 | ||||
-rw-r--r-- | win32/win32.c | 31 | ||||
-rw-r--r-- | yjit.h | 2 | ||||
-rw-r--r-- | yjit_asm.c | 15 |
4 files changed, 58 insertions, 9 deletions
@@ -796,6 +796,25 @@ double rb_w32_pow(double x, double y); #define pow rb_w32_pow #endif #if defined(__cplusplus) #if 0 { /* satisfy cc-mode */ @@ -8204,3 +8204,34 @@ VALUE (*const rb_f_notimplement_)(int, const VALUE *, VALUE, VALUE) = rb_f_notim #if RUBY_MSVCRT_VERSION < 120 #include "missing/nextafter.c" #endif @@ -16,7 +16,7 @@ #endif // We generate x86 assembly and rely on mmap(2). -#if defined(__x86_64__) && !defined(_WIN32) # define YJIT_SUPPORTED_P 1 #else # define YJIT_SUPPORTED_P 0 @@ -149,11 +149,10 @@ static uint8_t *align_ptr(uint8_t *ptr, uint32_t multiple) // Allocate a block of executable memory static uint8_t *alloc_exec_mem(uint32_t mem_size) { -#ifndef _WIN32 uint8_t *mem_block; // On Linux - #if defined(MAP_FIXED_NOREPLACE) && defined(_SC_PAGESIZE) // Align the requested address to page size uint32_t page_size = (uint32_t)sysconf(_SC_PAGESIZE); uint8_t *req_addr = align_ptr((uint8_t*)&alloc_exec_mem, page_size); @@ -179,7 +178,7 @@ static uint8_t *alloc_exec_mem(uint32_t mem_size) } while (req_addr < (uint8_t*)&alloc_exec_mem + INT32_MAX); // On MacOS and other platforms - #else // Try to map a chunk of memory as executable mem_block = (uint8_t*)mmap( (void*)alloc_exec_mem, @@ -189,7 +188,7 @@ static uint8_t *alloc_exec_mem(uint32_t mem_size) -1, 0 ); - #endif // Fallback if (mem_block == MAP_FAILED) { @@ -223,10 +222,6 @@ static uint8_t *alloc_exec_mem(uint32_t mem_size) cb_mark_all_executable(cb); return mem_block; -#else - // Windows not supported for now - return NULL; -#endif } // Initialize a code block object @@ -1811,7 +1806,11 @@ void cb_mark_all_writeable(codeblock_t * cb) void cb_mark_position_writeable(codeblock_t * cb, uint32_t write_pos) { uint32_t pagesize = (uint32_t)sysconf(_SC_PAGESIZE); uint32_t aligned_position = (write_pos / pagesize) * pagesize; if (cb->current_aligned_write_pos != aligned_position) { |