summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@ginger.bigkitten.com>2008-05-15 18:36:32 -0700
committerDavid Schleef <ds@ginger.bigkitten.com>2008-05-15 18:36:32 -0700
commitee71e629d30f76205c21ac7323b93e9181de11d8 (patch)
treed959b88e4ad197af874659b7a99b70becef5300b
parentc003f17b82ed66f7879a83519d19ac81207c07ce (diff)
downloadliboil-ee71e629d30f76205c21ac7323b93e9181de11d8.tar.gz
[orc] fix valgrind problems
-rw-r--r--examples/orc/Makefile.am4
-rw-r--r--examples/orc/jit.c9
-rw-r--r--examples/orc/simple.c74
-rw-r--r--orc/Makefile.am1
-rw-r--r--orc/orc.c20
-rw-r--r--orc/orcexecutor.c4
-rw-r--r--orc/orcprogram-x86.c15
-rw-r--r--orc/orcprogram.c13
-rw-r--r--orc/orcprogram.h5
-rw-r--r--orc/orcrule.c6
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;