-rw-r--r-- | lib/lightning.c | 28 |
diff --git a/lib/lightning.c b/lib/lightning.c index 817976c..e6c7f4b 100644 --- a/lib/lightning.c +++ b/lib/lightning.c @@ -180,12 +180,14 @@ init_jit(char *progname) jit_progname = progname; jit_get_cpu(); jit_init_debug(); + jit_init_size(); } void finish_jit(void) { jit_finish_debug(); + jit_finish_size(); } jit_int32_t @@ -1644,6 +1646,9 @@ _jit_reglive(jit_state_t *_jit, jit_node_t *node) void _jit_regarg_set(jit_state_t *_jit, jit_node_t *node, jit_int32_t value) { +#if GET_JIT_SIZE + jit_size_prepare(); +#endif if (value & jit_cc_a0_reg) { if (value & jit_cc_a0_rlh) { jit_regset_setbit(&_jitc->regarg, jit_regno(node->u.q.l)); @@ -1661,6 +1666,9 @@ _jit_regarg_set(jit_state_t *_jit, jit_node_t *node, jit_int32_t value) void _jit_regarg_clr(jit_state_t *_jit, jit_node_t *node, jit_int32_t value) { +#if GET_JIT_SIZE + jit_size_collect(node); +#endif if (value & jit_cc_a0_reg) { if (value & jit_cc_a0_rlh) { jit_regset_clrbit(&_jitc->regarg, jit_regno(node->u.q.l)); @@ -1690,12 +1698,15 @@ _jit_emit(jit_state_t *_jit) jit_epilog(); jit_optimize(); - /* Heuristic to guess code buffer size */ - _jitc->mult = 4; - _jitc->emit = 1; +#if GET_JIT_SIZE + /* Heuristic to guess code buffer size */ + _jitc->mult = 4; _jit->code.length = _jitc->pool.length * 1024 * _jitc->mult; +#else + _jit->code.length = jit_get_size(); +#endif #if defined(__sgi) mmap_fd = open("/dev/zero", O_RDWR); @@ -1704,7 +1715,8 @@ _jit_emit(jit_state_t *_jit) PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, mmap_fd, 0); assert(_jit->code.ptr != MAP_FAILED); - _jitc->code.end = _jit->code.ptr + _jit->code.length - 64; + _jitc->code.end = _jit->code.ptr + _jit->code.length - + jit_get_max_instr(); _jit->pc.uc = _jit->code.ptr; for (;;) { @@ -1715,8 +1727,13 @@ _jit_emit(jit_state_t *_jit) node->code == jit_code_epilog)) node->flag &= ~jit_flag_patch; } +#if GET_JIT_SIZE ++_jitc->mult; length = _jitc->pool.length * 1024 * _jitc->mult; +#else + /* Should only happen on very special cases */ + length = _jit->code.length + 4096; +#endif #if !HAVE_MREMAP munmap(_jit->code.ptr, _jit->code.length); @@ -1738,7 +1755,8 @@ _jit_emit(jit_state_t *_jit) assert(_jit->code.ptr != MAP_FAILED); _jit->code.length = length; - _jitc->code.end = _jit->code.ptr + _jit->code.length - 64; + _jitc->code.end = _jit->code.ptr + _jit->code.length - + jit_get_max_instr(); _jit->pc.uc = _jit->code.ptr; _jitc->patches.offset = 0; } |