comparison src/share/vm/runtime/sharedRuntime.cpp @ 13451:02f27ecb4f3a

Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
author Doug Simon <doug.simon@oracle.com>
date Wed, 18 Dec 2013 00:00:24 +0100
parents cefad50507d8 df832bd8edb9
children d8041d695d19
comparison
equal deleted inserted replaced
13371:4db09b7304da 13451:02f27ecb4f3a
82 #include "c1/c1_Runtime1.hpp" 82 #include "c1/c1_Runtime1.hpp"
83 #endif 83 #endif
84 84
85 // Shared stub locations 85 // Shared stub locations
86 RuntimeStub* SharedRuntime::_wrong_method_blob; 86 RuntimeStub* SharedRuntime::_wrong_method_blob;
87 RuntimeStub* SharedRuntime::_wrong_method_abstract_blob;
87 RuntimeStub* SharedRuntime::_ic_miss_blob; 88 RuntimeStub* SharedRuntime::_ic_miss_blob;
88 RuntimeStub* SharedRuntime::_resolve_opt_virtual_call_blob; 89 RuntimeStub* SharedRuntime::_resolve_opt_virtual_call_blob;
89 RuntimeStub* SharedRuntime::_resolve_virtual_call_blob; 90 RuntimeStub* SharedRuntime::_resolve_virtual_call_blob;
90 RuntimeStub* SharedRuntime::_resolve_static_call_blob; 91 RuntimeStub* SharedRuntime::_resolve_static_call_blob;
91 92
99 #endif // COMPILER2 100 #endif // COMPILER2
100 101
101 102
102 //----------------------------generate_stubs----------------------------------- 103 //----------------------------generate_stubs-----------------------------------
103 void SharedRuntime::generate_stubs() { 104 void SharedRuntime::generate_stubs() {
104 _wrong_method_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method), "wrong_method_stub"); 105 _wrong_method_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method), "wrong_method_stub");
105 _ic_miss_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method_ic_miss), "ic_miss_stub"); 106 _wrong_method_abstract_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method_abstract), "wrong_method_abstract_stub");
106 _resolve_opt_virtual_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_opt_virtual_call_C), "resolve_opt_virtual_call"); 107 _ic_miss_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method_ic_miss), "ic_miss_stub");
107 _resolve_virtual_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_virtual_call_C), "resolve_virtual_call"); 108 _resolve_opt_virtual_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_opt_virtual_call_C), "resolve_opt_virtual_call");
108 _resolve_static_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_static_call_C), "resolve_static_call"); 109 _resolve_virtual_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_virtual_call_C), "resolve_virtual_call");
110 _resolve_static_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_static_call_C), "resolve_static_call");
109 111
110 #ifdef COMPILER2 112 #ifdef COMPILER2
111 // Vectors are generated only by C2. 113 // Vectors are generated only by C2.
112 if (is_wide_vector(MaxVectorSize)) { 114 if (is_wide_vector(MaxVectorSize)) {
113 _polling_page_vectors_safepoint_handler_blob = generate_handler_blob(CAST_FROM_FN_PTR(address, SafepointSynchronize::handle_polling_page_exception), POLL_AT_VECTOR_LOOP); 115 _polling_page_vectors_safepoint_handler_blob = generate_handler_blob(CAST_FROM_FN_PTR(address, SafepointSynchronize::handle_polling_page_exception), POLL_AT_VECTOR_LOOP);
1236 frame caller_frame = thread->last_frame().sender(&cbl_map); 1238 frame caller_frame = thread->last_frame().sender(&cbl_map);
1237 1239
1238 CodeBlob* caller_cb = caller_frame.cb(); 1240 CodeBlob* caller_cb = caller_frame.cb();
1239 guarantee(caller_cb != NULL && caller_cb->is_nmethod(), "must be called from nmethod"); 1241 guarantee(caller_cb != NULL && caller_cb->is_nmethod(), "must be called from nmethod");
1240 nmethod* caller_nm = caller_cb->as_nmethod_or_null(); 1242 nmethod* caller_nm = caller_cb->as_nmethod_or_null();
1243
1241 // make sure caller is not getting deoptimized 1244 // make sure caller is not getting deoptimized
1242 // and removed before we are done with it. 1245 // and removed before we are done with it.
1243 // CLEANUP - with lazy deopt shouldn't need this lock 1246 // CLEANUP - with lazy deopt shouldn't need this lock
1244 nmethodLocker caller_lock(caller_nm); 1247 nmethodLocker caller_lock(caller_nm);
1245
1246 1248
1247 // determine call info & receiver 1249 // determine call info & receiver
1248 // note: a) receiver is NULL for static calls 1250 // note: a) receiver is NULL for static calls
1249 // b) an exception is thrown if receiver is NULL for non-static calls 1251 // b) an exception is thrown if receiver is NULL for non-static calls
1250 CallInfo call_info; 1252 CallInfo call_info;
1256 assert((!is_virtual && invoke_code == Bytecodes::_invokestatic ) || 1258 assert((!is_virtual && invoke_code == Bytecodes::_invokestatic ) ||
1257 (!is_virtual && invoke_code == Bytecodes::_invokehandle ) || 1259 (!is_virtual && invoke_code == Bytecodes::_invokehandle ) ||
1258 (!is_virtual && invoke_code == Bytecodes::_invokedynamic) || 1260 (!is_virtual && invoke_code == Bytecodes::_invokedynamic) ||
1259 ( is_virtual && invoke_code != Bytecodes::_invokestatic ), "inconsistent bytecode"); 1261 ( is_virtual && invoke_code != Bytecodes::_invokestatic ), "inconsistent bytecode");
1260 1262
1263 // We do not patch the call site if the caller nmethod has been made non-entrant.
1264 if (!caller_nm->is_in_use()) {
1265 return callee_method;
1266 }
1267
1261 #ifndef PRODUCT 1268 #ifndef PRODUCT
1262 // tracing/debugging/statistics 1269 // tracing/debugging/statistics
1263 int *addr = (is_optimized) ? (&_resolve_opt_virtual_ctr) : 1270 int *addr = (is_optimized) ? (&_resolve_opt_virtual_ctr) :
1264 (is_virtual) ? (&_resolve_virtual_ctr) : 1271 (is_virtual) ? (&_resolve_virtual_ctr) :
1265 (&_resolve_static_ctr); 1272 (&_resolve_static_ctr);
1295 CompiledICInfo virtual_call_info; 1302 CompiledICInfo virtual_call_info;
1296 1303
1297 // Make sure the callee nmethod does not get deoptimized and removed before 1304 // Make sure the callee nmethod does not get deoptimized and removed before
1298 // we are done patching the code. 1305 // we are done patching the code.
1299 nmethod* callee_nm = callee_method->code(); 1306 nmethod* callee_nm = callee_method->code();
1307 if (callee_nm != NULL && !callee_nm->is_in_use()) {
1308 // Patch call site to C2I adapter if callee nmethod is deoptimized or unloaded.
1309 callee_nm = NULL;
1310 }
1300 nmethodLocker nl_callee(callee_nm); 1311 nmethodLocker nl_callee(callee_nm);
1301 #ifdef ASSERT 1312 #ifdef ASSERT
1302 address dest_entry_point = callee_nm == NULL ? 0 : callee_nm->entry_point(); // used below 1313 address dest_entry_point = callee_nm == NULL ? 0 : callee_nm->entry_point(); // used below
1303 #endif 1314 #endif
1304 1315
1316 1327
1317 // grab lock, check for deoptimization and potentially patch caller 1328 // grab lock, check for deoptimization and potentially patch caller
1318 { 1329 {
1319 MutexLocker ml_patch(CompiledIC_lock); 1330 MutexLocker ml_patch(CompiledIC_lock);
1320 1331
1332 // Lock blocks for safepoint during which both nmethods can change state.
1333
1321 // Now that we are ready to patch if the Method* was redefined then 1334 // Now that we are ready to patch if the Method* was redefined then
1322 // don't update call site and let the caller retry. 1335 // don't update call site and let the caller retry.
1323 1336 // Don't update call site if caller nmethod has been made non-entrant
1324 if (!callee_method->is_old()) { 1337 // as it is a waste of time.
1338 // Don't update call site if callee nmethod was unloaded or deoptimized.
1339 // Don't update call site if callee nmethod was replaced by an other nmethod
1340 // which may happen when multiply alive nmethod (tiered compilation)
1341 // will be supported.
1342 if (!callee_method->is_old() && caller_nm->is_in_use() &&
1343 (callee_nm == NULL || callee_nm->is_in_use() && (callee_method->code() == callee_nm))) {
1325 #ifdef ASSERT 1344 #ifdef ASSERT
1326 // We must not try to patch to jump to an already unloaded method. 1345 // We must not try to patch to jump to an already unloaded method.
1327 if (dest_entry_point != 0) { 1346 if (dest_entry_point != 0) {
1328 assert(CodeCache::find_blob(dest_entry_point) != NULL, 1347 CodeBlob* cb = CodeCache::find_blob(dest_entry_point);
1329 "should not unload nmethod while locked"); 1348 assert((cb != NULL) && cb->is_nmethod() && (((nmethod*)cb) == callee_nm),
1349 "should not call unloaded nmethod");
1330 } 1350 }
1331 #endif 1351 #endif
1332 if (is_virtual) { 1352 if (is_virtual) {
1333 nmethod* nm = callee_nm; 1353 nmethod* nm = callee_nm;
1334 if (nm == NULL) CodeCache::find_blob(caller_frame.pc()); 1354 if (nm == NULL) CodeCache::find_blob(caller_frame.pc());
1403 thread->set_vm_result_2(callee_method()); 1423 thread->set_vm_result_2(callee_method());
1404 JRT_BLOCK_END 1424 JRT_BLOCK_END
1405 // return compiled code entry point after potential safepoints 1425 // return compiled code entry point after potential safepoints
1406 assert(callee_method->verified_code_entry() != NULL, " Jump to zero!"); 1426 assert(callee_method->verified_code_entry() != NULL, " Jump to zero!");
1407 return callee_method->verified_code_entry(); 1427 return callee_method->verified_code_entry();
1428 JRT_END
1429
1430 // Handle abstract method call
1431 JRT_BLOCK_ENTRY(address, SharedRuntime::handle_wrong_method_abstract(JavaThread* thread))
1432 return StubRoutines::throw_AbstractMethodError_entry();
1408 JRT_END 1433 JRT_END
1409 1434
1410 1435
1411 // resolve a static call and patch code 1436 // resolve a static call and patch code
1412 JRT_BLOCK_ENTRY(address, SharedRuntime::resolve_static_call_C(JavaThread *thread )) 1437 JRT_BLOCK_ENTRY(address, SharedRuntime::resolve_static_call_C(JavaThread *thread ))
2401 if (_adapters != NULL) return; 2426 if (_adapters != NULL) return;
2402 _adapters = new AdapterHandlerTable(); 2427 _adapters = new AdapterHandlerTable();
2403 2428
2404 // Create a special handler for abstract methods. Abstract methods 2429 // Create a special handler for abstract methods. Abstract methods
2405 // are never compiled so an i2c entry is somewhat meaningless, but 2430 // are never compiled so an i2c entry is somewhat meaningless, but
2406 // fill it in with something appropriate just in case. Pass handle 2431 // throw AbstractMethodError just in case.
2407 // wrong method for the c2i transitions. 2432 // Pass wrong_method_abstract for the c2i transitions to return
2408 address wrong_method = SharedRuntime::get_handle_wrong_method_stub(); 2433 // AbstractMethodError for invalid invocations.
2434 address wrong_method_abstract = SharedRuntime::get_handle_wrong_method_abstract_stub();
2409 _abstract_method_handler = AdapterHandlerLibrary::new_entry(new AdapterFingerPrint(0, NULL), 2435 _abstract_method_handler = AdapterHandlerLibrary::new_entry(new AdapterFingerPrint(0, NULL),
2410 StubRoutines::throw_AbstractMethodError_entry(), 2436 StubRoutines::throw_AbstractMethodError_entry(),
2411 wrong_method, wrong_method); 2437 wrong_method_abstract, wrong_method_abstract);
2412 } 2438 }
2413 2439
2414 AdapterHandlerEntry* AdapterHandlerLibrary::new_entry(AdapterFingerPrint* fingerprint, 2440 AdapterHandlerEntry* AdapterHandlerLibrary::new_entry(AdapterFingerPrint* fingerprint,
2415 address i2c_entry, 2441 address i2c_entry,
2416 address c2i_entry, 2442 address c2i_entry,