Merge pull request #1109 from adbre/iss358
[mono.git] / mono / mini / genmdesc.c
index 5df7c6b270c8fb24ef23c6cc873d9e222f5a1efc..2530df38784c7b283bb0c7b4c0a806aaf0eba8b4 100644 (file)
 #include <string.h>
 #include <mono/metadata/opcodes.h>
 
+#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;
 }