wingo pushed a commit to branch master in repository guile. commit 44b07aef4b893af7057a4a25edea56a7c8346a79 Author: Andy Wingo <wi...@igalia.com> AuthorDate: Thu Jul 30 13:36:24 2020 +0200
Allow jit_begin_data to declare max data size * lightening.h: * lightening/lightening.c (jit_begin_data): Add max data size parameter. If nonzero, can allow the JIT to avoid prematurely emitting a constant pool. (jit_end_data): Allow pending literals. * tests/jmp_table.c (run_test): Use new API. --- lightening.h | 2 +- lightening/lightening.c | 16 ++++++++-------- tests/jmp_table.c | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lightening.h b/lightening.h index 020c479..efa5dfd 100644 --- a/lightening.h +++ b/lightening.h @@ -661,7 +661,7 @@ FOR_EACH_INSTRUCTION(DECLARE_INSTRUCTION) # define jit_truncr_f(j,u,v) jit_truncr_f_l(j,u,v) #endif -void jit_begin_data(jit_state_t *); +void jit_begin_data(jit_state_t *, size_t max_size_or_zero); void jit_end_data(jit_state_t *); void jit_emit_u8(jit_state_t *, uint8_t); void jit_emit_u16(jit_state_t *, uint16_t); diff --git a/lightening/lightening.c b/lightening/lightening.c index 775b2b6..97f4de0 100644 --- a/lightening/lightening.c +++ b/lightening/lightening.c @@ -484,12 +484,16 @@ jit_patch_there(jit_state_t* _jit, jit_reloc_t reloc, jit_pointer_t addr) } void -jit_begin_data(jit_state_t *j) +jit_begin_data(jit_state_t *j, size_t max_size_or_zero) { #ifdef JIT_NEEDS_LITERAL_POOL - if (j->pool->size) - emit_literal_pool(j, NO_GUARD_NEEDED); - ASSERT(j->overflow || j->pool->size == 0); + if (j->pool->size) { + uint8_t *deadline = j->start + j->pool->deadline; + // Emit a literal pool now if the data might overwrite the deadline. + // Emitting data won't add entries to the pool. + if (max_size_or_zero == 0 || j->pc.uc + max_size_or_zero >= deadline) + emit_literal_pool(j, NO_GUARD_NEEDED); + } #endif ASSERT(!j->emitting_data); @@ -499,10 +503,6 @@ jit_begin_data(jit_state_t *j) void jit_end_data(jit_state_t *j) { -#ifdef JIT_NEEDS_LITERAL_POOL - ASSERT(j->overflow || j->pool->size == 0); -#endif - ASSERT(j->emitting_data); j->emitting_data = 0; } diff --git a/tests/jmp_table.c b/tests/jmp_table.c index 6d86b65..f90ab16 100644 --- a/tests/jmp_table.c +++ b/tests/jmp_table.c @@ -17,7 +17,7 @@ run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size) jit_ldxr(j, JIT_R1, JIT_R1, JIT_R0); jit_jmpr(j, JIT_R1); - jit_begin_data (j); + jit_begin_data (j, (NTARGETS + 1) * sizeof(intptr_t)); jit_align(j, sizeof(intptr_t)); jit_patch_here(j, table); jit_reloc_t targets[NTARGETS];