ruleset: fix registration of opcode sets
authorWim Taymans <wim.taymans@collabora.co.uk>
Sun, 13 Sep 2009 09:49:32 +0000 (11:49 +0200)
committerDavid Schleef <ds@schleef.org>
Sun, 20 Sep 2009 04:46:25 +0000 (21:46 -0700)
When we register a RuleSet for an OpcodeSet, don't keep a pointer from the
RuleSet to the OpcodeSet because the OpcodeSet pointer can change (due to
realloc) when we register new OpcodeSets.

Instead, keep the opcode_major and use this to get the right index in the
OpcodeSet.

orc/orcopcodes.c
orc/orcprogram.h
orc/orcrule.c

index 7a42586..32cb7fb 100644 (file)
@@ -131,7 +131,7 @@ orc_rule_set_new (OrcOpcodeSet *opcode_set, OrcTarget *target,
 
   memset (rule_set, 0, sizeof(OrcRuleSet));
 
-  rule_set->opcode_set = opcode_set;
+  rule_set->opcode_major = opcode_set->opcode_major;
   rule_set->required_target_flags = required_flags;
 
   rule_set->rules = malloc (sizeof(OrcRule) * opcode_set->n_opcodes);
@@ -156,7 +156,7 @@ orc_target_get_rule (OrcTarget *target, OrcStaticOpcode *opcode,
     if (opcode_sets[k].opcodes + j != opcode) continue;
 
     for(i=0;i<target->n_rule_sets;i++){
-      if (target->rule_sets[i].opcode_set != opcode_sets + k) continue;
+      if (target->rule_sets[i].opcode_major != opcode_sets[k].opcode_major) continue;
       if (target->rule_sets[i].required_target_flags & (~target_flags)) continue;
 
       rule = target->rule_sets[i].rules + j;
@@ -206,6 +206,12 @@ orc_opcode_set_get (const char *name)
   return NULL;
 }
 
+OrcOpcodeSet *
+orc_opcode_set_get_nth (int opcode_major)
+{
+  return opcode_sets + opcode_major;
+}
+
 int
 orc_opcode_set_find_by_name (OrcOpcodeSet *opcode_set, const char *name)
 {
index 4549798..16df498 100644 (file)
@@ -212,7 +212,7 @@ struct _OrcRule {
  */
 struct _OrcRuleSet {
   /*< private >*/
-  OrcOpcodeSet *opcode_set;
+  int opcode_major;
   int required_target_flags;
 
   OrcRule *rules;
@@ -366,6 +366,9 @@ struct _OrcCompiler {
   int need_mask_regs;
 };
 
+#define ORC_SRC_ARG(p,i,n) ((p)->vars[(i)->src_args[(n)]].alloc)
+#define ORC_DEST_ARG(p,i,n) ((p)->vars[(i)->dest_args[(n)]].alloc)
+
 /**
  * OrcOpcodeExecutor:
  *
@@ -510,6 +513,7 @@ void orc_executor_emulate (OrcExecutor *ex);
 void orc_executor_run (OrcExecutor *ex);
 
 OrcOpcodeSet *orc_opcode_set_get (const char *name);
+OrcOpcodeSet *orc_opcode_set_get_nth (int opcode_major);
 int orc_opcode_set_find_by_name (OrcOpcodeSet *opcode_set, const char *name);
 int orc_opcode_register_static (OrcStaticOpcode *sopcode, char *prefix);
 
index de57f78..4cd9910 100644 (file)
@@ -21,8 +21,11 @@ orc_rule_register (OrcRuleSet *rule_set,
     OrcRuleEmitFunc emit, void *emit_user)
 {
   int i;
+  OrcOpcodeSet *opcode_set;
 
-  i = orc_opcode_set_find_by_name (rule_set->opcode_set, opcode_name);
+  opcode_set = orc_opcode_set_get_nth (rule_set->opcode_major);
+
+  i = orc_opcode_set_find_by_name (opcode_set, opcode_name);
   if (i == -1) {
     ORC_ERROR("failed to find opcode \"%s\"", opcode_name);
     return;