[runtime] Expose trampoline jit infos that have unwind info to the runtime
[mono.git] / mono / mini / genmdesc.c
index 02e07bde6d5faffe88bb506b14c9dfdb185b31be..0cd3f3b5c815699c87ccd4a2beb6e9e55f633102 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 */
@@ -43,7 +48,7 @@ typedef struct {
        char spec [MONO_INST_MAX];
 } OpDesc;
 
-static int nacl;
+static int nacl = 0;
 static GHashTable *table;
 static GHashTable *template_table;
 
@@ -75,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])
@@ -132,14 +139,24 @@ load_file (const char *name) {
                                p += 7;
                                */
                        } else if (strncmp (p, "len:", 4) == 0) {
+                               unsigned long size;
+                               char* endptr;
                                p += 4;
-                               desc->spec [MONO_INST_LEN] += strtoul (p, &p, 10);
-                       } else if (strncmp (p, "nacl:", 5) == 0){
+                               size = strtoul (p, &endptr, 10);
+                               if (size == 0 && p == endptr)
+                                       g_error ("Invalid length '%s' at line %d in %s\n", p, line, name);
+                               p = endptr;
+                               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;
+                               if (nacl) {
+                                       desc->spec [MONO_INST_LEN] = size;
+                                       nacl_length_set = TRUE;
+                               }
                        } else if (strncmp (p, "template:", 9) == 0) {
                                char *tname;
                                int i;
@@ -206,7 +223,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
@@ -221,13 +238,13 @@ build_table (const char *fname, const char *name) {
        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, "const char %s [] = {\n", name);
+       fprintf (f, "const char mono_%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);
+       g_string_append_printf (idx_array, "const guint16 mono_%s_idx [] = {\n", name);
 
        for (i = OP_LOAD; i < OP_LAST; ++i) {
                desc = opcodes + i;
@@ -298,7 +315,7 @@ main (int argc, char* argv [])
                return 1;
        } else {
                int i = 3;
-               if (strcmp (argv [1], "--nacl") == 0){
+               if (strcmp (argv [1], "--nacl") == 0) {
                        nacl = 1;
                        i++;
                }