From 51c96f9e196d3d3d4d946083b469d7fa1ab9b77c Mon Sep 17 00:00:00 2001 From: pcpa Date: Fri, 29 Mar 2013 12:53:40 -0300 Subject: [PATCH] Do not start over jit generation if can safely grow buffer size. * include/lightning/jit_private.h, lib/jit_arm.c, lib/jit_memory.c, lib/jit_mips.c, lib/jit_ppc.c, lib/jit_sparc.c, lib/jit_x86.c, lib/lightning.c: Do not start over jit generation if can grow the code buffer with mremap without moving the base pointer. --- ChangeLog | 7 +++++++ include/lightning/jit_private.h | 9 +++++++++ lib/jit_arm.c | 2 +- lib/jit_memory.c | 24 ++++++++++++++++++++++++ lib/jit_mips.c | 2 +- lib/jit_ppc.c | 2 +- lib/jit_sparc.c | 2 +- lib/jit_x86.c | 2 +- lib/lightning.c | 9 ++++----- 9 files changed, 49 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9d4684485..a174e6433 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2013-03-29 Paulo Andrade + + * include/lightning/jit_private.h, lib/jit_arm.c, lib/jit_memory.c, + lib/jit_mips.c, lib/jit_ppc.c, lib/jit_sparc.c, lib/jit_x86.c, + lib/lightning.c: Do not start over jit generation if can grow + the code buffer with mremap without moving the base pointer. + 2013-03-29 Paulo Andrade * lib/jit_memory.c: Implement a simple memory allocation wrapper diff --git a/include/lightning/jit_private.h b/include/lightning/jit_private.h index 02847ea9d..133937b03 100644 --- a/include/lightning/jit_private.h +++ b/include/lightning/jit_private.h @@ -360,6 +360,8 @@ struct jit_compiler { } prolog; jit_bool_t jump; #endif + /* global flag for code buffer heuristic size computation */ + jit_word_t mult; }; #define _jitc _jit->comp @@ -485,6 +487,13 @@ extern void jit_alloc(jit_pointer_t*, jit_word_t); extern void jit_realloc(jit_pointer_t*, jit_word_t, jit_word_t); void jit_free(jit_pointer_t*); +#if HAVE_MREMAP +# define jit_remap() _jit_remap(_jit) +extern jit_bool_t _jit_remap(jit_state_t*); +#else +# define jit_remap() 0 +#endif + /* * Externs */ diff --git a/lib/jit_arm.c b/lib/jit_arm.c index 103307fec..c4fe59e27 100644 --- a/lib/jit_arm.c +++ b/lib/jit_arm.c @@ -1034,7 +1034,7 @@ _emit_code(jit_state_t *_jit) } \ break for (node = _jitc->head; node; node = node->next) { - if (_jit->pc.uc >= _jitc->code.end) + if (_jit->pc.uc >= _jitc->code.end && !jit_remap()) return (NULL); value = jit_classify(node->code); diff --git a/lib/jit_memory.c b/lib/jit_memory.c index ef2624fcb..7aa5afcec 100644 --- a/lib/jit_memory.c +++ b/lib/jit_memory.c @@ -17,6 +17,7 @@ #include #include +#include /* * Prototypes @@ -83,6 +84,29 @@ jit_free(jit_pointer_t *ptr) *ptr = NULL; } +#if HAVE_MREMAP +jit_bool_t +_jit_remap(jit_state_t *_jit) +{ + jit_uint8_t *code; + jit_word_t length; + + length = _jitc->pool.length * 1024 * (_jitc->mult + 1); + + code = mremap(_jit->code.ptr, _jit->code.length, length, 0, NULL); + if (code != MAP_FAILED) { + assert(code == _jit->code.ptr); + ++_jitc->mult; + _jit->code.length = length; + _jitc->code.end = _jit->code.ptr + _jit->code.length - 64; + + return (1); + } + + return (0); +} +#endif + static void * jit_default_alloc_func(size_t size) { diff --git a/lib/jit_mips.c b/lib/jit_mips.c index 0d927561b..29e087111 100644 --- a/lib/jit_mips.c +++ b/lib/jit_mips.c @@ -775,7 +775,7 @@ _emit_code(jit_state_t *_jit) } \ break for (node = _jitc->head; node; node = node->next) { - if (_jit->pc.uc >= _jitc->code.end) + if (_jit->pc.uc >= _jitc->code.end && !jit_remap()) return (NULL); value = jit_classify(node->code); diff --git a/lib/jit_ppc.c b/lib/jit_ppc.c index ec518825c..a09b24fa3 100644 --- a/lib/jit_ppc.c +++ b/lib/jit_ppc.c @@ -866,7 +866,7 @@ _emit_code(jit_state_t *_jit) } \ break for (node = _jitc->head; node; node = node->next) { - if (_jit->pc.uc >= _jitc->code.end) + if (_jit->pc.uc >= _jitc->code.end && !jit_remap()) return (NULL); value = jit_classify(node->code); diff --git a/lib/jit_sparc.c b/lib/jit_sparc.c index 43072a25e..a9eab396b 100644 --- a/lib/jit_sparc.c +++ b/lib/jit_sparc.c @@ -692,7 +692,7 @@ _emit_code(jit_state_t *_jit) } \ break for (node = _jitc->head; node; node = node->next) { - if (_jit->pc.uc >= _jitc->code.end) + if (_jit->pc.uc >= _jitc->code.end && !jit_remap()) return (NULL); value = jit_classify(node->code); diff --git a/lib/jit_x86.c b/lib/jit_x86.c index daf826feb..345dad7e7 100644 --- a/lib/jit_x86.c +++ b/lib/jit_x86.c @@ -1125,7 +1125,7 @@ _emit_code(jit_state_t *_jit) } \ break for (node = _jitc->head; node; node = node->next) { - if (_jit->pc.uc >= _jitc->code.end) + if (_jit->pc.uc >= _jitc->code.end && !jit_remap()) return (NULL); value = jit_classify(node->code); diff --git a/lib/lightning.c b/lib/lightning.c index 7c2dcadef..58b1a558e 100644 --- a/lib/lightning.c +++ b/lib/lightning.c @@ -1455,7 +1455,6 @@ _jit_emit(jit_state_t *_jit) { jit_pointer_t code; jit_node_t *node; - jit_int32_t mult; size_t length; int result; @@ -1464,11 +1463,11 @@ _jit_emit(jit_state_t *_jit) jit_optimize(); /* Heuristic to guess code buffer size */ - mult = 4; + _jitc->mult = 4; _jitc->emit = 1; - _jit->code.length = _jitc->pool.length * 1024 * mult; + _jit->code.length = _jitc->pool.length * 1024 * _jitc->mult; _jit->code.ptr = mmap(NULL, _jit->code.length, PROT_EXEC | PROT_READ | PROT_WRITE, @@ -1485,8 +1484,8 @@ _jit_emit(jit_state_t *_jit) node->code == jit_code_epilog)) node->flag &= ~jit_flag_patch; } - ++mult; - length = _jitc->pool.length * 1024 * mult; + ++_jitc->mult; + length = _jitc->pool.length * 1024 * _jitc->mult; #if !HAVE_MREMAP munmap(_jit->code.ptr, _jit->code.length);