< 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 >