< prev index next >
src/hotspot/cpu/x86/frame_x86.cpp
Print this page
*** 470,480 ****
if (map->update_map()) {
// Tell GC to use argument oopmaps for some runtime stubs that need it.
// For C1, the runtime stub might not have oop maps, so set this flag
// outside of update_register_map.
! map->set_include_argument_oops(_cb->caller_must_gc_arguments(map->thread()));
if (_cb->oop_maps() != NULL) {
OopMapSet::update_register_map(this, map);
}
// Since the prolog does the save and restore of EBP there is no oopmap
--- 470,495 ----
if (map->update_map()) {
// Tell GC to use argument oopmaps for some runtime stubs that need it.
// For C1, the runtime stub might not have oop maps, so set this flag
// outside of update_register_map.
! bool caller_args = _cb->caller_must_gc_arguments(map->thread());
! if (!caller_args) {
! nmethod* nm = _cb->as_nmethod_or_null();
! if (nm != NULL && nm->is_compiled_by_c1() && pc() < nm->verified_value_entry_point()) {
! // The VEP and VVEP(RO) of C1-compiled methods call buffer_value_args_xxx
! // before doing any argument shuffling, so we need to scan the oops
! // as the caller passes them.
! NativeCall* call = nativeCall_before(pc());
! address dest = call->destination();
! if (dest == Runtime1::entry_for(Runtime1::buffer_value_args_no_receiver_id) ||
! dest == Runtime1::entry_for(Runtime1::buffer_value_args_id)) {
! caller_args = true;
! }
! }
! }
! map->set_include_argument_oops(caller_args);
if (_cb->oop_maps() != NULL) {
OopMapSet::update_register_map(this, map);
}
// Since the prolog does the save and restore of EBP there is no oopmap
*** 489,499 ****
//------------------------------------------------------------------------------
// frame::sender
frame frame::sender(RegisterMap* map) const {
! // Default is we done have to follow them. The sender_for_xxx will
// update it accordingly
map->set_include_argument_oops(false);
if (is_entry_frame()) return sender_for_entry_frame(map);
if (is_interpreted_frame()) return sender_for_interpreter_frame(map);
--- 504,514 ----
//------------------------------------------------------------------------------
// frame::sender
frame frame::sender(RegisterMap* map) const {
! // Default is we don't have to follow them. The sender_for_xxx will
// update it accordingly
map->set_include_argument_oops(false);
if (is_entry_frame()) return sender_for_entry_frame(map);
if (is_interpreted_frame()) return sender_for_interpreter_frame(map);
< prev index next >