aboutsummaryrefslogtreecommitdiff
path: root/sjit_c.c
diff options
context:
space:
mode:
authorCamil Staps2018-12-24 14:15:16 +0100
committerCamil Staps2018-12-24 14:15:16 +0100
commitf31b200b58e994b7505707931d4278e3f61cc2d6 (patch)
tree372f4c08e9d35751a205ac965acc7385ff0c207c /sjit_c.c
parentUse rcx as scratch register, since it is caller-saved in the System V and Mic... (diff)
Iterative development
Diffstat (limited to 'sjit_c.c')
-rw-r--r--sjit_c.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/sjit_c.c b/sjit_c.c
index 50e8f57..879ec18 100644
--- a/sjit_c.c
+++ b/sjit_c.c
@@ -106,7 +106,7 @@ static inline void gen_instr(char *full_code, char **code_p, uint64_t **pgm_p, u
case Call:
arg=pgm[1];
#ifdef DEBUG_JIT_INSTRUCTIONS
- fprintf(stderr,"Call %lu -> %d\n",arg,mapping[arg]-(&code[5]-full_code));
+ fprintf(stderr,"Call %lu -> %d\n",arg,mapping[arg]-(uint32_t)(&code[5]-full_code));
#endif
code[0]='\xe8'; /* callq ARG */
*(uint32_t*)&code[1]=mapping[arg]-(&code[5]-full_code);
@@ -181,15 +181,20 @@ static inline void gen_instr(char *full_code, char **code_p, uint64_t **pgm_p, u
*pgm_p=pgm;
}
-unsigned int jit(uint64_t *pgm) {
+void init_jit(uint64_t max_instrs, uint64_t max_code_len,
+ char **code_block, uint32_t **mapping) {
+ *code_block=mmap (NULL,max_code_len,PROT_READ | PROT_EXEC,MAP_ANONYMOUS | MAP_PRIVATE,0,0);
+ *mapping=malloc (max_instrs*sizeof(uint32_t));
+}
+
+char *jit_append(char *code_block, uint32_t code_len, char *code_ptr,
+ uint32_t *mapping, uint32_t n_instr, uint64_t *pgm, int is_main) {
uint32_t len=*pgm++;
uint32_t i;
-
- uint32_t *mapping=malloc(len*sizeof(uint32_t));
- uint32_t code_i=0;
+ uint32_t code_i=code_ptr-code_block;
uint64_t *pgm_p=pgm;
- for (i=0; i<len; i++) {
+ for (i=n_instr; i<n_instr+len; i++) {
enum instr instr=(enum instr)*pgm_p;
mapping[i]=code_i;
@@ -209,14 +214,20 @@ unsigned int jit(uint64_t *pgm) {
}
}
- char *code=mmap(NULL, code_i, PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
- char *code_wr=code;
+ mprotect (code_block,code_len,PROT_WRITE);
+
+ if (is_main)
+ *(uint32_t*)&code_block[9]=code_ptr-code_block-13;
+
pgm_p=pgm;
for (i=0; i<len; i++)
- gen_instr(code, &code_wr, &pgm_p, mapping);
+ gen_instr (code_block,&code_ptr,&pgm_p,mapping);
+
+ mprotect (code_block,code_len,PROT_READ | PROT_EXEC);
- mprotect(code, code_i, PROT_READ | PROT_EXEC);
- int (*fun)(void) = (int(*)(void)) code;
+ return code_ptr;
+}
- return fun();
+uint64_t jit_exec(char *code_block) {
+ return ((uint64_t(*)(void))code_block)();
}