dotnet / dotnet/linker

Infinite Recursion When Linking

Open
#2,123 6 comments 0 reactions 0 assignees View on GitHub
area-Linker: Steps
Dominant language
C#
Stars
392
Forks
128
Avg merge
2d 10h
Merged PRs (30d)
2

Description

I am trying to use the dotnet/performance repo to run some wasm-aot programs. And when I do, I am getting this stack trace that looks like an infinite recursion:

``` at Mono.Linker.Driver.Main(System.String[])
at Mono.Linker.Driver.Run(Mono.Linker.ILogger)
at Mono.Linker.Pipeline.Process(Mono.Linker.LinkContext)
at Mono.Linker.Pipeline.ProcessStep(Mono.Linker.LinkContext, Mono.Linker.Steps.IStep)
at Mono.Linker.Steps.MarkStep.Process(Mono.Linker.LinkContext)
at Mono.Linker.Steps.MarkStep.Initialize()
at Mono.Linker.Steps.MarkStep.ProcessMarkedPending()
at Mono.Linker.Steps.MarkStep.MarkModule(Mono.Cecil.ModuleDefinition, Mono.Linker.DependencyInfo)
at Mono.Linker.Steps.MarkStep.MarkAssembly(Mono.Cecil.AssemblyDefinition, Mono.Linker.DependencyInfo)
at Mono.Linker.Steps.MarkStep.MarkEntireAssembly(Mono.Cecil.AssemblyDefinition)
at Mono.Linker.Steps.MarkStep.MarkCustomAttributes(Mono.Cecil.ICustomAttributeProvider, Mono.Linker.DependencyInfo ByRef, Mono.Cecil.IMemberDefinition)
at Mono.Cecil.TypeReference.Resolve()
at Mono.Cecil.ModuleDefinition.Resolve(Mono.Cecil.TypeReference)
at Mono.Cecil.MetadataResolver.Resolve(Mono.Cecil.TypeReference)
at Mono.Cecil.MetadataResolver.GetType(Mono.Cecil.ModuleDefinition, Mono.Cecil.TypeReference)
at Mono.Cecil.ExportedType.Resolve()

... Repeats ...

at Mono.Cecil.ModuleDefinition.GetType(System.String, System.String)
at Mono.Cecil.TypeDefinitionCollection.GetType(System.String, System.String)
at System.Collections.Generic.Dictionary`2[[Mono.Cecil.Metadata.Row`2[[System.__Canon, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], Mono.Cecil, Version=0.11.3.0, Culture=neutral, PublicKeyToken=50cebf1cceb9d05e],[System.__Canon, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].TryGetValue(Mono.Cecil.Metadata.Row`2, System.__Canon ByRef)
at System.Collections.Generic.Dictionary`2[[Mono.Cecil.Metadata.Row`2[[System.__Canon, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], Mono.Cecil, Version=0.11.3.0, Culture=neutral, PublicKeyToken=50cebf1cceb9d05e],[System.__Canon, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].FindValue(Mono.Cecil.Metadata.Row`2)
at Mono.Cecil.Metadata.RowEqualityComparer.GetHashCode(Mono.Cecil.Metadata.Row`2)
Stack overflow.
```

I have a repro for this, but because it only comes up in the project dotnet/performance generates (not dotnet performacne itself) , it is a little complicated. I am working on getting a simpler repro.

For now, what I've got is:

1. Download dotnet/runtime, build it for wasm:
```git clone git@github.com:dotnet/runtime.git```
```cd runtime```
```dotnet build -c Release -subset mono+libs -arch Browser -os wasm```

2. Download dotnet/performance; run the microbenchmarks project (in src/benchmarks/micro) like so:
```git clone git@github.com:dotnet/performance.git```
``` cd performance/src/benchmarks/micro```
```dotnet run --configuration Release --framework net6.0 --runtimes wasm --aotcompilermode wasm --runtimeSrcDir . --filter "*ByteMark*"```

You can use the `--keepfiles` option on that last `dotnet run` command to preserve the temporary project it generates, and the output shows all commands it runs on that project. This would probably be helpful for debugging.

It this a known error? I thought it might be some type of recursive type forwarding between assemblies, but couldn't find any typeforwarding annotations in the dotnet/performance code.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.