X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fgenmdesc.c;h=2530df38784c7b283bb0c7b4c0a806aaf0eba8b4;hb=f777bc37a485df19a4700d5c41e9e58bdfa2ef54;hp=5df7c6b270c8fb24ef23c6cc873d9e222f5a1efc;hpb=916c9bd899e6566389da672c5fc7c7450322c235;p=mono.git diff --git a/mono/mini/genmdesc.c b/mono/mini/genmdesc.c index 5df7c6b270c..2530df38784 100644 --- a/mono/mini/genmdesc.c +++ b/mono/mini/genmdesc.c @@ -11,6 +11,11 @@ #include #include +#if defined(__native_client__) || defined(__native_client_codegen__) +volatile int __nacl_thread_suspension_needed = 0; +void __nacl_suspend_thread_if_needed() {} +#endif + #define MINI_OP(a,b,dest,src1,src2) b, #define MINI_OP3(a,b,dest,src1,src2,src3) b, /* keep in sync with the enum in mini.h */ @@ -25,7 +30,7 @@ opnames[] = { * Duplicate this from helpers.c, so the opcode name array can be omitted when * DISABLE_JIT is set. */ -const char* +static const char* inst_name (int op) { if (op >= OP_LOAD && op <= OP_LAST) return opnames [op - OP_LOAD]; @@ -43,6 +48,7 @@ typedef struct { char spec [MONO_INST_MAX]; } OpDesc; +static int nacl = 0; static GHashTable *table; static GHashTable *template_table; @@ -65,7 +71,7 @@ load_file (const char *name) { * The format of the lines are: * # comment * opcode: [dest:format] [src1:format] [src2:format] [flags:format] [clob:format] - * [cost:num] [res:format] [delay:num] [len:num] + * [cost:num] [res:format] [delay:num] [len:num] [nacl:num] * format is a single letter that depends on the field * NOTE: no space between the field name and the ':' * @@ -74,6 +80,8 @@ load_file (const char *name) { line = 0; while ((str = fgets (buf, sizeof (buf), f))) { gboolean is_template = FALSE; + gboolean nacl_length_set = FALSE; + ++line; eat_whitespace (str); if (!str [0]) @@ -131,8 +139,20 @@ load_file (const char *name) { p += 7; */ } else if (strncmp (p, "len:", 4) == 0) { + unsigned long size; p += 4; - desc->spec [MONO_INST_LEN] = strtoul (p, &p, 10); + size = strtoul (p, &p, 10); + if (!nacl_length_set) { + desc->spec [MONO_INST_LEN] = size; + } + } else if (strncmp (p, "nacl:", 5) == 0) { + unsigned long size; + p += 5; + size = strtoul (p, &p, 10); + if (nacl) { + desc->spec [MONO_INST_LEN] = size; + nacl_length_set = TRUE; + } } else if (strncmp (p, "template:", 9) == 0) { char *tname; int i; @@ -199,7 +219,7 @@ output_char (FILE *f, char c) { if (isalnum (c)) fprintf (f, "%c", c); else - fprintf (f, "\\x%x\" \"", c); + fprintf (f, "\\x%x\" \"", (guint8)c); } static void @@ -284,14 +304,22 @@ main (int argc, char* argv []) dump (); } else if (argc < 4) { g_print ("Usage: genmdesc arguments\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"); + g_print ("\tgenmdesc desc Output to stdout the description file.\n"); + g_print ("\tgenmdesc [--nacl] output name desc [desc1...]\n" + " Write to output the description in a table named 'name',\n" + " use --nacl to generate Google NativeClient code\n"); return 1; } else { - int i; - for (i = 3; i < argc; ++i) + int i = 3; + if (strcmp (argv [1], "--nacl") == 0) { + nacl = 1; + i++; + } + + for (; i < argc; ++i) load_file (argv [i]); - build_table (argv [1], argv [2]); + + build_table (argv [1 + nacl], argv [2 + nacl]); } return 0; }