Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/linker.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackson Schuster <36744439+jtschuster@users.noreply.github.com>2022-10-07 20:43:35 +0300
committerGitHub <noreply@github.com>2022-10-07 20:43:35 +0300
commit6000a84c7e0b3678af032c25b7319aefdd057f6c (patch)
treed98a1f56557fc99370ccc59bbe8ea64dd621e40c
parent5c909850449fa60f0a0df1cfec7d942a560f3607 (diff)
Remove redundant checks in IntrinsicId switch statements (#3060)
Remove redundant checks on intrinsicIds Rename Get<Member>s(BindingFlags) enum variants Make intrinsicId a required param Add doc comments for a few intrinsicIds
-rw-r--r--src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisMethodCallPattern.cs4
-rw-r--r--src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs4
-rw-r--r--src/ILLink.Shared/TrimAnalysis/HandleCallAction.cs91
-rw-r--r--src/ILLink.Shared/TrimAnalysis/IntrinsicId.cs46
-rw-r--r--src/ILLink.Shared/TrimAnalysis/Intrinsics.cs18
-rw-r--r--src/linker/Linker.Dataflow/ReflectionMethodBodyScanner.cs50
6 files changed, 123 insertions, 90 deletions
diff --git a/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisMethodCallPattern.cs b/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisMethodCallPattern.cs
index 7d644a62b..d9276c8c9 100644
--- a/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisMethodCallPattern.cs
+++ b/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisMethodCallPattern.cs
@@ -66,7 +66,9 @@ namespace ILLink.RoslynAnalyzer.TrimAnalysis
{
DiagnosticContext diagnosticContext = new (Operation.Syntax.GetLocation ());
HandleCallAction handleCallAction = new (diagnosticContext, OwningSymbol, Operation);
- if (!handleCallAction.Invoke (new MethodProxy (CalledMethod), Instance, Arguments, out _, out _)) {
+ MethodProxy method = new (CalledMethod);
+ IntrinsicId intrinsicId = Intrinsics.GetIntrinsicIdForMethod (method);
+ if (!handleCallAction.Invoke (method, Instance, Arguments, intrinsicId, out _)) {
// If this returns false it means the intrinsic needs special handling:
// case IntrinsicId.TypeDelegator_Ctor:
// No diagnostics to report - this is an "identity" operation for data flow, can't produce diagnostics on its own
diff --git a/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs b/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs
index fe49bbffa..f29eb96a8 100644
--- a/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs
+++ b/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs
@@ -252,8 +252,10 @@ namespace ILLink.RoslynAnalyzer.TrimAnalysis
var diagnosticContext = DiagnosticContext.CreateDisabled ();
var handleCallAction = new HandleCallAction (diagnosticContext, Method, operation);
+ MethodProxy method = new (calledMethod);
+ var intrinsicId = Intrinsics.GetIntrinsicIdForMethod (method);
- if (!handleCallAction.Invoke (new MethodProxy (calledMethod), instance, arguments, out MultiValue methodReturnValue, out var intrinsicId)) {
+ if (!handleCallAction.Invoke (method, instance, arguments, intrinsicId, out MultiValue methodReturnValue)) {
switch (intrinsicId) {
case IntrinsicId.Array_Empty:
methodReturnValue = ArrayValue.Create (0);
diff --git a/src/ILLink.Shared/TrimAnalysis/HandleCallAction.cs b/src/ILLink.Shared/TrimAnalysis/HandleCallAction.cs
index 934cbd002..0fcf700bd 100644
--- a/src/ILLink.Shared/TrimAnalysis/HandleCallAction.cs
+++ b/src/ILLink.Shared/TrimAnalysis/HandleCallAction.cs
@@ -27,7 +27,7 @@ namespace ILLink.Shared.TrimAnalysis
readonly FlowAnnotations _annotations;
readonly RequireDynamicallyAccessedMembersAction _requireDynamicallyAccessedMembersAction;
- public bool Invoke (MethodProxy calledMethod, MultiValue instanceValue, IReadOnlyList<MultiValue> argumentValues, out MultiValue methodReturnValue, out IntrinsicId intrinsicId)
+ public bool Invoke (MethodProxy calledMethod, MultiValue instanceValue, IReadOnlyList<MultiValue> argumentValues, IntrinsicId intrinsicId, out MultiValue methodReturnValue)
{
MultiValue? returnValue = null;
@@ -35,7 +35,6 @@ namespace ILLink.Shared.TrimAnalysis
var annotatedMethodReturnValue = _annotations.GetMethodReturnValue (calledMethod);
Debug.Assert (requiresDataFlowAnalysis || annotatedMethodReturnValue.DynamicallyAccessedMemberTypes == DynamicallyAccessedMemberTypes.None);
- intrinsicId = Intrinsics.GetIntrinsicIdForMethod (calledMethod);
switch (intrinsicId) {
case IntrinsicId.IntrospectionExtensions_GetTypeInfo:
Debug.Assert (instanceValue.IsEmpty ());
@@ -251,24 +250,25 @@ namespace ILLink.Shared.TrimAnalysis
// GetNestedTypes (BindingFlags)
// GetMembers (BindingFlags)
//
- case var callType when (callType == IntrinsicId.Type_GetConstructors || callType == IntrinsicId.Type_GetMethods || callType == IntrinsicId.Type_GetFields ||
- callType == IntrinsicId.Type_GetProperties || callType == IntrinsicId.Type_GetEvents || callType == IntrinsicId.Type_GetNestedTypes || callType == IntrinsicId.Type_GetMembers)
- && calledMethod.IsDeclaredOnType ("System.Type")
- && calledMethod.HasParameterOfType (0, "System.Reflection.BindingFlags")
- && !calledMethod.IsStatic (): {
-
+ case IntrinsicId.Type_GetConstructors__BindingFlags:
+ case IntrinsicId.Type_GetMethods__BindingFlags:
+ case IntrinsicId.Type_GetFields__BindingFlags:
+ case IntrinsicId.Type_GetProperties__BindingFlags:
+ case IntrinsicId.Type_GetEvents__BindingFlags:
+ case IntrinsicId.Type_GetNestedTypes__BindingFlags:
+ case IntrinsicId.Type_GetMembers__BindingFlags: {
BindingFlags? bindingFlags;
bindingFlags = GetBindingFlagsFromValue (argumentValues[0]);
DynamicallyAccessedMemberTypes memberTypes;
if (BindingFlagsAreUnsupported (bindingFlags)) {
- memberTypes = callType switch {
- IntrinsicId.Type_GetConstructors => DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors,
- IntrinsicId.Type_GetMethods => DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods,
- IntrinsicId.Type_GetEvents => DynamicallyAccessedMemberTypes.PublicEvents | DynamicallyAccessedMemberTypes.NonPublicEvents,
- IntrinsicId.Type_GetFields => DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields,
- IntrinsicId.Type_GetProperties => DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties,
- IntrinsicId.Type_GetNestedTypes => DynamicallyAccessedMemberTypes.PublicNestedTypes | DynamicallyAccessedMemberTypes.NonPublicNestedTypes,
- IntrinsicId.Type_GetMembers => DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors |
+ memberTypes = intrinsicId switch {
+ IntrinsicId.Type_GetConstructors__BindingFlags => DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors,
+ IntrinsicId.Type_GetMethods__BindingFlags => DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods,
+ IntrinsicId.Type_GetEvents__BindingFlags => DynamicallyAccessedMemberTypes.PublicEvents | DynamicallyAccessedMemberTypes.NonPublicEvents,
+ IntrinsicId.Type_GetFields__BindingFlags => DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields,
+ IntrinsicId.Type_GetProperties__BindingFlags => DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties,
+ IntrinsicId.Type_GetNestedTypes__BindingFlags => DynamicallyAccessedMemberTypes.PublicNestedTypes | DynamicallyAccessedMemberTypes.NonPublicNestedTypes,
+ IntrinsicId.Type_GetMembers__BindingFlags => DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors |
DynamicallyAccessedMemberTypes.PublicEvents | DynamicallyAccessedMemberTypes.NonPublicEvents |
DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields |
DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods |
@@ -277,14 +277,14 @@ namespace ILLink.Shared.TrimAnalysis
_ => throw new ArgumentException ($"Reflection call '{calledMethod.GetDisplayName ()}' inside '{GetContainingSymbolDisplayName ()}' is of unexpected member type."),
};
} else {
- memberTypes = callType switch {
- IntrinsicId.Type_GetConstructors => GetDynamicallyAccessedMemberTypesFromBindingFlagsForConstructors (bindingFlags),
- IntrinsicId.Type_GetMethods => GetDynamicallyAccessedMemberTypesFromBindingFlagsForMethods (bindingFlags),
- IntrinsicId.Type_GetEvents => GetDynamicallyAccessedMemberTypesFromBindingFlagsForEvents (bindingFlags),
- IntrinsicId.Type_GetFields => GetDynamicallyAccessedMemberTypesFromBindingFlagsForFields (bindingFlags),
- IntrinsicId.Type_GetProperties => GetDynamicallyAccessedMemberTypesFromBindingFlagsForProperties (bindingFlags),
- IntrinsicId.Type_GetNestedTypes => GetDynamicallyAccessedMemberTypesFromBindingFlagsForNestedTypes (bindingFlags),
- IntrinsicId.Type_GetMembers => GetDynamicallyAccessedMemberTypesFromBindingFlagsForMembers (bindingFlags),
+ memberTypes = intrinsicId switch {
+ IntrinsicId.Type_GetConstructors__BindingFlags => GetDynamicallyAccessedMemberTypesFromBindingFlagsForConstructors (bindingFlags),
+ IntrinsicId.Type_GetMethods__BindingFlags => GetDynamicallyAccessedMemberTypesFromBindingFlagsForMethods (bindingFlags),
+ IntrinsicId.Type_GetEvents__BindingFlags => GetDynamicallyAccessedMemberTypesFromBindingFlagsForEvents (bindingFlags),
+ IntrinsicId.Type_GetFields__BindingFlags => GetDynamicallyAccessedMemberTypesFromBindingFlagsForFields (bindingFlags),
+ IntrinsicId.Type_GetProperties__BindingFlags => GetDynamicallyAccessedMemberTypesFromBindingFlagsForProperties (bindingFlags),
+ IntrinsicId.Type_GetNestedTypes__BindingFlags => GetDynamicallyAccessedMemberTypesFromBindingFlagsForNestedTypes (bindingFlags),
+ IntrinsicId.Type_GetMembers__BindingFlags => GetDynamicallyAccessedMemberTypesFromBindingFlagsForMembers (bindingFlags),
_ => throw new ArgumentException ($"Reflection call '{calledMethod.GetDisplayName ()}' inside '{GetContainingSymbolDisplayName ()}' is of unexpected member type."),
};
}
@@ -307,11 +307,9 @@ namespace ILLink.Shared.TrimAnalysis
// GetProperty (string, Type, Type[], ParameterModifier[])
// GetProperty (string, BindingFlags, Binder, Type, Type[], ParameterModifier[])
//
- case var fieldPropertyOrEvent when (fieldPropertyOrEvent == IntrinsicId.Type_GetField || fieldPropertyOrEvent == IntrinsicId.Type_GetProperty || fieldPropertyOrEvent == IntrinsicId.Type_GetEvent)
- && calledMethod.IsDeclaredOnType ("System.Type")
- && calledMethod.HasParameterOfType (0, "System.String")
- && !calledMethod.IsStatic (): {
-
+ case IntrinsicId.Type_GetField:
+ case IntrinsicId.Type_GetProperty:
+ case IntrinsicId.Type_GetEvent: {
if (instanceValue.IsEmpty () || argumentValues[0].IsEmpty ()) {
returnValue = MultiValueLattice.Top;
break;
@@ -324,7 +322,7 @@ namespace ILLink.Shared.TrimAnalysis
// Assume a default value for BindingFlags for methods that don't use BindingFlags as a parameter
bindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
- DynamicallyAccessedMemberTypes memberTypes = fieldPropertyOrEvent switch {
+ DynamicallyAccessedMemberTypes memberTypes = intrinsicId switch {
IntrinsicId.Type_GetEvent => GetDynamicallyAccessedMemberTypesFromBindingFlagsForEvents (bindingFlags),
IntrinsicId.Type_GetField => GetDynamicallyAccessedMemberTypesFromBindingFlagsForFields (bindingFlags),
IntrinsicId.Type_GetProperty => GetDynamicallyAccessedMemberTypesFromBindingFlagsForProperties (bindingFlags),
@@ -336,7 +334,7 @@ namespace ILLink.Shared.TrimAnalysis
if (value is SystemTypeValue systemTypeValue) {
foreach (var stringParam in argumentValues[0]) {
if (stringParam is KnownStringValue stringValue && !BindingFlagsAreUnsupported (bindingFlags)) {
- switch (fieldPropertyOrEvent) {
+ switch (intrinsicId) {
case IntrinsicId.Type_GetEvent:
MarkEventsOnTypeHierarchy (systemTypeValue.RepresentedType, stringValue.Contents, bindingFlags);
break;
@@ -527,10 +525,10 @@ namespace ILLink.Shared.TrimAnalysis
// static GetRuntimeMethod (this Type type, string name, Type[] parameters)
// static GetRuntimeProperty (this Type type, string name)
//
- case var getRuntimeMember when getRuntimeMember == IntrinsicId.RuntimeReflectionExtensions_GetRuntimeEvent
- || getRuntimeMember == IntrinsicId.RuntimeReflectionExtensions_GetRuntimeField
- || getRuntimeMember == IntrinsicId.RuntimeReflectionExtensions_GetRuntimeMethod
- || getRuntimeMember == IntrinsicId.RuntimeReflectionExtensions_GetRuntimeProperty: {
+ case IntrinsicId.RuntimeReflectionExtensions_GetRuntimeEvent:
+ case IntrinsicId.RuntimeReflectionExtensions_GetRuntimeField:
+ case IntrinsicId.RuntimeReflectionExtensions_GetRuntimeMethod:
+ case IntrinsicId.RuntimeReflectionExtensions_GetRuntimeProperty: {
if (argumentValues[0].IsEmpty () || argumentValues[1].IsEmpty ()) {
returnValue = MultiValueLattice.Top;
@@ -538,7 +536,7 @@ namespace ILLink.Shared.TrimAnalysis
}
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
- DynamicallyAccessedMemberTypes requiredMemberTypes = getRuntimeMember switch {
+ DynamicallyAccessedMemberTypes requiredMemberTypes = intrinsicId switch {
IntrinsicId.RuntimeReflectionExtensions_GetRuntimeEvent => DynamicallyAccessedMemberTypes.PublicEvents,
IntrinsicId.RuntimeReflectionExtensions_GetRuntimeField => DynamicallyAccessedMemberTypes.PublicFields,
IntrinsicId.RuntimeReflectionExtensions_GetRuntimeMethod => DynamicallyAccessedMemberTypes.PublicMethods,
@@ -552,7 +550,7 @@ namespace ILLink.Shared.TrimAnalysis
if (value is SystemTypeValue systemTypeValue) {
foreach (var stringParam in argumentValues[1]) {
if (stringParam is KnownStringValue stringValue) {
- switch (getRuntimeMember) {
+ switch (intrinsicId) {
case IntrinsicId.RuntimeReflectionExtensions_GetRuntimeEvent:
MarkEventsOnTypeHierarchy (systemTypeValue.RepresentedType, stringValue.Contents, bindingFlags);
break;
@@ -642,8 +640,9 @@ namespace ILLink.Shared.TrimAnalysis
// static Field (Expression, Type, String)
// static Property (Expression, Type, String)
//
- case var fieldOrPropertyInstrinsic when fieldOrPropertyInstrinsic == IntrinsicId.Expression_Field || fieldOrPropertyInstrinsic == IntrinsicId.Expression_Property: {
- DynamicallyAccessedMemberTypes memberTypes = fieldOrPropertyInstrinsic == IntrinsicId.Expression_Property
+ case IntrinsicId.Expression_Field:
+ case IntrinsicId.Expression_Property: {
+ DynamicallyAccessedMemberTypes memberTypes = intrinsicId == IntrinsicId.Expression_Property
? DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties
: DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields;
@@ -658,7 +657,7 @@ namespace ILLink.Shared.TrimAnalysis
foreach (var stringParam in argumentValues[2]) {
if (stringParam is KnownStringValue stringValue) {
BindingFlags bindingFlags = argumentValues[0].AsSingleValue () is NullValue ? BindingFlags.Static : BindingFlags.Default;
- if (fieldOrPropertyInstrinsic == IntrinsicId.Expression_Property) {
+ if (intrinsicId == IntrinsicId.Expression_Property) {
MarkPropertiesOnTypeHierarchy (systemTypeValue.RepresentedType, stringValue.Contents, bindingFlags);
} else {
MarkFieldsOnTypeHierarchy (systemTypeValue.RepresentedType, stringValue.Contents, bindingFlags);
@@ -1015,7 +1014,7 @@ namespace ILLink.Shared.TrimAnalysis
// static CreateInstance (System.Type type, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object?[]? args, System.Globalization.CultureInfo? culture)
// static CreateInstance (System.Type type, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object?[]? args, System.Globalization.CultureInfo? culture, object?[]? activationAttributes) { throw null; }
//
- case IntrinsicId.Activator_CreateInstance_Type: {
+ case IntrinsicId.Activator_CreateInstance__Type: {
int? ctorParameterCount = null;
BindingFlags bindingFlags = BindingFlags.Instance;
if (calledMethod.GetParametersCount () > 1) {
@@ -1085,7 +1084,7 @@ namespace ILLink.Shared.TrimAnalysis
// static CreateInstance (string assemblyName, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object?[]? args, System.Globalization.CultureInfo? culture, object?[]? activationAttributes)
// static CreateInstance (string assemblyName, string typeName, object?[]? activationAttributes)
//
- case IntrinsicId.Activator_CreateInstance_AssemblyName_TypeName:
+ case IntrinsicId.Activator_CreateInstance__AssemblyName_TypeName:
ProcessCreateInstanceByName (calledMethod, argumentValues);
break;
@@ -1119,10 +1118,10 @@ namespace ILLink.Shared.TrimAnalysis
// CreateInstanceFromAndUnwrap (string assemblyFile, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object? []? args, System.Globalization.CultureInfo? culture, object? []? activationAttributes)
// CreateInstanceFromAndUnwrap (string assemblyFile, string typeName, object? []? activationAttributes)
//
- case var appDomainCreateInstance when appDomainCreateInstance == IntrinsicId.AppDomain_CreateInstance
- || appDomainCreateInstance == IntrinsicId.AppDomain_CreateInstanceAndUnwrap
- || appDomainCreateInstance == IntrinsicId.AppDomain_CreateInstanceFrom
- || appDomainCreateInstance == IntrinsicId.AppDomain_CreateInstanceFromAndUnwrap:
+ case IntrinsicId.AppDomain_CreateInstance:
+ case IntrinsicId.AppDomain_CreateInstanceAndUnwrap:
+ case IntrinsicId.AppDomain_CreateInstanceFrom:
+ case IntrinsicId.AppDomain_CreateInstanceFromAndUnwrap:
ProcessCreateInstanceByName (calledMethod, argumentValues);
break;
diff --git a/src/ILLink.Shared/TrimAnalysis/IntrinsicId.cs b/src/ILLink.Shared/TrimAnalysis/IntrinsicId.cs
index bd9d8df89..8223a52da 100644
--- a/src/ILLink.Shared/TrimAnalysis/IntrinsicId.cs
+++ b/src/ILLink.Shared/TrimAnalysis/IntrinsicId.cs
@@ -10,14 +10,42 @@ namespace ILLink.Shared.TrimAnalysis
enum IntrinsicId
{
None = 0,
+ /// <summary>
+ /// <see cref="System.Reflection.IntrospectionExtensions.GetTypeInfo(System.Type)"/>
+ /// </summary>
IntrospectionExtensions_GetTypeInfo,
+ /// <summary>
+ /// <see cref="System.Type.GetTypeFromHandle(System.RuntimeTypeHandle)"/>
+ /// </summary>
Type_GetTypeFromHandle,
+ /// <summary>
+ /// <see cref="System.Type.TypeHandle"/>
+ /// </summary>
Type_get_TypeHandle,
+ /// <summary>
+ /// <see cref="System.Object.GetType()"/>
+ /// </summary>
Object_GetType,
+ /// <summary>
+ /// <see cref="System.Reflection.TypeDelegator()"/>
+ /// </summary>
TypeDelegator_Ctor,
+ /// <summary>
+ /// <see cref="System.Array.Empty{T}"/>
+ /// </summary>
Array_Empty,
+ /// <summary>
+ /// <see cref="System.Reflection.TypeInfo.AsType()"/>
+ /// </summary>
TypeInfo_AsType,
+ /// <summary>
+ /// <see cref="System.Reflection.MethodBase.GetMethodFromHandle(System.RuntimeMethodHandle)"/> or
+ /// <see cref="System.Reflection.MethodBase.GetMethodFromHandle(System.RuntimeMethodHandle, System.RuntimeTypeHandle)"/>
+ /// </summary>
MethodBase_GetMethodFromHandle,
+ /// <summary>
+ /// <see cref="System.Reflection.MethodBase.MethodHandle"/>
+ /// </summary>
MethodBase_get_MethodHandle,
// Anything above this marker will require the method to be run through
@@ -26,19 +54,19 @@ namespace ILLink.Shared.TrimAnalysis
Type_MakeGenericType,
Type_GetType,
Type_GetConstructor,
- Type_GetConstructors,
+ Type_GetConstructors__BindingFlags,
Type_GetMethod,
- Type_GetMethods,
+ Type_GetMethods__BindingFlags,
Type_GetField,
- Type_GetFields,
+ Type_GetFields__BindingFlags,
Type_GetProperty,
- Type_GetProperties,
+ Type_GetProperties__BindingFlags,
Type_GetEvent,
- Type_GetEvents,
+ Type_GetEvents__BindingFlags,
Type_GetNestedType,
- Type_GetNestedTypes,
+ Type_GetNestedTypes__BindingFlags,
Type_GetMember,
- Type_GetMembers,
+ Type_GetMembers__BindingFlags,
Type_GetInterface,
Type_get_AssemblyQualifiedName,
Type_get_UnderlyingSystemType,
@@ -53,8 +81,8 @@ namespace ILLink.Shared.TrimAnalysis
Marshal_PtrToStructure,
Marshal_DestroyStructure,
Marshal_GetDelegateForFunctionPointer,
- Activator_CreateInstance_Type,
- Activator_CreateInstance_AssemblyName_TypeName,
+ Activator_CreateInstance__Type,
+ Activator_CreateInstance__AssemblyName_TypeName,
Activator_CreateInstanceFrom,
AppDomain_CreateInstance,
AppDomain_CreateInstanceAndUnwrap,
diff --git a/src/ILLink.Shared/TrimAnalysis/Intrinsics.cs b/src/ILLink.Shared/TrimAnalysis/Intrinsics.cs
index 654e85151..3b9ee24cd 100644
--- a/src/ILLink.Shared/TrimAnalysis/Intrinsics.cs
+++ b/src/ILLink.Shared/TrimAnalysis/Intrinsics.cs
@@ -146,7 +146,7 @@ namespace ILLink.Shared.TrimAnalysis
&& calledMethod.HasParameterOfType (0, "System.Reflection.BindingFlags")
&& calledMethod.HasParametersCount (1)
&& !calledMethod.IsStatic ()
- => IntrinsicId.Type_GetConstructors,
+ => IntrinsicId.Type_GetConstructors__BindingFlags,
// System.Type.GetMethod (string)
// System.Type.GetMethod (string, BindingFlags)
@@ -169,7 +169,7 @@ namespace ILLink.Shared.TrimAnalysis
&& calledMethod.HasParameterOfType (0, "System.Reflection.BindingFlags")
&& calledMethod.HasParametersCount (1)
&& !calledMethod.IsStatic ()
- => IntrinsicId.Type_GetMethods,
+ => IntrinsicId.Type_GetMethods__BindingFlags,
// System.Type.GetField (string)
// System.Type.GetField (string, BindingFlags)
@@ -183,7 +183,7 @@ namespace ILLink.Shared.TrimAnalysis
&& calledMethod.HasParameterOfType (0, "System.Reflection.BindingFlags")
&& calledMethod.HasParametersCount (1)
&& !calledMethod.IsStatic ()
- => IntrinsicId.Type_GetFields,
+ => IntrinsicId.Type_GetFields__BindingFlags,
// System.Type.GetEvent (string)
// System.Type.GetEvent (string, BindingFlags)
@@ -197,7 +197,7 @@ namespace ILLink.Shared.TrimAnalysis
&& calledMethod.HasParameterOfType (0, "System.Reflection.BindingFlags")
&& calledMethod.HasParametersCount (1)
&& !calledMethod.IsStatic ()
- => IntrinsicId.Type_GetEvents,
+ => IntrinsicId.Type_GetEvents__BindingFlags,
// System.Type.GetNestedType (string)
// System.Type.GetNestedType (string, BindingFlags)
@@ -211,7 +211,7 @@ namespace ILLink.Shared.TrimAnalysis
&& calledMethod.HasParameterOfType (0, "System.Reflection.BindingFlags")
&& calledMethod.HasParametersCount (1)
&& !calledMethod.IsStatic ()
- => IntrinsicId.Type_GetNestedTypes,
+ => IntrinsicId.Type_GetNestedTypes__BindingFlags,
// System.Type.GetMember (String)
// System.Type.GetMember (String, BindingFlags)
@@ -229,7 +229,7 @@ namespace ILLink.Shared.TrimAnalysis
&& calledMethod.HasParameterOfType (0, "System.Reflection.BindingFlags")
&& calledMethod.HasParametersCount (1)
&& !calledMethod.IsStatic ()
- => IntrinsicId.Type_GetMembers,
+ => IntrinsicId.Type_GetMembers__BindingFlags,
// System.Type.GetInterface (string)
// System.Type.GetInterface (string, bool)
@@ -275,7 +275,7 @@ namespace ILLink.Shared.TrimAnalysis
&& calledMethod.HasParameterOfType (0, "System.Reflection.BindingFlags")
&& calledMethod.HasParametersCount (1)
&& !calledMethod.IsStatic ()
- => IntrinsicId.Type_GetProperties,
+ => IntrinsicId.Type_GetProperties__BindingFlags,
// static System.Object.GetType ()
"GetType" when calledMethod.IsDeclaredOnType ("System.Object")
@@ -297,7 +297,7 @@ namespace ILLink.Shared.TrimAnalysis
"CreateInstance" when calledMethod.IsDeclaredOnType ("System.Activator")
&& !calledMethod.HasGenericParameters ()
&& calledMethod.HasParameterOfType (0, "System.Type")
- => IntrinsicId.Activator_CreateInstance_Type,
+ => IntrinsicId.Activator_CreateInstance__Type,
// static System.Activator.CreateInstance (string assemblyName, string typeName)
// static System.Activator.CreateInstance (string assemblyName, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object?[]? args, System.Globalization.CultureInfo? culture, object?[]? activationAttributes)
@@ -306,7 +306,7 @@ namespace ILLink.Shared.TrimAnalysis
&& !calledMethod.HasGenericParameters ()
&& calledMethod.HasParameterOfType (0, "System.String")
&& calledMethod.HasParameterOfType (1, "System.String")
- => IntrinsicId.Activator_CreateInstance_AssemblyName_TypeName,
+ => IntrinsicId.Activator_CreateInstance__AssemblyName_TypeName,
// static System.Activator.CreateInstanceFrom (string assemblyFile, string typeName)
// static System.Activator.CreateInstanceFrom (string assemblyFile, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object? []? args, System.Globalization.CultureInfo? culture, object? []? activationAttributes)
diff --git a/src/linker/Linker.Dataflow/ReflectionMethodBodyScanner.cs b/src/linker/Linker.Dataflow/ReflectionMethodBodyScanner.cs
index c11c86a6c..15c5f83d8 100644
--- a/src/linker/Linker.Dataflow/ReflectionMethodBodyScanner.cs
+++ b/src/linker/Linker.Dataflow/ReflectionMethodBodyScanner.cs
@@ -196,7 +196,8 @@ namespace Mono.Linker.Dataflow
MultiValue? maybeMethodReturnValue = null;
var handleCallAction = new HandleCallAction (context, reflectionMarker, diagnosticContext, callingMethodDefinition);
- switch (Intrinsics.GetIntrinsicIdForMethod (calledMethodDefinition)) {
+ var intrinsicId = Intrinsics.GetIntrinsicIdForMethod (calledMethodDefinition);
+ switch (intrinsicId) {
case IntrinsicId.IntrospectionExtensions_GetTypeInfo:
case IntrinsicId.TypeInfo_AsType:
case IntrinsicId.Type_get_UnderlyingSystemType:
@@ -205,25 +206,26 @@ namespace Mono.Linker.Dataflow
case IntrinsicId.Type_GetInterface:
case IntrinsicId.Type_get_AssemblyQualifiedName:
case IntrinsicId.RuntimeHelpers_RunClassConstructor:
- case var callType when (callType == IntrinsicId.Type_GetConstructors || callType == IntrinsicId.Type_GetMethods || callType == IntrinsicId.Type_GetFields ||
- callType == IntrinsicId.Type_GetProperties || callType == IntrinsicId.Type_GetEvents || callType == IntrinsicId.Type_GetNestedTypes || callType == IntrinsicId.Type_GetMembers)
- && calledMethod.DeclaringType.IsTypeOf (WellKnownType.System_Type)
- && calledMethod.Parameters[0].ParameterType.FullName == "System.Reflection.BindingFlags"
- && calledMethod.HasThis:
- case var fieldPropertyOrEvent when (fieldPropertyOrEvent == IntrinsicId.Type_GetField || fieldPropertyOrEvent == IntrinsicId.Type_GetProperty || fieldPropertyOrEvent == IntrinsicId.Type_GetEvent)
- && calledMethod.DeclaringType.IsTypeOf (WellKnownType.System_Type)
- && calledMethod.Parameters[0].ParameterType.IsTypeOf (WellKnownType.System_String)
- && calledMethod.HasThis:
- case var getRuntimeMember when getRuntimeMember == IntrinsicId.RuntimeReflectionExtensions_GetRuntimeEvent
- || getRuntimeMember == IntrinsicId.RuntimeReflectionExtensions_GetRuntimeField
- || getRuntimeMember == IntrinsicId.RuntimeReflectionExtensions_GetRuntimeMethod
- || getRuntimeMember == IntrinsicId.RuntimeReflectionExtensions_GetRuntimeProperty:
+ case IntrinsicId.Type_GetConstructors__BindingFlags:
+ case IntrinsicId.Type_GetMethods__BindingFlags:
+ case IntrinsicId.Type_GetFields__BindingFlags:
+ case IntrinsicId.Type_GetProperties__BindingFlags:
+ case IntrinsicId.Type_GetEvents__BindingFlags:
+ case IntrinsicId.Type_GetNestedTypes__BindingFlags:
+ case IntrinsicId.Type_GetMembers__BindingFlags:
+ case IntrinsicId.Type_GetField:
+ case IntrinsicId.Type_GetProperty:
+ case IntrinsicId.Type_GetEvent:
+ case IntrinsicId.RuntimeReflectionExtensions_GetRuntimeEvent:
+ case IntrinsicId.RuntimeReflectionExtensions_GetRuntimeField:
+ case IntrinsicId.RuntimeReflectionExtensions_GetRuntimeMethod:
+ case IntrinsicId.RuntimeReflectionExtensions_GetRuntimeProperty:
case IntrinsicId.Type_GetMember:
case IntrinsicId.Type_GetMethod:
case IntrinsicId.Type_GetNestedType:
case IntrinsicId.Nullable_GetUnderlyingType:
- case IntrinsicId.Expression_Property when calledMethod.HasParameterOfType (1, "System.Reflection.MethodInfo"):
- case var fieldOrPropertyIntrinsic when fieldOrPropertyIntrinsic == IntrinsicId.Expression_Field || fieldOrPropertyIntrinsic == IntrinsicId.Expression_Property:
+ case IntrinsicId.Expression_Property:
+ case IntrinsicId.Expression_Field:
case IntrinsicId.Type_get_BaseType:
case IntrinsicId.Type_GetConstructor:
case IntrinsicId.MethodBase_GetMethodFromHandle:
@@ -233,15 +235,15 @@ namespace Mono.Linker.Dataflow
case IntrinsicId.Expression_Call:
case IntrinsicId.Expression_New:
case IntrinsicId.Type_GetType:
- case IntrinsicId.Activator_CreateInstance_Type:
- case IntrinsicId.Activator_CreateInstance_AssemblyName_TypeName:
+ case IntrinsicId.Activator_CreateInstance__Type:
+ case IntrinsicId.Activator_CreateInstance__AssemblyName_TypeName:
case IntrinsicId.Activator_CreateInstanceFrom:
- case var appDomainCreateInstance when appDomainCreateInstance == IntrinsicId.AppDomain_CreateInstance
- || appDomainCreateInstance == IntrinsicId.AppDomain_CreateInstanceAndUnwrap
- || appDomainCreateInstance == IntrinsicId.AppDomain_CreateInstanceFrom
- || appDomainCreateInstance == IntrinsicId.AppDomain_CreateInstanceFromAndUnwrap:
+ case IntrinsicId.AppDomain_CreateInstance:
+ case IntrinsicId.AppDomain_CreateInstanceAndUnwrap:
+ case IntrinsicId.AppDomain_CreateInstanceFrom:
+ case IntrinsicId.AppDomain_CreateInstanceFromAndUnwrap:
case IntrinsicId.Assembly_CreateInstance: {
- return handleCallAction.Invoke (calledMethodDefinition, instanceValue, argumentValues, out methodReturnValue, out _);
+ return handleCallAction.Invoke (calledMethodDefinition, instanceValue, argumentValues, intrinsicId, out methodReturnValue);
}
case IntrinsicId.None: {
@@ -250,7 +252,7 @@ namespace Mono.Linker.Dataflow
if (context.Annotations.DoesMethodRequireUnreferencedCode (calledMethodDefinition, out RequiresUnreferencedCodeAttribute? requiresUnreferencedCode))
MarkStep.ReportRequiresUnreferencedCode (calledMethodDefinition.GetDisplayName (), requiresUnreferencedCode, diagnosticContext);
- return handleCallAction.Invoke (calledMethodDefinition, instanceValue, argumentValues, out methodReturnValue, out _);
+ return handleCallAction.Invoke (calledMethodDefinition, instanceValue, argumentValues, intrinsicId, out methodReturnValue);
}
case IntrinsicId.TypeDelegator_Ctor: {