diff options
author | Jeremy Koritzinsky <jekoritz@microsoft.com> | 2021-01-20 10:58:03 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-20 10:58:03 +0300 |
commit | 5ec0c7a3e8db50143b6afdeb672c1aeb8eb32d31 (patch) | |
tree | 878129405c74a3d7942b6b4d929de052f83fbcdf /src/coreclr/jit/flowgraph.cpp | |
parent | 5aef85ae3da23dfd49f95be1c9336f1bad2e0123 (diff) |
Remove extra UnmanagedCallersOnly overhead on x86 (#46238)
* Implement emitting an unmanaged calling convention entry point with the correct argument order and register usage on x86.
* Move Unix x86 to the UnmanagedCallersOnly plan now that we don't need to do argument shuffling.
* Add SEH hookup and profiler/debugger hooks to Reverse P/Invoke entry helper to match custom x86 thunk.
Fixes #46177
* Remove Windows x86 assembly stub for individual reverse p/invokes. Move Windows x86 unmanaged callers only to not have extra overhead and put reverse P/Invoke stubs for Windows x86 on the UnmanagedCallersOnly plan.
* Further cleanup
* Remove extraneous UnmanagedCallersOnly block now that x86 UnmanagedCallersOnly has been simplified.
* Undo ArgOrder size specifier since it isn't needed and it doesn't work.
* Fix copy constructor reverse marshalling. Now that we don't have the emitted unmanaged thunk stub, we need to handle the x86 differences for copy-constructed parameters in the IL stub.
* Fix version guid syntax.
* Remove FastNExportHandler.
* Revert "Remove FastNExportHandler."
This reverts commit 423f70ee4d564147dc0ce370d38b3a38404f8e22.
* Fix setting up entry frame for new thread.
* Allow the NExportSEH record to live below ESP so we don't need to create a new stack frame.
* Fix formatting.
* Assign an offset for the return buffer on x86 since it might come in on the stack.
* Make sure we use the TC block we just put in on x86 as well.
* Shrink the ReversePInvokeFrame on non-x86 back to master's size.
* Fix arch-specific R2R constant.
* Pass the return address of the ReversePInvokeEnter helper to TraceCall instead of the entry point and call TraceCall from all JIT_ReversePInvokeEnter* helpers.
* Fix ILVerification and ILVerify
* fix R2R constants for crossgen1
* Don't assert ReversePInvokeFrame size for cross-bitness scenarios.
Diffstat (limited to 'src/coreclr/jit/flowgraph.cpp')
-rw-r--r-- | src/coreclr/jit/flowgraph.cpp | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index 950988adca1..e9cdd48899e 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -8683,13 +8683,29 @@ void Compiler::fgAddReversePInvokeEnterExit() varDsc->lvType = TYP_BLK; varDsc->lvExactSize = eeGetEEInfo()->sizeOfReversePInvokeFrame; - GenTree* tree; - // Add enter pinvoke exit callout at the start of prolog - tree = gtNewOperNode(GT_ADDR, TYP_I_IMPL, gtNewLclvNode(lvaReversePInvokeFrameVar, TYP_BLK)); + GenTree* pInvokeFrameVar = gtNewOperNode(GT_ADDR, TYP_I_IMPL, gtNewLclvNode(lvaReversePInvokeFrameVar, TYP_BLK)); + + GenTree* stubArgument; + + if (info.compPublishStubParam) + { + // If we have a secret param for a Reverse P/Invoke, that means that we are in an IL stub. + // In this case, the method handle we pass down to the Reverse P/Invoke helper should be + // the target method, which is passed in the secret parameter. + stubArgument = gtNewLclvNode(lvaStubArgumentVar, TYP_I_IMPL); + } + else + { + stubArgument = gtNewIconNode(0, TYP_I_IMPL); + } + + GenTree* tree; + + GenTreeCall::Use* args = gtNewCallArgs(pInvokeFrameVar, gtNewIconEmbMethHndNode(info.compMethodHnd), stubArgument); - tree = gtNewHelperCallNode(CORINFO_HELP_JIT_REVERSE_PINVOKE_ENTER, TYP_VOID, gtNewCallArgs(tree)); + tree = gtNewHelperCallNode(CORINFO_HELP_JIT_REVERSE_PINVOKE_ENTER, TYP_VOID, args); fgEnsureFirstBBisScratch(); |