Add support for previously missing helper Check_FieldOffset (#33729)
authorTomáš Rylek <trylek@microsoft.com>
Wed, 18 Mar 2020 23:59:40 +0000 (00:59 +0100)
committerGitHub <noreply@github.com>
Wed, 18 Mar 2020 23:59:40 +0000 (00:59 +0100)
This failure crashes Crossgen2 build of several framework assemblies
without the large version bubble. I discovered this during my work
on composite build against shared framework where we newly introduce
the notion of two separate large bubbles (app vs. framework).

Thanks

Tomas

src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/FieldFixupSignature.cs
src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunSymbolNodeFactory.cs
src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs

index 32cae03..88abad8 100644 (file)
@@ -40,6 +40,11 @@ namespace ILCompiler.DependencyAnalysis.ReadyToRun
                 EcmaModule targetModule = factory.SignatureContext.GetTargetModule(_fieldDesc);
                 SignatureContext innerContext = dataBuilder.EmitFixup(factory, _fixupKind, targetModule, factory.SignatureContext);
 
+                if (_fixupKind == ReadyToRunFixupKind.Check_FieldOffset)
+                {
+                    dataBuilder.EmitInt(_fieldDesc.Offset.AsInt);
+                }
+
                 dataBuilder.EmitFieldSignature(_fieldDesc, innerContext);
             }
 
index 735ada4..30191aa 100644 (file)
@@ -80,6 +80,14 @@ namespace ILCompiler.DependencyAnalysis
                 );
             });
 
+            _checkFieldOffsetCache = new NodeCache<FieldDesc, ISymbolNode>(key =>
+            {
+                return new PrecodeHelperImport(
+                    _codegenNodeFactory,
+                    new FieldFixupSignature(ReadyToRunFixupKind.Check_FieldOffset, key)
+                );
+            });
+
             _interfaceDispatchCells = new NodeCache<MethodAndCallSite, ISymbolNode>(cellKey =>
             {
                 return new DelayLoadHelperMethodImport(
@@ -376,6 +384,13 @@ namespace ILCompiler.DependencyAnalysis
             return _fieldOffsetCache.GetOrAdd(fieldDesc);
         }
 
+        private NodeCache<FieldDesc, ISymbolNode> _checkFieldOffsetCache;
+
+        public ISymbolNode CheckFieldOffset(FieldDesc fieldDesc)
+        {
+            return _checkFieldOffsetCache.GetOrAdd(fieldDesc);
+        }
+
         private NodeCache<TypeDesc, ISymbolNode> _fieldBaseOffsetCache;
 
         public ISymbolNode FieldBaseOffset(TypeDesc typeDesc)
index 62f8e33..08c0b88 100644 (file)
@@ -2126,7 +2126,10 @@ namespace Internal.JitInterface
             {
                 if (pMT.IsValueType)
                 {
-                    throw new NotImplementedException("https://github.com/dotnet/runtime/issues/32630: ENCODE_CHECK_FIELD_OFFSET: root field check import");
+                    // ENCODE_CHECK_FIELD_OFFSET
+                    pResult->offset = 0;
+                    pResult->fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_INSTANCE_WITH_BASE;
+                    pResult->fieldLookup = CreateConstLookupToSymbol(_compilation.SymbolNodeFactory.CheckFieldOffset(field));
                 }
                 else
                 {