| File: Compiler\SystemObjectFieldLayoutAlgorithm.cs | Web Access |
| Project: src\runtime\src\coreclr\tools\aot\ILCompiler.ReadyToRun\ILCompiler.ReadyToRun.csproj (ILCompiler.ReadyToRun) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using Internal.TypeSystem; using Debug = System.Diagnostics.Debug; namespace ILCompiler { /// <summary> /// Represents an algorithm that adds a target pointer of space at the beginning of all types /// deriving from System.Object used for the MethodTable pointer in the CoreCLR runtime. /// </summary> internal class SystemObjectFieldLayoutAlgorithm : FieldLayoutAlgorithm { private readonly FieldLayoutAlgorithm _fallbackAlgorithm; public SystemObjectFieldLayoutAlgorithm(FieldLayoutAlgorithm fallbackAlgorithm) { _fallbackAlgorithm = fallbackAlgorithm; } public override ComputedInstanceFieldLayout ComputeInstanceLayout(DefType defType, InstanceLayoutKind layoutKind) { TargetDetails targetDetails = defType.Context.Target; ComputedInstanceFieldLayout layoutFromMetadata = _fallbackAlgorithm.ComputeInstanceLayout(defType, layoutKind); // System.Object has an MethodTable field in the standard AOT version used in this repo. // Make sure that we always use the CoreCLR version which (currently) has no fields. Debug.Assert(0 == layoutFromMetadata.Offsets.Length, "Incompatible system library. The CoreCLR System.Private.CoreLib must be used when compiling in ready-to-run mode."); return new ComputedInstanceFieldLayout { ByteCountUnaligned = targetDetails.LayoutPointerSize, ByteCountAlignment = targetDetails.LayoutPointerSize, FieldAlignment = layoutFromMetadata.FieldAlignment, FieldSize = layoutFromMetadata.FieldSize, Offsets = layoutFromMetadata.Offsets, LayoutAbiStable = true, }; } public unsafe override ComputedStaticFieldLayout ComputeStaticFieldLayout(DefType defType, StaticLayoutKind layoutKind) { return _fallbackAlgorithm.ComputeStaticFieldLayout(defType, layoutKind); } public override bool ComputeContainsGCPointers(DefType type) { return false; } public override bool ComputeContainsByRefs(DefType type) { return false; } public override bool ComputeIsUnsafeValueType(DefType type) { return false; } public override ValueTypeShapeCharacteristics ComputeValueTypeShapeCharacteristics(DefType type) { return _fallbackAlgorithm.ComputeValueTypeShapeCharacteristics(type); } } }