> When a virtual thread suspended at a breakpoint gets unmounted and mounted 
> again only the top frame is thawed. The caller stays frozen in the stack 
> chunk and the popped frame returns into the continuation return barrier. The 
> interpreter's popframe entry treats that return address like a deoptimized 
> caller, preserves the arguments, sets the reexecution bit and returns. The 
> barrier then thawed the caller as a plain return. Arguments and bit left 
> behind, no reexecution of the invoke, run() went on with a zero result.
> 
> Thaw finishes it now. An interpreted caller gets the preserved arguments back 
> on its expression stack and its return slot is patched to the interpreter 
> deopt entry after push_return_frame, the x86 deopt entry reloads rsp from 
> last_sp for that, aarch64 already does. A compiled caller frozen in the chunk 
> is deoptimized from UpdateForPopTopFrameClosure::doit the same way 
> set_frame_pop does it. Thaw leaves the arguments alone in that case and 
> unpack_on_stack puts them back. A frozen compiled frame being popped stays 
> opaque.
> 
> A linkTo caller needs one more thing. The linker consumed the trailing 
> MemberName before the target ran and the preserved arguments are sized by the 
> target, so the MemberName is not among them. Thaw takes it from the caller's 
> local 0 the way the interpreter's popframe entry does, the lookup from 
> member_name_arg_or_null moved into a plain helper both can call. The 
> arguments go one slot up and the MemberName goes back on top.
> 
> popframes002 runs popframes001 on a virtual thread with the join Chris 
> Plummer wrote enabled by a property in the debuggee. It unmounts the tested 
> thread before the breakpoint so the caller is frozen when popped, and run() 
> is excluded from compilation so this stays the interpreted case. popframes003 
> is the compiled caller case, -Xcomp with the breakpoint in a separate stop() 
> so testedMethod keeps its compiled frame and run() stays frozen, the debugger 
> pops frame 1 and the debuggee checks with WhiteBox that run() and 
> testedMethod are compiled and that testedMethod ran twice. 
> -XX:+PreserveFramePointer keeps the thaw on the slow path. Both fail on 
> master without the hotspot change. popframes001 itself runs the plain case as 
> before and is off the virtual problem list. If separate copies of the 
> debugger and debuggee are preferred over the properties that is easy to 
> change. PopFrameMethodNameInvariantTest got an unmount mode, the same 
> linkToStatic pop on a virtual thread that sleeps
 before the breakpoint so its ca...

Shiv Shah has updated the pull request with a new target base due to a merge or 
a rebase. The incremental webrev excludes the unrelated changes brought in by 
the merge/rebase. The pull request contains 21 additional commits since the 
last revision:

 - Merge remote-tracking branch 'upstream/master' into JDK-8391440
 - Require continuations for the frozen caller runs and add popframes002 to the 
jdwp quick group
 - Keep testedMethod and run free of deoptimization before the freeze, drop the 
WhiteBox check
 - Break in stop() and pop its caller in popframes003, make the unmount 
deterministic
 - Put the MemberName back for a linkTo caller and factor the popframe block out
 - Run popframes002 and popframes003 on the popframes001 classes
 - Patch the return pc instead of rebuilding the frame
 - Exclude the popframes002 caller from compilation
 - Keep the popframes002 caller interpreted and add popframes003 for a compiled 
one
 - Deoptimize a frozen compiled caller instead of refusing the pop
 - ... and 11 more: https://git.openjdk.org/jdk/compare/c803e827...3d4ad029

-------------

Changes:
  - all: https://git.openjdk.org/jdk/pull/32661/files
  - new: https://git.openjdk.org/jdk/pull/32661/files/173a40d5..3d4ad029

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=32661&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=32661&range=00-01

  Stats: 84312 lines in 1865 files changed: 50995 ins; 23483 del; 9834 mod
  Patch: https://git.openjdk.org/jdk/pull/32661.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/32661/head:pull/32661

PR: https://git.openjdk.org/jdk/pull/32661

Reply via email to