-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Fix failure to generate ngen pdb in crossgen #89415
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
… not generate a name for
- This is caused by the the type of a parameter having a generic parameter which derived from a type not found in the compilation information
- There are 2 fixes here
1. Change the logic for computing the set of compilable methods to require that all parameters are loadable
2. Change the implementation of loadable types to check generic instantiations for loadability
- This required implementing a stack system to check types for loadability, as loading can require circular references to be resolved.
- Add a check that the instantiation types of an instantiated generic are loadable.
- Generic interfaces on arrays work now, so enable the the constraint checking logic.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good otherwise!
| } | ||
| } | ||
|
|
||
| if (checkingMode) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't see a codepath that would lead to this if being taken.
| ThrowHelper.ThrowTypeLoadException(ExceptionStringID.ClassLoadGeneral, type); | ||
| } | ||
|
|
||
| ((CompilerTypeSystemContext)type.Context).EnsureLoadableType(type.BaseType); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| ((CompilerTypeSystemContext)type.Context).EnsureLoadableType(type.BaseType); | |
| ((CompilerTypeSystemContext)type.Context).EnsureLoadableType(typeArg); |
After David Wrighton's refactoring of type loadability check in dotnet#89415 we started seeing stack overflow in Crossgen2 compilation of the outerloop test Loader/classloader/generics/regressions/DD117522/Test.csproj This is because the test is a negative test that exercises runtime behavior in the presence of a non-loadable type with recursive definition. David's stricter descent into the type ends up in an infinite recursion when presented with this invalid type. I haven't found any easy way to incorporate the additional check for recursive types into the loadability algorithm - in fact I'm not even sure whether that's generally doable. As a very simple way to protect against the infinite recursion I propose adding a heuristic limit for the type analysis stack size. I assume the proposed value 1024 to be more than enough for both Crossgen2 and NativeAOT, if it's realistic that NativeAOT can encounter deeper types than this, I can make the check specific for Crossgen2. Thanks Tomas Fixes: dotnet#89645
After David Wrighton's refactoring of type loadability check in #89415 we started seeing stack overflow in Crossgen2 compilation of the outerloop test Loader/classloader/generics/regressions/DD117522/Test.csproj This is because the test is a negative test that exercises runtime behavior in the presence of a non-loadable type with recursive definition. David's stricter descent into the type ends up in an infinite recursion when presented with this invalid type. I haven't found any easy way to incorporate the additional check for recursive types into the loadability algorithm - in fact I'm not even sure whether that's generally doable. As a very simple way to protect against the infinite recursion I propose adding a heuristic limit for the type analysis stack size. I assume the proposed value 1024 to be more than enough for both Crossgen2 and NativeAOT, if it's realistic that NativeAOT can encounter deeper types than this, I can make the check specific for Crossgen2. Fixes: #89645
Fix issue in R2R compilation where we would compile a method we could not generate a name for
Fixes #89337