summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@ginger.bigkitten.com>2008-05-15 11:53:12 -0700
committerDavid Schleef <ds@ginger.bigkitten.com>2008-05-15 11:53:12 -0700
commit5794b192bb6c9bab8654d1113b6097d35a4f6c82 (patch)
tree96df6df078bc2642bb98268a6ad072f103fe6e25
parent1501bac739641b8a5bf91a16dae3a849f7544d33 (diff)
downloadliboil-5794b192bb6c9bab8654d1113b6097d35a4f6c82.tar.gz
jit: rearrange code
-rw-r--r--examples/jit/Makefile.am3
-rw-r--r--examples/jit/ojprogram-linux.c57
-rw-r--r--examples/jit/ojprogram-x86.c92
-rw-r--r--examples/jit/ojprogram.c48
-rw-r--r--examples/jit/ojprogram.h2
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