diff --git a/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/GenericParameterConstraintNode.cs b/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/GenericParameterConstraintNode.cs index e3979602375dfc..b5722f70a252d8 100644 --- a/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/GenericParameterConstraintNode.cs +++ b/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/GenericParameterConstraintNode.cs @@ -29,7 +29,13 @@ public GenericParameterConstraintNode(EcmaModule module, GenericParameterConstra public override IEnumerable GetStaticDependencies(NodeFactory factory) { GenericParameterConstraint genericParamConstraint = _module.MetadataReader.GetGenericParameterConstraint(Handle); - yield return new DependencyListEntry(factory.GetNodeForTypeToken(_module, genericParamConstraint.Type), "Parameter constrained to type"); + + DependencyList dependencies = new DependencyList(); + dependencies.Add(factory.GetNodeForTypeToken(_module, genericParamConstraint.Type), "Parameter constrained to type"); + + CustomAttributeNode.AddDependenciesDueToCustomAttributes(ref dependencies, factory, _module, genericParamConstraint.GetCustomAttributes()); + + return dependencies; } protected override EntityHandle WriteInternal(ModuleWritingContext writeContext) diff --git a/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/GenericParameterNode.cs b/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/GenericParameterNode.cs index 12a4e6e2db3fb3..74dcb9d7c262f8 100644 --- a/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/GenericParameterNode.cs +++ b/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/GenericParameterNode.cs @@ -28,10 +28,18 @@ public GenericParameterNode(EcmaModule module, GenericParameterHandle handle) public override IEnumerable GetStaticDependencies(NodeFactory factory) { GenericParameter genericParam = _module.MetadataReader.GetGenericParameter(Handle); + + DependencyList dependencies = null; + foreach (var genericParamConstrain in genericParam.GetConstraints()) { - yield return new DependencyListEntry(factory.GenericParameterConstraint(_module, genericParamConstrain), "Generic Parameter Constraint of Generic Parameter"); + dependencies ??= new DependencyList(); + dependencies.Add(factory.GenericParameterConstraint(_module, genericParamConstrain), "Generic Parameter Constraint of Generic Parameter"); } + + CustomAttributeNode.AddDependenciesDueToCustomAttributes(ref dependencies, factory, _module, genericParam.GetCustomAttributes()); + + return dependencies; } protected override EntityHandle WriteInternal(ModuleWritingContext writeContext) diff --git a/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/ManifestResourceNode.cs b/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/ManifestResourceNode.cs index b7f6293f7b4376..3f55462eea6f3c 100644 --- a/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/ManifestResourceNode.cs +++ b/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/ManifestResourceNode.cs @@ -32,6 +32,8 @@ public override IEnumerable GetStaticDependencies(NodeFacto _skipWritingResource = false; + DependencyList dependencies = null; + if (resource.Implementation.IsNil) { string resourceName = _module.MetadataReader.GetString(resource.Name); @@ -40,29 +42,25 @@ public override IEnumerable GetStaticDependencies(NodeFacto string assemblyName = _module.Assembly.GetName().Name; _skipWritingResource = factory.Settings.Optimizations.IsEnabled(CodeOptimizations.RemoveDescriptors, assemblyName); - if (factory.Settings.IgnoreDescriptors) - return null; + if (!factory.Settings.IgnoreDescriptors) + { + PEMemoryBlock resourceDirectory = _module.PEReader.GetSectionData(_module.PEReader.PEHeaders.CorHeader.ResourcesDirectory.RelativeVirtualAddress); + BlobReader reader = resourceDirectory.GetReader((int)resource.Offset, resourceDirectory.Length - (int)resource.Offset); + int length = (int)reader.ReadUInt32(); - PEMemoryBlock resourceDirectory = _module.PEReader.GetSectionData(_module.PEReader.PEHeaders.CorHeader.ResourcesDirectory.RelativeVirtualAddress); - BlobReader reader = resourceDirectory.GetReader((int)resource.Offset, resourceDirectory.Length - (int)resource.Offset); - int length = (int)reader.ReadUInt32(); + UnmanagedMemoryStream ms; + unsafe + { + ms = new UnmanagedMemoryStream(reader.CurrentPointer, length); + } - UnmanagedMemoryStream ms; - unsafe - { - ms = new UnmanagedMemoryStream(reader.CurrentPointer, length); + dependencies = DescriptorMarker.GetDependencies(factory.Logger, factory, ms, resource, _module, "resource " + resourceName + " in " + _module.ToString(), factory.Settings.FeatureSettings); } - - return DescriptorMarker.GetDependencies(factory.Logger, factory, ms, resource, _module, "resource " + resourceName + " in " + _module.ToString(), factory.Settings.FeatureSettings); - } - else - { - return null; } } else { - DependencyList dependencies = new(); + dependencies = new(); switch (resource.Implementation.Kind) { case HandleKind.AssemblyReference: @@ -73,8 +71,10 @@ public override IEnumerable GetStaticDependencies(NodeFacto // TODO: Handle AssemblyFile throw new InvalidOperationException(resource.Implementation.Kind.ToString()); } - return dependencies; } + + CustomAttributeNode.AddDependenciesDueToCustomAttributes(ref dependencies, factory, _module, resource.GetCustomAttributes()); + return dependencies; } public override void BuildTokens(TokenMap.Builder builder) diff --git a/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/ParameterNode.cs b/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/ParameterNode.cs index 9cecda6e8137fb..915e88954a167c 100644 --- a/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/ParameterNode.cs +++ b/src/coreclr/tools/ILTrim.Core/DependencyAnalysis/TokenBased/ParameterNode.cs @@ -20,7 +20,15 @@ public ParameterNode(EcmaModule module, ParameterHandle handle) private ParameterHandle Handle => (ParameterHandle)_handle; - public override IEnumerable GetStaticDependencies(NodeFactory context) => null; + public override IEnumerable GetStaticDependencies(NodeFactory context) + { + DependencyList dependencies = null; + + Parameter parameter = _module.MetadataReader.GetParameter(Handle); + CustomAttributeNode.AddDependenciesDueToCustomAttributes(ref dependencies, context, _module, parameter.GetCustomAttributes()); + + return dependencies; + } public override string ToString() { diff --git a/src/coreclr/tools/ILTrim.Tests/ILTrimExpectedFailures.txt b/src/coreclr/tools/ILTrim.Tests/ILTrimExpectedFailures.txt index 359cb3545127a9..4f03cadcadc2be 100644 --- a/src/coreclr/tools/ILTrim.Tests/ILTrimExpectedFailures.txt +++ b/src/coreclr/tools/ILTrim.Tests/ILTrimExpectedFailures.txt @@ -1,7 +1,6 @@ Advanced.TypeCheckRemoval Attributes.AssemblyAttributeAccessesMembers Attributes.AssemblyAttributeIsRemovedIfOnlyTypesUsedInAssembly -Attributes.AttributeOnParameterInUsedMethodIsKept Attributes.AttributeOnPreservedTypeWithTypeUsedInConstructorIsKept Attributes.AttributeOnPreservedTypeWithTypeUsedInDifferentNamespaceIsKept Attributes.AttributeOnPreservedTypeWithTypeUsedInFieldIsKept @@ -54,16 +53,20 @@ Attributes.OnlyKeepUsed.AttributeUsedByAttributeIsKept Attributes.OnlyKeepUsed.CanLinkCoreLibrariesWithOnlyKeepUsedAttributes Attributes.OnlyKeepUsed.CoreLibraryUnusedAssemblyAttributesAreRemoved Attributes.OnlyKeepUsed.CoreLibraryUsedAssemblyAttributesAreKept +Attributes.OnlyKeepUsed.MethodWithUnmanagedConstraint Attributes.OnlyKeepUsed.NullableOnConstraintsKept Attributes.OnlyKeepUsed.NullableOnConstraintsRemoved +Attributes.OnlyKeepUsed.UnusedAttributeOnGenericParameterIsRemoved +Attributes.OnlyKeepUsed.UnusedAttributeOnReturnTypeIsRemoved Attributes.OnlyKeepUsed.UnusedAttributeTypeOnAssemblyIsRemoved Attributes.OnlyKeepUsed.UnusedAttributeTypeOnEventIsRemoved Attributes.OnlyKeepUsed.UnusedAttributeTypeOnMethodIsRemoved Attributes.OnlyKeepUsed.UnusedAttributeTypeOnModuleIsRemoved +Attributes.OnlyKeepUsed.UnusedAttributeTypeOnParameterIsRemoved Attributes.OnlyKeepUsed.UnusedAttributeTypeOnPropertyIsRemoved Attributes.OnlyKeepUsed.UnusedAttributeTypeOnTypeIsRemoved +Attributes.OnlyKeepUsed.UnusedAttributeWithTypeForwarderIsRemoved Attributes.OnlyKeepUsed.UnusedDerivedAttributeType -Attributes.OnlyKeepUsed.UsedAttributeTypeOnParameterIsKept Attributes.SecurityAttributesOnUsedMethodAreKept Attributes.SecurityAttributesOnUsedTypeAreKept Attributes.StructLayout.ExplicitClass @@ -95,9 +98,7 @@ DataFlow.AnnotatedMembersAccessedViaUnsafeAccessor DataFlow.ApplyTypeAnnotations DataFlow.AttributeConstructorDataflow DataFlow.AttributeFieldDataflow -DataFlow.AttributePrimaryConstructorDataflow DataFlow.AttributePropertyDataflow -DataFlow.ByRefDataflow DataFlow.CompilerGeneratedCodeAccessedViaReflection DataFlow.CompilerGeneratedCodeDataflow DataFlow.CompilerGeneratedTypes @@ -113,7 +114,6 @@ DataFlow.ExtensionMembersDataFlow DataFlow.FeatureCheckDataFlow DataFlow.FeatureGuardAttributeDataFlow DataFlow.FieldDataFlow -DataFlow.FieldKeyword DataFlow.GenericParameterDataFlow DataFlow.GenericParameterDataFlowMarking DataFlow.GenericParameterWarningLocation @@ -124,7 +124,6 @@ DataFlow.MemberTypes DataFlow.MemberTypesAllOnCopyAssembly DataFlow.MethodParametersDataFlow DataFlow.ModifierDataFlow -DataFlow.NullableAnnotations DataFlow.ObjectGetTypeDataflow DataFlow.PropertyDataFlow DataFlow.RuntimeAsyncMethods @@ -316,7 +315,6 @@ LinkAttributes.LinkAttributeErrorCases LinkAttributes.LinkerAttributeRemoval LinkAttributes.LinkerAttributeRemovalAndPreserveAssembly LinkAttributes.LinkerAttributeRemovalConditional -LinkAttributes.OverrideAttributeRemoval LinkAttributes.TypedArguments LinkAttributes.TypedArgumentsErrors LinkXml.CanPreserveAnExportedType @@ -369,22 +367,13 @@ References.MissingReferenceInUsedCodePath References.ReferenceWithEntryPoint Reflection.ActivatorCreateInstance Reflection.AssemblyImportedViaReflectionWithDerivedType -Reflection.ConstructorsUsedViaReflection -Reflection.ConstructorUsedViaReflection Reflection.CoreLibMessages Reflection.EventHanderTypeGetInvokeMethod Reflection.EventsUsedViaReflection Reflection.ExpressionCallString -Reflection.ExpressionFieldString -Reflection.ExpressionPropertyString -Reflection.FieldsUsedViaReflection Reflection.IsAssignableFrom -Reflection.MembersUsedViaReflection -Reflection.MemberUsedViaReflection Reflection.MethodsUsedViaReflection Reflection.MethodUsedViaReflection -Reflection.NestedTypesUsedViaReflection -Reflection.NestedTypeUsedViaReflection Reflection.ObjectGetType Reflection.ObjectGetTypeLibraryMode Reflection.ParametersUsedViaReflection @@ -392,10 +381,8 @@ Reflection.PropertiesUsedViaReflection Reflection.PropertyUsedViaReflection Reflection.RunClassConstructor Reflection.RuntimeReflectionExtensionsCalls -Reflection.TypeDelegator Reflection.TypeHierarchyLibraryModeSuppressions Reflection.TypeHierarchyReflectionWarnings -Reflection.TypeHierarchySuppressions Reflection.TypeMap Reflection.TypeMapEntryAssembly Reflection.TypeUsedViaReflection @@ -458,8 +445,6 @@ Symbols.ReferenceWithPortablePdbCopyActionAndSymbolLinkingEnabled TestFramework.VerifyAttributesInAssemblyWorks TestFramework.VerifyAttributesInAssemblyWorksWithStrings TestFramework.VerifyLocalsAreChanged -TopLevelStatements.BasicDataFlow -TopLevelStatements.InvalidAnnotations TypeForwarding.AttributeArgumentForwarded TypeForwarding.AttributeArgumentForwardedWithCopyAction TypeForwarding.AttributeEnumArgumentForwardedCopyUsedWithSweptForwarder