--- /dev/null
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+
+using ILCompiler.DependencyAnalysisFramework;
+using Internal.Text;
+using Internal.TypeSystem;
+
+namespace ILCompiler.DependencyAnalysis.ReadyToRun
+{
+ public class AllMethodsOnTypeNode : DependencyNodeCore<NodeFactory>
+ {
+ private readonly TypeDesc _type;
+
+ public AllMethodsOnTypeNode(TypeDesc type)
+ {
+ _type = type;
+ }
+
+ public TypeDesc Type => _type;
+
+ public override bool InterestingForDynamicDependencyAnalysis => false;
+
+ public override bool HasDynamicDependencies => false;
+
+ public override bool HasConditionalStaticDependencies => false;
+
+ public override bool StaticDependenciesAreComputed => true;
+
+ public override IEnumerable<CombinedDependencyListEntry> GetConditionalStaticDependencies(NodeFactory context) => null;
+ public override IEnumerable<CombinedDependencyListEntry> SearchDynamicDependencies(List<DependencyNodeCore<NodeFactory>> markedNodes, int firstNode, NodeFactory context) => null;
+
+ public override IEnumerable<DependencyListEntry> GetStaticDependencies(NodeFactory context)
+ {
+ DependencyList dependencies = new DependencyList();
+
+ foreach (MethodDesc method in Type.GetAllMethods())
+ {
+ if (!method.IsGenericMethodDefinition && context.CompilationModuleGroup.VersionsWithMethodBody(method))
+ {
+ dependencies.Add(context.MethodEntrypoint(method), $"Method on type {Type.ToString()}");
+ }
+ }
+
+ return dependencies;
+ }
+
+ protected override string GetName(NodeFactory factory) => $"All methods on type {Type.ToString()}";
+ }
+}
return _signatureContext.CompareTo(otherNode._signatureContext, comparer);
}
+
+ protected override DependencyList ComputeNonRelocationBasedDependencies(NodeFactory factory)
+ {
+ DependencyList dependencies = new DependencyList();
+
+ if (_typeDesc.HasInstantiation && !_typeDesc.IsGenericDefinition)
+ {
+ dependencies.Add(factory.AllMethodsOnType(_typeDesc), "Methods on generic type instantiation");
+ }
+ return dependencies;
+ }
}
}
private void CreateNodeCaches()
{
_methodEntrypoints = new NodeCache<MethodDesc, IMethodNode>(CreateMethodEntrypointNode);
+
+ _allMethodsOnType = new NodeCache<TypeDesc, AllMethodsOnTypeNode>(type =>
+ {
+ return new AllMethodsOnTypeNode(type);
+ });
+
_genericReadyToRunHelpersFromDict = new NodeCache<ReadyToRunGenericHelperKey, ISymbolNode>(CreateGenericLookupFromDictionaryNode);
_genericReadyToRunHelpersFromType = new NodeCache<ReadyToRunGenericHelperKey, ISymbolNode>(CreateGenericLookupFromTypeNode);
return _methodEntrypoints.GetOrAdd(method);
}
+ private NodeCache<TypeDesc, AllMethodsOnTypeNode> _allMethodsOnType;
+
+ public AllMethodsOnTypeNode AllMethodsOnType(TypeDesc type)
+ {
+ return _allMethodsOnType.GetOrAdd(type);
+ }
+
private NodeCache<ReadyToRunGenericHelperKey, ISymbolNode> _genericReadyToRunHelpersFromDict;
public ISymbolNode ReadyToRunHelperFromDictionaryLookup(ReadyToRunHelperId id, Object target, TypeSystemEntity dictionaryOwner)
<Compile Include="..\..\Common\TypeSystem\Interop\InteropTypes.cs" Link="Interop\InteropTypes.cs" />
<Compile Include="CodeGen\ReadyToRunObjectWriter.cs" />
<Compile Include="Compiler\CompilationModuleGroup.ReadyToRun.cs" />
+ <Compile Include="Compiler\DependencyAnalysis\AllMethodsOnTypeNode.cs" />
<Compile Include="Compiler\DependencyAnalysis\ArrayOfEmbeddedDataNode.cs" />
<Compile Include="Compiler\DependencyAnalysis\ArrayOfEmbeddedPointersNode.cs" />
<Compile Include="Compiler\DependencyAnalysis\EmbeddedObjectNode.cs" />