hotspot/src/share/vm/interpreter/linkResolver.cpp
changeset 35463 b32e362563bb
parent 34666 1c7168ea0034
child 35495 e27da438fa13
equal deleted inserted replaced
35461:1068dcb8d315 35463:b32e362563bb
    30 #include "compiler/compileBroker.hpp"
    30 #include "compiler/compileBroker.hpp"
    31 #include "gc/shared/collectedHeap.inline.hpp"
    31 #include "gc/shared/collectedHeap.inline.hpp"
    32 #include "interpreter/bytecode.hpp"
    32 #include "interpreter/bytecode.hpp"
    33 #include "interpreter/interpreterRuntime.hpp"
    33 #include "interpreter/interpreterRuntime.hpp"
    34 #include "interpreter/linkResolver.hpp"
    34 #include "interpreter/linkResolver.hpp"
       
    35 #include "logging/log.hpp"
    35 #include "memory/resourceArea.hpp"
    36 #include "memory/resourceArea.hpp"
    36 #include "memory/universe.inline.hpp"
    37 #include "memory/universe.inline.hpp"
    37 #include "oops/instanceKlass.hpp"
    38 #include "oops/instanceKlass.hpp"
       
    39 #include "oops/method.hpp"
    38 #include "oops/objArrayOop.hpp"
    40 #include "oops/objArrayOop.hpp"
    39 #include "oops/oop.inline.hpp"
    41 #include "oops/oop.inline.hpp"
    40 #include "prims/methodHandles.hpp"
    42 #include "prims/methodHandles.hpp"
    41 #include "prims/nativeLookup.hpp"
    43 #include "prims/nativeLookup.hpp"
    42 #include "runtime/compilationPolicy.hpp"
    44 #include "runtime/compilationPolicy.hpp"
   726   }
   728   }
   727 
   729 
   728   return resolved_method;
   730   return resolved_method;
   729 }
   731 }
   730 
   732 
       
   733 static void trace_method_resolution(const char* prefix,
       
   734                                     KlassHandle klass,
       
   735                                     KlassHandle resolved_klass,
       
   736                                     const methodHandle& method,
       
   737                                     bool logitables,
       
   738                                     int index = -1) {
       
   739 #ifndef PRODUCT
       
   740   ResourceMark rm;
       
   741   outputStream* st;
       
   742   if (logitables) {
       
   743     st = LogHandle(itables)::trace_stream();
       
   744   } else {
       
   745     st = LogHandle(vtables)::trace_stream();
       
   746   }
       
   747   st->print("%s%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
       
   748             prefix,
       
   749             (klass.is_null() ? "<NULL>" : klass->internal_name()),
       
   750             (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
       
   751             Method::name_and_sig_as_C_string(resolved_klass(),
       
   752                                              method->name(),
       
   753                                              method->signature()),
       
   754             method->method_holder()->internal_name());
       
   755   method->print_linkage_flags(st);
       
   756   if (index != -1) {
       
   757     st->print("vtable_index:%d", index);
       
   758   }
       
   759   st->cr();
       
   760 #endif // PRODUCT
       
   761 }
       
   762 
   731 methodHandle LinkResolver::resolve_interface_method(const LinkInfo& link_info,
   763 methodHandle LinkResolver::resolve_interface_method(const LinkInfo& link_info,
   732                                                     bool nostatics, TRAPS) {
   764                                                     bool nostatics, TRAPS) {
   733 
   765 
   734   KlassHandle resolved_klass = link_info.resolved_klass();
   766   KlassHandle resolved_klass = link_info.resolved_klass();
   735 
   767 
   782                  Method::name_and_sig_as_C_string(resolved_klass(),
   814                  Method::name_and_sig_as_C_string(resolved_klass(),
   783                  resolved_method->name(), resolved_method->signature()));
   815                  resolved_method->name(), resolved_method->signature()));
   784     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   816     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   785   }
   817   }
   786 
   818 
   787   if (TraceItables && Verbose) {
   819   if (develop_log_is_enabled(Trace, itables)) {
   788     trace_method_resolution("invokeinterface resolved method: caller-class",
   820     trace_method_resolution("invokeinterface resolved method: caller-class",
   789                             link_info.current_klass(), resolved_klass, resolved_method);
   821                             link_info.current_klass(), resolved_klass,
   790     tty->cr();
   822                             resolved_method, true);
   791   }
   823   }
   792 
   824 
   793   return resolved_method;
   825   return resolved_method;
   794 }
   826 }
   795 
   827 
  1030                                                   resolved_method->name(),
  1062                                                   resolved_method->name(),
  1031                                                   resolved_method->signature()));
  1063                                                   resolved_method->signature()));
  1032     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
  1064     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
  1033   }
  1065   }
  1034 
  1066 
  1035   if (TraceItables && Verbose) {
  1067   if (develop_log_is_enabled(Trace, itables)) {
  1036     trace_method_resolution("invokespecial resolved method: caller-class:",
  1068     trace_method_resolution("invokespecial resolved method: caller-class:",
  1037                             current_klass, resolved_klass, resolved_method);
  1069                             current_klass, resolved_klass, resolved_method, true);
  1038     tty->cr();
       
  1039   }
  1070   }
  1040 
  1071 
  1041   return resolved_method;
  1072   return resolved_method;
  1042 }
  1073 }
  1043 
  1074 
  1102               Method::name_and_sig_as_C_string(resolved_klass(),
  1133               Method::name_and_sig_as_C_string(resolved_klass(),
  1103                                                sel_method->name(),
  1134                                                sel_method->name(),
  1104                                                sel_method->signature()));
  1135                                                sel_method->signature()));
  1105   }
  1136   }
  1106 
  1137 
  1107   if (TraceItables && Verbose) {
  1138   if (develop_log_is_enabled(Trace, itables)) {
  1108     trace_method_resolution("invokespecial selected method: resolved-class:",
  1139     trace_method_resolution("invokespecial selected method: resolved-class:",
  1109                             resolved_klass, resolved_klass, sel_method);
  1140                             resolved_klass, resolved_klass, sel_method, true);
  1110     tty->cr();
       
  1111   }
  1141   }
  1112 
  1142 
  1113   // setup result
  1143   // setup result
  1114   result.set_static(resolved_klass, sel_method, CHECK);
  1144   result.set_static(resolved_klass, sel_method, CHECK);
  1115 }
  1145 }
  1156                                                                                                              resolved_method->name(),
  1186                                                                                                              resolved_method->name(),
  1157                                                                                                              resolved_method->signature()));
  1187                                                                                                              resolved_method->signature()));
  1158     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
  1188     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
  1159   }
  1189   }
  1160 
  1190 
  1161   if (PrintVtables && Verbose) {
  1191   if (develop_log_is_enabled(Trace, vtables)) {
  1162     trace_method_resolution("invokevirtual resolved method: caller-class:",
  1192     trace_method_resolution("invokevirtual resolved method: caller-class:",
  1163                             current_klass, resolved_klass, resolved_method);
  1193                             current_klass, resolved_klass, resolved_method, false);
  1164     tty->cr();
       
  1165   }
  1194   }
  1166 
  1195 
  1167   return resolved_method;
  1196   return resolved_method;
  1168 }
  1197 }
  1169 
  1198 
  1237               Method::name_and_sig_as_C_string(resolved_klass(),
  1266               Method::name_and_sig_as_C_string(resolved_klass(),
  1238                                                       selected_method->name(),
  1267                                                       selected_method->name(),
  1239                                                       selected_method->signature()));
  1268                                                       selected_method->signature()));
  1240   }
  1269   }
  1241 
  1270 
  1242   if (PrintVtables && Verbose) {
  1271   if (develop_log_is_enabled(Trace, vtables)) {
  1243     trace_method_resolution("invokevirtual selected method: receiver-class:",
  1272     trace_method_resolution("invokevirtual selected method: receiver-class:",
  1244                             recv_klass, resolved_klass, selected_method);
  1273                             recv_klass, resolved_klass, selected_method,
  1245     tty->print_cr("vtable_index:%d", vtable_index);
  1274                             false, vtable_index);
  1246   }
  1275   }
  1247   // setup result
  1276   // setup result
  1248   result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK);
  1277   result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK);
  1249 }
  1278 }
  1250 
  1279 
  1336               Method::name_and_sig_as_C_string(recv_klass(),
  1365               Method::name_and_sig_as_C_string(recv_klass(),
  1337                                                       sel_method->name(),
  1366                                                       sel_method->name(),
  1338                                                       sel_method->signature()));
  1367                                                       sel_method->signature()));
  1339   }
  1368   }
  1340 
  1369 
  1341   if (TraceItables && Verbose) {
  1370   if (develop_log_is_enabled(Trace, itables)) {
  1342     trace_method_resolution("invokeinterface selected method: receiver-class",
  1371     trace_method_resolution("invokeinterface selected method: receiver-class",
  1343                             recv_klass, resolved_klass, sel_method);
  1372                             recv_klass, resolved_klass, sel_method, true);
  1344     tty->cr();
       
  1345   }
  1373   }
  1346   // setup result
  1374   // setup result
  1347   if (!resolved_method->has_itable_index()) {
  1375   if (!resolved_method->has_itable_index()) {
  1348     int vtable_index = resolved_method->vtable_index();
  1376     int vtable_index = resolved_method->vtable_index();
  1349     assert(vtable_index == sel_method->vtable_index(), "sanity check");
  1377     assert(vtable_index == sel_method->vtable_index(), "sanity check");
  1586                                                      THREAD);
  1614                                                      THREAD);
  1587   wrap_invokedynamic_exception(CHECK);
  1615   wrap_invokedynamic_exception(CHECK);
  1588   result.set_handle(resolved_method, resolved_appendix, resolved_method_type, THREAD);
  1616   result.set_handle(resolved_method, resolved_appendix, resolved_method_type, THREAD);
  1589   wrap_invokedynamic_exception(CHECK);
  1617   wrap_invokedynamic_exception(CHECK);
  1590 }
  1618 }
  1591 
       
  1592 #ifndef PRODUCT
       
  1593 void LinkResolver::trace_method_resolution(const char* prefix,
       
  1594                                            KlassHandle klass,
       
  1595                                            KlassHandle resolved_klass,
       
  1596                                            const methodHandle& method) {
       
  1597   ResourceMark rm;
       
  1598   tty->print("%s%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
       
  1599              prefix,
       
  1600              (klass.is_null() ? "<NULL>" : klass->internal_name()),
       
  1601              (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
       
  1602              Method::name_and_sig_as_C_string(resolved_klass(),
       
  1603                                               method->name(),
       
  1604                                               method->signature()),
       
  1605              method->method_holder()->internal_name()
       
  1606              );
       
  1607   method->access_flags().print_on(tty);
       
  1608   if (method->is_default_method()) {
       
  1609     tty->print("default ");
       
  1610   }
       
  1611   if (method->is_overpass()) {
       
  1612     tty->print("overpass ");
       
  1613   }
       
  1614 }
       
  1615 #endif // PRODUCT