diff --git a/src/mono/System.Private.CoreLib/src/ILLink/ILLink.Descriptors.xml b/src/mono/System.Private.CoreLib/src/ILLink/ILLink.Descriptors.xml
index a327adba23fc35..f066b8f010d43d 100644
--- a/src/mono/System.Private.CoreLib/src/ILLink/ILLink.Descriptors.xml
+++ b/src/mono/System.Private.CoreLib/src/ILLink/ILLink.Descriptors.xml
@@ -618,6 +618,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/mono/System.Private.CoreLib/src/Mono/RuntimeStructs.cs b/src/mono/System.Private.CoreLib/src/Mono/RuntimeStructs.cs
index e5665589672187..b327ae3733f9e2 100644
--- a/src/mono/System.Private.CoreLib/src/Mono/RuntimeStructs.cs
+++ b/src/mono/System.Private.CoreLib/src/Mono/RuntimeStructs.cs
@@ -118,6 +118,38 @@ internal struct ValueTuple
public T5 Item5;
}
+ internal enum I8Enum : byte
+ {
+ }
+
+ internal enum UI8Enum : sbyte
+ {
+ }
+
+ internal enum I16Enum : short
+ {
+ }
+
+ internal enum UI16Enum : ushort
+ {
+ }
+
+ internal enum I32Enum : int
+ {
+ }
+
+ internal enum UI32Enum : uint
+ {
+ }
+
+ internal enum I64Enum : long
+ {
+ }
+
+ internal enum UI64Enum : ulong
+ {
+ }
+
internal class NullByRefReturnException : Exception
{
public NullByRefReturnException()
diff --git a/src/mono/mono/mini/aot-compiler.c b/src/mono/mono/mini/aot-compiler.c
index 6d97bf9c859bfb..b30835fc288fbb 100644
--- a/src/mono/mono/mini/aot-compiler.c
+++ b/src/mono/mono/mini/aot-compiler.c
@@ -5185,6 +5185,19 @@ is_vt_inst (MonoGenericInst *inst)
return FALSE;
}
+static gboolean
+is_vt_inst_no_enum (MonoGenericInst *inst)
+{
+ int i;
+
+ for (i = 0; i < inst->type_argc; ++i) {
+ MonoType *t = inst->type_argv [i];
+ if (MONO_TYPE_ISSTRUCT (t))
+ return TRUE;
+ }
+ return FALSE;
+}
+
static gboolean
method_has_type_vars (MonoMethod *method)
{
@@ -5338,7 +5351,7 @@ add_generic_class_with_depth (MonoAotCompile *acfg, MonoClass *klass, int depth,
* WASM only since other platforms depend on the
* previous behavior.
*/
- if ((acfg->jit_opts & MONO_OPT_GSHAREDVT) && mono_class_is_ginst (klass) && mono_class_get_generic_class (klass)->context.class_inst && is_vt_inst (mono_class_get_generic_class (klass)->context.class_inst)) {
+ if ((acfg->jit_opts & MONO_OPT_GSHAREDVT) && mono_class_is_ginst (klass) && mono_class_get_generic_class (klass)->context.class_inst && is_vt_inst_no_enum (mono_class_get_generic_class (klass)->context.class_inst)) {
use_gsharedvt = TRUE;
use_gsharedvt_for_array = TRUE;
}
@@ -5758,17 +5771,19 @@ add_generic_instances (MonoAotCompile *acfg)
/* Add instances of EnumEqualityComparer which are created by EqualityComparer for enums */
{
- MonoClass *enum_comparer;
+ MonoClass *k, *enum_comparer;
MonoType *insts [16];
int ninsts;
+ const char *enum_names [] = { "I8Enum", "I16Enum", "I32Enum", "I64Enum", "UI8Enum", "UI16Enum", "UI32Enum", "UI64Enum" };
ninsts = 0;
- insts [ninsts ++] = int32_type;
- insts [ninsts ++] = uint32_type;
- insts [ninsts ++] = uint16_type;
- insts [ninsts ++] = byte_type;
+ for (int i = 0; i < G_N_ELEMENTS (enum_names); ++i) {
+ k = mono_class_try_load_from_name (acfg->image, "Mono", enum_names [i]);
+ g_assert (k);
+ insts [ninsts ++] = m_class_get_byval_arg (k);
+ }
enum_comparer = mono_class_load_from_name (mono_defaults.corlib, "System.Collections.Generic", "EnumEqualityComparer`1");
- add_instances_of (acfg, enum_comparer, insts, ninsts, FALSE);
+ add_instances_of (acfg, enum_comparer, insts, ninsts, TRUE);
}
/* Add instances of the array generic interfaces for primitive types */