From 1cf4bde76e4063acbc163a7c8d31900a3ded39ac Mon Sep 17 00:00:00 2001 From: =?utf8?q?Michal=20Strehovsk=C3=BD?= Date: Tue, 2 Jun 2020 10:20:06 +0200 Subject: [PATCH] Linker-annotate Type/TypeInfo/RuntimeType (#37243) This annotates methods that linker was complaining about when analyzing their method bodies. We'll probably want to annotate additional methods that are unsafe, but linker doesn't see them. --- .../src/System/RuntimeType.CoreCLR.cs | 1 + .../src/System/Reflection/TypeInfo.cs | 53 +++++++++++++-- .../src/System/Type.Helpers.cs | 1 + .../System.Private.CoreLib/src/System/Type.cs | 76 +++++++++++++++++++++- 4 files changed, 124 insertions(+), 7 deletions(-) diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs index 3215635..3d1da0e 100644 --- a/src/coreclr/src/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs +++ b/src/coreclr/src/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs @@ -3378,6 +3378,7 @@ namespace System [DebuggerStepThrough] [DebuggerHidden] + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] public override object? InvokeMember( string name, BindingFlags bindingFlags, Binder? binder, object? target, object?[]? providedArgs, ParameterModifier[]? modifiers, CultureInfo? culture, string[]? namedParams) diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeInfo.cs index 1e10558..1baea1a 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeInfo.cs @@ -16,12 +16,22 @@ namespace System.Reflection public virtual Type[] GenericTypeParameters => IsGenericTypeDefinition ? GetGenericArguments() : Type.EmptyTypes; + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicEvents | DynamicallyAccessedMemberTypes.NonPublicEvents)] public virtual EventInfo? GetDeclaredEvent(string name) => GetEvent(name, TypeInfo.DeclaredOnlyLookup); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields)] public virtual FieldInfo? GetDeclaredField(string name) => GetField(name, TypeInfo.DeclaredOnlyLookup); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] public virtual MethodInfo? GetDeclaredMethod(string name) => GetMethod(name, TypeInfo.DeclaredOnlyLookup); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicNestedTypes | DynamicallyAccessedMemberTypes.NonPublicNestedTypes)] public virtual TypeInfo? GetDeclaredNestedType(string name) => GetNestedType(name, TypeInfo.DeclaredOnlyLookup)?.GetTypeInfo(); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] public virtual PropertyInfo? GetDeclaredProperty(string name) => GetProperty(name, TypeInfo.DeclaredOnlyLookup); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] public virtual IEnumerable GetDeclaredMethods(string name) { foreach (MethodInfo method in GetMethods(TypeInfo.DeclaredOnlyLookup)) @@ -31,13 +41,39 @@ namespace System.Reflection } } - public virtual IEnumerable DeclaredConstructors => GetConstructors(TypeInfo.DeclaredOnlyLookup); - public virtual IEnumerable DeclaredEvents => GetEvents(TypeInfo.DeclaredOnlyLookup); - public virtual IEnumerable DeclaredFields => GetFields(TypeInfo.DeclaredOnlyLookup); - public virtual IEnumerable DeclaredMembers => GetMembers(TypeInfo.DeclaredOnlyLookup); - public virtual IEnumerable DeclaredMethods => GetMethods(TypeInfo.DeclaredOnlyLookup); + public virtual IEnumerable DeclaredConstructors + { + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] + get => GetConstructors(TypeInfo.DeclaredOnlyLookup); + } + + public virtual IEnumerable DeclaredEvents + { + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicEvents | DynamicallyAccessedMemberTypes.NonPublicEvents)] + get => GetEvents(TypeInfo.DeclaredOnlyLookup); + } + + public virtual IEnumerable DeclaredFields + { + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields)] + get => GetFields(TypeInfo.DeclaredOnlyLookup); + } + + public virtual IEnumerable DeclaredMembers + { + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] + get => GetMembers(TypeInfo.DeclaredOnlyLookup); + } + + public virtual IEnumerable DeclaredMethods + { + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] + get => GetMethods(TypeInfo.DeclaredOnlyLookup); + } + public virtual IEnumerable DeclaredNestedTypes { + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicNestedTypes | DynamicallyAccessedMemberTypes.NonPublicNestedTypes)] get { foreach (Type t in GetNestedTypes(TypeInfo.DeclaredOnlyLookup)) @@ -46,7 +82,12 @@ namespace System.Reflection } } } - public virtual IEnumerable DeclaredProperties => GetProperties(TypeInfo.DeclaredOnlyLookup); + + public virtual IEnumerable DeclaredProperties + { + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] + get => GetProperties(TypeInfo.DeclaredOnlyLookup); + } public virtual IEnumerable ImplementedInterfaces => GetInterfaces(); diff --git a/src/libraries/System.Private.CoreLib/src/System/Type.Helpers.cs b/src/libraries/System.Private.CoreLib/src/System/Type.Helpers.cs index f407ebc..e33e059 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Type.Helpers.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Type.Helpers.cs @@ -142,6 +142,7 @@ namespace System return ret; } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] public virtual MemberInfo[] FindMembers(MemberTypes memberType, BindingFlags bindingAttr, MemberFilter? filter, object? filterCriteria) { // Define the work arrays diff --git a/src/libraries/System.Private.CoreLib/src/System/Type.cs b/src/libraries/System.Private.CoreLib/src/System/Type.cs index 76aa11b..7c4be7b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Type.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Type.cs @@ -119,10 +119,20 @@ namespace System public virtual bool IsSecurityTransparent => throw NotImplemented.ByDesign; public virtual StructLayoutAttribute? StructLayoutAttribute => throw new NotSupportedException(); - public ConstructorInfo? TypeInitializer => GetConstructorImpl(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, CallingConventions.Any, Type.EmptyTypes, null); + public ConstructorInfo? TypeInitializer + { + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] + get => GetConstructorImpl(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, CallingConventions.Any, Type.EmptyTypes, null); + } + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] public ConstructorInfo? GetConstructor(Type[] types) => GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, types, null); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] public ConstructorInfo? GetConstructor(BindingFlags bindingAttr, Binder? binder, Type[] types, ParameterModifier[]? modifiers) => GetConstructor(bindingAttr, binder, CallingConventions.Any, types, modifiers); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] public ConstructorInfo? GetConstructor(BindingFlags bindingAttr, Binder? binder, CallingConventions callConvention, Type[] types, ParameterModifier[]? modifiers) { if (types == null) @@ -134,21 +144,38 @@ namespace System } return GetConstructorImpl(bindingAttr, binder, callConvention, types, modifiers); } + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] protected abstract ConstructorInfo? GetConstructorImpl(BindingFlags bindingAttr, Binder? binder, CallingConventions callConvention, Type[] types, ParameterModifier[]? modifiers); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] public ConstructorInfo[] GetConstructors() => GetConstructors(BindingFlags.Public | BindingFlags.Instance); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] public abstract ConstructorInfo[] GetConstructors(BindingFlags bindingAttr); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicEvents)] public EventInfo? GetEvent(string name) => GetEvent(name, Type.DefaultLookup); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicEvents | DynamicallyAccessedMemberTypes.NonPublicEvents)] public abstract EventInfo? GetEvent(string name, BindingFlags bindingAttr); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicEvents)] public virtual EventInfo[] GetEvents() => GetEvents(Type.DefaultLookup); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicEvents | DynamicallyAccessedMemberTypes.NonPublicEvents)] public abstract EventInfo[] GetEvents(BindingFlags bindingAttr); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] public FieldInfo? GetField(string name) => GetField(name, Type.DefaultLookup); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields)] public abstract FieldInfo? GetField(string name, BindingFlags bindingAttr); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] public FieldInfo[] GetFields() => GetFields(Type.DefaultLookup); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields)] public abstract FieldInfo[] GetFields(BindingFlags bindingAttr); public MemberInfo[] GetMember(string name) => GetMember(name, Type.DefaultLookup); @@ -158,7 +185,10 @@ namespace System public MemberInfo[] GetMembers() => GetMembers(Type.DefaultLookup); public abstract MemberInfo[] GetMembers(BindingFlags bindingAttr); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] public MethodInfo? GetMethod(string name) => GetMethod(name, Type.DefaultLookup); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] public MethodInfo? GetMethod(string name, BindingFlags bindingAttr) { if (name == null) @@ -166,9 +196,16 @@ namespace System return GetMethodImpl(name, bindingAttr, null, CallingConventions.Any, null, null); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] public MethodInfo? GetMethod(string name, Type[] types) => GetMethod(name, types, null); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] public MethodInfo? GetMethod(string name, Type[] types, ParameterModifier[]? modifiers) => GetMethod(name, Type.DefaultLookup, null, types, modifiers); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] public MethodInfo? GetMethod(string name, BindingFlags bindingAttr, Binder? binder, Type[] types, ParameterModifier[]? modifiers) => GetMethod(name, bindingAttr, binder, CallingConventions.Any, types, modifiers); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] public MethodInfo? GetMethod(string name, BindingFlags bindingAttr, Binder? binder, CallingConventions callConvention, Type[] types, ParameterModifier[]? modifiers) { if (name == null) @@ -183,11 +220,19 @@ namespace System return GetMethodImpl(name, bindingAttr, binder, callConvention, types, modifiers); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] protected abstract MethodInfo? GetMethodImpl(string name, BindingFlags bindingAttr, Binder? binder, CallingConventions callConvention, Type[]? types, ParameterModifier[]? modifiers); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] public MethodInfo? GetMethod(string name, int genericParameterCount, Type[] types) => GetMethod(name, genericParameterCount, types, null); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] public MethodInfo? GetMethod(string name, int genericParameterCount, Type[] types, ParameterModifier[]? modifiers) => GetMethod(name, genericParameterCount, Type.DefaultLookup, null, types, modifiers); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] public MethodInfo? GetMethod(string name, int genericParameterCount, BindingFlags bindingAttr, Binder? binder, Type[] types, ParameterModifier[]? modifiers) => GetMethod(name, genericParameterCount, bindingAttr, binder, CallingConventions.Any, types, modifiers); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] public MethodInfo? GetMethod(string name, int genericParameterCount, BindingFlags bindingAttr, Binder? binder, CallingConventions callConvention, Type[] types, ParameterModifier[]? modifiers) { if (name == null) @@ -204,18 +249,31 @@ namespace System return GetMethodImpl(name, genericParameterCount, bindingAttr, binder, callConvention, types, modifiers); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] protected virtual MethodInfo? GetMethodImpl(string name, int genericParameterCount, BindingFlags bindingAttr, Binder? binder, CallingConventions callConvention, Type[]? types, ParameterModifier[]? modifiers) => throw new NotSupportedException(); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] public MethodInfo[] GetMethods() => GetMethods(Type.DefaultLookup); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] public abstract MethodInfo[] GetMethods(BindingFlags bindingAttr); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicNestedTypes)] public Type? GetNestedType(string name) => GetNestedType(name, Type.DefaultLookup); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicNestedTypes | DynamicallyAccessedMemberTypes.NonPublicNestedTypes)] public abstract Type? GetNestedType(string name, BindingFlags bindingAttr); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicNestedTypes)] public Type[] GetNestedTypes() => GetNestedTypes(Type.DefaultLookup); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicNestedTypes | DynamicallyAccessedMemberTypes.NonPublicNestedTypes)] public abstract Type[] GetNestedTypes(BindingFlags bindingAttr); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public PropertyInfo? GetProperty(string name) => GetProperty(name, Type.DefaultLookup); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] public PropertyInfo? GetProperty(string name, BindingFlags bindingAttr) { if (name == null) @@ -223,6 +281,7 @@ namespace System return GetPropertyImpl(name, bindingAttr, null, null, null, null); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public PropertyInfo? GetProperty(string name, Type? returnType) { if (name == null) @@ -230,9 +289,16 @@ namespace System return GetPropertyImpl(name, Type.DefaultLookup, null, returnType, null, null); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public PropertyInfo? GetProperty(string name, Type[] types) => GetProperty(name, null, types); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public PropertyInfo? GetProperty(string name, Type? returnType, Type[] types) => GetProperty(name, returnType, types, null); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public PropertyInfo? GetProperty(string name, Type? returnType, Type[] types, ParameterModifier[]? modifiers) => GetProperty(name, Type.DefaultLookup, null, returnType, types, modifiers); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] public PropertyInfo? GetProperty(string name, BindingFlags bindingAttr, Binder? binder, Type? returnType, Type[] types, ParameterModifier[]? modifiers) { if (name == null) @@ -242,9 +308,13 @@ namespace System return GetPropertyImpl(name, bindingAttr, binder, returnType, types, modifiers); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] protected abstract PropertyInfo? GetPropertyImpl(string name, BindingFlags bindingAttr, Binder? binder, Type? returnType, Type[]? types, ParameterModifier[]? modifiers); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] public PropertyInfo[] GetProperties() => GetProperties(Type.DefaultLookup); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] public abstract PropertyInfo[] GetProperties(BindingFlags bindingAttr); public virtual MemberInfo[] GetDefaultMembers() => throw NotImplemented.ByDesign; @@ -302,11 +372,15 @@ namespace System [DebuggerHidden] [DebuggerStepThrough] + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] public object? InvokeMember(string name, BindingFlags invokeAttr, Binder? binder, object? target, object?[]? args) => InvokeMember(name, invokeAttr, binder, target, args, null, null, null); [DebuggerHidden] [DebuggerStepThrough] + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] public object? InvokeMember(string name, BindingFlags invokeAttr, Binder? binder, object? target, object?[]? args, CultureInfo? culture) => InvokeMember(name, invokeAttr, binder, target, args, null, culture, null); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] public abstract object? InvokeMember(string name, BindingFlags invokeAttr, Binder? binder, object? target, object?[]? args, ParameterModifier[]? modifiers, CultureInfo? culture, string[]? namedParameters); public Type? GetInterface(string name) => GetInterface(name, ignoreCase: false); -- 2.7.4