-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Emit task returning thunks in crossgen2 #122651
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
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.
Pull request overview
This PR implements support for emitting Task-returning async method thunks in crossgen2 by encoding them as MethodSignatures with the AsyncVariant flag set. The changes introduce a new GetPrimaryMethodDesc helper method to navigate between different MethodDesc variants (async, unboxing, P/Invoke) and their primary metadata representations. The GC reference map emission is updated to account for the additional async continuation parameter.
Key changes:
- Adds
AsyncVariantflag to ReadyToRunMethodSigFlags enum (requiring uint instead of byte to accommodate 0x100 value) - Implements
GetPrimaryMethodDescextension method to resolve various MethodDesc wrappers to their primary ECMA method - Updates ArgIterator and GCRefMapBuilder to handle async continuation parameter in both managed and native code
- Modifies ReadyToRunILProvider to emit Task-returning thunks for async methods
Reviewed changes
Copilot reviewed 16 out of 16 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| src/coreclr/vm/frames.cpp | Adds async continuation parameter handling in FakeGcScanRoots for GC scanning |
| src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunSignature.cs | Adds display support for ASYNC flag in method signatures |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/TypeSystem/MethodDescExtensions.cs | New file introducing GetPrimaryMethodDesc helper to unwrap MethodDesc variants |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs | Updates token resolution to use GetPrimaryMethodDesc and removes version bubble checks |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csproj | Adds new MethodDescExtensions.cs file to project |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/IL/ReadyToRunILProvider.cs | Implements Task-returning async thunk emission for async methods |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunTableManager.cs | Updates module resolution to use GetPrimaryMethodDesc |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.cs | Updates async variant assertion to use new helper method |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.cs | Adds IsPrimaryMethodDesc check in debug code and minor formatting fix |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/SignatureBuilder.cs | Adds AsyncVariant flag emission in method signatures |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/MethodFixupSignature.cs | Replaces unboxing check with IsPrimaryMethodDesc for fixup optimization |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/GCRefMapBuilder.cs | Adds async continuation parameter to GC reference map generation |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ArgIterator.cs | Implements async continuation argument offset calculation and allocation logic |
| src/coreclr/tools/Common/TypeSystem/IL/Stubs/AsyncResumptionStub.cs | Exposes TargetMethod property for GetPrimaryMethodDesc navigation |
| src/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.cs | Changes ReadyToRunMethodSigFlags from byte to uint and adds AsyncVariant flag |
| src/coreclr/tools/Common/Compiler/AsyncMethodVariant.cs | Adds GetAsyncVariant and GetTargetOfAsyncVariant extension methods |
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs
Outdated
Show resolved
Hide resolved
...lr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/GCRefMapBuilder.cs
Show resolved
Hide resolved
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.
Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.
54e7d22 to
b779849
Compare
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.
Pull request overview
Copilot reviewed 16 out of 16 changed files in this pull request and generated no new comments.
|
/azp run runtime-coreclr crossgen2 outerloop |
|
Azure Pipelines successfully started running 1 pipeline(s). |
|
/azp run runtime-coreclr crossgen2 outerloop |
|
Azure Pipelines successfully started running 1 pipeline(s). |
|
/azp run runtime-coreclr crossgen2 outerloop |
|
Azure Pipelines successfully started running 1 pipeline(s). |
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs
Outdated
Show resolved
Hide resolved
|
Azure Pipelines successfully started running 1 pipeline(s). |
|
/azp run runtime-coreclr crossgen2 outerloop |
|
Azure Pipelines successfully started running 1 pipeline(s). |
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.
Pull request overview
Copilot reviewed 24 out of 24 changed files in this pull request and generated 1 comment.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs
Show resolved
Hide resolved
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs
Outdated
Show resolved
Hide resolved
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.cs
Show resolved
Hide resolved
- Clear ClassTokenOrOffset when setting R2R_SYSTEM_EXCEPTION flag - Add COR_ILEXCEPTION_CLAUSE_R2R_SYSTEM_EXCEPTION to R2R dumper
|
/azp run runtime-coreclr crossgen2 outerloop |
|
Azure Pipelines successfully started running 1 pipeline(s). |
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.
Pull request overview
Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.
|
/ba-g timeout appears unrelated |
Emits Task-returning async method thunks in crossgen2 as MethodSignatures with the AsyncVariant flag set
Adds
GetPrimaryMethodDescto get the most natural "primary" method desc for MethodDesc's that point to the same Ecma/Instantiated method. This is used in the places where we cast to EcmaMethod to get relevant metadata information.GCRefMap emission also needed to be updated to account for the continuation parameter. Runtime's
FakeGcScanRoots(used to verify the ReadyToRun images GCRefMap in debug config) also needed to updated to handle the continuation parameter.In R2R exception info clauses, a new flag is added to use when the handler catches System.Exception. It's not guaranteed that a token for System.Exception exists in the context of the EH info struct, and there is no equivalent of a module override for the structs.
In the MethodWithToken constructor, it's expected that callers pass the Token that points to the exact method that is being called on the correct instantiated type. It's again not guaranteed that we have valid tokens for the method being called in the context of an instantiated type (technically any call to
G<MyClass>.M()will have a token for G, but when we compile the canonicalize method, we call the asyncG<!0>.M()in the IL, and we don't have a token forG<!0>). For this reason, we wrap the MethodIL in a ManifestModuleWrappedMethodIL, and when we construct a MethodWithToken, we resolve the OwningType with the MutableModule token, but swap out the Token for the typical method definition token and force emission of a full MethodSignature in the Fixup.