From 22d06620ee225d6003f5a29fd6f91873637a6575 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Wed, 3 Apr 2019 15:25:21 +0200 Subject: [PATCH 1/2] Allow users to pass custom allocators --- lightening.h | 15 ++++++++++++++- lightening/lightening.c | 13 ++++++++++--- tests/test.h | 2 +- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/lightening.h b/lightening.h index da1d4ec68..5331a8de7 100644 --- a/lightening.h +++ b/lightening.h @@ -110,6 +110,18 @@ typedef struct jit_reloc #define jit_class(bits) ((bits) & 0xffff0000) #define jit_regno(bits) ((bits) & 0x00007fff) +static inline jit_bool_t +jit_gpr_is_callee_save (jit_gpr_t reg) +{ + return jit_class(reg.bits) & jit_class_sav; +} + +static inline jit_bool_t +jit_fpr_is_callee_save (jit_fpr_t reg) +{ + return jit_class(reg.bits) & jit_class_sav; +} + typedef struct jit_state jit_state_t; enum jit_arg_loc { @@ -155,7 +167,8 @@ typedef union jit_anyreg JIT_API jit_bool_t init_jit(void); -JIT_API jit_state_t *jit_new_state(void); +JIT_API jit_state_t *jit_new_state(void* (*alloc_fn)(size_t), + void (*free_fn)(void*)); JIT_API void jit_destroy_state(jit_state_t*); JIT_API void jit_begin(jit_state_t*, uint8_t*, size_t); diff --git a/lightening/lightening.c b/lightening/lightening.c index afb0b11ee..7b46d4fcc 100644 --- a/lightening/lightening.c +++ b/lightening/lightening.c @@ -137,6 +137,8 @@ struct jit_state uint8_t temp_gpr_saved; uint8_t temp_fpr_saved; uint8_t overflow; + void* (*alloc)(size_t); + void (*free)(void*); }; enum jit_reloc_flags @@ -177,13 +179,18 @@ init_jit(void) } jit_state_t * -jit_new_state(void) +jit_new_state(void* (*alloc_fn)(size_t), void (*free_fn)(void*)) { - jit_state_t *_jit = malloc (sizeof (*_jit)); + if (!alloc_fn) alloc_fn = malloc; + if (!free_fn) free_fn = free; + + jit_state_t *_jit = alloc_fn (sizeof (*_jit)); if (!_jit) abort (); memset(_jit, 0, sizeof (*_jit)); + _jit->alloc = alloc_fn; + _jit->free = free_fn; if (!jit_init (_jit)); @@ -193,7 +200,7 @@ jit_new_state(void) void jit_destroy_state(jit_state_t *_jit) { - free (_jit); + _jit->free (_jit); } jit_pointer_t diff --git a/tests/test.h b/tests/test.h index d2d7ec72d..578709f03 100644 --- a/tests/test.h +++ b/tests/test.h @@ -18,7 +18,7 @@ main_helper (int argc, char *argv[], void (*run_test)(jit_state_t*, uint8_t*, size_t)) { ASSERT(init_jit()); - jit_state_t *j = jit_new_state(); + jit_state_t *j = jit_new_state (NULL, NULL); ASSERT(j); const size_t arena_size = 4096; From f9da599ef552553052561c76506a55d7608b8ad1 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Wed, 3 Apr 2019 17:37:18 +0200 Subject: [PATCH 2/2] Fix jit_reset to be useful --- lightening/lightening.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lightening/lightening.c b/lightening/lightening.c index 7b46d4fcc..11cc3735f 100644 --- a/lightening/lightening.c +++ b/lightening/lightening.c @@ -214,9 +214,9 @@ jit_begin(jit_state_t *_jit, uint8_t* buf, size_t length) { ASSERT (!_jit->start); - _jit->start = buf; + _jit->pc.uc = _jit->start = buf; _jit->limit = buf + length; - jit_reset(_jit); + _jit->overflow = 0; } jit_bool_t @@ -230,7 +230,7 @@ void jit_reset(jit_state_t *_jit) { ASSERT (_jit->start); - _jit->pc.uc = _jit->start; + _jit->pc.uc = _jit->start = _jit->limit = NULL; _jit->overflow = 0; }