From e312bda175d72267b0c5ada0a9c471313a2ae3da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Thu, 27 Jan 2022 11:47:12 +0900 Subject: [PATCH 1/3] Add support for byref fields in NativeAOT/crossgen2 --- src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs | 2 +- .../Common/MetadataFieldLayoutAlgorithm.cs | 12 ++++-------- .../Loader/classloader/RefFields/InvalidCSharp.il | 4 ++-- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs index cd464db7955341..af21f16373dab6 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs @@ -2193,7 +2193,7 @@ private int GatherClassGCLayout(TypeDesc type, byte* gcPtrs) { int result = 0; - if (type.IsByReferenceOfT) + if (type.IsByReferenceOfT || type.IsByRef) { return MarkGcField(gcPtrs, CorInfoGCType.TYPE_GC_BYREF); } diff --git a/src/coreclr/tools/Common/TypeSystem/Common/MetadataFieldLayoutAlgorithm.cs b/src/coreclr/tools/Common/TypeSystem/Common/MetadataFieldLayoutAlgorithm.cs index 9973be45ff1308..637f1f7538ff88 100644 --- a/src/coreclr/tools/Common/TypeSystem/Common/MetadataFieldLayoutAlgorithm.cs +++ b/src/coreclr/tools/Common/TypeSystem/Common/MetadataFieldLayoutAlgorithm.cs @@ -37,12 +37,8 @@ public override ComputedInstanceFieldLayout ComputeInstanceLayout(DefType defTyp TypeDesc fieldType = field.FieldType; - // ByRef instance fields are not allowed. - if (fieldType.IsByRef) - ThrowHelper.ThrowTypeLoadException(ExceptionStringID.ClassLoadGeneral, type); - - // ByRef-like instance fields on non-byref-like types are not allowed. - if (fieldType.IsByRefLike && !type.IsByRefLike) + // ByRef and byref-like instance fields on non-byref-like types are not allowed. + if ((fieldType.IsByRef || fieldType.IsByRefLike) && !type.IsByRefLike) ThrowHelper.ThrowTypeLoadException(ExceptionStringID.ClassLoadGeneral, type); numInstanceFields++; @@ -481,7 +477,7 @@ protected ComputedInstanceFieldLayout ComputeAutoFieldLayout(MetadataType type, } else { - Debug.Assert(fieldType.IsPrimitive || fieldType.IsPointer || fieldType.IsFunctionPointer || fieldType.IsEnum); + Debug.Assert(fieldType.IsPrimitive || fieldType.IsPointer || fieldType.IsFunctionPointer || fieldType.IsEnum || fieldType.IsByRef); var fieldSizeAndAlignment = ComputeFieldSizeAndAlignment(fieldType, hasLayout, packingSize, out bool _, out bool _); instanceNonGCPointerFieldsCount[CalculateLog2(fieldSizeAndAlignment.Size.AsInt)]++; @@ -815,7 +811,7 @@ private static SizeAndAlignment ComputeFieldSizeAndAlignment(TypeDesc fieldType, } else { - Debug.Assert(fieldType.IsPointer || fieldType.IsFunctionPointer); + Debug.Assert(fieldType.IsPointer || fieldType.IsFunctionPointer || fieldType.IsByRef); result.Size = fieldType.Context.Target.LayoutPointerSize; result.Alignment = fieldType.Context.Target.LayoutPointerSize; } diff --git a/src/tests/Loader/classloader/RefFields/InvalidCSharp.il b/src/tests/Loader/classloader/RefFields/InvalidCSharp.il index b976227547def5..08d6fed97742e7 100644 --- a/src/tests/Loader/classloader/RefFields/InvalidCSharp.il +++ b/src/tests/Loader/classloader/RefFields/InvalidCSharp.il @@ -107,7 +107,7 @@ ldarg.0 ldarga.s 1 mkrefany !T - stfld typedref InvalidCSharp.WithTypedReferenceField`1::Field + stfld typedref class InvalidCSharp.WithTypedReferenceField`1::Field ret } @@ -115,7 +115,7 @@ instance class [System.Runtime]System.Type GetFieldType () cil managed { ldarg.0 - ldfld typedref InvalidCSharp.WithTypedReferenceField`1::Field + ldfld typedref class InvalidCSharp.WithTypedReferenceField`1::Field refanytype call class [System.Runtime]System.Type [System.Runtime]System.Type::GetTypeFromHandle(valuetype [System.Runtime]System.RuntimeTypeHandle ) ret From a1a67b07a0004ac0baa6e8910d36167f8f9e03ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Thu, 27 Jan 2022 14:12:08 +0900 Subject: [PATCH 2/3] Oops --- src/tests/Loader/classloader/RefFields/InvalidCSharp.il | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tests/Loader/classloader/RefFields/InvalidCSharp.il b/src/tests/Loader/classloader/RefFields/InvalidCSharp.il index 08d6fed97742e7..7fc74717dd1029 100644 --- a/src/tests/Loader/classloader/RefFields/InvalidCSharp.il +++ b/src/tests/Loader/classloader/RefFields/InvalidCSharp.il @@ -107,7 +107,7 @@ ldarg.0 ldarga.s 1 mkrefany !T - stfld typedref class InvalidCSharp.WithTypedReferenceField`1::Field + stfld typedref valuetype InvalidCSharp.WithTypedReferenceField`1::Field ret } @@ -115,9 +115,9 @@ instance class [System.Runtime]System.Type GetFieldType () cil managed { ldarg.0 - ldfld typedref class InvalidCSharp.WithTypedReferenceField`1::Field + ldfld typedref valuetype InvalidCSharp.WithTypedReferenceField`1::Field refanytype call class [System.Runtime]System.Type [System.Runtime]System.Type::GetTypeFromHandle(valuetype [System.Runtime]System.RuntimeTypeHandle ) ret } -} \ No newline at end of file +} From 53ae879a4732fe31a32a4c34146a94ed6f1244a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Fri, 28 Jan 2022 05:43:01 +0900 Subject: [PATCH 3/3] Update CorInfoImpl.cs --- src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs index af21f16373dab6..cd464db7955341 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs @@ -2193,7 +2193,7 @@ private int GatherClassGCLayout(TypeDesc type, byte* gcPtrs) { int result = 0; - if (type.IsByReferenceOfT || type.IsByRef) + if (type.IsByReferenceOfT) { return MarkGcField(gcPtrs, CorInfoGCType.TYPE_GC_BYREF); }