X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fgenmdesc.c;h=aad714566b9969ef59a5f8d12f792f6d661dab32;hb=9ab38c6192912cc1efb8178d8cd5fe00d7c90a78;hp=e7496983ec18a83bf56000e946079147f242d479;hpb=234225d112c4b018b8d1796f4c06a15812137500;p=mono.git diff --git a/mono/mini/genmdesc.c b/mono/mini/genmdesc.c index e7496983ec1..aad714566b9 100644 --- a/mono/mini/genmdesc.c +++ b/mono/mini/genmdesc.c @@ -79,12 +79,16 @@ load_file (const char *name) { } else if (strncmp (p, "src2:", 5) == 0) { desc->spec [MONO_INST_SRC2] = p [5]; p += 6; - } else if (strncmp (p, "cost:", 5) == 0) { - desc->spec [MONO_INST_COST] = p [5]; + } else if (strncmp (p, "src3:", 5) == 0) { + desc->spec [MONO_INST_SRC3] = p [5]; p += 6; } else if (strncmp (p, "clob:", 5) == 0) { desc->spec [MONO_INST_CLOB] = p [5]; p += 6; + /* Currently unused fields + } else if (strncmp (p, "cost:", 5) == 0) { + desc->spec [MONO_INST_COST] = p [5]; + p += 6; } else if (strncmp (p, "res:", 4) == 0) { desc->spec [MONO_INST_RES] = p [4]; p += 5; @@ -94,6 +98,7 @@ load_file (const char *name) { } else if (strncmp (p, "delay:", 6) == 0) { desc->spec [MONO_INST_DELAY] = p [6]; p += 7; + */ } else if (strncmp (p, "len:", 4) == 0) { p += 4; desc->spec [MONO_INST_LEN] = strtoul (p, &p, 10); @@ -117,12 +122,6 @@ init_table (void) { table = g_hash_table_new (g_str_hash, g_str_equal); opcodes = g_new0 (OpDesc, OP_LAST); - for (i = 0; i < MONO_CEE_LAST; ++i) { - desc = opcodes + i; - desc->num = i; - desc->name = mono_inst_name (i); - g_hash_table_insert (table, (char *)desc->name, desc); - } for (i = OP_LOAD; i < OP_LAST; ++i) { desc = opcodes + i; desc->num = i; @@ -142,41 +141,41 @@ output_char (FILE *f, char c) { static void build_table (const char *fname, const char *name) { FILE *f; - int i, j; + int i, j, idx; OpDesc *desc; + GString *idx_array = g_string_new (""); + /* use this to remove duplicates */ + GHashTable *desc_ht = g_hash_table_new (g_str_hash, g_str_equal); if (!(f = fopen (fname, "w"))) g_error ("Cannot open file '%s'", fname); fprintf (f, "/* File automatically generated by genmdesc, don't change */\n\n"); - fprintf (f, "static const char * const %s [OP_LAST] = {\n", name); + fprintf (f, "const char %s [] = {\n", name); + fprintf (f, "\t\""); + for (j = 0; j < MONO_INST_MAX; ++j) + fprintf (f, "\\x0"); + fprintf (f, "\"\t/* null entry */\n"); + idx = 1; + g_string_append_printf (idx_array, "const guint16 %s_idx [] = {\n", name); - for (i = 0; i < MONO_CEE_LAST; ++i) { - desc = opcodes + i; - if (!desc->desc) - fprintf (f, "\tNULL,\t/* %s */\n", desc->name); - else { - fprintf (f, "\t\""); - for (j = 0; j < MONO_INST_MAX; ++j) - output_char (f, desc->spec [j]); - fprintf (f, "\",\t/* %s */\n", desc->name); - } - } - for (i = MONO_CEE_LAST; i < OP_LOAD; ++i) { - fprintf (f, "\tNULL, /* unassigned */\n"); - } for (i = OP_LOAD; i < OP_LAST; ++i) { desc = opcodes + i; if (!desc->desc) - fprintf (f, "\tNULL,\t/* %s */\n", desc->name); + g_string_append_printf (idx_array, "\t0,\t/* %s */\n", desc->name ? desc->name : ""); else { fprintf (f, "\t\""); for (j = 0; j < MONO_INST_MAX; ++j) output_char (f, desc->spec [j]); - fprintf (f, "\",\t/* %s */\n", desc->name); + fprintf (f, "\"\t/* %s */\n", desc->name); + g_string_append_printf (idx_array, "\t%d,\t/* %s */\n", idx * MONO_INST_MAX, desc->name); + ++idx; } } fprintf (f, "};\n\n"); + fprintf (f, "%s};\n\n", idx_array->str); fclose (f); + g_string_free (idx_array, TRUE); + g_hash_table_destroy (desc_ht); } static void @@ -215,21 +214,20 @@ int main (int argc, char* argv []) { init_table (); - switch (argc) { - case 2: + if (argc == 2) { /* useful to get a new file when some opcodes are added: looses the comments, though */ load_file (argv [1]); dump (); - break; - case 4: - load_file (argv [1]); - build_table (argv [2], argv [3]); - break; - default: + } else if (argc < 4) { g_print ("Usage: genmdesc arguments\n"); - g_print ("\tgenmdesc desc Output to stdout the description file.\n"); - g_print ("\tgenmdesc desc output name Write to output the description in a table named 'name'.\n"); + g_print ("\tgenmdesc desc Output to stdout the description file.\n"); + g_print ("\tgenmdesc output name desc [desc1...] Write to output the description in a table named 'name'.\n"); return 1; + } else { + int i; + for (i = 3; i < argc; ++i) + load_file (argv [i]); + build_table (argv [1], argv [2]); } return 0; }