diff options
author | David Schleef <ds@ginger.bigkitten.com> | 2008-05-15 18:36:32 -0700 |
---|---|---|
committer | David Schleef <ds@ginger.bigkitten.com> | 2008-05-15 18:36:32 -0700 |
commit | ee71e629d30f76205c21ac7323b93e9181de11d8 (patch) | |
tree | d959b88e4ad197af874659b7a99b70becef5300b | |
parent | c003f17b82ed66f7879a83519d19ac81207c07ce (diff) | |
download | liboil-ee71e629d30f76205c21ac7323b93e9181de11d8.tar.gz |
[orc] fix valgrind problems
-rw-r--r-- | examples/orc/Makefile.am | 4 | ||||
-rw-r--r-- | examples/orc/jit.c | 9 | ||||
-rw-r--r-- | examples/orc/simple.c | 74 | ||||
-rw-r--r-- | orc/Makefile.am | 1 | ||||
-rw-r--r-- | orc/orc.c | 20 | ||||
-rw-r--r-- | orc/orcexecutor.c | 4 | ||||
-rw-r--r-- | orc/orcprogram-x86.c | 15 | ||||
-rw-r--r-- | orc/orcprogram.c | 13 | ||||
-rw-r--r-- | orc/orcprogram.h | 5 | ||||
-rw-r--r-- | orc/orcrule.c | 6 |
10 files changed, 137 insertions, 14 deletions
diff --git a/examples/orc/Makefile.am b/examples/orc/Makefile.am index 7d3bfc0..9023579 100644 --- a/examples/orc/Makefile.am +++ b/examples/orc/Makefile.am @@ -1,8 +1,10 @@ -noinst_PROGRAMS = jit +noinst_PROGRAMS = jit simple AM_LDFLAGS = $(ORC_LIBS) $(GLIB_LIBS) AM_CFLAGS = $(ORC_CFLAGS) $(GLIB_CFLAGS) jit_SOURCES = jit.c +simple_SOURCES = simple.c + diff --git a/examples/orc/jit.c b/examples/orc/jit.c index 4e9b1fc..35df92c 100644 --- a/examples/orc/jit.c +++ b/examples/orc/jit.c @@ -24,7 +24,7 @@ main (int argc, char *argv[]) int s1, s2, d1, offset, shift; int t1; - orc_opcode_init (); + orc_init (); p = orc_program_new (); @@ -50,15 +50,13 @@ main (int argc, char *argv[]) if (0) { int i; - void (*func) (OrcExecutor *); for(i=0;i<N;i++){ src1[i] = rand()&0xf; src2[i] = rand()&0xf; } - func = p->code_exec; - func (ex); + orc_executor_run (ex); //orc_executor_emulate (ex); for(i=0;i<N;i++){ @@ -67,6 +65,9 @@ main (int argc, char *argv[]) } } + orc_executor_free (ex); + orc_program_free (p); + return 0; } diff --git a/examples/orc/simple.c b/examples/orc/simple.c new file mode 100644 index 0000000..d505c41 --- /dev/null +++ b/examples/orc/simple.c @@ -0,0 +1,74 @@ + +#include "config.h" + +#include <glib.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#include <orc/orcprogram.h> + +#define N 10 + +int16_t src1[N]; +int16_t src2[N]; +int16_t dest[N]; + +void test1(void); + +int +main (int argc, char *argv[]) +{ + orc_init (); + + test1(); + exit(0); +} + + +void +test1(void) +{ + OrcProgram *p; + OrcExecutor *ex; + int s1, s2, d1; + + + p = orc_program_new (); + + d1 = orc_program_add_destination (p, "s16", "d1"); + s1 = orc_program_add_source (p, "s16", "s1"); + s2 = orc_program_add_source (p, "s16", "s2"); + + orc_program_append (p, "add_s16", d1, s1, s2); + + orc_program_compile_x86 (p); + + ex = orc_executor_new (p); + orc_executor_set_n (ex, N); + orc_executor_set_array (ex, s1, src1); + orc_executor_set_array (ex, s2, src2); + orc_executor_set_array (ex, d1, dest); + + if (1) { + int i; + + for(i=0;i<N;i++){ + src1[i] = rand()&0xf; + src2[i] = rand()&0xf; + } + + orc_executor_run (ex); + //orc_executor_emulate (ex); + + for(i=0;i<N;i++){ + printf("# %4d %4d %4d %4d\n", src1[i], src2[i], dest[i], + (src1[i] + src2[i] + 1)>>1); + } + } + + orc_executor_free (ex); + orc_program_free (p); +} + + diff --git a/orc/Makefile.am b/orc/Makefile.am index e117cf7..6554224 100644 --- a/orc/Makefile.am +++ b/orc/Makefile.am @@ -7,6 +7,7 @@ liborc_@LIBOIL_MAJORMINOR@_la_LIBS = $(LIBOIL_LIBS) $(GLIB_LIBS) liborc_@LIBOIL_MAJORMINOR@_la_CFLAGS = $(LIBOIL_CFLAGS) $(GLIB_CFLAGS) liborc_@LIBOIL_MAJORMINOR@_la_SOURCES = \ + orc.c \ orcexecutor.c \ orcrule.c \ orctype.c \ diff --git a/orc/orc.c b/orc/orc.c new file mode 100644 index 0000000..1475505 --- /dev/null +++ b/orc/orc.c @@ -0,0 +1,20 @@ + +#include "config.h" + +#include <glib.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#include <liboil/liboil.h> +#include <orc/orcprogram.h> + + +void +orc_init (void) +{ + oil_init (); + orc_opcode_init(); + orc_x86_init(); +} + diff --git a/orc/orcexecutor.c b/orc/orcexecutor.c index f8af0ce..d6b9282 100644 --- a/orc/orcexecutor.c +++ b/orc/orcexecutor.c @@ -32,8 +32,10 @@ orc_executor_free (OrcExecutor *ex) void orc_executor_run (OrcExecutor *ex) { + void (*func) (OrcExecutor *); - + func = ex->program->code_exec; + func (ex); } void diff --git a/orc/orcprogram-x86.c b/orc/orcprogram-x86.c index 4faa7c8..cbda868 100644 --- a/orc/orcprogram-x86.c +++ b/orc/orcprogram-x86.c @@ -124,6 +124,15 @@ x86_do_fixups (OrcProgram *program) } } +static OrcRuleList *orc_x86_list; + +void +orc_x86_init (void) +{ + orc_x86_list = orc_rule_list_new(); + orc_program_x86_register_rules (orc_x86_list); +} + void orc_program_compile_x86 (OrcProgram *program) { @@ -132,14 +141,10 @@ orc_program_compile_x86 (OrcProgram *program) OrcInstruction *insn; OrcOpcode *opcode; OrcVariable *args[10]; - OrcRuleList *list; OrcRule *rule; orc_program_allocate_codemem (program); - list = orc_rule_list_new(); - orc_program_x86_register_rules (list); - orc_program_rewrite_vars (program); x86_emit_prologue (program); @@ -188,7 +193,7 @@ orc_program_compile_x86 (OrcProgram *program) } } - rule = orc_rule_list_get (list, opcode); + rule = orc_rule_list_get (orc_x86_list, opcode); if (rule) { if (!(rule->flags & ORC_RULE_3REG) && insn->args[0] != insn->args[1]) { x86_emit_mov_reg_reg (program, 2, args[1]->alloc, args[0]->alloc); diff --git a/orc/orcprogram.c b/orc/orcprogram.c index f2e83d3..591902d 100644 --- a/orc/orcprogram.c +++ b/orc/orcprogram.c @@ -13,10 +13,21 @@ OrcProgram * orc_program_new (void) { OrcProgram *p; - p = g_malloc0(sizeof(OrcProgram)); + p = malloc(sizeof(OrcProgram)); + memset (p, 0, sizeof(OrcProgram)); return p; } +void +orc_program_free (OrcProgram *program) +{ + int i; + for(i=0;i<program->n_vars;i++){ + free (program->vars[i].name); + } + free (program); +} + int orc_program_add_temporary (OrcProgram *program, const char *type, const char *name) { diff --git a/orc/orcprogram.h b/orc/orcprogram.h index 58f84a7..2ef5671 100644 --- a/orc/orcprogram.h +++ b/orc/orcprogram.h @@ -143,12 +143,16 @@ struct _OrcRuleList { #define ORC_GP_REG_BASE 8 +void orc_init (void); + OrcProgram * orc_program_new (void); OrcOpcode * orc_opcode_find_by_name (const char *name); void orc_opcode_init (void); void orc_program_append (OrcProgram *p, const char *opcode, int arg0, int arg1, int arg2); +void orc_x86_init (void); + void orc_program_compile_x86 (OrcProgram *p); void orc_program_free (OrcProgram *program); @@ -169,6 +173,7 @@ void orc_executor_free (OrcExecutor *ex); void orc_executor_set_array (OrcExecutor *ex, int var, void *ptr); void orc_executor_set_n (OrcExecutor *ex, int n); void orc_executor_emulate (OrcExecutor *ex); +void orc_executor_run (OrcExecutor *ex); OrcRuleList *orc_rule_list_new(void); diff --git a/orc/orcrule.c b/orc/orcrule.c index 7170b9e..3b13020 100644 --- a/orc/orcrule.c +++ b/orc/orcrule.c @@ -23,7 +23,9 @@ orc_rule_list_new (void) void orc_rule_list_free (OrcRuleList *rule_list) { - free (rule_list->rules); + if (rule_list->rules) { + free (rule_list->rules); + } free (rule_list); } @@ -35,7 +37,7 @@ orc_rule_list_register (OrcRuleList *rule_list, const char *opcode_name, if (rule_list->n_rules == rule_list->n_alloc) { rule_list->n_alloc += 100; - rule_list->rules = realloc (rule_list, sizeof(OrcRule) * rule_list->n_alloc); + rule_list->rules = realloc (rule_list->rules, sizeof(OrcRule) * rule_list->n_alloc); } i = rule_list->n_rules; |