417 if (is_osr_method()) return "osr"; |
412 if (is_osr_method()) return "osr"; |
418 if (method() != NULL && is_native_method()) return "c2n"; |
413 if (method() != NULL && is_native_method()) return "c2n"; |
419 return NULL; |
414 return NULL; |
420 } |
415 } |
421 |
416 |
422 // %%% This variable is no longer used? |
417 // Fill in default values for various flag fields |
423 int nmethod::_zombie_instruction_size = NativeJump::instruction_size; |
418 void nmethod::init_defaults() { |
|
419 _state = alive; |
|
420 _marked_for_reclamation = 0; |
|
421 _has_flushed_dependencies = 0; |
|
422 _speculatively_disconnected = 0; |
|
423 _has_unsafe_access = 0; |
|
424 _has_method_handle_invokes = 0; |
|
425 _marked_for_deoptimization = 0; |
|
426 _lock_count = 0; |
|
427 _stack_traversal_mark = 0; |
|
428 _unload_reported = false; // jvmti state |
|
429 |
|
430 NOT_PRODUCT(_has_debug_info = false); |
|
431 _oops_do_mark_link = NULL; |
|
432 _jmethod_id = NULL; |
|
433 _osr_link = NULL; |
|
434 _scavenge_root_link = NULL; |
|
435 _scavenge_root_state = 0; |
|
436 _saved_nmethod_link = NULL; |
|
437 _compiler = NULL; |
|
438 |
|
439 #ifdef HAVE_DTRACE_H |
|
440 _trap_offset = 0; |
|
441 #endif // def HAVE_DTRACE_H |
|
442 } |
424 |
443 |
425 |
444 |
426 nmethod* nmethod::new_native_nmethod(methodHandle method, |
445 nmethod* nmethod::new_native_nmethod(methodHandle method, |
427 CodeBuffer *code_buffer, |
446 CodeBuffer *code_buffer, |
428 int vep_offset, |
447 int vep_offset, |
578 { |
597 { |
579 { |
598 { |
580 debug_only(No_Safepoint_Verifier nsv;) |
599 debug_only(No_Safepoint_Verifier nsv;) |
581 assert_locked_or_safepoint(CodeCache_lock); |
600 assert_locked_or_safepoint(CodeCache_lock); |
582 |
601 |
583 NOT_PRODUCT(_has_debug_info = false); |
602 init_defaults(); |
584 _oops_do_mark_link = NULL; |
|
585 _method = method; |
603 _method = method; |
586 _entry_bci = InvocationEntryBci; |
604 _entry_bci = InvocationEntryBci; |
587 _jmethod_id = NULL; |
|
588 _osr_link = NULL; |
|
589 _scavenge_root_link = NULL; |
|
590 _scavenge_root_state = 0; |
|
591 _saved_nmethod_link = NULL; |
|
592 _compiler = NULL; |
|
593 // We have no exception handler or deopt handler make the |
605 // We have no exception handler or deopt handler make the |
594 // values something that will never match a pc like the nmethod vtable entry |
606 // values something that will never match a pc like the nmethod vtable entry |
595 _exception_offset = 0; |
607 _exception_offset = 0; |
596 _deoptimize_offset = 0; |
608 _deoptimize_offset = 0; |
597 _deoptimize_mh_offset = 0; |
609 _deoptimize_mh_offset = 0; |
598 _orig_pc_offset = 0; |
610 _orig_pc_offset = 0; |
599 #ifdef HAVE_DTRACE_H |
611 |
600 _trap_offset = 0; |
|
601 #endif // def HAVE_DTRACE_H |
|
602 _stub_offset = data_offset(); |
612 _stub_offset = data_offset(); |
603 _consts_offset = data_offset(); |
613 _consts_offset = data_offset(); |
604 _oops_offset = data_offset(); |
614 _oops_offset = data_offset(); |
605 _scopes_data_offset = _oops_offset + round_to(code_buffer->total_oop_size(), oopSize); |
615 _scopes_data_offset = _oops_offset + round_to(code_buffer->total_oop_size(), oopSize); |
606 _scopes_pcs_offset = _scopes_data_offset; |
616 _scopes_pcs_offset = _scopes_data_offset; |
614 _verified_entry_point = instructions_begin() + offsets->value(CodeOffsets::Verified_Entry); |
624 _verified_entry_point = instructions_begin() + offsets->value(CodeOffsets::Verified_Entry); |
615 _osr_entry_point = NULL; |
625 _osr_entry_point = NULL; |
616 _exception_cache = NULL; |
626 _exception_cache = NULL; |
617 _pc_desc_cache.reset_to(NULL); |
627 _pc_desc_cache.reset_to(NULL); |
618 |
628 |
619 flags.clear(); |
|
620 flags.state = alive; |
|
621 _markedForDeoptimization = 0; |
|
622 |
|
623 _lock_count = 0; |
|
624 _stack_traversal_mark = 0; |
|
625 |
|
626 code_buffer->copy_oops_to(this); |
629 code_buffer->copy_oops_to(this); |
627 debug_only(verify_scavenge_root_oops()); |
630 debug_only(verify_scavenge_root_oops()); |
628 CodeCache::commit(this); |
631 CodeCache::commit(this); |
629 VTune::create_nmethod(this); |
|
630 } |
632 } |
631 |
633 |
632 if (PrintNativeNMethods || PrintDebugInfo || PrintRelocations || PrintDependencies) { |
634 if (PrintNativeNMethods || PrintDebugInfo || PrintRelocations || PrintDependencies) { |
633 ttyLocker ttyl; // keep the following output all in one block |
635 ttyLocker ttyl; // keep the following output all in one block |
634 // This output goes directly to the tty, not the compiler log. |
636 // This output goes directly to the tty, not the compiler log. |
706 _verified_entry_point = instructions_begin() + offsets->value(CodeOffsets::Verified_Entry); |
702 _verified_entry_point = instructions_begin() + offsets->value(CodeOffsets::Verified_Entry); |
707 _osr_entry_point = NULL; |
703 _osr_entry_point = NULL; |
708 _exception_cache = NULL; |
704 _exception_cache = NULL; |
709 _pc_desc_cache.reset_to(NULL); |
705 _pc_desc_cache.reset_to(NULL); |
710 |
706 |
711 flags.clear(); |
|
712 flags.state = alive; |
|
713 _markedForDeoptimization = 0; |
|
714 |
|
715 _lock_count = 0; |
|
716 _stack_traversal_mark = 0; |
|
717 |
|
718 code_buffer->copy_oops_to(this); |
707 code_buffer->copy_oops_to(this); |
719 debug_only(verify_scavenge_root_oops()); |
708 debug_only(verify_scavenge_root_oops()); |
720 CodeCache::commit(this); |
709 CodeCache::commit(this); |
721 VTune::create_nmethod(this); |
|
722 } |
710 } |
723 |
711 |
724 if (PrintNMethods || PrintDebugInfo || PrintRelocations || PrintDependencies) { |
712 if (PrintNMethods || PrintDebugInfo || PrintRelocations || PrintDependencies) { |
725 ttyLocker ttyl; // keep the following output all in one block |
713 ttyLocker ttyl; // keep the following output all in one block |
726 // This output goes directly to the tty, not the compiler log. |
714 // This output goes directly to the tty, not the compiler log. |
781 assert(debug_info->oop_recorder() == code_buffer->oop_recorder(), "shared OR"); |
769 assert(debug_info->oop_recorder() == code_buffer->oop_recorder(), "shared OR"); |
782 { |
770 { |
783 debug_only(No_Safepoint_Verifier nsv;) |
771 debug_only(No_Safepoint_Verifier nsv;) |
784 assert_locked_or_safepoint(CodeCache_lock); |
772 assert_locked_or_safepoint(CodeCache_lock); |
785 |
773 |
786 NOT_PRODUCT(_has_debug_info = false); |
774 init_defaults(); |
787 _oops_do_mark_link = NULL; |
|
788 _method = method; |
775 _method = method; |
789 _jmethod_id = NULL; |
776 _entry_bci = entry_bci; |
790 _compile_id = compile_id; |
777 _compile_id = compile_id; |
791 _comp_level = comp_level; |
778 _comp_level = comp_level; |
792 _entry_bci = entry_bci; |
|
793 _osr_link = NULL; |
|
794 _scavenge_root_link = NULL; |
|
795 _scavenge_root_state = 0; |
|
796 _compiler = compiler; |
779 _compiler = compiler; |
797 _orig_pc_offset = orig_pc_offset; |
780 _orig_pc_offset = orig_pc_offset; |
798 #ifdef HAVE_DTRACE_H |
|
799 _trap_offset = 0; |
|
800 #endif // def HAVE_DTRACE_H |
|
801 _stub_offset = instructions_offset() + code_buffer->total_offset_of(code_buffer->stubs()->start()); |
781 _stub_offset = instructions_offset() + code_buffer->total_offset_of(code_buffer->stubs()->start()); |
802 |
782 |
803 // Exception handler and deopt handler are in the stub section |
783 // Exception handler and deopt handler are in the stub section |
804 _exception_offset = _stub_offset + offsets->value(CodeOffsets::Exceptions); |
784 _exception_offset = _stub_offset + offsets->value(CodeOffsets::Exceptions); |
805 _deoptimize_offset = _stub_offset + offsets->value(CodeOffsets::Deopt); |
785 _deoptimize_offset = _stub_offset + offsets->value(CodeOffsets::Deopt); |
822 _verified_entry_point = instructions_begin() + offsets->value(CodeOffsets::Verified_Entry); |
802 _verified_entry_point = instructions_begin() + offsets->value(CodeOffsets::Verified_Entry); |
823 _osr_entry_point = instructions_begin() + offsets->value(CodeOffsets::OSR_Entry); |
803 _osr_entry_point = instructions_begin() + offsets->value(CodeOffsets::OSR_Entry); |
824 _exception_cache = NULL; |
804 _exception_cache = NULL; |
825 _pc_desc_cache.reset_to(scopes_pcs_begin()); |
805 _pc_desc_cache.reset_to(scopes_pcs_begin()); |
826 |
806 |
827 flags.clear(); |
|
828 flags.state = alive; |
|
829 _markedForDeoptimization = 0; |
|
830 |
|
831 _unload_reported = false; // jvmti state |
|
832 |
|
833 _lock_count = 0; |
|
834 _stack_traversal_mark = 0; |
|
835 |
|
836 // Copy contents of ScopeDescRecorder to nmethod |
807 // Copy contents of ScopeDescRecorder to nmethod |
837 code_buffer->copy_oops_to(this); |
808 code_buffer->copy_oops_to(this); |
838 debug_info->copy_to(this); |
809 debug_info->copy_to(this); |
839 dependencies->copy_to(this); |
810 dependencies->copy_to(this); |
840 if (ScavengeRootsInCode && detect_scavenge_root_oops()) { |
811 if (ScavengeRootsInCode && detect_scavenge_root_oops()) { |
841 CodeCache::add_scavenge_root_nmethod(this); |
812 CodeCache::add_scavenge_root_nmethod(this); |
842 } |
813 } |
843 debug_only(verify_scavenge_root_oops()); |
814 debug_only(verify_scavenge_root_oops()); |
844 |
815 |
845 CodeCache::commit(this); |
816 CodeCache::commit(this); |
846 |
|
847 VTune::create_nmethod(this); |
|
848 |
817 |
849 // Copy contents of ExceptionHandlerTable to nmethod |
818 // Copy contents of ExceptionHandlerTable to nmethod |
850 handler_table->copy_to(this); |
819 handler_table->copy_to(this); |
851 nul_chk_table->copy_to(this); |
820 nul_chk_table->copy_to(this); |
852 |
821 |
1234 |
1200 |
1235 void nmethod::log_state_change() const { |
1201 void nmethod::log_state_change() const { |
1236 if (LogCompilation) { |
1202 if (LogCompilation) { |
1237 if (xtty != NULL) { |
1203 if (xtty != NULL) { |
1238 ttyLocker ttyl; // keep the following output all in one block |
1204 ttyLocker ttyl; // keep the following output all in one block |
1239 if (flags.state == unloaded) { |
1205 if (_state == unloaded) { |
1240 xtty->begin_elem("make_unloaded thread='" UINTX_FORMAT "'", |
1206 xtty->begin_elem("make_unloaded thread='" UINTX_FORMAT "'", |
1241 os::current_thread_id()); |
1207 os::current_thread_id()); |
1242 } else { |
1208 } else { |
1243 xtty->begin_elem("make_not_entrant thread='" UINTX_FORMAT "'%s", |
1209 xtty->begin_elem("make_not_entrant thread='" UINTX_FORMAT "'%s", |
1244 os::current_thread_id(), |
1210 os::current_thread_id(), |
1245 (flags.state == zombie ? " zombie='1'" : "")); |
1211 (_state == zombie ? " zombie='1'" : "")); |
1246 } |
1212 } |
1247 log_identity(xtty); |
1213 log_identity(xtty); |
1248 xtty->stamp(); |
1214 xtty->stamp(); |
1249 xtty->end_elem(); |
1215 xtty->end_elem(); |
1250 } |
1216 } |
1251 } |
1217 } |
1252 if (PrintCompilation && flags.state != unloaded) { |
1218 if (PrintCompilation && _state != unloaded) { |
1253 print_on(tty, flags.state == zombie ? "made zombie " : "made not entrant "); |
1219 print_on(tty, _state == zombie ? "made zombie " : "made not entrant "); |
1254 tty->cr(); |
1220 tty->cr(); |
1255 } |
1221 } |
1256 } |
1222 } |
1257 |
1223 |
1258 // Common functionality for both make_not_entrant and make_zombie |
1224 // Common functionality for both make_not_entrant and make_zombie |
1259 bool nmethod::make_not_entrant_or_zombie(unsigned int state) { |
1225 bool nmethod::make_not_entrant_or_zombie(unsigned int state) { |
1260 assert(state == zombie || state == not_entrant, "must be zombie or not_entrant"); |
1226 assert(state == zombie || state == not_entrant, "must be zombie or not_entrant"); |
1261 |
1227 |
1262 bool was_alive = false; |
1228 bool was_alive = false; |
1263 |
1229 |
1264 // Make sure the nmethod is not flushed in case of a safepoint in code below. |
1230 // Make sure neither the nmethod nor the method is flushed in case of a safepoint in code below. |
1265 nmethodLocker nml(this); |
1231 nmethodLocker nml(this); |
|
1232 methodHandle the_method(method()); |
1266 |
1233 |
1267 { |
1234 { |
1268 // If the method is already zombie there is nothing to do |
1235 // If the method is already zombie there is nothing to do |
1269 if (is_zombie()) { |
1236 if (is_zombie()) { |
1270 return false; |
1237 return false; |
1280 } |
1247 } |
1281 |
1248 |
1282 // Enter critical section. Does not block for safepoint. |
1249 // Enter critical section. Does not block for safepoint. |
1283 MutexLockerEx pl(Patching_lock, Mutex::_no_safepoint_check_flag); |
1250 MutexLockerEx pl(Patching_lock, Mutex::_no_safepoint_check_flag); |
1284 |
1251 |
1285 if (flags.state == state) { |
1252 if (_state == state) { |
1286 // another thread already performed this transition so nothing |
1253 // another thread already performed this transition so nothing |
1287 // to do, but return false to indicate this. |
1254 // to do, but return false to indicate this. |
1288 return false; |
1255 return false; |
1289 } |
1256 } |
1290 |
1257 |
1291 // The caller can be calling the method statically or through an inline |
1258 // The caller can be calling the method statically or through an inline |
1292 // cache call. |
1259 // cache call. |
1293 if (!is_osr_method() && !is_not_entrant()) { |
1260 if (!is_osr_method() && !is_not_entrant()) { |
1294 NativeJump::patch_verified_entry(entry_point(), verified_entry_point(), |
1261 NativeJump::patch_verified_entry(entry_point(), verified_entry_point(), |
1295 SharedRuntime::get_handle_wrong_method_stub()); |
1262 SharedRuntime::get_handle_wrong_method_stub()); |
1296 assert (NativeJump::instruction_size == nmethod::_zombie_instruction_size, ""); |
1263 } |
1297 } |
1264 |
1298 |
1265 if (is_in_use()) { |
1299 was_alive = is_in_use(); // Read state under lock |
1266 // It's a true state change, so mark the method as decompiled. |
|
1267 // Do it only for transition from alive. |
|
1268 inc_decompile_count(); |
|
1269 } |
1300 |
1270 |
1301 // Change state |
1271 // Change state |
1302 flags.state = state; |
1272 _state = state; |
1303 |
1273 |
1304 // Log the transition once |
1274 // Log the transition once |
1305 log_state_change(); |
1275 log_state_change(); |
|
1276 |
|
1277 // Remove nmethod from method. |
|
1278 // We need to check if both the _code and _from_compiled_code_entry_point |
|
1279 // refer to this nmethod because there is a race in setting these two fields |
|
1280 // in methodOop as seen in bugid 4947125. |
|
1281 // If the vep() points to the zombie nmethod, the memory for the nmethod |
|
1282 // could be flushed and the compiler and vtable stubs could still call |
|
1283 // through it. |
|
1284 if (method() != NULL && (method()->code() == this || |
|
1285 method()->from_compiled_entry() == verified_entry_point())) { |
|
1286 HandleMark hm; |
|
1287 method()->clear_code(); |
|
1288 } |
|
1289 |
|
1290 if (state == not_entrant) { |
|
1291 mark_as_seen_on_stack(); |
|
1292 } |
1306 |
1293 |
1307 } // leave critical region under Patching_lock |
1294 } // leave critical region under Patching_lock |
1308 |
1295 |
1309 // When the nmethod becomes zombie it is no longer alive so the |
1296 // When the nmethod becomes zombie it is no longer alive so the |
1310 // dependencies must be flushed. nmethods in the not_entrant |
1297 // dependencies must be flushed. nmethods in the not_entrant |
1311 // state will be flushed later when the transition to zombie |
1298 // state will be flushed later when the transition to zombie |
1312 // happens or they get unloaded. |
1299 // happens or they get unloaded. |
1313 if (state == zombie) { |
1300 if (state == zombie) { |
|
1301 // zombie only - if a JVMTI agent has enabled the CompiledMethodUnload event |
|
1302 // and it hasn't already been reported for this nmethod then report it now. |
|
1303 // (the event may have been reported earilier if the GC marked it for unloading). |
|
1304 post_compiled_method_unload(); |
|
1305 |
1314 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); |
1306 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); |
1315 flush_dependencies(NULL); |
1307 flush_dependencies(NULL); |
1316 } else { |
1308 } else { |
1317 assert(state == not_entrant, "other cases may need to be handled differently"); |
1309 assert(state == not_entrant, "other cases may need to be handled differently"); |
1318 } |
1310 } |
1319 |
1311 |
1320 if (state == not_entrant) { |
|
1321 Events::log("Make nmethod not entrant " INTPTR_FORMAT, this); |
|
1322 } else { |
|
1323 Events::log("Make nmethod zombie " INTPTR_FORMAT, this); |
|
1324 } |
|
1325 |
|
1326 if (TraceCreateZombies) { |
1312 if (TraceCreateZombies) { |
1327 tty->print_cr("nmethod <" INTPTR_FORMAT "> code made %s", this, (state == not_entrant) ? "not entrant" : "zombie"); |
1313 tty->print_cr("nmethod <" INTPTR_FORMAT "> code made %s", this, (state == not_entrant) ? "not entrant" : "zombie"); |
1328 } |
1314 } |
1329 |
1315 |
1330 // Make sweeper aware that there is a zombie method that needs to be removed |
1316 // Make sweeper aware that there is a zombie method that needs to be removed |
1331 NMethodSweeper::notify(this); |
1317 NMethodSweeper::notify(this); |
1332 |
|
1333 // not_entrant only stuff |
|
1334 if (state == not_entrant) { |
|
1335 mark_as_seen_on_stack(); |
|
1336 } |
|
1337 |
|
1338 if (was_alive) { |
|
1339 // It's a true state change, so mark the method as decompiled. |
|
1340 // Do it only for transition from alive. |
|
1341 inc_decompile_count(); |
|
1342 } |
|
1343 |
|
1344 // zombie only - if a JVMTI agent has enabled the CompiledMethodUnload event |
|
1345 // and it hasn't already been reported for this nmethod then report it now. |
|
1346 // (the event may have been reported earilier if the GC marked it for unloading). |
|
1347 if (state == zombie) { |
|
1348 post_compiled_method_unload(); |
|
1349 } |
|
1350 |
|
1351 |
|
1352 // Zombie only stuff |
|
1353 if (state == zombie) { |
|
1354 VTune::delete_nmethod(this); |
|
1355 } |
|
1356 |
|
1357 // Check whether method got unloaded at a safepoint before this, |
|
1358 // if so we can skip the flushing steps below |
|
1359 if (method() == NULL) return true; |
|
1360 |
|
1361 // Remove nmethod from method. |
|
1362 // We need to check if both the _code and _from_compiled_code_entry_point |
|
1363 // refer to this nmethod because there is a race in setting these two fields |
|
1364 // in methodOop as seen in bugid 4947125. |
|
1365 // If the vep() points to the zombie nmethod, the memory for the nmethod |
|
1366 // could be flushed and the compiler and vtable stubs could still call |
|
1367 // through it. |
|
1368 if (method()->code() == this || |
|
1369 method()->from_compiled_entry() == verified_entry_point()) { |
|
1370 HandleMark hm; |
|
1371 method()->clear_code(); |
|
1372 } |
|
1373 |
1318 |
1374 return true; |
1319 return true; |
1375 } |
1320 } |
1376 |
1321 |
1377 void nmethod::flush() { |
1322 void nmethod::flush() { |