mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-19 03:00:25 +02:00
"extern"-related cleanup, and further implementation
This commit is contained in:
parent
0d78447d85
commit
47970773bc
6 changed files with 67 additions and 58 deletions
46
jit.h
46
jit.h
|
@ -47,6 +47,12 @@ typedef intptr_t jit_imm_t;
|
||||||
typedef uintptr_t jit_uimm_t;
|
typedef uintptr_t jit_uimm_t;
|
||||||
typedef struct jit_reloc *jit_reloc_t;
|
typedef struct jit_reloc *jit_reloc_t;
|
||||||
|
|
||||||
|
#if defined(__GNUC__) && (__GNUC__ >= 4)
|
||||||
|
# define JIT_API extern __attribute__ ((__visibility__("hidden")))
|
||||||
|
#else
|
||||||
|
# define JIT_API extern
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__i386__) || defined(__x86_64__)
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
# include "jit/x86.h"
|
# include "jit/x86.h"
|
||||||
#elif defined(__mips__)
|
#elif defined(__mips__)
|
||||||
|
@ -105,39 +111,39 @@ typedef struct jit_arg
|
||||||
} loc;
|
} loc;
|
||||||
} jit_arg_t;
|
} jit_arg_t;
|
||||||
|
|
||||||
extern void init_jit(void);
|
JIT_API void init_jit(void);
|
||||||
|
|
||||||
extern jit_state_t *jit_new_state(void);
|
JIT_API jit_state_t *jit_new_state(void);
|
||||||
extern void jit_destroy_state(jit_state_t*);
|
JIT_API void jit_destroy_state(jit_state_t*);
|
||||||
|
|
||||||
extern void jit_begin(jit_state_t*, jit_addr_t, size_t);
|
JIT_API void jit_begin(jit_state_t*, jit_addr_t, size_t);
|
||||||
extern void jit_reset(jit_state_t*);
|
JIT_API void jit_reset(jit_state_t*);
|
||||||
extern jit_addr_t jit_end(jit_state_t*, size_t*);
|
JIT_API jit_addr_t jit_end(jit_state_t*, size_t*);
|
||||||
|
|
||||||
extern void jit_align(jit_state_t*, unsigned);
|
JIT_API void jit_align(jit_state_t*, unsigned);
|
||||||
extern void jit_allocai(jit_state_t*, size_t);
|
JIT_API void jit_allocai(jit_state_t*, size_t);
|
||||||
extern void jit_allocar(jit_state_t*, jit_gpr_t, jit_gpr_t);
|
JIT_API void jit_allocar(jit_state_t*, jit_gpr_t, jit_gpr_t);
|
||||||
|
|
||||||
extern jit_pointer_t jit_address(jit_state_t*);
|
JIT_API jit_pointer_t jit_address(jit_state_t*);
|
||||||
extern void jit_patch_here(jit_state_t*, jit_reloc_t);
|
JIT_API void jit_patch_here(jit_state_t*, jit_reloc_t);
|
||||||
extern void jit_patch_there(jit_state_t*, jit_reloc_t, jit_pointer_t);
|
JIT_API void jit_patch_there(jit_state_t*, jit_reloc_t, jit_pointer_t);
|
||||||
|
|
||||||
extern void jit_calli(jit_state_t *, jit_pointer_t f,
|
JIT_API void jit_calli(jit_state_t *, jit_pointer_t f,
|
||||||
size_t argc, const jit_arg_t *argv);
|
size_t argc, const jit_arg_t *argv);
|
||||||
extern void jit_callr(jit_state_t *, jit_gpr_t f,
|
JIT_API void jit_callr(jit_state_t *, jit_gpr_t f,
|
||||||
size_t argc, const jit_arg_t *argv);
|
size_t argc, const jit_arg_t *argv);
|
||||||
extern void jit_receive(jit_state_t*, size_t argc, jit_arg_t *argv);
|
JIT_API void jit_receive(jit_state_t*, size_t argc, jit_arg_t *argv);
|
||||||
|
|
||||||
#define JIT_PROTO_0(stem, ret) \
|
#define JIT_PROTO_0(stem, ret) \
|
||||||
extern ret jit_##stem (jit_state_t*)
|
JIT_API ret jit_##stem (jit_state_t*)
|
||||||
#define JIT_PROTO_1(stem, ret, a) \
|
#define JIT_PROTO_1(stem, ret, a) \
|
||||||
extern ret jit_##stem (jit_state_t*, jit_##a##_t)
|
JIT_API ret jit_##stem (jit_state_t*, jit_##a##_t)
|
||||||
#define JIT_PROTO_2(stem, ret, a, b) \
|
#define JIT_PROTO_2(stem, ret, a, b) \
|
||||||
extern ret jit_##stem (jit_state_t*, jit_##a##_t, jit_##b##_t)
|
JIT_API ret jit_##stem (jit_state_t*, jit_##a##_t, jit_##b##_t)
|
||||||
#define JIT_PROTO_3(stem, ret, a, b, c) \
|
#define JIT_PROTO_3(stem, ret, a, b, c) \
|
||||||
extern ret jit_##stem (jit_state_t*, jit_##a##_t, jit_##b##_t, jit_##c##_t)
|
JIT_API ret jit_##stem (jit_state_t*, jit_##a##_t, jit_##b##_t, jit_##c##_t)
|
||||||
#define JIT_PROTO_4(stem, ret, a, b, c, d) \
|
#define JIT_PROTO_4(stem, ret, a, b, c, d) \
|
||||||
extern ret jit_##stem (jit_state_t*, jit_##a##_t, jit_##b##_t, jit_##c##_t, jit_##d##_t)
|
JIT_API ret jit_##stem (jit_state_t*, jit_##a##_t, jit_##b##_t, jit_##c##_t, jit_##d##_t)
|
||||||
|
|
||||||
#define JIT_PROTO_RFF__(stem) JIT_PROTO_2(stem, jit_reloc_t, fpr, fpr)
|
#define JIT_PROTO_RFF__(stem) JIT_PROTO_2(stem, jit_reloc_t, fpr, fpr)
|
||||||
#define JIT_PROTO_RGG__(stem) JIT_PROTO_2(stem, jit_reloc_t, gpr, gpr)
|
#define JIT_PROTO_RGG__(stem) JIT_PROTO_2(stem, jit_reloc_t, gpr, gpr)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2012-2017 Free Software Foundation, Inc.
|
* Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This file is part of GNU lightning.
|
* This file is part of GNU lightning.
|
||||||
*
|
*
|
||||||
|
@ -474,7 +474,7 @@ __aeabi_f2d(float u)
|
||||||
return (u);
|
return (u);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int
|
int
|
||||||
__aeabi_f2iz(float u)
|
__aeabi_f2iz(float u)
|
||||||
{
|
{
|
||||||
return (u);
|
return (u);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2012-2017 Free Software Foundation, Inc.
|
* Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This file is part of GNU lightning.
|
* This file is part of GNU lightning.
|
||||||
*
|
*
|
||||||
|
@ -122,6 +122,6 @@ typedef struct {
|
||||||
/*
|
/*
|
||||||
* Initialization
|
* Initialization
|
||||||
*/
|
*/
|
||||||
extern jit_cpu_t jit_cpu;
|
JIT_API jit_cpu_t jit_cpu;
|
||||||
|
|
||||||
#endif /* _jit_arm_h */
|
#endif /* _jit_arm_h */
|
||||||
|
|
21
jit/jit.c
21
jit/jit.c
|
@ -41,9 +41,12 @@
|
||||||
#define jit_regload_isdead 2 /* delete and unset live bit */
|
#define jit_regload_isdead 2 /* delete and unset live bit */
|
||||||
|
|
||||||
|
|
||||||
/*
|
static void jit_get_cpu(void);
|
||||||
* Implementation
|
static void jit_flush(jit_state_t *, const char *, const char *);
|
||||||
*/
|
static void jit_nop(jit_state_t *, unsigned);
|
||||||
|
static void jit_patch(jit_state_t *, const uint8_t *loc, const uint8_t *addr);
|
||||||
|
static void jit_patch_last(jit_state_t *, const uint8_t *loc, const uint8_t *addr);
|
||||||
|
|
||||||
void
|
void
|
||||||
init_jit(void)
|
init_jit(void)
|
||||||
{
|
{
|
||||||
|
@ -134,18 +137,20 @@ jit_align(jit_state_t *_jit, unsigned align)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
jit_patch_here(jit_state_t *_jit, jit_reloc_t *reloc)
|
jit_patch_here(jit_state_t *_jit, jit_reloc_t reloc)
|
||||||
{
|
{
|
||||||
jit_patch_there (_jit, reloc, jit_address (_jit));
|
jit_patch_there (_jit, reloc, jit_address (_jit));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
jit_patch_there(jit_state_t* _jit, jit_reloc_t *reloc, jit_pointer_t *addr)
|
jit_patch_there(jit_state_t* _jit, jit_reloc_t reloc, jit_pointer_t addr)
|
||||||
{
|
{
|
||||||
if (reloc == _jit->last_instruction)
|
const uint8_t *loc = jit_reloc_instruction (reloc);
|
||||||
jit_patch_last (_jit, reloc, addr);
|
|
||||||
|
if (loc == _jit->last_instruction_start)
|
||||||
|
jit_patch_last (_jit, loc, addr);
|
||||||
else
|
else
|
||||||
jit_patch (_jit, reloc, addr);
|
jit_patch (_jit, loc, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__i386__) || defined(__x86_64__)
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
|
|
|
@ -130,34 +130,32 @@
|
||||||
* returned by a "user" call
|
* returned by a "user" call
|
||||||
* to jit_get_reg() */
|
* to jit_get_reg() */
|
||||||
|
|
||||||
/*
|
struct jit_state
|
||||||
* Types
|
{
|
||||||
*/
|
union {
|
||||||
typedef struct jit_register jit_register_t;
|
uint8_t *uc;
|
||||||
|
uint16_t *us;
|
||||||
struct jit_state {
|
uint32_t *ui;
|
||||||
union {
|
uint64_t *ul;
|
||||||
uint8_t *uc;
|
intptr_t w;
|
||||||
uint16_t *us;
|
uintptr_t uw;
|
||||||
uint32_t *ui;
|
} pc;
|
||||||
uint64_t *ul;
|
uint8_t *start;
|
||||||
jit_word_t w;
|
uint8_t *last_instruction_start;
|
||||||
} pc;
|
uint8_t *end;
|
||||||
struct {
|
|
||||||
uint8_t *ptr;
|
|
||||||
uint8_t *end;
|
|
||||||
jit_word_t length;
|
|
||||||
} code;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct jit_register {
|
struct jit_register
|
||||||
jit_reg_t spec;
|
{
|
||||||
char *name;
|
jit_reg_t spec;
|
||||||
|
char *name;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void jit_get_cpu(void);
|
typedef struct jit_register jit_register_t;
|
||||||
extern void jit_flush(void *fptr, void *tptr);
|
|
||||||
|
|
||||||
extern jit_register_t _rvs[];
|
static void jit_get_cpu(void);
|
||||||
|
static void jit_flush(void *fptr, void *tptr);
|
||||||
|
|
||||||
|
static jit_register_t _rvs[];
|
||||||
|
|
||||||
#endif /* _jit_private_h */
|
#endif /* _jit_private_h */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2012-2017 Free Software Foundation, Inc.
|
* Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This file is part of GNU lightning.
|
* This file is part of GNU lightning.
|
||||||
*
|
*
|
||||||
|
@ -194,6 +194,6 @@ typedef struct {
|
||||||
/*
|
/*
|
||||||
* Initialization
|
* Initialization
|
||||||
*/
|
*/
|
||||||
extern jit_cpu_t jit_cpu;
|
JIT_API jit_cpu_t jit_cpu;
|
||||||
|
|
||||||
#endif /* _jit_x86_h */
|
#endif /* _jit_x86_h */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue