Skip to content

Commit a8e4a4c

Browse files
authored
[NativeAOT] Ensure that frozen objects respect the minimum object size (#76031)
* Ensure that frozen objects respect the minimum object size * Handle FrozenStringNode too
1 parent 93cfa75 commit a8e4a4c

3 files changed

Lines changed: 21 additions & 1 deletion

File tree

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/EETypeNode.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,10 @@ public override ObjectNodeSection Section
128128
}
129129
}
130130

131-
public int MinimumObjectSize => _type.Context.Target.PointerSize * 3;
131+
public int MinimumObjectSize => GetMinimumObjectSize(_type.Context);
132+
133+
public static int GetMinimumObjectSize(TypeSystemContext typeSystemContext)
134+
=> typeSystemContext.Target.PointerSize * 3;
132135

133136
protected virtual bool EmitVirtualSlotsAndInterfaces => false;
134137

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/FrozenObjectNode.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,20 @@ int ISymbolDefinitionNode.Offset
4848

4949
public override void EncodeData(ref ObjectDataBuilder dataBuilder, NodeFactory factory, bool relocsOnly)
5050
{
51+
int initialOffset = dataBuilder.CountBytes;
52+
5153
// Sync Block
5254
dataBuilder.EmitZeroPointer();
5355

5456
// byte contents
5557
_data.WriteContent(ref dataBuilder, this, factory);
58+
59+
int objectSize = dataBuilder.CountBytes - initialOffset;
60+
int minimumObjectSize = EETypeNode.GetMinimumObjectSize(factory.TypeSystemContext);
61+
if (objectSize < minimumObjectSize)
62+
{
63+
dataBuilder.EmitZeros(minimumObjectSize - objectSize);
64+
}
5665
}
5766

5867
protected override string GetName(NodeFactory factory) => this.GetMangledName(factory.NameMangler);

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/FrozenStringNode.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ private static IEETypeNode GetEETypeNode(NodeFactory factory)
5959

6060
public override void EncodeData(ref ObjectDataBuilder dataBuilder, NodeFactory factory, bool relocsOnly)
6161
{
62+
int initialOffset = dataBuilder.CountBytes;
63+
6264
dataBuilder.EmitZeroPointer(); // Sync block
6365

6466
dataBuilder.EmitPointerReloc(GetEETypeNode(factory));
@@ -73,6 +75,12 @@ public override void EncodeData(ref ObjectDataBuilder dataBuilder, NodeFactory f
7375
// Null-terminate for friendliness with interop
7476
dataBuilder.EmitShort(0);
7577

78+
int objectSize = dataBuilder.CountBytes - initialOffset;
79+
int minimumObjectSize = EETypeNode.GetMinimumObjectSize(factory.TypeSystemContext);
80+
if (objectSize < minimumObjectSize)
81+
{
82+
dataBuilder.EmitZeros(minimumObjectSize - objectSize);
83+
}
7684
}
7785

7886
protected override string GetName(NodeFactory factory) => this.GetMangledName(factory.NameMangler);

0 commit comments

Comments
 (0)