mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-21 19:20:21 +02:00
Add code to release all memory used by the jit state.
* include/lightning.h, lib/lightning.c: Implement the new jit_clear_state and jit_destroy_state calls. jit_clear_state releases all memory not required during jit_execution; that is, leaves only the mmap'ed data and code buffers allocated. jit_destroy_state releases the mmap'ed buffers as well as the jit_state_t object itself, that holds pointers to the code and data buffers, as well as annotation pointers (for disassembly or backtrace) in the data buffer. * lib/jit_note.c: Correct invalid vector offset access. * check/ccall.c, check/lightning.c, doc/ifib.c, doc/incr.c, doc/printf.c, doc/rfib.c, doc/rpn.c: Use the new jit_clear_state and jit_destroy_state calls, to demonstrate the new code to release all jit memory. * doc/body.texi: Add basic documentation and usage description of jit_clear_state and jit_destroy_state.
This commit is contained in:
parent
6039794ec3
commit
8f020fe044
12 changed files with 138 additions and 4 deletions
|
@ -539,6 +539,70 @@ jit_new_state(void)
|
|||
return (_jit);
|
||||
}
|
||||
|
||||
void
|
||||
_jit_clear_state(jit_state_t *_jit)
|
||||
{
|
||||
jit_word_t offset;
|
||||
jit_function_t *function;
|
||||
|
||||
/* release memory not required at jit execution time and set
|
||||
* pointers to NULL to explicitly know they are released */
|
||||
_jit->head = _jit->tail = NULL;
|
||||
|
||||
mpz_clear(_jit->blockmask);
|
||||
|
||||
free(_jit->data.table);
|
||||
_jit->data.table = NULL;
|
||||
_jit->data.size = _jit->data.count = 0;
|
||||
|
||||
free(_jit->spill);
|
||||
_jit->spill = NULL;
|
||||
free(_jit->gen);
|
||||
_jit->gen = NULL;
|
||||
free(_jit->values);
|
||||
_jit->values = NULL;
|
||||
|
||||
free(_jit->blocks.ptr);
|
||||
_jit->blocks.ptr = NULL;
|
||||
|
||||
free(_jit->patches.ptr);
|
||||
_jit->patches.ptr = NULL;
|
||||
_jit->patches.offset = _jit->patches.length = 0;
|
||||
|
||||
for (offset = 0; offset < _jit->functions.offset; offset++) {
|
||||
function = _jit->functions.ptr + offset;
|
||||
free(function->regoff);
|
||||
function->regoff = NULL;
|
||||
}
|
||||
free(_jit->functions.ptr);
|
||||
_jit->functions.offset = _jit->functions.length = 0;
|
||||
_jit->function = NULL;
|
||||
|
||||
for (offset = 0; offset < _jit->pool.length; offset++)
|
||||
free(_jit->pool.ptr[offset]);
|
||||
free(_jit->pool.ptr);
|
||||
_jit->pool.ptr = NULL;
|
||||
_jit->pool.offset = _jit->pool.length = 0;
|
||||
_jit->list = NULL;
|
||||
|
||||
_jit->note.head = _jit->note.tail =
|
||||
_jit->note.name = _jit->note.note = NULL;
|
||||
_jit->note.base = NULL;
|
||||
|
||||
#if __arm__ && DISASSEMBLER
|
||||
free(_jit->data_info.ptr);
|
||||
_jit->data_info.ptr = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
_jit_destroy_state(jit_state_t *_jit)
|
||||
{
|
||||
munmap(_jit->code.ptr, _jit->code.length);
|
||||
munmap(_jit->data.ptr, _jit->data.length);
|
||||
free(_jit);
|
||||
}
|
||||
|
||||
jit_node_t *
|
||||
_jit_new_node(jit_state_t *_jit, jit_code_t code)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue