1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-30 06:50:31 +02:00

Merge from upstream Lightening

This commit is contained in:
Andy Wingo 2019-04-03 17:38:00 +02:00
commit 9f22ec9e2d
3 changed files with 28 additions and 8 deletions

View file

@ -110,6 +110,18 @@ typedef struct jit_reloc
#define jit_class(bits) ((bits) & 0xffff0000) #define jit_class(bits) ((bits) & 0xffff0000)
#define jit_regno(bits) ((bits) & 0x00007fff) #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; typedef struct jit_state jit_state_t;
enum jit_arg_loc enum jit_arg_loc
{ {
@ -155,7 +167,8 @@ typedef union jit_anyreg
JIT_API jit_bool_t init_jit(void); 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_destroy_state(jit_state_t*);
JIT_API void jit_begin(jit_state_t*, uint8_t*, size_t); JIT_API void jit_begin(jit_state_t*, uint8_t*, size_t);

View file

@ -137,6 +137,8 @@ struct jit_state
uint8_t temp_gpr_saved; uint8_t temp_gpr_saved;
uint8_t temp_fpr_saved; uint8_t temp_fpr_saved;
uint8_t overflow; uint8_t overflow;
void* (*alloc)(size_t);
void (*free)(void*);
}; };
enum jit_reloc_flags enum jit_reloc_flags
@ -177,13 +179,18 @@ init_jit(void)
} }
jit_state_t * 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) if (!_jit)
abort (); abort ();
memset(_jit, 0, sizeof (*_jit)); memset(_jit, 0, sizeof (*_jit));
_jit->alloc = alloc_fn;
_jit->free = free_fn;
if (!jit_init (_jit)); if (!jit_init (_jit));
@ -193,7 +200,7 @@ jit_new_state(void)
void void
jit_destroy_state(jit_state_t *_jit) jit_destroy_state(jit_state_t *_jit)
{ {
free (_jit); _jit->free (_jit);
} }
jit_pointer_t jit_pointer_t
@ -207,9 +214,9 @@ jit_begin(jit_state_t *_jit, uint8_t* buf, size_t length)
{ {
ASSERT (!_jit->start); ASSERT (!_jit->start);
_jit->start = buf; _jit->pc.uc = _jit->start = buf;
_jit->limit = buf + length; _jit->limit = buf + length;
jit_reset(_jit); _jit->overflow = 0;
} }
jit_bool_t jit_bool_t
@ -223,7 +230,7 @@ void
jit_reset(jit_state_t *_jit) jit_reset(jit_state_t *_jit)
{ {
ASSERT (_jit->start); ASSERT (_jit->start);
_jit->pc.uc = _jit->start; _jit->pc.uc = _jit->start = _jit->limit = NULL;
_jit->overflow = 0; _jit->overflow = 0;
} }

View file

@ -18,7 +18,7 @@ main_helper (int argc, char *argv[],
void (*run_test)(jit_state_t*, uint8_t*, size_t)) void (*run_test)(jit_state_t*, uint8_t*, size_t))
{ {
ASSERT(init_jit()); ASSERT(init_jit());
jit_state_t *j = jit_new_state(); jit_state_t *j = jit_new_state (NULL, NULL);
ASSERT(j); ASSERT(j);
const size_t arena_size = 4096; const size_t arena_size = 4096;