mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +00:00
GH-129231: Group executable JIT code in memory (GH-129232)
This commit is contained in:
parent
567394517a
commit
a29a9c0f38
2 changed files with 6 additions and 5 deletions
|
@ -0,0 +1 @@
|
||||||
|
Improve memory layout of JIT traces. Patch by Diego Russo
|
10
Python/jit.c
10
Python/jit.c
|
@ -502,8 +502,8 @@ _PyJIT_Compile(_PyExecutorObject *executor, const _PyUOpInstruction trace[], siz
|
||||||
// Round up to the nearest page:
|
// Round up to the nearest page:
|
||||||
size_t page_size = get_page_size();
|
size_t page_size = get_page_size();
|
||||||
assert((page_size & (page_size - 1)) == 0);
|
assert((page_size & (page_size - 1)) == 0);
|
||||||
size_t padding = page_size - ((code_size + data_size + state.trampolines.size) & (page_size - 1));
|
size_t padding = page_size - ((code_size + state.trampolines.size + data_size) & (page_size - 1));
|
||||||
size_t total_size = code_size + data_size + state.trampolines.size + padding;
|
size_t total_size = code_size + state.trampolines.size + data_size + padding;
|
||||||
unsigned char *memory = jit_alloc(total_size);
|
unsigned char *memory = jit_alloc(total_size);
|
||||||
if (memory == NULL) {
|
if (memory == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -524,8 +524,8 @@ _PyJIT_Compile(_PyExecutorObject *executor, const _PyUOpInstruction trace[], siz
|
||||||
}
|
}
|
||||||
// Loop again to emit the code:
|
// Loop again to emit the code:
|
||||||
unsigned char *code = memory;
|
unsigned char *code = memory;
|
||||||
unsigned char *data = memory + code_size;
|
state.trampolines.mem = memory + code_size;
|
||||||
state.trampolines.mem = memory + code_size + data_size;
|
unsigned char *data = memory + code_size + state.trampolines.size;
|
||||||
// Compile the shim, which handles converting between the native
|
// Compile the shim, which handles converting between the native
|
||||||
// calling convention and the calling convention used by jitted code
|
// calling convention and the calling convention used by jitted code
|
||||||
// (which may be different for efficiency reasons).
|
// (which may be different for efficiency reasons).
|
||||||
|
@ -547,7 +547,7 @@ _PyJIT_Compile(_PyExecutorObject *executor, const _PyUOpInstruction trace[], siz
|
||||||
code += group->code_size;
|
code += group->code_size;
|
||||||
data += group->data_size;
|
data += group->data_size;
|
||||||
assert(code == memory + code_size);
|
assert(code == memory + code_size);
|
||||||
assert(data == memory + code_size + data_size);
|
assert(data == memory + code_size + state.trampolines.size + data_size);
|
||||||
#ifdef MAP_JIT
|
#ifdef MAP_JIT
|
||||||
pthread_jit_write_protect_np(1);
|
pthread_jit_write_protect_np(1);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue