diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/EETypeNode.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/EETypeNode.cs index a74192ec045124..913c3e3812661e 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/EETypeNode.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/EETypeNode.cs @@ -123,7 +123,10 @@ public override ObjectNodeSection Section } } - public int MinimumObjectSize => _type.Context.Target.PointerSize * 3; + public int MinimumObjectSize => GetMinimumObjectSize(_type.Context); + + public static int GetMinimumObjectSize(TypeSystemContext typeSystemContext) + => typeSystemContext.Target.PointerSize * 3; protected virtual bool EmitVirtualSlotsAndInterfaces => false; diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/FrozenObjectNode.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/FrozenObjectNode.cs index 567ecb7595c513..dbd298b4b801cb 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/FrozenObjectNode.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/FrozenObjectNode.cs @@ -48,11 +48,20 @@ int ISymbolDefinitionNode.Offset public override void EncodeData(ref ObjectDataBuilder dataBuilder, NodeFactory factory, bool relocsOnly) { + int initialOffset = dataBuilder.CountBytes; + // Sync Block dataBuilder.EmitZeroPointer(); // byte contents _data.WriteContent(ref dataBuilder, this, factory); + + int objectSize = dataBuilder.CountBytes - initialOffset; + int minimumObjectSize = EETypeNode.GetMinimumObjectSize(factory.TypeSystemContext); + if (objectSize < minimumObjectSize) + { + dataBuilder.EmitZeros(minimumObjectSize - objectSize); + } } protected override string GetName(NodeFactory factory) => this.GetMangledName(factory.NameMangler); diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/FrozenStringNode.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/FrozenStringNode.cs index 40765b9b17be8f..d1978383f236b2 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/FrozenStringNode.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/FrozenStringNode.cs @@ -59,6 +59,8 @@ private static IEETypeNode GetEETypeNode(NodeFactory factory) public override void EncodeData(ref ObjectDataBuilder dataBuilder, NodeFactory factory, bool relocsOnly) { + int initialOffset = dataBuilder.CountBytes; + dataBuilder.EmitZeroPointer(); // Sync block dataBuilder.EmitPointerReloc(GetEETypeNode(factory)); @@ -73,6 +75,12 @@ public override void EncodeData(ref ObjectDataBuilder dataBuilder, NodeFactory f // Null-terminate for friendliness with interop dataBuilder.EmitShort(0); + int objectSize = dataBuilder.CountBytes - initialOffset; + int minimumObjectSize = EETypeNode.GetMinimumObjectSize(factory.TypeSystemContext); + if (objectSize < minimumObjectSize) + { + dataBuilder.EmitZeros(minimumObjectSize - objectSize); + } } protected override string GetName(NodeFactory factory) => this.GetMangledName(factory.NameMangler);