Cleanup patch_info code a little. (mono/mono#14037)
authorJay Krell <jay.krell@cornell.edu>
Tue, 23 Apr 2019 08:57:31 +0000 (01:57 -0700)
committerAlexander Köplinger <alex.koeplinger@outlook.com>
Tue, 23 Apr 2019 08:57:31 +0000 (10:57 +0200)
 e.g. whenever underlying representation is nul terminated string.
 MONO_PATCH_INFO_LDSTR_LIT
 MONO_PATCH_INFO_OBJC_SELECTOR_REF
almost the same as
 MONO_PATCH_INFO_JIT_ICALL
 MONO_PATCH_INFO_JIT_ICALL_ADDR
 MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL

MONO_PATCH_INFO_LDSTR_LIT no longer allocate
 and copy the string from the AOT image into image_pool.

g_str_equal check pointer equality first.
While obviously correct, not obviously faster,
as it adds cost when strings are unequal.

Uninline g_str_equal, seems cleaner, but perhaps less efficient.

Combine the switch-exit and default: paths,
as only one case other than default exited the switch.

Lift out other common subexpressions.

Commit migrated from https://github.com/mono/mono/commit/1ffb5fb83f41c77e901617e6c35e8306bad393ec

src/mono/mono/eglib/ghashtable.c
src/mono/mono/mini/aot-compiler.c
src/mono/mono/mini/aot-runtime.c
src/mono/mono/mini/mini-runtime.c

index 93aa37a..03ae92e 100644 (file)
@@ -658,7 +658,7 @@ g_int_hash (gconstpointer v1)
 gboolean
 g_str_equal (gconstpointer v1, gconstpointer v2)
 {
-       return strcmp ((const char*)v1, (const char*)v2) == 0;
+       return v1 == v2 || strcmp ((const char*)v1, (const char*)v2) == 0;
 }
 
 guint
index d03c43f..88e4ce9 100644 (file)
@@ -6426,6 +6426,7 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint
        case MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR:
                encode_value (patch_info->data.uindex, p, &p);
                break;
+       case MONO_PATCH_INFO_LDSTR_LIT:
        case MONO_PATCH_INFO_JIT_ICALL:
        case MONO_PATCH_INFO_JIT_ICALL_ADDR:
        case MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL: {
@@ -6433,9 +6434,8 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint
 
                encode_value (len, p, &p);
 
-               memcpy (p, patch_info->data.name, len);
-               p += len;
-               *p++ = '\0';
+               memcpy (p, patch_info->data.name, len + 1);
+               p += len + 1;
                break;
        }
        case MONO_PATCH_INFO_LDSTR: {
@@ -6556,15 +6556,6 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint
                }
                break;
        }
-       case MONO_PATCH_INFO_LDSTR_LIT: {
-               const char *s = (const char *)patch_info->data.target;
-               int len = strlen (s);
-
-               encode_value (len, p, &p);
-               memcpy (p, s, len + 1);
-               p += len + 1;
-               break;
-       }
        case MONO_PATCH_INFO_VIRT_METHOD:
                encode_klass_ref (acfg, patch_info->data.virt_method->klass, p, &p);
                encode_method_ref (acfg, patch_info->data.virt_method->method, p, &p);
index 1d11f46..d02ed40 100644 (file)
@@ -3773,6 +3773,7 @@ decode_patch (MonoAotModule *aot_module, MonoMemPool *mp, MonoJumpInfo *ji, guin
                }
                break;
        }
+       case MONO_PATCH_INFO_LDSTR_LIT:
        case MONO_PATCH_INFO_JIT_ICALL:
        case MONO_PATCH_INFO_JIT_ICALL_ADDR:
        case MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL: {
@@ -3986,17 +3987,6 @@ 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 = (char *)mono_mempool_alloc0 (mp, len + 1);
-               memcpy (s, p, len + 1);
-               p += len + 1;
-
-               ji->data.target = s;
-               break;
-       }
        case MONO_PATCH_INFO_VIRT_METHOD: {
                MonoJumpInfoVirtMethod *info = (MonoJumpInfoVirtMethod *)mono_mempool_alloc0 (mp, sizeof (MonoJumpInfoVirtMethod));
 
index 3a81527..218f907 100644 (file)
@@ -1206,17 +1206,24 @@ guint
 mono_patch_info_hash (gconstpointer data)
 {
        const MonoJumpInfo *ji = (MonoJumpInfo*)data;
+       const MonoJumpInfoType type = ji->type;
+       guint hash = type << 8;
 
-       switch (ji->type) {
+       switch (type) {
        case MONO_PATCH_INFO_RVA:
        case MONO_PATCH_INFO_LDSTR:
        case MONO_PATCH_INFO_LDTOKEN:
        case MONO_PATCH_INFO_DECLSEC:
-               return (ji->type << 8) | ji->data.token->token;
+               return hash | ji->data.token->token;
        case MONO_PATCH_INFO_TYPE_FROM_HANDLE:
-               return (ji->type << 8) | ji->data.token->token | (ji->data.token->has_context ? (gsize)ji->data.token->context.class_inst : 0);
+               return hash | ji->data.token->token | (ji->data.token->has_context ? (gsize)ji->data.token->context.class_inst : 0);
+       case MONO_PATCH_INFO_OBJC_SELECTOR_REF: // Hash on the selector name
+       case MONO_PATCH_INFO_LDSTR_LIT:
+               return g_str_hash (ji->data.name);
        case MONO_PATCH_INFO_JIT_ICALL:
-               return (ji->type << 8) | g_str_hash (ji->data.name);
+       case MONO_PATCH_INFO_JIT_ICALL_ADDR:
+       case MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL:
+               return hash | g_str_hash (ji->data.name);
        case MONO_PATCH_INFO_VTABLE:
        case MONO_PATCH_INFO_CLASS:
        case MONO_PATCH_INFO_IID:
@@ -1237,17 +1244,17 @@ mono_patch_info_hash (gconstpointer data)
        case MONO_PATCH_INFO_AOT_JIT_INFO:
        case MONO_PATCH_INFO_GET_TLS_TRAMP:
        case MONO_PATCH_INFO_SET_TLS_TRAMP:
-               return (ji->type << 8) | (gssize)ji->data.target;
+               return hash | (gssize)ji->data.target;
        case MONO_PATCH_INFO_GSHAREDVT_CALL:
-               return (ji->type << 8) | (gssize)ji->data.gsharedvt->method;
+               return hash | (gssize)ji->data.gsharedvt->method;
        case MONO_PATCH_INFO_RGCTX_FETCH:
        case MONO_PATCH_INFO_RGCTX_SLOT_INDEX: {
                MonoJumpInfoRgctxEntry *e = ji->data.rgctx_entry;
-
+               hash |= e->in_mrgctx | e->info_type | mono_patch_info_hash (e->data);
                if (e->in_mrgctx)
-                       return (ji->type << 8) | (gssize)e->d.method | (e->in_mrgctx) | e->info_type | mono_patch_info_hash (e->data);
+                       return hash | (gssize)e->d.method;
                else
-                       return (ji->type << 8) | (gssize)e->d.klass | (e->in_mrgctx) | e->info_type | mono_patch_info_hash (e->data);
+                       return hash | (gssize)e->d.klass;
        }
        case MONO_PATCH_INFO_INTERRUPTION_REQUEST_FLAG:
        case MONO_PATCH_INFO_MSCORLIB_GOT_ADDR:
@@ -1259,33 +1266,25 @@ mono_patch_info_hash (gconstpointer data)
        case MONO_PATCH_INFO_AOT_MODULE:
        case MONO_PATCH_INFO_PROFILER_ALLOCATION_COUNT:
        case MONO_PATCH_INFO_PROFILER_CLAUSE_COUNT:
-               return (ji->type << 8);
+               return hash;
        case MONO_PATCH_INFO_SPECIFIC_TRAMPOLINE_LAZY_FETCH_ADDR:
-               return (ji->type << 8) | (ji->data.uindex);
+               return hash | ji->data.uindex;
        case MONO_PATCH_INFO_TRAMPOLINE_FUNC_ADDR:
        case MONO_PATCH_INFO_CASTCLASS_CACHE:
-               return (ji->type << 8) | (ji->data.index);
+               return hash | ji->data.index;
        case MONO_PATCH_INFO_SWITCH:
-               return (ji->type << 8) | ji->data.table->table_size;
+               return hash | ji->data.table->table_size;
        case MONO_PATCH_INFO_GSHAREDVT_METHOD:
-               return (ji->type << 8) | (gssize)ji->data.gsharedvt_method->method;
-       case MONO_PATCH_INFO_OBJC_SELECTOR_REF:
-               /* Hash on the selector name */
-               return g_str_hash (ji->data.target);
+               return hash | (gssize)ji->data.gsharedvt_method->method;
        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->is_virtual;
-       case MONO_PATCH_INFO_LDSTR_LIT:
-               return g_str_hash (ji->data.target);
+               return hash | (gsize)ji->data.del_tramp->klass | (gsize)ji->data.del_tramp->method | (gsize)ji->data.del_tramp->is_virtual;
        case MONO_PATCH_INFO_VIRT_METHOD: {
                MonoJumpInfoVirtMethod *info = ji->data.virt_method;
 
-               return (ji->type << 8) | (gssize)info->klass | (gssize)info->method;
+               return hash | (gssize)info->klass | (gssize)info->method;
        }
-       case MONO_PATCH_INFO_JIT_ICALL_ADDR:
-       case MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL:
-               return (ji->type << 8) | g_str_hash (ji->data.target);
        case MONO_PATCH_INFO_GSHAREDVT_IN_WRAPPER:
-               return (ji->type << 8) | mono_signature_hash (ji->data.sig);
+               return hash | mono_signature_hash (ji->data.sig);
        default:
                printf ("info type: %d\n", ji->type);
                mono_print_ji (ji); printf ("\n");
@@ -1316,14 +1315,16 @@ mono_patch_info_equal (gconstpointer ka, gconstpointer kb)
        case MONO_PATCH_INFO_TYPE_FROM_HANDLE:
        case MONO_PATCH_INFO_LDTOKEN:
        case MONO_PATCH_INFO_DECLSEC:
-               if ((ji1->data.token->image != ji2->data.token->image) ||
-                       (ji1->data.token->token != ji2->data.token->token) ||
-                       (ji1->data.token->has_context != ji2->data.token->has_context) ||
-                       (ji1->data.token->context.class_inst != ji2->data.token->context.class_inst) ||
-                       (ji1->data.token->context.method_inst != ji2->data.token->context.method_inst))
-                       return 0;
-               break;
+               return ji1->data.token->image == ji2->data.token->image &&
+                      ji1->data.token->token == ji2->data.token->token &&
+                      ji1->data.token->has_context == ji2->data.token->has_context &&
+                      ji1->data.token->context.class_inst == ji2->data.token->context.class_inst &&
+                      ji1->data.token->context.method_inst == ji2->data.token->context.method_inst;
+       case MONO_PATCH_INFO_OBJC_SELECTOR_REF:
+       case MONO_PATCH_INFO_LDSTR_LIT:
        case MONO_PATCH_INFO_JIT_ICALL:
+       case MONO_PATCH_INFO_JIT_ICALL_ADDR:
+       case MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL:
                return g_str_equal (ji1->data.name, ji2->data.name);
        case MONO_PATCH_INFO_RGCTX_FETCH:
        case MONO_PATCH_INFO_RGCTX_SLOT_INDEX: {
@@ -1349,22 +1350,13 @@ mono_patch_info_equal (gconstpointer ka, gconstpointer kb)
                return ji1->data.index == ji2->data.index;
        case MONO_PATCH_INFO_VIRT_METHOD:
                return ji1->data.virt_method->klass == ji2->data.virt_method->klass && ji1->data.virt_method->method == ji2->data.virt_method->method;
-       case MONO_PATCH_INFO_JIT_ICALL_ADDR:
-       case MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL:
-               if (ji1->data.target == ji2->data.target)
-                       return 1;
-               return strcmp ((const char*)ji1->data.target, (const char*)ji2->data.target) == 0 ? 1 : 0;
        case MONO_PATCH_INFO_GSHAREDVT_IN_WRAPPER:
-               return mono_metadata_signature_equal (ji1->data.sig, ji2->data.sig) ? 1 : 0;
+               return mono_metadata_signature_equal (ji1->data.sig, ji2->data.sig);
        case MONO_PATCH_INFO_GC_SAFE_POINT_FLAG:
                return 1;
-       default:
-               if (ji1->data.target != ji2->data.target)
-                       return 0;
-               break;
        }
 
-       return 1;
+       return ji1->data.target == ji2->data.target;
 }
 
 gpointer