@@ -56,15 +56,13 @@ jit_alloc(size_t size)
56
56
int flags = MEM_COMMIT | MEM_RESERVE ;
57
57
unsigned char * memory = VirtualAlloc (NULL , size , flags , PAGE_READWRITE );
58
58
int failed = memory == NULL ;
59
- #elif defined(__APPLE__ ) && defined(__aarch64__ )
60
- int flags = MAP_ANONYMOUS | MAP_PRIVATE | MAP_JIT ;
61
- int prot = PROT_READ | PROT_WRITE | PROT_EXEC ;
62
- unsigned char * memory = mmap (NULL , size , prot , flags , -1 , 0 );
63
- int failed = memory == MAP_FAILED ;
64
- pthread_jit_write_protect_np (0 );
65
59
#else
66
60
int flags = MAP_ANONYMOUS | MAP_PRIVATE ;
67
61
int prot = PROT_READ | PROT_WRITE ;
62
+ # ifdef MAP_JIT
63
+ flags |= MAP_JIT ;
64
+ prot |= PROT_EXEC ;
65
+ # endif
68
66
unsigned char * memory = mmap (NULL , size , prot , flags , -1 , 0 );
69
67
int failed = memory == MAP_FAILED ;
70
68
#endif
@@ -108,13 +106,12 @@ mark_executable(unsigned char *memory, size_t size)
108
106
}
109
107
int old ;
110
108
int failed = !VirtualProtect (memory , size , PAGE_EXECUTE_READ , & old );
111
- #elif defined(__APPLE__ ) && defined(__aarch64__ )
112
- int failed = 0 ;
113
- __builtin___clear_cache ((char * )memory , (char * )memory + size );
114
- pthread_jit_write_protect_np (1 );
115
109
#else
110
+ int failed = 0 ;
116
111
__builtin___clear_cache ((char * )memory , (char * )memory + size );
117
- int failed = mprotect (memory , size , PROT_EXEC | PROT_READ );
112
+ # ifndef MAP_JIT
113
+ failed = mprotect (memory , size , PROT_EXEC | PROT_READ );
114
+ # endif
118
115
#endif
119
116
if (failed ) {
120
117
jit_error ("unable to protect executable memory" );
@@ -510,6 +507,9 @@ _PyJIT_Compile(_PyExecutorObject *executor, const _PyUOpInstruction trace[], siz
510
507
if (memory == NULL ) {
511
508
return -1 ;
512
509
}
510
+ #ifdef MAP_JIT
511
+ pthread_jit_write_protect_np (0 );
512
+ #endif
513
513
// Update the offsets of each instruction:
514
514
for (size_t i = 0 ; i < length ; i ++ ) {
515
515
state .instruction_starts [i ] += (uintptr_t )memory ;
@@ -540,7 +540,11 @@ _PyJIT_Compile(_PyExecutorObject *executor, const _PyUOpInstruction trace[], siz
540
540
data += group -> data_size ;
541
541
assert (code == memory + code_size );
542
542
assert (data == memory + code_size + data_size );
543
- if (mark_executable (memory , total_size )) {
543
+ int status = mark_executable (memory , total_size );
544
+ #ifdef MAP_JIT
545
+ pthread_jit_write_protect_np (1 );
546
+ #endif
547
+ if (status ) {
544
548
jit_free (memory , total_size );
545
549
return -1 ;
546
550
}
0 commit comments