1
Fork 0
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:
pcpa 2013-02-11 15:51:55 -02:00
parent 6039794ec3
commit 8f020fe044
12 changed files with 138 additions and 4 deletions

View file

@ -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)
{