Fix P/Invoke call and method {pro,epi}logs in RyuJIT/x86.
authorPat Gavlin <pagavlin@microsoft.com>
Mon, 3 Oct 2016 20:27:06 +0000 (13:27 -0700)
committerPat Gavlin <pagavlin@microsoft.com>
Mon, 3 Oct 2016 20:27:06 +0000 (13:27 -0700)
commit5e93edd7fd6f21e2364a864e18c1098148d81109
tree38ff643f5ebfb54724c97ffea72282f4ad125c28
parent89bf443d2787e1b4754718bf28e71da248ea7727
Fix P/Invoke call and method {pro,epi}logs in RyuJIT/x86.

The contract for methods that contain P/Invokes differs between 64- and
32-bit targets.

In the former case, the JIT must:
- In the method prolog, initialize the P/Invoke frame with a call to
  CORINFO_HELP_INIT_PINVOKE_FRAME and push the frame on to the current
  thread's frame list if the method is an IL stub.
- Before/after each call, if the method is *not* an IL stub, push/pop
  the frame (respectively).
- In the method epilog, if the method is an IL stub, pop the P/Invoke
  frame.

In the latter case, CORINFO_HELP_INIT_PINVOKE_FRAME pushes the P/Invoke
frame on to the current thread's frame list, and the frame need only
be popped in the method epilog.

This change adjusts P/Invoke lowering s.t. the 64-bit discipline is
only followed for 64-bit targets.
src/jit/lower.cpp