Merge pull request #2237 from xmcclure/container-owner
[mono.git] / mono / mini / aot-compiler.c
index e828ba9d3d12bc5fcf107fbf2ab2ae109a4349de..67cf7924434cddab73471f621e42539ae60008fc 100644 (file)
@@ -251,8 +251,8 @@ typedef struct {
        gboolean jit_used, llvm_used;
 } MonoPltEntry;
 
-#define mono_acfg_lock(acfg) mono_mutex_lock (&((acfg)->mutex))
-#define mono_acfg_unlock(acfg) mono_mutex_unlock (&((acfg)->mutex))
+#define mono_acfg_lock(acfg) mono_os_mutex_lock (&((acfg)->mutex))
+#define mono_acfg_unlock(acfg) mono_os_mutex_unlock (&((acfg)->mutex))
 
 /* This points to the current acfg in LLVM mode */
 static MonoAotCompile *llvm_acfg;
@@ -3057,7 +3057,6 @@ is_plt_patch (MonoJumpInfo *patch_info)
        case MONO_PATCH_INFO_JIT_ICALL_ADDR:
        case MONO_PATCH_INFO_ICALL_ADDR:
        case MONO_PATCH_INFO_RGCTX_FETCH:
-       case MONO_PATCH_INFO_LLVM_IMT_TRAMPOLINE:
                return TRUE;
        default:
                return FALSE;
@@ -4482,24 +4481,39 @@ add_generic_instances (MonoAotCompile *acfg)
                if (klass)
                        add_instances_of (acfg, klass, insts, ninsts, TRUE);
 
-               /* Add an instance of LongEnumEqualityComparer<long/ulong> which is created by EqualityComparer<T> for enums */
+               /* Add instances of EnumEqualityComparer which are created by EqualityComparer<T> for enums */
                {
                        MonoClass *enum_comparer;
-                       MonoGenericContext ctx;
-                       MonoType *args [16];
+                       MonoType *insts [16];
+                       int ninsts;
+
+                       ninsts = 0;
+                       insts [ninsts ++] = &mono_defaults.int32_class->byval_arg;
+                       insts [ninsts ++] = &mono_defaults.uint32_class->byval_arg;
+                       insts [ninsts ++] = &mono_defaults.uint16_class->byval_arg;
+                       insts [ninsts ++] = &mono_defaults.byte_class->byval_arg;
+                       enum_comparer = mono_class_from_name (mono_defaults.corlib, "System.Collections.Generic", "EnumEqualityComparer`1");
+                       g_assert (enum_comparer);
+                       add_instances_of (acfg, enum_comparer, insts, ninsts, FALSE);
 
-                       enum_comparer = mono_class_from_name (mono_defaults.corlib, "System.Collections.Generic", "LongEnumEqualityComparer`1");
+                       ninsts = 0;
+                       insts [ninsts ++] = &mono_defaults.int16_class->byval_arg;
+                       enum_comparer = mono_class_from_name (mono_defaults.corlib, "System.Collections.Generic", "ShortEnumEqualityComparer`1");
                        g_assert (enum_comparer);
+                       add_instances_of (acfg, enum_comparer, insts, ninsts, FALSE);
 
-                       memset (&ctx, 0, sizeof (ctx));
-                       args [0] = &mono_defaults.int64_class->byval_arg;
-                       ctx.class_inst = mono_metadata_get_generic_inst (1, args);
-                       add_generic_class (acfg, mono_class_inflate_generic_class (enum_comparer, &ctx), FALSE, "EqualityComparer<T>");
+                       ninsts = 0;
+                       insts [ninsts ++] = &mono_defaults.sbyte_class->byval_arg;
+                       enum_comparer = mono_class_from_name (mono_defaults.corlib, "System.Collections.Generic", "SByteEnumEqualityComparer`1");
+                       g_assert (enum_comparer);
+                       add_instances_of (acfg, enum_comparer, insts, ninsts, FALSE);
 
-                       memset (&ctx, 0, sizeof (ctx));
-                       args [0] = &mono_defaults.uint64_class->byval_arg;
-                       ctx.class_inst = mono_metadata_get_generic_inst (1, args);
-                       add_generic_class (acfg, mono_class_inflate_generic_class (enum_comparer, &ctx), FALSE, "EqualityComparer<T>");
+                       enum_comparer = mono_class_from_name (mono_defaults.corlib, "System.Collections.Generic", "LongEnumEqualityComparer`1");
+                       g_assert (enum_comparer);
+                       ninsts = 0;
+                       insts [ninsts ++] = &mono_defaults.int64_class->byval_arg;
+                       insts [ninsts ++] = &mono_defaults.uint64_class->byval_arg;
+                       add_instances_of (acfg, enum_comparer, insts, ninsts, FALSE);
                }
 
                /* Add instances of the array generic interfaces for primitive types */
@@ -5347,10 +5361,6 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint
        case MONO_PATCH_INFO_SEQ_POINT_INFO:
        case MONO_PATCH_INFO_AOT_MODULE:
                break;
-       case MONO_PATCH_INFO_LLVM_IMT_TRAMPOLINE:
-               encode_method_ref (acfg, patch_info->data.imt_tramp->method, p, &p);
-               encode_value (patch_info->data.imt_tramp->vt_offset, p, &p);
-               break;
        case MONO_PATCH_INFO_SIGNATURE:
                encode_signature (acfg, (MonoMethodSignature*)patch_info->data.target, p, &p);
                break;
@@ -9302,7 +9312,7 @@ acfg_create (MonoAssembly *ass, guint32 opts)
        acfg->klass_blob_hash = g_hash_table_new (NULL, NULL);
        acfg->method_blob_hash = g_hash_table_new (NULL, NULL);
        acfg->plt_entry_debug_sym_cache = g_hash_table_new (g_str_hash, g_str_equal);
-       mono_mutex_init_recursive (&acfg->mutex);
+       mono_os_mutex_init_recursive (&acfg->mutex);
 
        init_got_info (&acfg->got_info);
        init_got_info (&acfg->llvm_got_info);