From 32a9a04bf69a3c3e404df5bf57411747a0e990cd Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Thu, 7 Jan 2021 18:16:51 -0600 Subject: [PATCH] Resolve ILLink warnings in System.Text.RegularExpressions (#46687) * Add DynamicallyAccessedMembers All to TypeBuilder and EnumBuilder CreateType methods. Contributes to #45623 --- .../src/System/Reflection/Emit/EnumBuilder.cs | 2 ++ .../src/System/Reflection/Emit/TypeBuilder.cs | 5 +++++ .../ref/System.Reflection.Emit.cs | 3 +++ .../src/ILLink/ILLink.Suppressions.Debug.xml | 23 ---------------------- .../src/ILLink/ILLink.Suppressions.xml | 11 ----------- .../RegularExpressions/RegexAssemblyCompiler.cs | 19 ++++++++++++++---- .../Text/RegularExpressions/RegexCompiler.cs | 3 +++ .../src/System/Reflection/Emit/EnumBuilder.Mono.cs | 2 ++ .../src/System/Reflection/Emit/TypeBuilder.Mono.cs | 5 ++--- 9 files changed, 32 insertions(+), 41 deletions(-) delete mode 100644 src/libraries/System.Text.RegularExpressions/src/ILLink/ILLink.Suppressions.Debug.xml delete mode 100644 src/libraries/System.Text.RegularExpressions/src/ILLink/ILLink.Suppressions.xml diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs index fd0807c..2d1c72d 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs @@ -38,12 +38,14 @@ namespace System.Reflection.Emit return fieldBuilder; } + [return: DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes.All)] public TypeInfo? CreateTypeInfo() { return m_typeBuilder.CreateTypeInfo(); } // CreateType cause EnumBuilder to be baked. + [return: DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes.All)] public Type? CreateType() { return m_typeBuilder.CreateType(); diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs index 7c1f93c..3a2a774 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs @@ -1881,6 +1881,7 @@ namespace System.Reflection.Emit #region Create Type + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] public TypeInfo? CreateTypeInfo() { lock (SyncRoot) @@ -1889,6 +1890,7 @@ namespace System.Reflection.Emit } } + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] public Type? CreateType() { lock (SyncRoot) @@ -1897,6 +1899,9 @@ namespace System.Reflection.Emit } } + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2083:UnrecognizedReflectionPattern", + Justification = "Reflection.Emit is not subject to trimming")] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] private TypeInfo? CreateTypeNoLock() { if (IsCreated()) diff --git a/src/libraries/System.Reflection.Emit/ref/System.Reflection.Emit.cs b/src/libraries/System.Reflection.Emit/ref/System.Reflection.Emit.cs index 278f491..4692f04 100644 --- a/src/libraries/System.Reflection.Emit/ref/System.Reflection.Emit.cs +++ b/src/libraries/System.Reflection.Emit/ref/System.Reflection.Emit.cs @@ -106,6 +106,7 @@ namespace System.Reflection.Emit public override System.RuntimeTypeHandle TypeHandle { get { throw null; } } public System.Reflection.Emit.FieldBuilder UnderlyingField { get { throw null; } } public override System.Type UnderlyingSystemType { get { throw null; } } + [return: System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)] public System.Reflection.TypeInfo? CreateTypeInfo() { throw null; } public System.Reflection.Emit.FieldBuilder DefineLiteral(string literalName, object? literalValue) { throw null; } protected override System.Reflection.TypeAttributes GetAttributeFlagsImpl() { throw null; } @@ -460,7 +461,9 @@ namespace System.Reflection.Emit public override System.RuntimeTypeHandle TypeHandle { get { throw null; } } public override System.Type UnderlyingSystemType { get { throw null; } } public void AddInterfaceImplementation([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)] System.Type interfaceType) { } + [return: System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)] public System.Type? CreateType() { throw null; } + [return: System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)] public System.Reflection.TypeInfo? CreateTypeInfo() { throw null; } public System.Reflection.Emit.ConstructorBuilder DefineConstructor(System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, System.Type[]? parameterTypes) { throw null; } public System.Reflection.Emit.ConstructorBuilder DefineConstructor(System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, System.Type[]? parameterTypes, System.Type[][]? requiredCustomModifiers, System.Type[][]? optionalCustomModifiers) { throw null; } diff --git a/src/libraries/System.Text.RegularExpressions/src/ILLink/ILLink.Suppressions.Debug.xml b/src/libraries/System.Text.RegularExpressions/src/ILLink/ILLink.Suppressions.Debug.xml deleted file mode 100644 index dd49320..0000000 --- a/src/libraries/System.Text.RegularExpressions/src/ILLink/ILLink.Suppressions.Debug.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - ILLink - IL2067 - member - M:System.Text.RegularExpressions.RegexAssemblyCompiler.DefineType(System.Reflection.Emit.ModuleBuilder,System.String,System.Boolean,System.Boolean,System.Type) - - - ILLink - IL2070 - member - M:System.Text.RegularExpressions.RegexAssemblyCompiler.GenerateCreateInstance(System.Type) - - - ILLink - IL2070 - member - M:System.Text.RegularExpressions.RegexAssemblyCompiler.GenerateRegexDefaultCtor(System.String,System.Text.RegularExpressions.RegexOptions,System.Type,System.Text.RegularExpressions.RegexCode,System.TimeSpan) - - - \ No newline at end of file diff --git a/src/libraries/System.Text.RegularExpressions/src/ILLink/ILLink.Suppressions.xml b/src/libraries/System.Text.RegularExpressions/src/ILLink/ILLink.Suppressions.xml deleted file mode 100644 index e2645a3..0000000 --- a/src/libraries/System.Text.RegularExpressions/src/ILLink/ILLink.Suppressions.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - ILLink - IL2060 - member - M:System.Text.RegularExpressions.RegexCompiler.#cctor - - - \ No newline at end of file diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexAssemblyCompiler.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexAssemblyCompiler.cs index ce7a8ce..8b35c6e 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexAssemblyCompiler.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexAssemblyCompiler.cs @@ -2,9 +2,10 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections; -using System.Threading; +using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Reflection.Emit; +using System.Threading; #if DEBUG // until it can be fully implemented namespace System.Text.RegularExpressions @@ -97,14 +98,19 @@ namespace System.Text.RegularExpressions } /// Generates a very simple factory method. - internal void GenerateCreateInstance(Type type) + private void GenerateCreateInstance([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] Type type) { // return new Type(); Newobj(type.GetConstructor(Type.EmptyTypes)!); Ret(); } - private void GenerateRegexDefaultCtor(string pattern, RegexOptions options, Type regexRunnerFactoryType, RegexCode code, TimeSpan matchTimeout) + private void GenerateRegexDefaultCtor( + string pattern, + RegexOptions options, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] Type regexRunnerFactoryType, + RegexCode code, + TimeSpan matchTimeout) { // Call the base ctor and store pattern, options, and factory. // base.ctor(); @@ -241,7 +247,12 @@ namespace System.Text.RegularExpressions } /// Begins the definition of a new type with a specified base class - private static TypeBuilder DefineType(ModuleBuilder moduleBuilder, string typeName, bool isPublic, bool isSealed, Type inheritFromClass) + private static TypeBuilder DefineType( + ModuleBuilder moduleBuilder, + string typeName, + bool isPublic, + bool isSealed, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type inheritFromClass) { TypeAttributes attrs = TypeAttributes.Class | TypeAttributes.BeforeFieldInit | (isPublic ? TypeAttributes.Public : TypeAttributes.NotPublic); if (isSealed) diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCompiler.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCompiler.cs index 7316eb8..4315c93 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCompiler.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCompiler.cs @@ -15,6 +15,9 @@ namespace System.Text.RegularExpressions /// RegexCompiler translates a block of RegexCode to MSIL, and creates a /// subclass of the RegexRunner type. /// + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod", + Target = "M:System.Text.RegularExpressions.RegexCompiler.#cctor", + Justification = "The referenced methods don't have any DynamicallyAccessedMembers annotations. See https://github.com/mono/linker/issues/1727")] internal abstract class RegexCompiler { private static readonly FieldInfo s_runtextbegField = RegexRunnerField("runtextbeg"); diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs index 38f9a9e..b9060a7 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs @@ -192,11 +192,13 @@ namespace System.Reflection.Emit } } + [return: DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes.All)] public Type? CreateType() { return _tb.CreateType(); } + [return: DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes.All)] public TypeInfo? CreateTypeInfo() { return _tb.CreateTypeInfo(); diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs index 3febd60..a5b807d 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs @@ -796,10 +796,9 @@ namespace System.Reflection.Emit // We require emitted types to have all members on their bases to be accessible. // This is basically an identity function for `this`. [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2083:UnrecognizedReflectionPattern", - Justification = "Reflection emitted types have all of their members")] + Justification = "Reflection.Emit is not subject to trimming")] [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] - public - TypeInfo? CreateTypeInfo() + public TypeInfo? CreateTypeInfo() { /* handle nesting_type */ if (createTypeCalled) -- 2.7.4