diff --git a/src/tools/illink/src/linker/Linker.Steps/MarkStep.cs b/src/tools/illink/src/linker/Linker.Steps/MarkStep.cs index 280f1908f79f03..0e95901f271aca 100644 --- a/src/tools/illink/src/linker/Linker.Steps/MarkStep.cs +++ b/src/tools/illink/src/linker/Linker.Steps/MarkStep.cs @@ -477,7 +477,6 @@ bool ProcessMarkedPending () foreach (var type in Annotations.GetPendingPreserve ()) { marked = true; - Debug.Assert (Annotations.IsProcessed (type)); ApplyPreserveInfo (type); } @@ -2785,7 +2784,7 @@ void ApplyPreserveInfo (TypeDefinition type) if (Annotations.TryGetPreserve (type, out TypePreserve preserve)) { if (!Annotations.SetAppliedPreserve (type, preserve)) - throw new InternalErrorException ($"Type {type} already has applied {preserve}."); + return; var di = new DependencyInfo (DependencyKind.TypePreserve, type); diff --git a/src/tools/illink/src/linker/Linker/Annotations.cs b/src/tools/illink/src/linker/Linker/Annotations.cs index 68c8c320749966..bfcfe56e7d71e7 100644 --- a/src/tools/illink/src/linker/Linker/Annotations.cs +++ b/src/tools/illink/src/linker/Linker/Annotations.cs @@ -34,7 +34,6 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Linq; -using System.Reflection.Metadata.Ecma335; using ILLink.Shared.TrimAnalysis; using Mono.Cecil; using Mono.Cecil.Cil; @@ -303,25 +302,12 @@ public bool SetAppliedPreserve (TypeDefinition type, TypePreserve preserve) return true; } - public bool HasAppliedPreserve (TypeDefinition type, TypePreserve preserve) - { - if (!preserved_types.TryGetValue (type, out (TypePreserve preserve, bool applied) existing)) - throw new InternalErrorException ($"Type {type} must have a TypePreserve before it can be applied."); - - if (preserve != existing.preserve) - throw new InternalErrorException ($"Type {type} does not have {preserve}. The TypePreserve may have changed before the call to {nameof (HasAppliedPreserve)}."); - - return existing.applied; - } - public void SetPreserve (TypeDefinition type, TypePreserve preserve) { Debug.Assert (preserve != TypePreserve.Nothing); if (!preserved_types.TryGetValue (type, out (TypePreserve preserve, bool applied) existing)) { preserved_types.Add (type, (preserve, false)); if (IsProcessed (type)) { - // Required to track preserve for marked types where the existing preserve - // was Nothing (since these aren't explicitly tracked.) var addedPending = pending_preserve.Add (type); Debug.Assert (addedPending); } diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/CommandLine/CustomStepApplyPreserve.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/CommandLine/CustomStepApplyPreserve.cs new file mode 100644 index 00000000000000..ae48755d7fedfd --- /dev/null +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/CommandLine/CustomStepApplyPreserve.cs @@ -0,0 +1,35 @@ +using System; +using Mono.Linker.Tests.Cases.Expectations.Assertions; +using Mono.Linker.Tests.Cases.Expectations.Metadata; + +namespace Mono.Linker.Tests.Cases.CommandLine +{ + [SetupCompileBefore ("CustomApplyPreserveStep.dll", new[] { "Dependencies/CustomApplyPreserveStep.cs" }, new[] { "illink.dll", "Mono.Cecil.dll" }, addAsReference: false)] + [SetupLinkerArgument ("--custom-step", "-MarkStep:CustomStep.CustomApplyPreserveStep,CustomApplyPreserveStep.dll")] + [SetupLinkerArgument ("--verbose")] + public class CustomStepApplyPreserve + { + [Kept] + public class HasPreserveApplied + { + [Kept] + public int Field; + + [Kept] + public HasPreserveApplied () { } + + [Kept] + public void Method () + { + } + + public class Nested { } + } + + [Kept] + public static void Main () + { + Console.WriteLine (typeof (HasPreserveApplied).FullName); + } + } +} diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/CommandLine/Dependencies/CustomApplyPreserveStep.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/CommandLine/Dependencies/CustomApplyPreserveStep.cs new file mode 100644 index 00000000000000..1975f2c357179a --- /dev/null +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/CommandLine/Dependencies/CustomApplyPreserveStep.cs @@ -0,0 +1,13 @@ +namespace CustomStep +{ + public class CustomApplyPreserveStep : Mono.Linker.Steps.IStep + { + public void Process(Mono.Linker.LinkContext context) + { + var myType = context.GetType("Mono.Linker.Tests.Cases.CommandLine.CustomStepApplyPreserve/HasPreserveApplied"); + context.Annotations.SetPreserve(myType, Mono.Linker.TypePreserve.Methods); + // Make sure we can set preserve multiple times + context.Annotations.SetPreserve(myType, Mono.Linker.TypePreserve.All); + } + } +} diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/Mono.Linker.Tests.Cases.csproj b/src/tools/illink/test/Mono.Linker.Tests.Cases/Mono.Linker.Tests.Cases.csproj index 2b025d9861a116..f54ae5639f9b75 100644 --- a/src/tools/illink/test/Mono.Linker.Tests.Cases/Mono.Linker.Tests.Cases.csproj +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/Mono.Linker.Tests.Cases.csproj @@ -22,6 +22,7 @@ +