-
Notifications
You must be signed in to change notification settings - Fork 4.8k
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
JIT: Unify InlinedCallFrame
secret stub arg handling
#100662
Labels
area-CodeGen-coreclr
CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI
Milestone
Comments
dotnet-issue-labeler
bot
added
the
area-CodeGen-coreclr
CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI
label
Apr 5, 2024
Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch |
jakobbotsch
changed the title
JIT: Unify
JIT: Unify Apr 5, 2024
InlinedFrame
secret stub arg handlingInlinedCallFrame
secret stub arg handling
jakobbotsch
added a commit
to jakobbotsch/runtime
that referenced
this issue
Apr 9, 2024
jakobbotsch
added a commit
to jakobbotsch/runtime
that referenced
this issue
Apr 9, 2024
Ruihan-Yin
pushed a commit
to Ruihan-Yin/runtime
that referenced
this issue
May 30, 2024
When a pinvoke/reverse pinvoke needs marshalling the VM creates an IL stub to perform this marshalling. These IL stubs have a non-standard parameter called the "secret stub parameter". The VM uses this parameter to map the IL stub back to the user defined function that caused the IL stub to be required (multiple user functions can share the same IL stubs, so the mapping cannot be done by other means). To facilitate the access of this value the JIT must make the parameter's value available to the VM somehow. Previously this was done in two separate ways for 32-bit and 64-bit target: - For 32-bit targets the parameter was marked as do-not-enregister and always spilled to the stack frame at a location that was known by the VM. - For 64-bit targets the parameter was saved in the `InlinedCallFrame` as part of a VM helper call. We still marked it as do-not-enregister, probably because parameter homing did not handle it. For 64-bit targets this introduces a bit of inefficiency: the secret stub parameter is only needed for the IL stubs case, but `InlinedCallFrame` is used for all inlined pinvokes. So we ended up with a larger frame than necessary and with an additional store to the frame, even outside IL stubs. This change removes that inefficiency by unifying how 32-bit and 64-bit targets work: - Switch all platforms to only allocate space in `InlinedCallFrame` for the secret stub parameter when necessary - Move responsibility of storing the secret stub parameter out of `CORINFO_HELP_INIT_PINVOKE_FRAME` and to the JIT generated code - Remove special casing of frame layout around the secret stub parameter and frame structures within the JIT - Enable enregistration for the secret stub parameter Fix dotnet#100662
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Labels
area-CodeGen-coreclr
CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI
For some IL stubs with pinvokes in them the runtime passes a non-standard argument that the JIT must save in a known place. Currently this mechanism is different between 32 bit and 64 bit platforms. On 32 bit platforms the argument is stored by the JIT in the local stack frame at a known place:
runtime/src/coreclr/vm/frames.h
Lines 2850 to 2880 in b4765bd
On 64-bit platforms the argument is instead passed to the
CORINFO_HELP_INIT_PINVOKE_FRAME
helper call.We can unify these mechanisms in the way suggested by @jkotas here, by storing it directly inside the
InlinedFrame
that the JIT already has special knowledge of. It will save us some special casing within the JIT and avoid the unnecessary store on 64-bit in many cases.The text was updated successfully, but these errors were encountered: