dotnet / linker

388 stars 127 forks source link

"Root dependency" internal constructor on public type preserved in console app after trimming even though unused #1871

Open layomia opened 3 years ago

layomia commented 3 years ago

The vertex in question, "Method:System.Void System.Text.Json.Serialization.Metadata.JsonClassInfo::.ctor(System.Type,System.Text.Json.JsonSerializerOptions)", is not used anywhere in the app. There's also no descriptor file that roots this ctor.

I've attached the linker dependency zip.

Repro steps:

  1. Clone https://github.com/layomia/JsonSourceGenPerf/
  2. Navigate to the Runner.csproj project: https://github.com/layomia/JsonSourceGenPerf/tree/main/General/Runner
  3. Add "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental/nuget/v3/index.json" as a NuGet feed, to get the updated System.Text.Json.dll and source generator.
  4. dotnet publish -c Release
  5. illinkanalyzer -r "Method:System.Void System.Text.Json.Serialization.Metadata.JsonClassInfo::.ctor(System.Type,System.Text.Json.JsonSerializerOptions)" linker-dependencies.xml.gz

You'll find that the ctor is not a dependency of any other vertex, yet it is preserved after trimming.

Here's the linker command:

C:\Program Files\dotnet\dotnet.exe "C:\Program Files\dotnet\sdk\6.0.100-preview.3.21153.9\Sdks\Microsoft.NET.ILLink.Tasks\tools\net5.0\illink.dll" -a "obj\Release\net6.0\win-x64\Runner.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\system.text.json\6.0.1-jsoncogen.1.21152.3\lib\netcoreapp3.0\System.Text.Json.dll"
--action link "System.Text.Json"
-reference "obj\Release\net6.0\win-x64\Runner.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\Microsoft.CSharp.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\Microsoft.VisualBasic.Core.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\Microsoft.VisualBasic.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\Microsoft.Win32.Primitives.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\Microsoft.Win32.Registry.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.AppContext.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Buffers.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Collections.Concurrent.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Collections.Immutable.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Collections.NonGeneric.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Collections.Specialized.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Collections.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.ComponentModel.Annotations.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.ComponentModel.DataAnnotations.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.ComponentModel.EventBasedAsync.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.ComponentModel.Primitives.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.ComponentModel.TypeConverter.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.ComponentModel.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Configuration.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Console.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Core.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Data.Common.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Data.DataSetExtensions.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Data.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Diagnostics.Contracts.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Diagnostics.Debug.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Diagnostics.DiagnosticSource.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Diagnostics.FileVersionInfo.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Diagnostics.Process.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Diagnostics.StackTrace.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Diagnostics.TextWriterTraceListener.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Diagnostics.Tools.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Diagnostics.TraceSource.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Diagnostics.Tracing.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Drawing.Primitives.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Drawing.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Dynamic.Runtime.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Formats.Asn1.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Globalization.Calendars.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Globalization.Extensions.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Globalization.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.Compression.Brotli.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.Compression.FileSystem.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.Compression.ZipFile.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.Compression.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.FileSystem.AccessControl.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.FileSystem.DriveInfo.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.FileSystem.Primitives.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.FileSystem.Watcher.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.FileSystem.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.IsolatedStorage.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.MemoryMappedFiles.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.Pipes.AccessControl.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.Pipes.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.UnmanagedMemoryStream.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.IO.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Linq.Expressions.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Linq.Parallel.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Linq.Queryable.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Linq.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Memory.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.Http.Json.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.Http.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.HttpListener.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.Mail.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.NameResolution.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.NetworkInformation.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.Ping.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.Primitives.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.Quic.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.Requests.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.Security.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.ServicePoint.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.Sockets.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.WebClient.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.WebHeaderCollection.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.WebProxy.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.WebSockets.Client.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.WebSockets.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Net.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Numerics.Vectors.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Numerics.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.ObjectModel.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Private.CoreLib.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Private.DataContractSerialization.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Private.Uri.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Private.Xml.Linq.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Private.Xml.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Reflection.DispatchProxy.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Reflection.Emit.ILGeneration.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Reflection.Emit.Lightweight.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Reflection.Emit.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Reflection.Extensions.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Reflection.Metadata.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Reflection.Primitives.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Reflection.TypeExtensions.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Reflection.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Resources.Reader.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Resources.ResourceManager.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Resources.Writer.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.CompilerServices.Unsafe.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.CompilerServices.VisualC.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.Extensions.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.Handles.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.InteropServices.RuntimeInformation.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.InteropServices.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.Intrinsics.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.Loader.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.Numerics.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.Serialization.Formatters.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.Serialization.Json.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.Serialization.Primitives.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.Serialization.Xml.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.Serialization.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Runtime.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Security.AccessControl.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Security.Claims.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Security.Cryptography.Algorithms.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Security.Cryptography.Cng.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Security.Cryptography.Csp.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Security.Cryptography.Encoding.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Security.Cryptography.OpenSsl.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Security.Cryptography.Primitives.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Security.Cryptography.X509Certificates.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Security.Principal.Windows.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Security.Principal.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Security.SecureString.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Security.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.ServiceModel.Web.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.ServiceProcess.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Text.Encoding.CodePages.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Text.Encoding.Extensions.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Text.Encoding.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Text.Encodings.Web.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Text.RegularExpressions.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Threading.Channels.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Threading.Overlapped.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Threading.Tasks.Dataflow.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Threading.Tasks.Extensions.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Threading.Tasks.Parallel.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Threading.Tasks.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Threading.Thread.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Threading.ThreadPool.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Threading.Timer.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Threading.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Transactions.Local.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Transactions.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.ValueTuple.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Web.HttpUtility.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Web.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Windows.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Xml.Linq.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Xml.ReaderWriter.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Xml.Serialization.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Xml.XDocument.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Xml.XPath.XDocument.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Xml.XPath.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Xml.XmlDocument.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Xml.XmlSerializer.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.Xml.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\System.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\WindowsBase.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\mscorlib.dll"
-reference "C:\Users\laakinri.NORTHAMERICA\.nuget\packages\microsoft.netcore.app.runtime.win-x64\6.0.0-preview.3.21152.1\runtimes\win-x64\lib\net6.0\netstandard.dll"
-out "obj\Release\net6.0\win-x64\linked"
--nowarn "1701;1702;1701;1702"
--warn "5"
--warnaserror- --warnaserror ";NU1605"
--feature System.Resources.ResourceManager.AllowCustomResourceTypes false
--feature System.StartupHookProvider.IsSupported false
-b
--trim-mode link
--action copy
--skip-unresolved true --feature System.Text.Json.DisableJsonSerializerDynamicFallback true
--dump-dependencies

cc @sbomer @agocke @mateoatr @vitek-karas @eerhardt

linker-dependencies.xml.gz

layomia commented 3 years ago

The only reference to the constructor is this LOC from the following snippet:

if (!_classes.TryGetValue(type, out JsonClassInfo? result))
{
    if (JsonHelpers.DisableJsonSerializerDynamicFallback)
    {
        throw new NotSupportedException($"Metadata for type {type} not provided to serializer - will not go down reflection-based code path.");
    }
    else
    {
        result = _classes.GetOrAdd(type, new JsonClassInfo(type, this));
    }
}

The JsonHelpers.DisableJsonSerializerDynamicFallback boolean above is controlled by a linker feature switch (which is active in this repro). I mention this in case there is an issue with ILLinker only trimming source in the else branch, rather than also trimming all code that it references.

mateoatr commented 3 years ago

I see that the type is annotated with DebuggerDisplay attribute. We currently keep the entire type whenever the attribute's value is not understood. https://github.com/mono/linker/blob/228dc42248bb56fc0897aa756236a6e79e2690a7/src/linker/Linker.Steps/MarkStep.cs#L1940

eerhardt commented 3 years ago

@layomia - can you try publishing with -p:DebuggerSupport=false? That should trim the DebuggerDisplay attribute.

https://github.com/dotnet/runtime/blob/79ae74f5ca5c8a6fe3a48935e85bd7374959c570/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.LinkAttributes.Shared.xml#L2-L13

eerhardt commented 3 years ago

Should this be a warning?

@mateoatr - at least we should put it in the linker dependencies file so someone can use the analyzer to see why the member was being preserved.

sbomer commented 3 years ago

It currently doesn't show up in the trace because of this logic that skips tracing of custom attribute instances: https://github.com/mono/linker/blob/228dc42248bb56fc0897aa756236a6e79e2690a7/src/linker/Linker/XmlDependencyRecorder.cs#L109-L111

A quick fix would be to log the attribute type instead of just "CustomAttribute", but that has other problems. The trace in this case becomes:

--- Method:System.Void System.Text.Json.Serialization.Metadata.JsonClassInfo::.ctor(System.Type,System.Text.Json.JsonSerializerOptions) dependencies ---
Dependency #1
        Method:System.Void System.Text.Json.Serialization.Metadata.JsonClassInfo::.ctor(System.Type,System.Text.Json.JsonSerializerOptions)
        | Attribute:System.Diagnostics.DebuggerDisplayAttribute [43 deps]
        | TypeDef:System.Text.Json.Serialization.Metadata.JsonClassInfo [106 deps]
        | TypeDef:System.Text.Json.Serialization.Metadata.JsonTypeInfo`1 [14 deps]
        | TypeSpec:System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<Runner.MyClass0> [5 deps]
        | Field:System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<Runner.MyClass0> Runner.JsonSourceGeneration.JsonContext/MyClass0TypeInfo::<TypeInfo>k__BackingField [3 deps]
        | TypeDef:Runner.JsonSourceGeneration.JsonContext/MyClass0TypeInfo:Runner.dll [9 deps]
        | TypeDef:Runner.JsonSourceGeneration.JsonContext/MyClass0TypeInfo/<>c:Runner.dll [20 deps]
        | Field:Runner.JsonSourceGeneration.JsonContext/MyClass0TypeInfo/<>c Runner.JsonSourceGeneration.JsonContext/MyClass0TypeInfo/<>c::<>9 [3 deps]
        | Method:System.Void Runner.JsonSourceGeneration.JsonContext/MyClass0TypeInfo/<>c::.cctor() [2 deps]
        warning: loop to TypeDef:Runner.JsonSourceGeneration.JsonContext/MyClass0TypeInfo/<>c:Runner.dll

Notice the DebuggerDisplayAttribute [43 deps] - there were 43 things with DebuggerDisplayAttribute and output just happened to pick the right one (JsonClassInfo).

To log attributes in general I think we'd need to figure out how to avoid unifying the same attribute instance on different members. For example:

[MyAttribute(typeof(C))]
class A {}
[MyAttribute(typeof(D))]
class B {}
class C {}
class D {}

This should produce a graph like:

A -> MyAttribute_instance1 -> C
B -> MyAttribute_instance2 -> D

Rather than:

A -> MyAttribute -> C
     ^         |
B --/           \-> D
mateoatr commented 3 years ago

@sbomer Related, why don't we add the reason why a member was marked in the trace (i.e., add DependencyKind to the traced members)?

layomia commented 3 years ago

@layomia - can you try publishing with -p:DebuggerSupport=false? That should trim the DebuggerDisplay attribute

@eerhardt, yes - when publishing with -p:DebuggerSupport=false the attribute was trimmed, along with the JsonClassInfo constructor and other expected members. Looks like this property is used by default in a Blazor app which is helpful for size goals for JSON and Blazor in .NET 6.

It would be nice for DebuggerDisplay to show up in the trace as a reason types are rooted.

ericstj commented 3 years ago

Additionally, should DebuggerDisplay even root the constructor? I don't think the contents of the DebuggerDisplay string would ever result in calling the constructor, just members: right?

mateoatr commented 3 years ago

Additionally, should DebuggerDisplay even root the constructor?

I think it's possible to call the ctor from DebuggerDisplay, i.e.: DebuggerDisplay["Print whatever comes from {new Foo()}"] (but then, you can actually call any method from within the attribute, so we'd actually need to keep everything whenever we don't understand the argument). I just opened #1873. I think we should stop keeping everything and also warn.