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:
Diffstat (limited to 'src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/DefaultConstructorMapNode.cs')
-rw-r--r--src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/DefaultConstructorMapNode.cs52
1 files changed, 9 insertions, 43 deletions
diff --git a/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/DefaultConstructorMapNode.cs b/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/DefaultConstructorMapNode.cs
index 9f6735b88..bee2f4de6 100644
--- a/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/DefaultConstructorMapNode.cs
+++ b/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/DefaultConstructorMapNode.cs
@@ -15,43 +15,6 @@ using ILCompiler.DependencyAnalysisFramework;
namespace ILCompiler.DependencyAnalysis
{
/// <summary>
- /// Dependency analysis node used to keep track of types needing an entry in the default
- /// constructor map hashtable
- /// </summary>
- internal sealed class DefaultConstructorFromLazyNode : DependencyNodeCore<NodeFactory>
- {
- public TypeDesc TypeNeedingDefaultCtor { get; }
-
- public DefaultConstructorFromLazyNode(TypeDesc type)
- {
- Debug.Assert(!type.IsRuntimeDeterminedSubtype);
- Debug.Assert(type == type.ConvertToCanonForm(CanonicalFormKind.Specific));
- Debug.Assert(type.GetDefaultConstructor() != null && !type.IsValueType);
-
- TypeNeedingDefaultCtor = type;
- }
-
- public override bool HasDynamicDependencies => false;
- public override bool HasConditionalStaticDependencies => false;
- public override bool InterestingForDynamicDependencyAnalysis => false;
- public override bool StaticDependenciesAreComputed => true;
- protected override string GetName(NodeFactory factory) => "__DefaultConstructorFromLazyNode_" + factory.NameMangler.GetMangledTypeName(TypeNeedingDefaultCtor);
- public override IEnumerable<CombinedDependencyListEntry> GetConditionalStaticDependencies(NodeFactory context) => null;
- public override IEnumerable<CombinedDependencyListEntry> SearchDynamicDependencies(List<DependencyNodeCore<NodeFactory>> markedNodes, int firstNode, NodeFactory factory) => null;
-
- public override IEnumerable<DependencyListEntry> GetStaticDependencies(NodeFactory context)
- {
- yield return new DependencyListEntry(
- context.MaximallyConstructableType(TypeNeedingDefaultCtor),
- "DefaultConstructorNode type");
-
- yield return new DependencyListEntry(
- context.MethodEntrypoint(TypeNeedingDefaultCtor.GetDefaultConstructor(), TypeNeedingDefaultCtor.IsValueType),
- "DefaultConstructorNode");
- }
- }
-
- /// <summary>
/// DefaultConstructorMap blob, containing information on default constructor entrypoints of all types used
/// by lazy generic instantiations.
/// </summary>
@@ -80,7 +43,7 @@ namespace ILCompiler.DependencyAnalysis
public override bool StaticDependenciesAreComputed => true;
protected internal override int Phase => (int)ObjectNodePhase.Ordered;
- protected internal override int ClassCode => (int)ObjectNodeOrder.DefaultConstructorMapNode;
+ public override int ClassCode => (int)ObjectNodeOrder.DefaultConstructorMapNode;
protected override string GetName(NodeFactory factory) => this.GetMangledName(factory.NameMangler);
@@ -96,19 +59,22 @@ namespace ILCompiler.DependencyAnalysis
Section defaultConstructorHashtableSection = writer.NewSection();
defaultConstructorHashtableSection.Place(defaultConstructorHashtable);
- foreach (var ctorNeeded in factory.MetadataManager.GetDefaultConstructorsNeeded())
+ foreach (var type in factory.MetadataManager.GetTypesWithConstructedEETypes())
{
- MethodDesc defaultCtor = ctorNeeded.TypeNeedingDefaultCtor.GetDefaultConstructor();
- Debug.Assert(defaultCtor != null);
+ MethodDesc defaultCtor = type.GetDefaultConstructor();
+ if (defaultCtor == null)
+ continue;
+
+ defaultCtor = defaultCtor.GetCanonMethodTarget(CanonicalFormKind.Specific);
- ISymbolNode typeNode = factory.NecessaryTypeSymbol(ctorNeeded.TypeNeedingDefaultCtor);
+ ISymbolNode typeNode = factory.NecessaryTypeSymbol(type);
ISymbolNode defaultCtorNode = factory.MethodEntrypoint(defaultCtor, false);
Vertex vertex = writer.GetTuple(
writer.GetUnsignedConstant(_externalReferences.GetIndex(typeNode)),
writer.GetUnsignedConstant(_externalReferences.GetIndex(defaultCtorNode)));
- int hashCode = ctorNeeded.TypeNeedingDefaultCtor.GetHashCode();
+ int hashCode = type.GetHashCode();
defaultConstructorHashtable.Append((uint)hashCode, defaultConstructorHashtableSection.Place(vertex));
}