diff --git a/src/tools/illink/src/linker/Linker.Steps/MarkStep.NodeFactory.cs b/src/tools/illink/src/linker/Linker.Steps/MarkStep.NodeFactory.cs index 7e16f7ac25981d..61d1e806209f43 100644 --- a/src/tools/illink/src/linker/Linker.Steps/MarkStep.NodeFactory.cs +++ b/src/tools/illink/src/linker/Linker.Steps/MarkStep.NodeFactory.cs @@ -15,6 +15,7 @@ internal sealed class NodeFactory (MarkStep markStep) public MarkStep MarkStep { get; } = markStep; readonly NodeCache _typeNodes = new (static t => new TypeDefinitionNode(t)); readonly NodeCache _methodNodes = new (static _ => throw new InvalidOperationException ("Creation of node requires more than the key.")); + readonly NodeCache _propertyNodes = new (static p => new PropertyDefinitionNode(p)); readonly NodeCache _typeIsRelevantToVariantCastingNodes = new (static (t) => new TypeIsRelevantToVariantCastingNode (t)); internal TypeDefinitionNode GetTypeNode (TypeDefinition definition) @@ -32,6 +33,11 @@ internal TypeIsRelevantToVariantCastingNode GetTypeIsRelevantToVariantCastingNod return _typeIsRelevantToVariantCastingNodes.GetOrAdd (type); } + internal PropertyDefinitionNode GetPropertyNode (PropertyDefinition prop) + { + return _propertyNodes.GetOrAdd (prop); + } + struct NodeCache where TKey : notnull { // Change to concurrent dictionary if/when multithreaded marking is enabled diff --git a/src/tools/illink/src/linker/Linker.Steps/MarkStep.PropertyDefinitionNode.cs b/src/tools/illink/src/linker/Linker.Steps/MarkStep.PropertyDefinitionNode.cs new file mode 100644 index 00000000000000..68e86ba7edca25 --- /dev/null +++ b/src/tools/illink/src/linker/Linker.Steps/MarkStep.PropertyDefinitionNode.cs @@ -0,0 +1,46 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using ILCompiler.DependencyAnalysisFramework; +using Mono.Cecil; + +namespace Mono.Linker.Steps +{ + + public partial class MarkStep + { + internal sealed class PropertyDefinitionNode : DependencyNodeCore + { + PropertyDefinition _property; + public PropertyDefinitionNode(PropertyDefinition property) + { + _property = property; + } + + public override bool InterestingForDynamicDependencyAnalysis => false; + + public override bool HasDynamicDependencies => false; + + public override bool HasConditionalStaticDependencies => false; + + public override bool StaticDependenciesAreComputed => true; + + public override IEnumerable? GetConditionalStaticDependencies (NodeFactory context) => null; + + public override IEnumerable? GetStaticDependencies (NodeFactory context) + { + var propertyOrigin = new MessageOrigin (_property); + + // Consider making this more similar to MarkEvent method? + context.MarkStep.MarkCustomAttributes (_property, new DependencyInfo (DependencyKind.CustomAttribute, _property), propertyOrigin); + context.MarkStep.DoAdditionalPropertyProcessing (_property); + return null; + } + + public override IEnumerable? SearchDynamicDependencies (List> markedNodes, int firstNode, NodeFactory context) => null; + + protected override string GetName (NodeFactory context) => _property.GetDisplayName (); + } + } +} diff --git a/src/tools/illink/src/linker/Linker.Steps/MarkStep.cs b/src/tools/illink/src/linker/Linker.Steps/MarkStep.cs index 91deaecad2c8a3..7a9acfb226770c 100644 --- a/src/tools/illink/src/linker/Linker.Steps/MarkStep.cs +++ b/src/tools/illink/src/linker/Linker.Steps/MarkStep.cs @@ -3498,11 +3498,8 @@ protected internal void MarkProperty (PropertyDefinition prop, in DependencyInfo if (!Annotations.MarkProcessed (prop, reason)) return; - var propertyOrigin = new MessageOrigin (prop); - - // Consider making this more similar to MarkEvent method? - MarkCustomAttributes (prop, new DependencyInfo (DependencyKind.CustomAttribute, prop), propertyOrigin); - DoAdditionalPropertyProcessing (prop); + PropertyDefinitionNode propertyNode = _nodeFactory.GetPropertyNode (prop); + _dependencyGraph.AddRoot (propertyNode, reason.Kind.ToString ()); } protected internal virtual void MarkEvent (EventDefinition evt, in DependencyInfo reason, MessageOrigin origin)