RFR 8227040 [lworld][c1] Must repair stack frame before calling buffer_value_args
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
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
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.
More information about the valhalla-dev