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
|