Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -249,9 +249,12 @@ private static unsafe void RehydrateData(IntPtr dehydratedData, int length)
// Destination for the hydrated data is in the first 32-bit relative pointer
byte* pDest = (byte*)ReadRelPtr32((void*)dehydratedData);

// Next is the number of fixups at the end of the stream
int numFixups = *(int*)(dehydratedData + sizeof(int));

// The dehydrated data follows
byte* pCurrent = (byte*)dehydratedData + sizeof(int);
byte* pEnd = (byte*)dehydratedData + length;
byte* pCurrent = (byte*)dehydratedData + sizeof(int) * 2;
byte* pEnd = (byte*)dehydratedData + length - (sizeof(int) * numFixups);
Comment on lines +252 to +257
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this would be easier math/require fewer axioms if instead of number of fixups we encode size of dehydrated data. (Also drop the length parameter from the method.)

Suggested change
// Next is the number of fixups at the end of the stream
int numFixups = *(int*)(dehydratedData + sizeof(int));
// The dehydrated data follows
byte* pCurrent = (byte*)dehydratedData + sizeof(int);
byte* pEnd = (byte*)dehydratedData + length;
byte* pCurrent = (byte*)dehydratedData + sizeof(int) * 2;
byte* pEnd = (byte*)dehydratedData + length - (sizeof(int) * numFixups);
// Next is length of the dehydrated data
int length = *(int*)(dehydratedData + sizeof(int));
// The dehydrated data follows
byte* pCurrent = (byte*)dehydratedData + sizeof(int) * 2;
byte* pEnd = (byte*)dehydratedData + length;


// Fixup table immediately follows the command stream
int* pFixups = (int*)pEnd;
Expand Down
19 changes: 1 addition & 18 deletions src/coreclr/nativeaot/Runtime/TypeManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ void * TypeManager::GetModuleSection(ReadyToRunSectionType sectionId, int * leng
ModuleInfoRow * pCurrent = pModuleInfoRows + i;
if ((int32_t)sectionId == pCurrent->SectionId)
{
*length = pCurrent->GetLength();
*length = pCurrent->Length;
return pCurrent->Start;
}
}
Expand All @@ -79,23 +79,6 @@ void * TypeManager::GetClasslibFunction(ClasslibFunctionId functionId)
return m_pClasslibFunctions[id];
}

bool TypeManager::ModuleInfoRow::HasEndPointer()
{
return Flags & (int32_t)ModuleInfoFlags::HasEndPointer;
}

int TypeManager::ModuleInfoRow::GetLength()
{
if (HasEndPointer())
{
return (int)((uint8_t*)End - (uint8_t*)Start);
}
else
{
return sizeof(void*);
}
}

HANDLE TypeManager::GetOsModuleHandle()
{
return m_osModule;
Expand Down
6 changes: 1 addition & 5 deletions src/coreclr/nativeaot/Runtime/TypeManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,8 @@ class TypeManager
struct ModuleInfoRow
{
int32_t SectionId;
int32_t Flags;
int32_t Length;
void * Start;
void * End;

bool HasEndPointer();
int GetLength();
};
};

Expand Down
5 changes: 0 additions & 5 deletions src/coreclr/nativeaot/Runtime/inc/ModuleHeaders.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,3 @@ enum class ReadyToRunSectionType
ReadonlyBlobRegionStart = 300,
ReadonlyBlobRegionEnd = 399,
};

enum class ModuleInfoFlags
{
HasEndPointer = 0x1,
};
Original file line number Diff line number Diff line change
Expand Up @@ -435,10 +435,8 @@ public virtual void EmitObject(Stream outputFileStream, IReadOnlyCollection<Depe

bool isMethod = node is IMethodBodyNode or AssemblyStubNode;
#if !READYTORUN
bool recordSize = isMethod;
long thumbBit = _nodeFactory.Target.Architecture == TargetArchitecture.ARM && isMethod ? 1 : 0;
#else
bool recordSize = true;
// R2R records the thumb bit in the addend when needed, so we don't have to do it here.
long thumbBit = 0;
#endif
Expand All @@ -462,7 +460,7 @@ public virtual void EmitObject(Stream outputFileStream, IReadOnlyCollection<Depe
sectionWriter.EmitSymbolDefinition(
mangledName,
n.Offset + thumbBit,
n.Offset == 0 && recordSize ? nodeContents.Data.Length : 0);
n.Offset == 0 ? nodeContents.Data.Length : 0);

_outputInfoBuilder?.AddSymbol(new OutputSymbol(sectionWriter.SectionIndex, (ulong)(sectionWriter.Position + n.Offset), mangledName));

Expand All @@ -473,7 +471,7 @@ public virtual void EmitObject(Stream outputFileStream, IReadOnlyCollection<Depe
sectionWriter.EmitSymbolDefinition(
alternateCName,
n.Offset + thumbBit,
n.Offset == 0 && recordSize ? nodeContents.Data.Length : 0,
n.Offset == 0 ? nodeContents.Data.Length : 0,
global: !isHidden);

if (n is IMethodNode)
Expand Down
6 changes: 0 additions & 6 deletions src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,10 +102,4 @@ enum ReadyToRunSectionType
ReadonlyBlobRegionStart = 300,
ReadonlyBlobRegionEnd = 399,
}

[Flags]
internal enum ModuleInfoFlags : int
{
HasEndPointer = 0x1,
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,15 @@ namespace ILCompiler.DependencyAnalysis
/// <summary>
/// Represents a hash table of array types generated into the image.
/// </summary>
internal sealed class ArrayMapNode : ObjectNode, ISymbolDefinitionNode, INodeWithSize
internal sealed class ArrayMapNode : ObjectNode, ISymbolDefinitionNode
{
private readonly ExternalReferencesTableNode _externalReferences;
private int? _size;

public ArrayMapNode(ExternalReferencesTableNode externalReferences)
{
_externalReferences = externalReferences;
}

int INodeWithSize.Size => _size.Value;

public void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb)
{
sb.Append(nameMangler.CompilationUnitPrefix).Append("__array_type_map"u8);
Expand Down Expand Up @@ -66,8 +63,6 @@ public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false)

byte[] hashTableBytes = writer.Save();

_size = hashTableBytes.Length;

return new ObjectData(hashTableBytes, Array.Empty<Relocation>(), 1, new ISymbolDefinitionNode[] { this });
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,13 @@ namespace ILCompiler.DependencyAnalysis
/// by placing a starting symbol, followed by contents of <typeparamref name="TEmbedded"/> nodes (optionally
/// sorted using provided comparer), followed by ending symbol.
/// </summary>
public class ArrayOfEmbeddedDataNode<TEmbedded> : EmbeddedDataContainerNode, INodeWithSize
public class ArrayOfEmbeddedDataNode<TEmbedded> : EmbeddedDataContainerNode
where TEmbedded : EmbeddedObjectNode
{
private int? _size;
private HashSet<TEmbedded> _nestedNodes = new HashSet<TEmbedded>();
private List<TEmbedded> _nestedNodesList = new List<TEmbedded>();
private IComparer<TEmbedded> _sorter;

int INodeWithSize.Size => _size.Value;

public ArrayOfEmbeddedDataNode(string mangledName, IComparer<TEmbedded> nodeSorter) : base(mangledName)
{
_sorter = nodeSorter;
Expand Down Expand Up @@ -85,8 +82,6 @@ public override ObjectData GetData(NodeFactory factory, bool relocsOnly)

GetElementDataForNodes(ref builder, factory, relocsOnly);

_size = builder.CountBytes;

ObjectData objData = builder.ToObjectData();
return objData;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,8 @@

namespace ILCompiler.DependencyAnalysis
{
public class ArrayOfFrozenObjectsNode : DehydratableObjectNode, ISymbolDefinitionNode, INodeWithSize
public class ArrayOfFrozenObjectsNode : DehydratableObjectNode, ISymbolDefinitionNode
{
private int? _size;
int INodeWithSize.Size => _size.Value;

public void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb)
=> sb.Append(nameMangler.CompilationUnitPrefix).Append("__FrozenSegmentStart"u8);
Expand Down Expand Up @@ -57,8 +55,6 @@ protected override ObjectData GetDehydratableData(NodeFactory factory, bool relo
AlignNextObject(ref builder, factory);
builder.EmitZeroPointer();

_size = builder.CountBytes;

return builder.ToObjectData();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,15 @@ namespace ILCompiler.DependencyAnalysis
/// <summary>
/// Represents a hash table of ByRef types generated into the image.
/// </summary>
internal sealed class ByRefTypeMapNode : ObjectNode, ISymbolDefinitionNode, INodeWithSize
internal sealed class ByRefTypeMapNode : ObjectNode, ISymbolDefinitionNode
{
private int? _size;
private readonly ExternalReferencesTableNode _externalReferences;

public ByRefTypeMapNode(ExternalReferencesTableNode externalReferences)
{
_externalReferences = externalReferences;
}

int INodeWithSize.Size => _size.Value;

public void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb)
{
sb.Append(nameMangler.CompilationUnitPrefix).Append("__byref_type_map"u8);
Expand Down Expand Up @@ -61,8 +58,6 @@ public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false)

byte[] hashTableBytes = writer.Save();

_size = hashTableBytes.Length;

return new ObjectData(hashTableBytes, Array.Empty<Relocation>(), 1, new ISymbolDefinitionNode[] { this });
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,15 @@

namespace ILCompiler.DependencyAnalysis
{
internal sealed class ClassConstructorContextMap : ObjectNode, ISymbolDefinitionNode, INodeWithSize
internal sealed class ClassConstructorContextMap : ObjectNode, ISymbolDefinitionNode
{
private int? _size;
private ExternalReferencesTableNode _externalReferences;

public ClassConstructorContextMap(ExternalReferencesTableNode externalReferences)
{
_externalReferences = externalReferences;
}

int INodeWithSize.Size => _size.Value;

public void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb)
{
sb.Append(nameMangler.CompilationUnitPrefix).Append("__type_to_cctorContext_map"u8);
Expand Down Expand Up @@ -73,8 +70,6 @@ public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false)

byte[] hashTableBytes = writer.Save();

_size = hashTableBytes.Length;

return new ObjectData(hashTableBytes, Array.Empty<Relocation>(), 1, new ISymbolDefinitionNode[] { this });
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,8 @@ namespace ILCompiler.DependencyAnalysis
/// * Generate N bytes of zeros.
/// * Generate a relocation to Nth entry in the lookup table that supplements the dehydrated stream.
/// </remarks>
internal sealed class DehydratedDataNode : ObjectNode, ISymbolDefinitionNode, INodeWithSize
internal sealed class DehydratedDataNode : ObjectNode, ISymbolDefinitionNode
{
private int? _size;

public override bool IsShareable => false;

Expand All @@ -43,8 +42,6 @@ internal sealed class DehydratedDataNode : ObjectNode, ISymbolDefinitionNode, IN

public int Offset => 0;

int INodeWithSize.Size => _size.Value;

public void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb)
{
sb.Append(nameMangler.CompilationUnitPrefix).Append("__dehydrated_data"u8);
Expand Down Expand Up @@ -107,6 +104,8 @@ public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false)
Array.Resize(ref relocSort, lastProfitableReloc);
var relocs = new Dictionary<ISymbolNode, int>(relocSort);

ObjectDataBuilder.Reservation numRelocsReservation = builder.ReserveInt();

// Walk all the ObjectDatas and generate the dehydrated instruction stream.
byte[] buff = new byte[4];
int dehydratedSegmentPosition = 0;
Expand Down Expand Up @@ -309,7 +308,7 @@ public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false)
dehydratedSegmentPosition += o.Data.Length;
}

_size = builder.CountBytes;
builder.EmitInt(numRelocsReservation, relocSort.Length);

// Dehydrated data is followed by the reloc lookup table.
for (int i = 0; i < relocSort.Length; i++)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,8 @@ namespace ILCompiler.DependencyAnalysis
/// <summary>
/// Represents a hash table of delegate marshalling stub types generated into the image.
/// </summary>
internal sealed class DelegateMarshallingStubMapNode : ObjectNode, ISymbolDefinitionNode, INodeWithSize
internal sealed class DelegateMarshallingStubMapNode : ObjectNode, ISymbolDefinitionNode
{
private int? _size;
private readonly ExternalReferencesTableNode _externalReferences;
private readonly InteropStateManager _interopStateManager;

Expand All @@ -24,8 +23,6 @@ public DelegateMarshallingStubMapNode(ExternalReferencesTableNode externalRefere
_interopStateManager = interopStateManager;
}

int INodeWithSize.Size => _size.Value;

public void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb)
{
sb.Append(nameMangler.CompilationUnitPrefix).Append("__delegate_marshalling_stub_map"u8);
Expand Down Expand Up @@ -70,8 +67,6 @@ public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false)

byte[] hashTableBytes = writer.Save();

_size = hashTableBytes.Length;

return new ObjectData(hashTableBytes, Array.Empty<Relocation>(), 1, new ISymbolDefinitionNode[] { this });
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,8 @@ namespace ILCompiler.DependencyAnalysis
/// <summary>
/// Hashtable of all exact (non-canonical) generic method instantiations compiled in the module.
/// </summary>
public sealed class ExactMethodInstantiationsNode : ObjectNode, ISymbolDefinitionNode, INodeWithSize
public sealed class ExactMethodInstantiationsNode : ObjectNode, ISymbolDefinitionNode
{
private int? _size;
private ExternalReferencesTableNode _externalReferences;

public ExactMethodInstantiationsNode(ExternalReferencesTableNode externalReferences)
Expand All @@ -29,7 +28,6 @@ public void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb)
sb.Append(nameMangler.CompilationUnitPrefix).Append("__exact_method_instantiations"u8);
}

int INodeWithSize.Size => _size.Value;
public int Offset => 0;
public override bool IsShareable => false;
public override ObjectNodeSection GetSection(NodeFactory factory) => _externalReferences.GetSection(factory);
Expand All @@ -50,7 +48,6 @@ public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false)
Section nativeSection = nativeWriter.NewSection();
nativeSection.Place(hashtable);


foreach (MethodDesc method in factory.MetadataManager.GetExactMethodHashtableEntries())
{
// Get the method pointer vertex
Expand Down Expand Up @@ -98,8 +95,6 @@ public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false)

byte[] streamBytes = nativeWriter.Save();

_size = streamBytes.Length;

return new ObjectData(streamBytes, Array.Empty<Relocation>(), 1, new ISymbolDefinitionNode[] { this });
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,8 @@ namespace ILCompiler.DependencyAnalysis
/// <summary>
/// Represents a node that points to various symbols and can be sequentially addressed.
/// </summary>
public sealed class ExternalReferencesTableNode : ObjectNode, ISymbolDefinitionNode, INodeWithSize
public sealed class ExternalReferencesTableNode : ObjectNode, ISymbolDefinitionNode
{
private int? _size;
private readonly string _blobName;
private readonly NodeFactory _nodeFactory;

Expand All @@ -28,8 +27,6 @@ public ExternalReferencesTableNode(string blobName, NodeFactory nodeFactory)
_nodeFactory = nodeFactory;
}

int INodeWithSize.Size => _size.Value;

public void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb)
{
sb.Append(nameMangler.CompilationUnitPrefix).Append("__external_" + _blobName + "_references");
Expand Down Expand Up @@ -102,8 +99,6 @@ public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false)
}
}

_size = builder.CountBytes;

builder.AddSymbol(this);

return builder.ToObjectData();
Expand Down
Loading
Loading