Skip to content

Commit 8767b38

Browse files
Delete parts of type system that deal with layouts (#79366)
The layout of type is always the same as the template so we don't need the logic. This gets rid of uncertainities around "can I reliably ask type system questions around layouts" (see the deleted FieldLayoutAlgorithms). Now the answer is: "you can't ask those questions", which is better than "you could get an answer that you might not like" (an assert).
1 parent 932221d commit 8767b38

File tree

8 files changed

+41
-623
lines changed

8 files changed

+41
-623
lines changed

src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/EETypeCreator.cs

Lines changed: 17 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,6 @@ private static void CreateEETypeWorker(MethodTable* pTemplateEEType, uint hashCo
161161
pTemplateEEType = pTemplateEEType->DynamicTemplateType;
162162
}
163163

164-
uint valueTypeFieldPaddingEncoded = 0;
165164
int baseSize = 0;
166165

167166
bool isValueType;
@@ -171,68 +170,32 @@ private static void CreateEETypeWorker(MethodTable* pTemplateEEType, uint hashCo
171170
bool isGeneric;
172171
uint flags;
173172
ushort runtimeInterfacesLength = 0;
174-
bool isAbstractClass;
175-
bool isByRefLike;
176173
IntPtr typeManager = IntPtr.Zero;
177174

178175
if (state.RuntimeInterfaces != null)
179176
{
180177
runtimeInterfacesLength = checked((ushort)state.RuntimeInterfaces.Length);
181178
}
182179

183-
valueTypeFieldPaddingEncoded = EETypeBuilderHelpers.ComputeValueTypeFieldPaddingFieldValue(
184-
pTemplateEEType->ValueTypeFieldPadding,
185-
(uint)pTemplateEEType->FieldAlignmentRequirement,
186-
IntPtr.Size);
187180
baseSize = (int)pTemplateEEType->BaseSize;
188181
isValueType = pTemplateEEType->IsValueType;
189182
hasFinalizer = pTemplateEEType->IsFinalizable;
190183
isNullable = pTemplateEEType->IsNullable;
191184
flags = pTemplateEEType->Flags;
192185
isArray = pTemplateEEType->IsArray;
193186
isGeneric = pTemplateEEType->IsGeneric;
194-
isAbstractClass = pTemplateEEType->IsAbstract && !pTemplateEEType->IsInterface;
195-
isByRefLike = pTemplateEEType->IsByRefLike;
196187
typeManager = pTemplateEEType->PointerToTypeManager;
197188
Debug.Assert(pTemplateEEType->NumInterfaces == runtimeInterfacesLength);
198189

199190
flags |= (uint)EETypeFlags.IsDynamicTypeFlag;
200191

201-
// TODO! Change to if template is Universal or non-Existent
202-
203-
// FEATURE_UNIVERSAL_GENERICS?
204-
if (state.TypeSize.HasValue)
192+
if (state.TypeBeingBuilt.IsMdArray)
205193
{
206-
baseSize = state.TypeSize.Value;
207-
208-
int baseSizeBeforeAlignment = baseSize;
209-
210-
baseSize = MemoryHelpers.AlignUp(baseSize, IntPtr.Size);
211-
212-
if (isValueType)
213-
{
214-
// Compute the valuetype padding size based on size before adding the object type pointer field to the size
215-
uint cbValueTypeFieldPadding = (uint)(baseSize - baseSizeBeforeAlignment);
216-
217-
// Add Object type pointer field to base size
218-
baseSize += IntPtr.Size;
219-
220-
valueTypeFieldPaddingEncoded = (uint)EETypeBuilderHelpers.ComputeValueTypeFieldPaddingFieldValue(cbValueTypeFieldPadding, (uint)state.FieldAlignment.Value, IntPtr.Size);
221-
}
222-
223-
// Minimum base size is 3 pointers, and requires us to bump the size of an empty class type
224-
if (baseSize <= IntPtr.Size)
225-
{
226-
// ValueTypes should already have had their size bumped up by the normal type layout process
227-
Debug.Assert(!isValueType);
228-
baseSize += IntPtr.Size;
229-
}
230-
231-
// Add sync block skew
232-
baseSize += IntPtr.Size;
233-
234-
// Minimum basesize is 3 pointers
235-
Debug.Assert(baseSize >= (IntPtr.Size * 3));
194+
// If we're building an MDArray, the template is object[,] and we
195+
// need to recompute the base size.
196+
baseSize = IntPtr.Size + // sync block
197+
2 * IntPtr.Size + // EETypePtr + Length
198+
state.ArrayRank.Value * sizeof(int) * 2; // 2 ints per rank for bounds
236199
}
237200

238201
// Optional fields encoding
@@ -241,7 +204,11 @@ private static void CreateEETypeWorker(MethodTable* pTemplateEEType, uint hashCo
241204

242205
uint rareFlags = optionalFields.GetFieldValue(EETypeOptionalFieldTag.RareFlags, 0);
243206

244-
if (state.NonGcDataSize != 0)
207+
int allocatedNonGCDataSize = state.NonGcDataSize;
208+
if (state.HasStaticConstructor)
209+
allocatedNonGCDataSize += -TypeBuilder.ClassConstructorOffset;
210+
211+
if (allocatedNonGCDataSize != 0)
245212
rareFlags |= (uint)EETypeRareFlags.IsDynamicTypeWithNonGcStatics;
246213

247214
if (state.GcDataSize != 0)
@@ -250,60 +217,11 @@ private static void CreateEETypeWorker(MethodTable* pTemplateEEType, uint hashCo
250217
if (state.ThreadDataSize != 0)
251218
rareFlags |= (uint)EETypeRareFlags.IsDynamicTypeWithThreadStatics;
252219

253-
#if TARGET_ARM
254-
if (state.FieldAlignment == 8)
255-
rareFlags |= (uint)EETypeRareFlags.RequiresAlign8Flag;
256-
else
257-
rareFlags &= ~(uint)EETypeRareFlags.RequiresAlign8Flag;
258-
#endif
259-
260-
#if TARGET_ARM || TARGET_ARM64
261-
if (state.IsHFA)
262-
rareFlags |= (uint)EETypeRareFlags.IsHFAFlag;
263-
else
264-
rareFlags &= ~(uint)EETypeRareFlags.IsHFAFlag;
265-
#endif
266-
if (state.HasStaticConstructor)
267-
rareFlags |= (uint)EETypeRareFlags.HasCctorFlag;
268-
else
269-
rareFlags &= ~(uint)EETypeRareFlags.HasCctorFlag;
270-
271-
if (isAbstractClass)
272-
rareFlags |= (uint)EETypeRareFlags.IsAbstractClassFlag;
273-
else
274-
rareFlags &= ~(uint)EETypeRareFlags.IsAbstractClassFlag;
275-
276-
if (isByRefLike)
277-
rareFlags |= (uint)EETypeRareFlags.IsByRefLikeFlag;
278-
else
279-
rareFlags &= ~(uint)EETypeRareFlags.IsByRefLikeFlag;
280-
281-
if (isNullable)
282-
{
283-
uint nullableValueOffset = state.NullableValueOffset;
284-
285-
// The stored offset is never zero (Nullable has a boolean there indicating whether the value is valid).
286-
// If the real offset is one, then the field isn't set. Otherwise the offset is encoded - 1 to save space.
287-
if (nullableValueOffset == 1)
288-
optionalFields.ClearField(EETypeOptionalFieldTag.NullableValueOffset);
289-
else
290-
optionalFields.SetFieldValue(EETypeOptionalFieldTag.NullableValueOffset, checked(nullableValueOffset - 1));
291-
}
292-
else
293-
{
294-
optionalFields.ClearField(EETypeOptionalFieldTag.NullableValueOffset);
295-
}
296-
297220
optionalFields.SetFieldValue(EETypeOptionalFieldTag.RareFlags, rareFlags);
298221

299222
// Dispatch map is fetched from template type
300223
optionalFields.ClearField(EETypeOptionalFieldTag.DispatchMap);
301224

302-
optionalFields.ClearField(EETypeOptionalFieldTag.ValueTypeFieldPadding);
303-
304-
if (valueTypeFieldPaddingEncoded != 0)
305-
optionalFields.SetFieldValue(EETypeOptionalFieldTag.ValueTypeFieldPadding, valueTypeFieldPaddingEncoded);
306-
307225
// Compute size of optional fields encoding
308226
cbOptionalFieldsSize = optionalFields.Encode();
309227
Debug.Assert(cbOptionalFieldsSize > 0);
@@ -328,7 +246,7 @@ private static void CreateEETypeWorker(MethodTable* pTemplateEEType, uint hashCo
328246
true,
329247
(rareFlags & (int)EETypeRareFlags.HasSealedVTableEntriesFlag) != 0,
330248
isGeneric,
331-
state.NonGcDataSize != 0,
249+
allocatedNonGCDataSize != 0,
332250
state.GcDataSize != 0,
333251
state.ThreadDataSize != 0);
334252

@@ -401,19 +319,19 @@ private static void CreateEETypeWorker(MethodTable* pTemplateEEType, uint hashCo
401319
nonGCStaticDataOffset = state.HasStaticConstructor ? -TypeBuilder.ClassConstructorOffset : 0;
402320

403321
// If we have a class constructor, our NonGcDataSize MUST be non-zero
404-
Debug.Assert(!state.HasStaticConstructor || (state.NonGcDataSize != 0));
322+
Debug.Assert(!state.HasStaticConstructor || (allocatedNonGCDataSize != 0));
405323
}
406324

407325
if (isGeneric)
408326
{
409327
genericComposition = MemoryHelpers.AllocateMemory(MethodTable.GetGenericCompositionSize(arity, pEEType->HasGenericVariance));
410328
pEEType->SetGenericComposition(genericComposition);
411329

412-
if (state.NonGcDataSize > 0)
330+
if (allocatedNonGCDataSize > 0)
413331
{
414-
nonGcStaticData = MemoryHelpers.AllocateMemory(state.NonGcDataSize);
415-
MemoryHelpers.Memset(nonGcStaticData, state.NonGcDataSize, 0);
416-
Debug.Assert(nonGCStaticDataOffset <= state.NonGcDataSize);
332+
nonGcStaticData = MemoryHelpers.AllocateMemory(allocatedNonGCDataSize);
333+
MemoryHelpers.Memset(nonGcStaticData, allocatedNonGCDataSize, 0);
334+
Debug.Assert(nonGCStaticDataOffset <= allocatedNonGCDataSize);
417335
pEEType->DynamicNonGcStaticsData = (IntPtr)((byte*)nonGcStaticData + nonGCStaticDataOffset);
418336
}
419337
}

src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/NativeLayoutFieldAlgorithm.cs

Lines changed: 0 additions & 124 deletions
This file was deleted.

0 commit comments

Comments
 (0)