310 // Must be native-compiled frame, i.e. the marshaling code for native
311 // methods that exists in the core system.
312 return frame(sender_sp(), sender_pc(), kind::code_blob);
313 }
314
315 inline frame frame::sender(RegisterMap* map) const {
316 frame result = sender_raw(map);
317
318 if (map->process_frames() && !map->in_cont()) {
319 StackWatermarkSet::on_iteration(map->thread(), result);
320 }
321
322 // Calling frame::id() is currently not supported for heap frames.
323 assert(result._on_heap || this->_on_heap || result.is_older(this->id()), "Must be");
324
325 return result;
326 }
327
328 inline frame frame::sender_for_compiled_frame(RegisterMap *map) const {
329 assert(map != nullptr, "map must be set");
330
331 intptr_t* sender_sp = this->sender_sp();
332 address sender_pc = this->sender_pc();
333
334 if (map->update_map()) {
335 // Tell GC to use argument oopmaps for some runtime stubs that need it.
336 // For C1, the runtime stub might not have oop maps, so set this flag
337 // outside of update_register_map.
338 if (!_cb->is_nmethod()) { // compiled frames do not use callee-saved registers
339 map->set_include_argument_oops(_cb->caller_must_gc_arguments(map->thread()));
340 if (oop_map() != nullptr) {
341 _oop_map->update_register_map(this, map);
342 }
343 } else {
344 assert(!_cb->caller_must_gc_arguments(map->thread()), "");
345 assert(!map->include_argument_oops(), "");
346 assert(oop_map() == nullptr || !oop_map()->has_any(OopMapValue::callee_saved_value), "callee-saved value in compiled frame");
347 }
348 }
349
350 assert(sender_sp != sp(), "must have changed");
351
352 if (Continuation::is_return_barrier_entry(sender_pc)) {
353 if (map->walk_cont()) { // about to walk into an h-stack
354 return Continuation::top_frame(*this, map);
355 } else {
356 return Continuation::continuation_bottom_sender(map->thread(), *this, sender_sp);
357 }
|
310 // Must be native-compiled frame, i.e. the marshaling code for native
311 // methods that exists in the core system.
312 return frame(sender_sp(), sender_pc(), kind::code_blob);
313 }
314
315 inline frame frame::sender(RegisterMap* map) const {
316 frame result = sender_raw(map);
317
318 if (map->process_frames() && !map->in_cont()) {
319 StackWatermarkSet::on_iteration(map->thread(), result);
320 }
321
322 // Calling frame::id() is currently not supported for heap frames.
323 assert(result._on_heap || this->_on_heap || result.is_older(this->id()), "Must be");
324
325 return result;
326 }
327
328 inline frame frame::sender_for_compiled_frame(RegisterMap *map) const {
329 assert(map != nullptr, "map must be set");
330 assert(!_cb->is_nmethod() || !_cb->as_nmethod()->needs_stack_repair(), "unsupported");
331
332 intptr_t* sender_sp = this->sender_sp();
333 address sender_pc = this->sender_pc();
334
335 if (map->update_map()) {
336 // Tell GC to use argument oopmaps for some runtime stubs that need it.
337 // For C1, the runtime stub might not have oop maps, so set this flag
338 // outside of update_register_map.
339 #ifdef COMPILER1
340 DEBUG_ONLY(nmethod* nm = _cb->as_nmethod_or_null());
341 assert(nm == nullptr || !nm->is_compiled_by_c1() || !nm->method()->has_scalarized_args() ||
342 pc() >= nm->verified_inline_entry_point(), "unsupported");
343 #endif
344 if (!_cb->is_nmethod()) { // compiled frames do not use callee-saved registers
345 map->set_include_argument_oops(_cb->caller_must_gc_arguments(map->thread()));
346 if (oop_map() != nullptr) {
347 _oop_map->update_register_map(this, map);
348 }
349 } else {
350 assert(!_cb->caller_must_gc_arguments(map->thread()), "");
351 assert(!map->include_argument_oops(), "");
352 assert(oop_map() == nullptr || !oop_map()->has_any(OopMapValue::callee_saved_value), "callee-saved value in compiled frame");
353 }
354 }
355
356 assert(sender_sp != sp(), "must have changed");
357
358 if (Continuation::is_return_barrier_entry(sender_pc)) {
359 if (map->walk_cont()) { // about to walk into an h-stack
360 return Continuation::top_frame(*this, map);
361 } else {
362 return Continuation::continuation_bottom_sender(map->thread(), *this, sender_sp);
363 }
|