diff options
author | David Schleef <ds@ginger.bigkitten.com> | 2008-05-15 11:53:12 -0700 |
---|---|---|
committer | David Schleef <ds@ginger.bigkitten.com> | 2008-05-15 11:53:12 -0700 |
commit | 5794b192bb6c9bab8654d1113b6097d35a4f6c82 (patch) | |
tree | 96df6df078bc2642bb98268a6ad072f103fe6e25 | |
parent | 1501bac739641b8a5bf91a16dae3a849f7544d33 (diff) | |
download | liboil-5794b192bb6c9bab8654d1113b6097d35a4f6c82.tar.gz |
jit: rearrange code
-rw-r--r-- | examples/jit/Makefile.am | 3 | ||||
-rw-r--r-- | examples/jit/ojprogram-linux.c | 57 | ||||
-rw-r--r-- | examples/jit/ojprogram-x86.c | 92 | ||||
-rw-r--r-- | examples/jit/ojprogram.c | 48 | ||||
-rw-r--r-- | examples/jit/ojprogram.h | 2 |
5 files changed, 110 insertions, 92 deletions
diff --git a/examples/jit/Makefile.am b/examples/jit/Makefile.am index 8c62260..c2b9972 100644 --- a/examples/jit/Makefile.am +++ b/examples/jit/Makefile.am @@ -10,5 +10,6 @@ jit_SOURCES = jit.c \ ojprogram.c \ ojprogram-x86.c \ ojprogram.h \ - ojopcodes.c + ojopcodes.c \ + ojprogram-linux.c diff --git a/examples/jit/ojprogram-linux.c b/examples/jit/ojprogram-linux.c new file mode 100644 index 0000000..8991da2 --- /dev/null +++ b/examples/jit/ojprogram-linux.c @@ -0,0 +1,57 @@ + +#include "config.h" + +#include <glib.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#include <unistd.h> +#include <sys/types.h> +#include <sys/mman.h> + +#include "ojprogram.h" + +#define SIZE 65536 + + +void +oj_program_allocate_codemem (OJProgram *program) +{ + char *filename; + int fd; + GError *error = NULL; + + fd = g_file_open_tmp ("liboilexecXXXXXX", &filename, &error); + if (fd == -1) { + /* FIXME oh crap */ + g_print("failed to create temp file\n"); + program->error = TRUE; + return; + } + unlink (filename); + g_free (filename); + + ftruncate (fd, SIZE); + + program->code = mmap (NULL, SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (program->code == MAP_FAILED) { + /* FIXME oh crap */ + g_print("failed to create write map\n"); + program->error = TRUE; + return; + } + program->code_exec = mmap (NULL, SIZE, PROT_READ|PROT_EXEC, MAP_SHARED, fd, 0); + if (program->code_exec == MAP_FAILED) { + /* FIXME oh crap */ + g_print("failed to create exec map\n"); + program->error = TRUE; + return; + } + + close (fd); + + program->code_size = SIZE; + program->codeptr = program->code; +} + diff --git a/examples/jit/ojprogram-x86.c b/examples/jit/ojprogram-x86.c index 1911b9f..ed121dc 100644 --- a/examples/jit/ojprogram-x86.c +++ b/examples/jit/ojprogram-x86.c @@ -32,8 +32,6 @@ void x86_emit_modrm_memoffset (OJProgram *program, int reg1, int offset, int reg void x86_emit_modrm_reg (OJProgram *program, int reg1, int reg2); void x86_test (OJProgram *program); -void oj_program_dump_code (OJProgram *program); - enum { X86_EAX = OJ_GP_REG_BASE, X86_ECX, @@ -228,6 +226,7 @@ oj_program_compile_x86 (OJProgram *program) X86_EBP); } } + x86_emit_dec_memoffset (program, 4, (int)G_STRUCT_OFFSET(OJExecutor,counter), X86_EBP); x86_emit_jne (program, 0); @@ -244,44 +243,6 @@ oj_program_compile_x86 (OJProgram *program) } -void -oj_program_dump (OJProgram *program) -{ - int i; - int j; - OJOpcode *opcode; - OJInstruction *insn; - - for(i=0;i<program->n_insns;i++){ - insn = program->insns + i; - opcode = insn->opcode; - - g_print("insn: %d\n", i); - g_print(" opcode: %s\n", opcode->name); - - for(j=0;j<opcode->n_dest;j++){ - g_print(" dest%d: %d %s\n", j, insn->args[j], - program->vars[insn->args[j]].name); - } - for(j=0;j<opcode->n_src;j++){ - g_print(" src%d: %d %s\n", j, insn->args[opcode->n_dest + j], - program->vars[insn->args[opcode->n_dest + j]].name); - } - - g_print("\n"); - } - - for(i=0;i<program->n_vars;i++){ - g_print("var: %d %s\n", i, program->vars[i].name); - g_print("first_use: %d\n", program->vars[i].first_use); - g_print("last_use: %d\n", program->vars[i].last_use); - - g_print("\n"); - } - -} - - /* rules */ static void @@ -368,60 +329,9 @@ oj_program_x86_register_rules (OJRuleList *list) } -void -oj_program_allocate_codemem (OJProgram *program) -{ - char *filename; - int fd; - GError *error = NULL; - - fd = g_file_open_tmp ("liboilexecXXXXXX", &filename, &error); - if (fd == -1) { - /* FIXME oh crap */ - g_print("failed to create temp file\n"); - program->error = TRUE; - return; - } - unlink (filename); - g_free (filename); - - ftruncate (fd, SIZE); - - program->code = mmap (NULL, SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); - if (program->code == MAP_FAILED) { - /* FIXME oh crap */ - g_print("failed to create write map\n"); - program->error = TRUE; - return; - } - program->code_exec = mmap (NULL, SIZE, PROT_READ|PROT_EXEC, MAP_SHARED, fd, 0); - if (program->code_exec == MAP_FAILED) { - /* FIXME oh crap */ - g_print("failed to create exec map\n"); - program->error = TRUE; - return; - } - - close (fd); - - program->codeptr = program->code; -} - - /* code generation */ void -oj_program_dump_code (OJProgram *program) -{ - FILE *file; - - file = fopen("dump","w"); - - fwrite (program->code, 1, program->codeptr - program->code, file); - fclose (file); -} - -void x86_emit_push (OJProgram *program, int size, int reg) { diff --git a/examples/jit/ojprogram.c b/examples/jit/ojprogram.c index a6b0ff4..688d44a 100644 --- a/examples/jit/ojprogram.c +++ b/examples/jit/ojprogram.c @@ -401,3 +401,51 @@ oj_program_rewrite_vars (OJProgram *program) } +void +oj_program_dump_code (OJProgram *program) +{ + FILE *file; + + file = fopen("dump","w"); + + fwrite (program->code, 1, program->codeptr - program->code, file); + fclose (file); +} + +void +oj_program_dump (OJProgram *program) +{ + int i; + int j; + OJOpcode *opcode; + OJInstruction *insn; + + for(i=0;i<program->n_insns;i++){ + insn = program->insns + i; + opcode = insn->opcode; + + g_print("insn: %d\n", i); + g_print(" opcode: %s\n", opcode->name); + + for(j=0;j<opcode->n_dest;j++){ + g_print(" dest%d: %d %s\n", j, insn->args[j], + program->vars[insn->args[j]].name); + } + for(j=0;j<opcode->n_src;j++){ + g_print(" src%d: %d %s\n", j, insn->args[opcode->n_dest + j], + program->vars[insn->args[opcode->n_dest + j]].name); + } + + g_print("\n"); + } + + for(i=0;i<program->n_vars;i++){ + g_print("var: %d %s\n", i, program->vars[i].name); + g_print("first_use: %d\n", program->vars[i].first_use); + g_print("last_use: %d\n", program->vars[i].last_use); + + g_print("\n"); + } + +} + diff --git a/examples/jit/ojprogram.h b/examples/jit/ojprogram.h index 6ee1710..c755b3e 100644 --- a/examples/jit/ojprogram.h +++ b/examples/jit/ojprogram.h @@ -95,6 +95,7 @@ struct _OJProgram { unsigned char *code; void *code_exec; unsigned char *codeptr; + int code_size; OJFixup fixups[100]; int n_fixups; @@ -177,6 +178,7 @@ void oj_rule_list_register (OJRuleList *rule_list, const char *op_name, OJRule * oj_rule_list_get (OJRuleList *rule_list, OJOpcode *opcode); void oj_program_x86_register_rules (OJRuleList *rule_list); void oj_program_allocate_codemem (OJProgram *program); +void oj_program_dump_code (OJProgram *program); #endif |