352 1, // abstract_with_no_concrete_subtype ctxk |
358 1, // abstract_with_no_concrete_subtype ctxk |
353 1, // concrete_with_no_concrete_subtype ctxk |
359 1, // concrete_with_no_concrete_subtype ctxk |
354 2, // unique_concrete_method ctxk, m |
360 2, // unique_concrete_method ctxk, m |
355 3, // unique_concrete_subtypes_2 ctxk, k1, k2 |
361 3, // unique_concrete_subtypes_2 ctxk, k1, k2 |
356 3, // unique_concrete_methods_2 ctxk, m1, m2 |
362 3, // unique_concrete_methods_2 ctxk, m1, m2 |
357 1 // no_finalizable_subclasses ctxk |
363 1, // no_finalizable_subclasses ctxk |
|
364 3 // call_site_target_value ctxk, call_site, method_handle |
358 }; |
365 }; |
359 |
366 |
360 const char* Dependencies::dep_name(Dependencies::DepType dept) { |
367 const char* Dependencies::dep_name(Dependencies::DepType dept) { |
361 if (!dept_in_mask(dept, all_types)) return "?bad-dep?"; |
368 if (!dept_in_mask(dept, all_types)) return "?bad-dep?"; |
362 return _dep_name[dept]; |
369 return _dep_name[dept]; |
363 } |
370 } |
364 |
371 |
365 int Dependencies::dep_args(Dependencies::DepType dept) { |
372 int Dependencies::dep_args(Dependencies::DepType dept) { |
366 if (!dept_in_mask(dept, all_types)) return -1; |
373 if (!dept_in_mask(dept, all_types)) return -1; |
367 return _dep_args[dept]; |
374 return _dep_args[dept]; |
|
375 } |
|
376 |
|
377 void Dependencies::check_valid_dependency_type(DepType dept) { |
|
378 for (int deptv = (int) FIRST_TYPE; deptv < (int) TYPE_LIMIT; deptv++) { |
|
379 if (dept == ((DepType) deptv)) return; |
|
380 } |
|
381 ShouldNotReachHere(); |
368 } |
382 } |
369 |
383 |
370 // for the sake of the compiler log, print out current dependencies: |
384 // for the sake of the compiler log, print out current dependencies: |
371 void Dependencies::log_all_dependencies() { |
385 void Dependencies::log_all_dependencies() { |
372 if (log() == NULL) return; |
386 if (log() == NULL) return; |
798 // the actual search method: |
812 // the actual search method: |
799 klassOop find_witness_anywhere(klassOop context_type, |
813 klassOop find_witness_anywhere(klassOop context_type, |
800 bool participants_hide_witnesses, |
814 bool participants_hide_witnesses, |
801 bool top_level_call = true); |
815 bool top_level_call = true); |
802 // the spot-checking version: |
816 // the spot-checking version: |
803 klassOop find_witness_in(DepChange& changes, |
817 klassOop find_witness_in(KlassDepChange& changes, |
804 klassOop context_type, |
818 klassOop context_type, |
805 bool participants_hide_witnesses); |
819 bool participants_hide_witnesses); |
806 public: |
820 public: |
807 klassOop find_witness_subtype(klassOop context_type, DepChange* changes = NULL) { |
821 klassOop find_witness_subtype(klassOop context_type, KlassDepChange* changes = NULL) { |
808 assert(doing_subtype_search(), "must set up a subtype search"); |
822 assert(doing_subtype_search(), "must set up a subtype search"); |
809 // When looking for unexpected concrete types, |
823 // When looking for unexpected concrete types, |
810 // do not look beneath expected ones. |
824 // do not look beneath expected ones. |
811 const bool participants_hide_witnesses = true; |
825 const bool participants_hide_witnesses = true; |
812 // CX > CC > C' is OK, even if C' is new. |
826 // CX > CC > C' is OK, even if C' is new. |
1135 // The type conck itself is allowed to have have further concrete subtypes. |
1149 // The type conck itself is allowed to have have further concrete subtypes. |
1136 // This allows the compiler to narrow occurrences of ctxk by conck, |
1150 // This allows the compiler to narrow occurrences of ctxk by conck, |
1137 // when dealing with the types of actual instances. |
1151 // when dealing with the types of actual instances. |
1138 klassOop Dependencies::check_abstract_with_unique_concrete_subtype(klassOop ctxk, |
1152 klassOop Dependencies::check_abstract_with_unique_concrete_subtype(klassOop ctxk, |
1139 klassOop conck, |
1153 klassOop conck, |
1140 DepChange* changes) { |
1154 KlassDepChange* changes) { |
1141 ClassHierarchyWalker wf(conck); |
1155 ClassHierarchyWalker wf(conck); |
1142 return wf.find_witness_subtype(ctxk, changes); |
1156 return wf.find_witness_subtype(ctxk, changes); |
1143 } |
1157 } |
1144 |
1158 |
1145 // If a non-concrete class has no concrete subtypes, it is not (yet) |
1159 // If a non-concrete class has no concrete subtypes, it is not (yet) |
1146 // instantiatable. This can allow the compiler to make some paths go |
1160 // instantiatable. This can allow the compiler to make some paths go |
1147 // dead, if they are gated by a test of the type. |
1161 // dead, if they are gated by a test of the type. |
1148 klassOop Dependencies::check_abstract_with_no_concrete_subtype(klassOop ctxk, |
1162 klassOop Dependencies::check_abstract_with_no_concrete_subtype(klassOop ctxk, |
1149 DepChange* changes) { |
1163 KlassDepChange* changes) { |
1150 // Find any concrete subtype, with no participants: |
1164 // Find any concrete subtype, with no participants: |
1151 ClassHierarchyWalker wf; |
1165 ClassHierarchyWalker wf; |
1152 return wf.find_witness_subtype(ctxk, changes); |
1166 return wf.find_witness_subtype(ctxk, changes); |
1153 } |
1167 } |
1154 |
1168 |
1155 |
1169 |
1156 // If a concrete class has no concrete subtypes, it can always be |
1170 // If a concrete class has no concrete subtypes, it can always be |
1157 // exactly typed. This allows the use of a cheaper type test. |
1171 // exactly typed. This allows the use of a cheaper type test. |
1158 klassOop Dependencies::check_concrete_with_no_concrete_subtype(klassOop ctxk, |
1172 klassOop Dependencies::check_concrete_with_no_concrete_subtype(klassOop ctxk, |
1159 DepChange* changes) { |
1173 KlassDepChange* changes) { |
1160 // Find any concrete subtype, with only the ctxk as participant: |
1174 // Find any concrete subtype, with only the ctxk as participant: |
1161 ClassHierarchyWalker wf(ctxk); |
1175 ClassHierarchyWalker wf(ctxk); |
1162 return wf.find_witness_subtype(ctxk, changes); |
1176 return wf.find_witness_subtype(ctxk, changes); |
1163 } |
1177 } |
1164 |
1178 |
1393 } |
1407 } |
1394 return result->as_klassOop(); |
1408 return result->as_klassOop(); |
1395 } |
1409 } |
1396 |
1410 |
1397 |
1411 |
1398 klassOop Dependencies::DepStream::check_dependency_impl(DepChange* changes) { |
1412 klassOop Dependencies::check_call_site_target_value(klassOop ctxk, oop call_site, oop method_handle, CallSiteDepChange* changes) { |
|
1413 assert(call_site ->is_a(SystemDictionary::CallSite_klass()), "sanity"); |
|
1414 assert(method_handle->is_a(SystemDictionary::MethodHandle_klass()), "sanity"); |
|
1415 if (changes == NULL) { |
|
1416 // Validate all CallSites |
|
1417 if (java_lang_invoke_CallSite::target(call_site) != method_handle) |
|
1418 return ctxk; // assertion failed |
|
1419 } else { |
|
1420 // Validate the given CallSite |
|
1421 if (call_site == changes->call_site() && java_lang_invoke_CallSite::target(call_site) != changes->method_handle()) { |
|
1422 assert(method_handle != changes->method_handle(), "must be"); |
|
1423 return ctxk; // assertion failed |
|
1424 } |
|
1425 } |
|
1426 assert(java_lang_invoke_CallSite::target(call_site) == method_handle, "should still be valid"); |
|
1427 return NULL; // assertion still valid |
|
1428 } |
|
1429 |
|
1430 |
|
1431 void Dependencies::DepStream::trace_and_log_witness(klassOop witness) { |
|
1432 if (witness != NULL) { |
|
1433 if (TraceDependencies) { |
|
1434 print_dependency(witness, /*verbose=*/ true); |
|
1435 } |
|
1436 // The following is a no-op unless logging is enabled: |
|
1437 log_dependency(witness); |
|
1438 } |
|
1439 } |
|
1440 |
|
1441 |
|
1442 klassOop Dependencies::DepStream::check_klass_dependency(KlassDepChange* changes) { |
1399 assert_locked_or_safepoint(Compile_lock); |
1443 assert_locked_or_safepoint(Compile_lock); |
|
1444 Dependencies::check_valid_dependency_type(type()); |
1400 |
1445 |
1401 klassOop witness = NULL; |
1446 klassOop witness = NULL; |
1402 switch (type()) { |
1447 switch (type()) { |
1403 case evol_method: |
1448 case evol_method: |
1404 witness = check_evol_method(method_argument(0)); |
1449 witness = check_evol_method(method_argument(0)); |
1405 break; |
1450 break; |
1406 case leaf_type: |
1451 case leaf_type: |
1407 witness = check_leaf_type(context_type()); |
1452 witness = check_leaf_type(context_type()); |
1408 break; |
1453 break; |
1409 case abstract_with_unique_concrete_subtype: |
1454 case abstract_with_unique_concrete_subtype: |
1410 witness = check_abstract_with_unique_concrete_subtype(context_type(), |
1455 witness = check_abstract_with_unique_concrete_subtype(context_type(), type_argument(1), changes); |
1411 type_argument(1), |
|
1412 changes); |
|
1413 break; |
1456 break; |
1414 case abstract_with_no_concrete_subtype: |
1457 case abstract_with_no_concrete_subtype: |
1415 witness = check_abstract_with_no_concrete_subtype(context_type(), |
1458 witness = check_abstract_with_no_concrete_subtype(context_type(), changes); |
1416 changes); |
|
1417 break; |
1459 break; |
1418 case concrete_with_no_concrete_subtype: |
1460 case concrete_with_no_concrete_subtype: |
1419 witness = check_concrete_with_no_concrete_subtype(context_type(), |
1461 witness = check_concrete_with_no_concrete_subtype(context_type(), changes); |
1420 changes); |
|
1421 break; |
1462 break; |
1422 case unique_concrete_method: |
1463 case unique_concrete_method: |
1423 witness = check_unique_concrete_method(context_type(), |
1464 witness = check_unique_concrete_method(context_type(), method_argument(1), changes); |
1424 method_argument(1), |
|
1425 changes); |
|
1426 break; |
1465 break; |
1427 case abstract_with_exclusive_concrete_subtypes_2: |
1466 case abstract_with_exclusive_concrete_subtypes_2: |
1428 witness = check_abstract_with_exclusive_concrete_subtypes(context_type(), |
1467 witness = check_abstract_with_exclusive_concrete_subtypes(context_type(), type_argument(1), type_argument(2), changes); |
1429 type_argument(1), |
|
1430 type_argument(2), |
|
1431 changes); |
|
1432 break; |
1468 break; |
1433 case exclusive_concrete_methods_2: |
1469 case exclusive_concrete_methods_2: |
1434 witness = check_exclusive_concrete_methods(context_type(), |
1470 witness = check_exclusive_concrete_methods(context_type(), method_argument(1), method_argument(2), changes); |
1435 method_argument(1), |
|
1436 method_argument(2), |
|
1437 changes); |
|
1438 break; |
1471 break; |
1439 case no_finalizable_subclasses: |
1472 case no_finalizable_subclasses: |
1440 witness = check_has_no_finalizable_subclasses(context_type(), |
1473 witness = check_has_no_finalizable_subclasses(context_type(), changes); |
1441 changes); |
|
1442 break; |
|
1443 default: |
|
1444 witness = NULL; |
|
1445 ShouldNotReachHere(); |
|
1446 break; |
|
1447 } |
|
1448 if (witness != NULL) { |
|
1449 if (TraceDependencies) { |
|
1450 print_dependency(witness, /*verbose=*/ true); |
|
1451 } |
|
1452 // The following is a no-op unless logging is enabled: |
|
1453 log_dependency(witness); |
|
1454 } |
|
1455 return witness; |
|
1456 } |
|
1457 |
|
1458 |
|
1459 klassOop Dependencies::DepStream::spot_check_dependency_at(DepChange& changes) { |
|
1460 if (!changes.involves_context(context_type())) |
|
1461 // irrelevant dependency; skip it |
|
1462 return NULL; |
|
1463 |
|
1464 return check_dependency_impl(&changes); |
|
1465 } |
|
1466 |
|
1467 |
|
1468 void DepChange::initialize() { |
|
1469 // entire transaction must be under this lock: |
|
1470 assert_lock_strong(Compile_lock); |
|
1471 |
|
1472 // Mark all dependee and all its superclasses |
|
1473 // Mark transitive interfaces |
|
1474 for (ContextStream str(*this); str.next(); ) { |
|
1475 klassOop d = str.klass(); |
|
1476 assert(!instanceKlass::cast(d)->is_marked_dependent(), "checking"); |
|
1477 instanceKlass::cast(d)->set_is_marked_dependent(true); |
|
1478 } |
|
1479 } |
|
1480 |
|
1481 DepChange::~DepChange() { |
|
1482 // Unmark all dependee and all its superclasses |
|
1483 // Unmark transitive interfaces |
|
1484 for (ContextStream str(*this); str.next(); ) { |
|
1485 klassOop d = str.klass(); |
|
1486 instanceKlass::cast(d)->set_is_marked_dependent(false); |
|
1487 } |
|
1488 } |
|
1489 |
|
1490 bool DepChange::involves_context(klassOop k) { |
|
1491 if (k == NULL || !Klass::cast(k)->oop_is_instance()) { |
|
1492 return false; |
|
1493 } |
|
1494 instanceKlass* ik = instanceKlass::cast(k); |
|
1495 bool is_contained = ik->is_marked_dependent(); |
|
1496 assert(is_contained == Klass::cast(new_type())->is_subtype_of(k), |
|
1497 "correct marking of potential context types"); |
|
1498 return is_contained; |
|
1499 } |
|
1500 |
|
1501 bool DepChange::ContextStream::next() { |
|
1502 switch (_change_type) { |
|
1503 case Start_Klass: // initial state; _klass is the new type |
|
1504 _ti_base = instanceKlass::cast(_klass)->transitive_interfaces(); |
|
1505 _ti_index = 0; |
|
1506 _change_type = Change_new_type; |
|
1507 return true; |
|
1508 case Change_new_type: |
|
1509 // fall through: |
|
1510 _change_type = Change_new_sub; |
|
1511 case Change_new_sub: |
|
1512 // 6598190: brackets workaround Sun Studio C++ compiler bug 6629277 |
|
1513 { |
|
1514 _klass = instanceKlass::cast(_klass)->super(); |
|
1515 if (_klass != NULL) { |
|
1516 return true; |
|
1517 } |
|
1518 } |
|
1519 // else set up _ti_limit and fall through: |
|
1520 _ti_limit = (_ti_base == NULL) ? 0 : _ti_base->length(); |
|
1521 _change_type = Change_new_impl; |
|
1522 case Change_new_impl: |
|
1523 if (_ti_index < _ti_limit) { |
|
1524 _klass = klassOop( _ti_base->obj_at(_ti_index++) ); |
|
1525 return true; |
|
1526 } |
|
1527 // fall through: |
|
1528 _change_type = NO_CHANGE; // iterator is exhausted |
|
1529 case NO_CHANGE: |
|
1530 break; |
1474 break; |
1531 default: |
1475 default: |
1532 ShouldNotReachHere(); |
1476 witness = NULL; |
1533 } |
1477 break; |
1534 return false; |
1478 } |
1535 } |
1479 trace_and_log_witness(witness); |
|
1480 return witness; |
|
1481 } |
|
1482 |
|
1483 |
|
1484 klassOop Dependencies::DepStream::check_call_site_dependency(CallSiteDepChange* changes) { |
|
1485 assert_locked_or_safepoint(Compile_lock); |
|
1486 Dependencies::check_valid_dependency_type(type()); |
|
1487 |
|
1488 klassOop witness = NULL; |
|
1489 switch (type()) { |
|
1490 case call_site_target_value: |
|
1491 witness = check_call_site_target_value(context_type(), argument(1), argument(2), changes); |
|
1492 break; |
|
1493 default: |
|
1494 witness = NULL; |
|
1495 break; |
|
1496 } |
|
1497 trace_and_log_witness(witness); |
|
1498 return witness; |
|
1499 } |
|
1500 |
|
1501 |
|
1502 klassOop Dependencies::DepStream::spot_check_dependency_at(DepChange& changes) { |
|
1503 // Handle klass dependency |
|
1504 if (changes.is_klass_change() && changes.as_klass_change()->involves_context(context_type())) |
|
1505 return check_klass_dependency(changes.as_klass_change()); |
|
1506 |
|
1507 // Handle CallSite dependency |
|
1508 if (changes.is_call_site_change()) |
|
1509 return check_call_site_dependency(changes.as_call_site_change()); |
|
1510 |
|
1511 // irrelevant dependency; skip it |
|
1512 return NULL; |
|
1513 } |
|
1514 |
1536 |
1515 |
1537 void DepChange::print() { |
1516 void DepChange::print() { |
1538 int nsup = 0, nint = 0; |
1517 int nsup = 0, nint = 0; |
1539 for (ContextStream str(*this); str.next(); ) { |
1518 for (ContextStream str(*this); str.next(); ) { |
1540 klassOop k = str.klass(); |
1519 klassOop k = str.klass(); |
1561 if (nsup + nint != 0) { |
1540 if (nsup + nint != 0) { |
1562 tty->print_cr(" context supers = %d, interfaces = %d", nsup, nint); |
1541 tty->print_cr(" context supers = %d, interfaces = %d", nsup, nint); |
1563 } |
1542 } |
1564 } |
1543 } |
1565 |
1544 |
|
1545 void DepChange::ContextStream::start() { |
|
1546 klassOop new_type = _changes.is_klass_change() ? _changes.as_klass_change()->new_type() : (klassOop) NULL; |
|
1547 _change_type = (new_type == NULL ? NO_CHANGE : Start_Klass); |
|
1548 _klass = new_type; |
|
1549 _ti_base = NULL; |
|
1550 _ti_index = 0; |
|
1551 _ti_limit = 0; |
|
1552 } |
|
1553 |
|
1554 bool DepChange::ContextStream::next() { |
|
1555 switch (_change_type) { |
|
1556 case Start_Klass: // initial state; _klass is the new type |
|
1557 _ti_base = instanceKlass::cast(_klass)->transitive_interfaces(); |
|
1558 _ti_index = 0; |
|
1559 _change_type = Change_new_type; |
|
1560 return true; |
|
1561 case Change_new_type: |
|
1562 // fall through: |
|
1563 _change_type = Change_new_sub; |
|
1564 case Change_new_sub: |
|
1565 // 6598190: brackets workaround Sun Studio C++ compiler bug 6629277 |
|
1566 { |
|
1567 _klass = instanceKlass::cast(_klass)->super(); |
|
1568 if (_klass != NULL) { |
|
1569 return true; |
|
1570 } |
|
1571 } |
|
1572 // else set up _ti_limit and fall through: |
|
1573 _ti_limit = (_ti_base == NULL) ? 0 : _ti_base->length(); |
|
1574 _change_type = Change_new_impl; |
|
1575 case Change_new_impl: |
|
1576 if (_ti_index < _ti_limit) { |
|
1577 _klass = klassOop( _ti_base->obj_at(_ti_index++) ); |
|
1578 return true; |
|
1579 } |
|
1580 // fall through: |
|
1581 _change_type = NO_CHANGE; // iterator is exhausted |
|
1582 case NO_CHANGE: |
|
1583 break; |
|
1584 default: |
|
1585 ShouldNotReachHere(); |
|
1586 } |
|
1587 return false; |
|
1588 } |
|
1589 |
|
1590 void KlassDepChange::initialize() { |
|
1591 // entire transaction must be under this lock: |
|
1592 assert_lock_strong(Compile_lock); |
|
1593 |
|
1594 // Mark all dependee and all its superclasses |
|
1595 // Mark transitive interfaces |
|
1596 for (ContextStream str(*this); str.next(); ) { |
|
1597 klassOop d = str.klass(); |
|
1598 assert(!instanceKlass::cast(d)->is_marked_dependent(), "checking"); |
|
1599 instanceKlass::cast(d)->set_is_marked_dependent(true); |
|
1600 } |
|
1601 } |
|
1602 |
|
1603 KlassDepChange::~KlassDepChange() { |
|
1604 // Unmark all dependee and all its superclasses |
|
1605 // Unmark transitive interfaces |
|
1606 for (ContextStream str(*this); str.next(); ) { |
|
1607 klassOop d = str.klass(); |
|
1608 instanceKlass::cast(d)->set_is_marked_dependent(false); |
|
1609 } |
|
1610 } |
|
1611 |
|
1612 bool KlassDepChange::involves_context(klassOop k) { |
|
1613 if (k == NULL || !Klass::cast(k)->oop_is_instance()) { |
|
1614 return false; |
|
1615 } |
|
1616 instanceKlass* ik = instanceKlass::cast(k); |
|
1617 bool is_contained = ik->is_marked_dependent(); |
|
1618 assert(is_contained == Klass::cast(new_type())->is_subtype_of(k), |
|
1619 "correct marking of potential context types"); |
|
1620 return is_contained; |
|
1621 } |
|
1622 |
1566 #ifndef PRODUCT |
1623 #ifndef PRODUCT |
1567 void Dependencies::print_statistics() { |
1624 void Dependencies::print_statistics() { |
1568 if (deps_find_witness_print != 0) { |
1625 if (deps_find_witness_print != 0) { |
1569 // Call one final time, to flush out the data. |
1626 // Call one final time, to flush out the data. |
1570 deps_find_witness_print = -1; |
1627 deps_find_witness_print = -1; |