< prev index next >

src/hotspot/cpu/riscv/continuationFreezeThaw_riscv.inline.hpp

Print this page

110       // so we make more room by moving sp down by argsize
111       int argsize = FKind::stack_argsize(f);
112       sp -= argsize;
113     }
114     caller.set_sp(sp + fsize);
115 
116     assert(_cont.tail()->is_in_chunk(sp), "");
117 
118     return frame(sp, sp, fp, f.pc(), nullptr, nullptr, true /* on_heap */);
119   }
120 }
121 
122 void FreezeBase::adjust_interpreted_frame_unextended_sp(frame& f) {
123   assert((f.at(frame::interpreter_frame_last_sp_offset) != 0) || (f.unextended_sp() == f.sp()), "");
124   intptr_t* real_unextended_sp = (intptr_t*)f.at_relative_or_null(frame::interpreter_frame_last_sp_offset);
125   if (real_unextended_sp != nullptr) {
126     f.set_unextended_sp(real_unextended_sp); // can be null at a safepoint
127   }
128 }
129 




130 inline void FreezeBase::relativize_interpreted_frame_metadata(const frame& f, const frame& hf) {
131   assert(hf.fp() == hf.unextended_sp() + (f.fp() - f.unextended_sp()), "");
132   assert((f.at(frame::interpreter_frame_last_sp_offset) != 0)
133     || (f.unextended_sp() == f.sp()), "");
134   assert(f.fp() > (intptr_t*)f.at_relative(frame::interpreter_frame_initial_sp_offset), "");
135 
136   // On RISCV, we may insert padding between the locals and the rest of the frame
137   // (see TemplateInterpreterGenerator::generate_normal_entry, and AbstractInterpreter::layout_activation)
138   // because we freeze the padding word (see recurse_freeze_interpreted_frame) in order to keep the same relativized
139   // locals value, we don't need to change the locals value here.
140 
141   // Make sure that last_sp is already relativized.
142   assert((intptr_t*)hf.at_relative(frame::interpreter_frame_last_sp_offset) == hf.unextended_sp(), "");
143 
144   // Make sure that monitor_block_top is already relativized.
145   assert(hf.at_absolute(frame::interpreter_frame_monitor_block_top_offset) <= frame::interpreter_frame_initial_sp_offset, "");
146 
147   // extended_sp is already relativized by TemplateInterpreterGenerator::generate_normal_entry or
148   // AbstractInterpreter::layout_activation
149 

262   }
263 }
264 
265 inline intptr_t* ThawBase::align(const frame& hf, intptr_t* frame_sp, frame& caller, bool bottom) {
266 #ifdef _LP64
267   if (((intptr_t)frame_sp & 0xf) != 0) {
268     assert(caller.is_interpreted_frame() || (bottom && hf.compiled_frame_stack_argsize() % 2 != 0), "");
269     frame_sp--;
270     caller.set_sp(caller.sp() - 1);
271   }
272   assert(is_aligned(frame_sp, frame::frame_alignment), "");
273 #endif
274 
275   return frame_sp;
276 }
277 
278 inline void ThawBase::patch_pd(frame& f, const frame& caller) {
279   patch_callee_link(caller, caller.fp());
280 }
281 














282 inline void ThawBase::derelativize_interpreted_frame_metadata(const frame& hf, const frame& f) {
283   // Make sure that last_sp is kept relativized.
284   assert((intptr_t*)f.at_relative(frame::interpreter_frame_last_sp_offset) == f.unextended_sp(), "");
285 
286   // Make sure that monitor_block_top is still relativized.
287   assert(f.at_absolute(frame::interpreter_frame_monitor_block_top_offset) <= frame::interpreter_frame_initial_sp_offset, "");
288 
289   // Make sure that extended_sp is kept relativized.
290   assert((intptr_t*)f.at_relative(frame::interpreter_frame_extended_sp_offset) < f.unextended_sp(), "");
291 }
292 
293 #endif // CPU_RISCV_CONTINUATIONFREEZETHAW_RISCV_INLINE_HPP

110       // so we make more room by moving sp down by argsize
111       int argsize = FKind::stack_argsize(f);
112       sp -= argsize;
113     }
114     caller.set_sp(sp + fsize);
115 
116     assert(_cont.tail()->is_in_chunk(sp), "");
117 
118     return frame(sp, sp, fp, f.pc(), nullptr, nullptr, true /* on_heap */);
119   }
120 }
121 
122 void FreezeBase::adjust_interpreted_frame_unextended_sp(frame& f) {
123   assert((f.at(frame::interpreter_frame_last_sp_offset) != 0) || (f.unextended_sp() == f.sp()), "");
124   intptr_t* real_unextended_sp = (intptr_t*)f.at_relative_or_null(frame::interpreter_frame_last_sp_offset);
125   if (real_unextended_sp != nullptr) {
126     f.set_unextended_sp(real_unextended_sp); // can be null at a safepoint
127   }
128 }
129 
130 inline void FreezeBase::prepare_freeze_interpreted_top_frame(const frame& f) {
131   Unimplemented();
132 }
133 
134 inline void FreezeBase::relativize_interpreted_frame_metadata(const frame& f, const frame& hf) {
135   assert(hf.fp() == hf.unextended_sp() + (f.fp() - f.unextended_sp()), "");
136   assert((f.at(frame::interpreter_frame_last_sp_offset) != 0)
137     || (f.unextended_sp() == f.sp()), "");
138   assert(f.fp() > (intptr_t*)f.at_relative(frame::interpreter_frame_initial_sp_offset), "");
139 
140   // On RISCV, we may insert padding between the locals and the rest of the frame
141   // (see TemplateInterpreterGenerator::generate_normal_entry, and AbstractInterpreter::layout_activation)
142   // because we freeze the padding word (see recurse_freeze_interpreted_frame) in order to keep the same relativized
143   // locals value, we don't need to change the locals value here.
144 
145   // Make sure that last_sp is already relativized.
146   assert((intptr_t*)hf.at_relative(frame::interpreter_frame_last_sp_offset) == hf.unextended_sp(), "");
147 
148   // Make sure that monitor_block_top is already relativized.
149   assert(hf.at_absolute(frame::interpreter_frame_monitor_block_top_offset) <= frame::interpreter_frame_initial_sp_offset, "");
150 
151   // extended_sp is already relativized by TemplateInterpreterGenerator::generate_normal_entry or
152   // AbstractInterpreter::layout_activation
153 

266   }
267 }
268 
269 inline intptr_t* ThawBase::align(const frame& hf, intptr_t* frame_sp, frame& caller, bool bottom) {
270 #ifdef _LP64
271   if (((intptr_t)frame_sp & 0xf) != 0) {
272     assert(caller.is_interpreted_frame() || (bottom && hf.compiled_frame_stack_argsize() % 2 != 0), "");
273     frame_sp--;
274     caller.set_sp(caller.sp() - 1);
275   }
276   assert(is_aligned(frame_sp, frame::frame_alignment), "");
277 #endif
278 
279   return frame_sp;
280 }
281 
282 inline void ThawBase::patch_pd(frame& f, const frame& caller) {
283   patch_callee_link(caller, caller.fp());
284 }
285 
286 inline void ThawBase::patch_pd(frame& f, intptr_t* caller_sp) {
287   Unimplemented();
288 }
289 
290 inline intptr_t* ThawBase::push_preempt_rerun_adapter(frame top, bool is_interpreted_frame) {
291   Unimplemented();
292   return nullptr;
293 }
294 
295 inline intptr_t* ThawBase::push_preempt_monitorenter_redo(stackChunkOop chunk) {
296   Unimplemented();
297   return nullptr;
298 }
299 
300 inline void ThawBase::derelativize_interpreted_frame_metadata(const frame& hf, const frame& f) {
301   // Make sure that last_sp is kept relativized.
302   assert((intptr_t*)f.at_relative(frame::interpreter_frame_last_sp_offset) == f.unextended_sp(), "");
303 
304   // Make sure that monitor_block_top is still relativized.
305   assert(f.at_absolute(frame::interpreter_frame_monitor_block_top_offset) <= frame::interpreter_frame_initial_sp_offset, "");
306 
307   // Make sure that extended_sp is kept relativized.
308   assert((intptr_t*)f.at_relative(frame::interpreter_frame_extended_sp_offset) < f.unextended_sp(), "");
309 }
310 
311 #endif // CPU_RISCV_CONTINUATIONFREEZETHAW_RISCV_INLINE_HPP
< prev index next >