RFR 8227040 [lworld][c1] Must repair stack frame before calling buffer_value_args

Ioi Lam ioi.lam at oracle.com
Wed Jul 3 05:13:23 UTC 2019


When a C1-compiled method is called by C2, it needs to pack all the fields
of its value arguments back to buffered objects. In some cases, usually 
when the
value arguments have floating point fields, the C1 callee may require more
stack than what has been provided by the C2 caller. On x64, this is handled
by the following "stack repair" instructions in the "Verified Entry Point"
of the callee

     pop %r13
     sub <sp_inc>,%rsp
     push %r13
     movq <real_frame_size>,<frame_size - 8>(%rsp)

The stack must be repaired before it can be walked (for GC, etc). This bug
happens because we call Runtime1::buffer_value_args, which may GC, before
the stack is repaired.

The fix is to move the stack repair code before calling buffer_value_args.
I also added one test case that would reliably catch this type of error.

- Ioi

More information about the valhalla-dev mailing list