[jit] Add a MONO_PATCH_INFO_LDSTR_LIT patch type to handle strings which do not come...
authorZoltan Varga <vargaz@gmail.com>
Fri, 9 Jan 2015 22:30:06 +0000 (17:30 -0500)
committerZoltan Varga <vargaz@gmail.com>
Fri, 9 Jan 2015 22:30:27 +0000 (17:30 -0500)
mono/mini/aot-compiler.c
mono/mini/aot-runtime.c
mono/mini/ir-emit.h
mono/mini/method-to-ir.c
mono/mini/mini.c
mono/mini/patch-info.h

index cd0efb5ed4781f8209076aa535a249f57bacee7f..29aa92c939399cd1826d46be9aa8ae79d9f4a62c 100644 (file)
@@ -5236,6 +5236,13 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint
                }
                break;
        }
+       case MONO_PATCH_INFO_LDSTR_LIT: {
+               const char *s = patch_info->data.target;
+
+               encode_value (strlen (s), p, &p);
+               memcpy (p, s, strlen (s) + 1);
+               break;
+       }
        default:
                g_warning ("unable to handle jump info %d", patch_info->type);
                g_assert_not_reached ();
index b01e4ece7491f4a1dfa52d807df17d46f0ad847a..ec7d7696f2390e8b2a29da55263eca84443d2488 100644 (file)
@@ -3378,6 +3378,17 @@ decode_patch (MonoAotModule *aot_module, MonoMemPool *mp, MonoJumpInfo *ji, guin
                ji->data.target = info;
                break;
        }
+       case MONO_PATCH_INFO_LDSTR_LIT: {
+               int len = decode_value (p, &p);
+               char *s;
+
+           s = mono_mempool_alloc0 (mp, len + 1);
+               memcpy (s, p, len + 1);
+               p += len + 1;
+
+               ji->data.target = s;
+               break;
+       }
        default:
                g_warning ("unhandled type %d", ji->type);
                g_assert_not_reached ();
index aac45186598af0c3295e282aca2433512024e1e9..748c5072279781cd6628389211af4d4d589dec58 100644 (file)
@@ -259,6 +259,8 @@ alloc_dreg (MonoCompile *cfg, MonoStackType stack_type)
 
 #define NEW_LDSTRCONST(cfg,dest,image,token) NEW_AOTCONST_TOKEN ((cfg), (dest), MONO_PATCH_INFO_LDSTR, (image), (token), NULL, STACK_OBJ, mono_defaults.string_class)
 
+#define NEW_LDSTRLITCONST(cfg,dest,val) NEW_AOTCONST ((cfg), (dest), MONO_PATCH_INFO_LDSTR_LIT, (val))
+
 #define NEW_TYPE_FROM_HANDLE_CONST(cfg,dest,image,token,generic_context) NEW_AOTCONST_TOKEN ((cfg), (dest), MONO_PATCH_INFO_TYPE_FROM_HANDLE, (image), (token), (generic_context), STACK_OBJ, mono_defaults.monotype_class)
 
 #define NEW_LDTOKENCONST(cfg,dest,image,token,generic_context) NEW_AOTCONST_TOKEN ((cfg), (dest), MONO_PATCH_INFO_LDTOKEN, (image), (token), (generic_context), STACK_PTR, NULL)
@@ -443,6 +445,8 @@ handle_gsharedvt_ldaddr (MonoCompile *cfg)
 
 #define EMIT_NEW_LDSTRCONST(cfg,dest,image,token) do { NEW_AOTCONST_TOKEN ((cfg), (dest), MONO_PATCH_INFO_LDSTR, (image), (token), NULL, STACK_OBJ, mono_defaults.string_class); MONO_ADD_INS ((cfg)->cbb, (dest)); } while (0)
 
+#define EMIT_NEW_LDSTRLITCONST(cfg,dest,val) do { NEW_AOTCONST ((cfg), (dest), MONO_PATCH_INFO_LDSTR_LIT, (val)); MONO_ADD_INS ((cfg)->cbb, (dest)); } while (0)
+
 #define EMIT_NEW_TYPE_FROM_HANDLE_CONST(cfg,dest,image,token,generic_context) do { NEW_AOTCONST_TOKEN ((cfg), (dest), MONO_PATCH_INFO_TYPE_FROM_HANDLE, (image), (token), (generic_context), STACK_OBJ, mono_defaults.monotype_class); MONO_ADD_INS ((cfg)->cbb, (dest)); } while (0)
 
 #define EMIT_NEW_LDTOKENCONST(cfg,dest,image,token,generic_context) do { NEW_AOTCONST_TOKEN ((cfg), (dest), MONO_PATCH_INFO_LDTOKEN, (image), (token), (generic_context), STACK_PTR, NULL); MONO_ADD_INS ((cfg)->cbb, (dest)); } while (0)
index 22de9cba26de3d4fbfecd0c2722cfe58633e67e4..9156f97731dbfef3bfbb2987dce1edefe0328816 100755 (executable)
@@ -9644,8 +9644,12 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                        }
                        else if (method->wrapper_type != MONO_WRAPPER_NONE) {
                                MonoInst *iargs [1];
+                               char *str = mono_method_get_wrapper_data (method, n);
 
-                               EMIT_NEW_PCONST (cfg, iargs [0], mono_method_get_wrapper_data (method, n));                             
+                               if (cfg->compile_aot)
+                                       EMIT_NEW_LDSTRLITCONST (cfg, iargs [0], str);
+                               else
+                                       EMIT_NEW_PCONST (cfg, iargs [0], str);
                                *sp = mono_emit_jit_icall (cfg, mono_string_new_wrapper, iargs);
                        } else {
                                if (cfg->opt & MONO_OPT_SHARED) {
index 9df94126df9779f82acf58e0e6328c3d617fd057..8bd69c3863d010712689fa307b29ecc680604cb1 100755 (executable)
@@ -3261,6 +3261,8 @@ mono_patch_info_hash (gconstpointer data)
                return g_str_hash (ji->data.target);
        case MONO_PATCH_INFO_DELEGATE_TRAMPOLINE:
                return (ji->type << 8) | (gsize)ji->data.del_tramp->klass | (gsize)ji->data.del_tramp->method | (gsize)ji->data.del_tramp->virtual;
+       case MONO_PATCH_INFO_LDSTR_LIT:
+               return g_str_hash (ji->data.target);
        default:
                printf ("info type: %d\n", ji->type);
                mono_print_ji (ji); printf ("\n");
@@ -3712,6 +3714,10 @@ mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code,
                target = NULL;
                break;
        }
+       case MONO_PATCH_INFO_LDSTR_LIT: {
+               target = mono_string_new (domain, patch_info->data.target);
+               break;
+       }
        default:
                g_assert_not_reached ();
        }
index 12c55254231904484cd34b4a7f9625e677830486..39ffb714737dbb0fdab31ded1e123280b6ba16bb 100644 (file)
@@ -51,4 +51,5 @@ PATCH_INFO(JIT_TLS_ID, "jit_tls_id")
 PATCH_INFO(TLS_OFFSET, "tls_offset")
 PATCH_INFO(OBJC_SELECTOR_REF, "objc_selector_ref")
 PATCH_INFO(METHOD_CODE_SLOT, "method_code_slot")
+PATCH_INFO(LDSTR_LIT, "ldstr_lit")
 PATCH_INFO(NONE, "none")