Skip to content

Commit 8419a11

Browse files
[release/7.0] [NativeAOT] Ensure that frozen objects respect the minimum object size (#76050)
* Ensure that frozen objects respect the minimum object size * Apply feedback * Handle FrozenStringNode too Co-authored-by: Filip Navara <[email protected]>
1 parent e707f98 commit 8419a11

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,10 @@ public override ObjectNodeSection Section
123123
}
124124
}
125125

126-
public int MinimumObjectSize => _type.Context.Target.PointerSize * 3;
126+
public int MinimumObjectSize => GetMinimumObjectSize(_type.Context);
127+
128+
public static int GetMinimumObjectSize(TypeSystemContext typeSystemContext)
129+
=> typeSystemContext.Target.PointerSize * 3;
127130

128131
protected virtual bool EmitVirtualSlotsAndInterfaces => false;
129132

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)