< prev index next >

src/hotspot/cpu/ppc/continuationFreezeThaw_ppc.inline.hpp

Print this page
@@ -1,7 +1,8 @@
  /*
-  * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved.
+  * Copyright (c) 2019, 2026, Oracle and/or its affiliates. All rights reserved.
+  * Copyright (c) 2026 SAP SE. All rights reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 only, as
   * published by the Free Software Foundation.

@@ -54,10 +55,13 @@
    assert(FKind::is_instance(f), "");
    if (FKind::interpreted) {
      return frame(f.sender_sp(), f.sender_pc(), f.interpreter_frame_sender_sp());
    }
  
+   assert(f.cb() == nullptr || !f.cb()->is_nmethod() || !f.cb()->as_nmethod()->needs_stack_repair(),
+          "unsupported");
+ 
    intptr_t* sender_sp = f.sender_sp();
    address sender_pc = f.sender_pc();
    assert(sender_sp != f.sp(), "must have changed");
  
    int slot = 0;

@@ -267,11 +271,12 @@
  //                                                         | frame::java_abi        |
  //      Where f is the frame to be relocated on the heap.  | (metadata_words_at_top)|<- SP == unext. SP of new frame
  //      See also StackChunkFrameStream::frame_size().      ==========================
  //
  template<typename FKind>
- frame FreezeBase::new_heap_frame(frame& f, frame& caller) {
+ frame FreezeBase::new_heap_frame(frame& f, frame& caller, int size_adjust) {
+   assert(size_adjust == 0, "unsupported");
    assert(FKind::is_instance(f), "");
  
    intptr_t *sp, *fp;
    if (FKind::interpreted) {
      intptr_t locals_offset = *f.addr_at(ijava_idx(locals));

@@ -315,11 +320,11 @@
  
      return frame(sp, sp, fp, f.pc(), nullptr, nullptr, true /* on_heap */);
    }
  }
  
- inline void FreezeBase::patch_pd(frame& hf, const frame& caller) {
+ inline void FreezeBase::patch_pd(frame& hf, const frame& caller, bool is_bottom_frame) {
    if (caller.is_interpreted_frame()) {
      assert(!caller.is_empty(), "");
      patch_callee_link_relative(caller, caller.fp());
    }
  #ifdef ASSERT

@@ -501,11 +506,12 @@
  //  If the new frame is at the bottom just above the ContinuationEntry frame then the stackargs
  //  don't overlap the caller either even though it is compiled because the size is not
  //  limited/known. In contrast to the interpreted caller case the abi overlaps with the caller
  //  if there are no stackargs. This is to comply with shared code (see e.g. StackChunkFrameStream::frame_size())
  //
- template<typename FKind> frame ThawBase::new_stack_frame(const frame& hf, frame& caller, bool bottom) {
+ template<typename FKind> frame ThawBase::new_stack_frame(const frame& hf, frame& caller, bool bottom, int size_adjust) {
+   assert(size_adjust == 0, "unsupported");
    assert(FKind::is_instance(hf), "");
  
    assert(is_aligned(caller.fp(), frame::frame_alignment), PTR_FORMAT, p2i(caller.fp()));
    // caller.sp() can be unaligned. This is fixed below.
    if (FKind::interpreted) {
< prev index next >