diff options
author | Camil Staps | 2018-12-24 14:15:16 +0100 |
---|---|---|
committer | Camil Staps | 2018-12-24 14:15:16 +0100 |
commit | f31b200b58e994b7505707931d4278e3f61cc2d6 (patch) | |
tree | 372f4c08e9d35751a205ac965acc7385ff0c207c /sjit_c.c | |
parent | Use 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.c | 35 |
1 files changed, 23 insertions, 12 deletions
@@ -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)(); } |