Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corert.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Strehovský <MichalStrehovsky@users.noreply.github.com>2017-01-13 02:04:38 +0300
committerGitHub <noreply@github.com>2017-01-13 02:04:38 +0300
commit3c743db45a56bb67de58f1d86e00ba360eb2ea0e (patch)
tree1857307f231d533b7cdd8c39121f7a4f321510a0
parent3c469925815430603fd64011ba9c98faaf187d65 (diff)
parentdaabbb9b56e48de5d0f9aa6fbb7772c555e539ff (diff)
Merge pull request #2496 from MichalStrehovsky/nativeLayoutCleanup
Cleanup around ExactMethodInstantiation and Generics hashtable
-rw-r--r--src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/ExactMethodInstantiationsNode.cs28
-rw-r--r--src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/GenericsHashtableNode.cs53
-rw-r--r--src/ILCompiler.Compiler/src/Compiler/MetadataGeneration.cs46
3 files changed, 46 insertions, 81 deletions
diff --git a/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/ExactMethodInstantiationsNode.cs b/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/ExactMethodInstantiationsNode.cs
index 9c6ed6029..124b1854f 100644
--- a/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/ExactMethodInstantiationsNode.cs
+++ b/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/ExactMethodInstantiationsNode.cs
@@ -5,7 +5,6 @@
using System;
using System.IO;
using System.Diagnostics;
-using System.Collections.Generic;
using Internal.Text;
using Internal.TypeSystem;
@@ -21,16 +20,10 @@ namespace ILCompiler.DependencyAnalysis
private ObjectAndOffsetSymbolNode _endSymbol;
private ExternalReferencesTableNode _externalReferences;
- private HashSet<MethodDesc> _visitedMethods;
- private List<MethodDesc> _exactMethodInstantiationsList;
-
public ExactMethodInstantiationsNode(ExternalReferencesTableNode externalReferences)
{
_endSymbol = new ObjectAndOffsetSymbolNode(this, 0, "__exact_method_instantiations_End", true);
_externalReferences = externalReferences;
-
- _visitedMethods = new HashSet<MethodDesc>();
- _exactMethodInstantiationsList = new List<MethodDesc>();
}
public void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb)
@@ -51,21 +44,20 @@ namespace ILCompiler.DependencyAnalysis
if (relocsOnly)
return new ObjectData(Array.Empty<byte>(), Array.Empty<Relocation>(), 1, new ISymbolNode[] { this });
- // Zero out the hashset so that we AV if someone tries to insert after we're done.
- _visitedMethods = null;
-
// Ensure the native layout data has been saved, in order to get valid Vertex offsets for the signature Vertices
factory.MetadataManager.NativeLayoutInfo.SaveNativeLayoutInfoWriter(factory);
-
NativeWriter nativeWriter = new NativeWriter();
VertexHashtable hashtable = new VertexHashtable();
Section nativeSection = nativeWriter.NewSection();
nativeSection.Place(hashtable);
- foreach (MethodDesc method in _exactMethodInstantiationsList)
+ foreach (MethodDesc method in factory.MetadataManager.GetCompiledMethods())
{
+ if (!IsMethodEligibleForTracking(method))
+ continue;
+
// Get the method pointer vertex
bool getUnboxingStub = method.OwningType.IsValueType && !method.Signature.IsStatic;
@@ -143,18 +135,6 @@ namespace ILCompiler.DependencyAnalysis
return dependencies;
}
- public void AddEntryIfEligible(NodeFactory factory, MethodDesc method)
- {
- // Check if we already saw this method
- if (!_visitedMethods.Add(method))
- return;
-
- if (!IsMethodEligibleForTracking(method))
- return;
-
- _exactMethodInstantiationsList.Add(method);
- }
-
private static bool IsMethodEligibleForTracking(MethodDesc method)
{
// Runtime determined methods should never show up here.
diff --git a/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/GenericsHashtableNode.cs b/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/GenericsHashtableNode.cs
index 5511c4114..fd5315207 100644
--- a/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/GenericsHashtableNode.cs
+++ b/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/GenericsHashtableNode.cs
@@ -4,8 +4,6 @@
using System;
using System.IO;
-using System.Diagnostics;
-using System.Collections.Generic;
using Internal.Text;
using Internal.TypeSystem;
@@ -21,23 +19,10 @@ namespace ILCompiler.DependencyAnalysis
private ObjectAndOffsetSymbolNode _endSymbol;
private ExternalReferencesTableNode _externalReferences;
- private NativeWriter _writer;
- private Section _tableSection;
- private VertexHashtable _hashtable;
-
- private HashSet<TypeDesc> _genericTypeInstantiations;
-
public GenericsHashtableNode(ExternalReferencesTableNode externalReferences)
{
_endSymbol = new ObjectAndOffsetSymbolNode(this, 0, "__generics_hashtable_End", true);
_externalReferences = externalReferences;
-
- _writer = new NativeWriter();
- _hashtable = new VertexHashtable();
- _tableSection = _writer.NewSection();
- _tableSection.Place(_hashtable);
-
- _genericTypeInstantiations = new HashSet<TypeDesc>();
}
public void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb)
@@ -52,34 +37,32 @@ namespace ILCompiler.DependencyAnalysis
public override bool StaticDependenciesAreComputed => true;
protected override string GetName() => this.GetMangledName();
- public void AddEntryIfEligible(NodeFactory factory, TypeDesc type)
- {
- // If this is an instantiated non-canonical generic type, add it to the generic instantiations hashtable
- if (!type.HasInstantiation || type.IsGenericDefinition || type.IsCanonicalSubtype(CanonicalFormKind.Any))
- return;
-
- // Already added?
- if (!_genericTypeInstantiations.Add(type))
- return;
-
- var typeSymbol = factory.NecessaryTypeSymbol(type);
- uint instantiationId = _externalReferences.GetIndex(typeSymbol);
- Vertex hashtableEntry = _writer.GetUnsignedConstant(instantiationId);
-
- _hashtable.Append((uint)type.GetHashCode(), _tableSection.Place(hashtableEntry));
- }
-
public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false)
{
// This node does not trigger generation of other nodes.
if (relocsOnly)
return new ObjectData(Array.Empty<byte>(), Array.Empty<Relocation>(), 1, new ISymbolNode[] { this });
- // Zero out the hashset so that we AV if someone tries to insert after we're done.
- _genericTypeInstantiations = null;
+ NativeWriter nativeWriter = new NativeWriter();
+ VertexHashtable hashtable = new VertexHashtable();
+ Section nativeSection = nativeWriter.NewSection();
+ nativeSection.Place(hashtable);
+
+ foreach (var type in factory.MetadataManager.GetTypesWithEETypes())
+ {
+ // If this is an instantiated non-canonical generic type, add it to the generic instantiations hashtable
+ if (!type.HasInstantiation || type.IsGenericDefinition || type.IsCanonicalSubtype(CanonicalFormKind.Any))
+ continue;
+
+ var typeSymbol = factory.NecessaryTypeSymbol(type);
+ uint instantiationId = _externalReferences.GetIndex(typeSymbol);
+ Vertex hashtableEntry = nativeWriter.GetUnsignedConstant(instantiationId);
+
+ hashtable.Append((uint)type.GetHashCode(), nativeSection.Place(hashtableEntry));
+ }
MemoryStream stream = new MemoryStream();
- _writer.Save(stream);
+ nativeWriter.Save(stream);
byte[] streamBytes = stream.ToArray();
_endSymbol.SetSymbolOffset(streamBytes.Length);
diff --git a/src/ILCompiler.Compiler/src/Compiler/MetadataGeneration.cs b/src/ILCompiler.Compiler/src/Compiler/MetadataGeneration.cs
index 31a832f0e..ff39e1b51 100644
--- a/src/ILCompiler.Compiler/src/Compiler/MetadataGeneration.cs
+++ b/src/ILCompiler.Compiler/src/Compiler/MetadataGeneration.cs
@@ -46,12 +46,6 @@ namespace ILCompiler
private Dictionary<DynamicInvokeMethodSignature, MethodDesc> _dynamicInvokeThunks = new Dictionary<DynamicInvokeMethodSignature, MethodDesc>();
- private ExternalReferencesTableNode _commonFixupsTableNode;
- private ExternalReferencesTableNode _nativeReferencesTableNode;
-
- private GenericsHashtableNode _genericsHashtable;
- private ExactMethodInstantiationsNode _exactMethodInstantiations;
-
internal NativeLayoutInfoNode NativeLayoutInfo { get; private set; }
public MetadataGeneration(NodeFactory factory)
@@ -76,8 +70,8 @@ namespace ILCompiler
var metadataNode = new MetadataNode();
header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.EmbeddedMetadata), metadataNode, metadataNode, metadataNode.EndSymbol);
- _commonFixupsTableNode = new ExternalReferencesTableNode("CommonFixupsTable");
- _nativeReferencesTableNode = new ExternalReferencesTableNode("NativeReferences");
+ var commonFixupsTableNode = new ExternalReferencesTableNode("CommonFixupsTable");
+ var nativeReferencesTableNode = new ExternalReferencesTableNode("NativeReferences");
var resourceDataNode = new ResourceDataNode();
header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.BlobIdResourceData), resourceDataNode, resourceDataNode, resourceDataNode.EndSymbol);
@@ -85,34 +79,34 @@ namespace ILCompiler
var resourceIndexNode = new ResourceIndexNode(resourceDataNode);
header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.BlobIdResourceIndex), resourceIndexNode, resourceIndexNode, resourceIndexNode.EndSymbol);
- var typeMapNode = new TypeMetadataMapNode(_commonFixupsTableNode);
+ var typeMapNode = new TypeMetadataMapNode(commonFixupsTableNode);
header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.TypeMap), typeMapNode, typeMapNode, typeMapNode.EndSymbol);
- var cctorContextMapNode = new ClassConstructorContextMap(_commonFixupsTableNode);
+ var cctorContextMapNode = new ClassConstructorContextMap(commonFixupsTableNode);
header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.CCtorContextMap), cctorContextMapNode, cctorContextMapNode, cctorContextMapNode.EndSymbol);
- var invokeMapNode = new ReflectionInvokeMapNode(_commonFixupsTableNode);
+ var invokeMapNode = new ReflectionInvokeMapNode(commonFixupsTableNode);
header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.InvokeMap), invokeMapNode, invokeMapNode, invokeMapNode.EndSymbol);
- var arrayMapNode = new ArrayMapNode(_commonFixupsTableNode);
+ var arrayMapNode = new ArrayMapNode(commonFixupsTableNode);
header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.ArrayMap), arrayMapNode, arrayMapNode, arrayMapNode.EndSymbol);
- var fieldMapNode = new ReflectionFieldMapNode(_commonFixupsTableNode);
+ var fieldMapNode = new ReflectionFieldMapNode(commonFixupsTableNode);
header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.FieldAccessMap), fieldMapNode, fieldMapNode, fieldMapNode.EndSymbol);
- NativeLayoutInfo = new NativeLayoutInfoNode(_nativeReferencesTableNode);
+ NativeLayoutInfo = new NativeLayoutInfoNode(nativeReferencesTableNode);
header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.NativeLayoutInfo), NativeLayoutInfo, NativeLayoutInfo, NativeLayoutInfo.EndSymbol);
- _exactMethodInstantiations = new ExactMethodInstantiationsNode(_nativeReferencesTableNode);
- header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.ExactMethodInstantiationsHashtable), _exactMethodInstantiations, _exactMethodInstantiations, _exactMethodInstantiations.EndSymbol);
+ var exactMethodInstantiations = new ExactMethodInstantiationsNode(nativeReferencesTableNode);
+ header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.ExactMethodInstantiationsHashtable), exactMethodInstantiations, exactMethodInstantiations, exactMethodInstantiations.EndSymbol);
- _genericsHashtable = new GenericsHashtableNode(_nativeReferencesTableNode);
- header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.GenericsHashtable), _genericsHashtable, _genericsHashtable, _genericsHashtable.EndSymbol);
+ var genericsHashtable = new GenericsHashtableNode(nativeReferencesTableNode);
+ header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.GenericsHashtable), genericsHashtable, genericsHashtable, genericsHashtable.EndSymbol);
// This one should go last
- header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.CommonFixupsTable), _commonFixupsTableNode, _commonFixupsTableNode, _commonFixupsTableNode.EndSymbol);
- header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.NativeReferences), _nativeReferencesTableNode, _nativeReferencesTableNode, _nativeReferencesTableNode.EndSymbol);
+ header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.CommonFixupsTable), commonFixupsTableNode, commonFixupsTableNode, commonFixupsTableNode.EndSymbol);
+ header.Add(BlobIdToReadyToRunSection(ReflectionMapBlob.NativeReferences), nativeReferencesTableNode, nativeReferencesTableNode, nativeReferencesTableNode.EndSymbol);
}
private void Graph_NewMarkedNode(DependencyNodeCore<NodeFactory> obj)
@@ -122,7 +116,6 @@ namespace ILCompiler
{
_typesWithEETypesGenerated.Add(eetypeNode.Type);
AddGeneratedType(eetypeNode.Type);
- _genericsHashtable.AddEntryIfEligible(_nodeFactory, eetypeNode.Type);
return;
}
@@ -140,7 +133,6 @@ namespace ILCompiler
}
AddGeneratedType(method.OwningType);
- _exactMethodInstantiations.AddEntryIfEligible(_nodeFactory, method);
_methodDefinitionsGenerated.Add(method.GetTypicalMethodDefinition());
_methodsGenerated.Add(method);
return;
@@ -392,11 +384,21 @@ namespace ILCompiler
return _arrayTypesGenerated;
}
+ internal IEnumerable<MethodDesc> GetCompiledMethods()
+ {
+ return _methodsGenerated;
+ }
+
internal bool TypeGeneratesEEType(TypeDesc type)
{
return _typesWithEETypesGenerated.Contains(type);
}
+ internal IEnumerable<TypeDesc> GetTypesWithEETypes()
+ {
+ return _typesWithEETypesGenerated;
+ }
+
private struct DummyMetadataPolicy : IMetadataPolicy
{
private MetadataGeneration _parent;