hotspot/src/share/vm/c1/c1_GraphBuilder.cpp
changeset 19710 2f8ca425504e
parent 18507 61bfc8995bb3
child 19715 a3f8b34430ef
equal deleted inserted replaced
19709:33aa3e85cc75 19710:2f8ca425504e
  1665   ciMethod*             target = stream()->get_method(will_link, &declared_signature);
  1665   ciMethod*             target = stream()->get_method(will_link, &declared_signature);
  1666   ciKlass*              holder = stream()->get_declared_method_holder();
  1666   ciKlass*              holder = stream()->get_declared_method_holder();
  1667   const Bytecodes::Code bc_raw = stream()->cur_bc_raw();
  1667   const Bytecodes::Code bc_raw = stream()->cur_bc_raw();
  1668   assert(declared_signature != NULL, "cannot be null");
  1668   assert(declared_signature != NULL, "cannot be null");
  1669 
  1669 
  1670   // FIXME bail out for now
  1670   if (!C1PatchInvokeDynamic && Bytecodes::has_optional_appendix(bc_raw) && !will_link) {
  1671   if (Bytecodes::has_optional_appendix(bc_raw) && !will_link) {
  1671     BAILOUT("unlinked call site (C1PatchInvokeDynamic is off)");
  1672     BAILOUT("unlinked call site (FIXME needs patching or recompile support)");
       
  1673   }
  1672   }
  1674 
  1673 
  1675   // we have to make sure the argument size (incl. the receiver)
  1674   // we have to make sure the argument size (incl. the receiver)
  1676   // is correct for compilation (the call would fail later during
  1675   // is correct for compilation (the call would fail later during
  1677   // linkage anyway) - was bug (gri 7/28/99)
  1676   // linkage anyway) - was bug (gri 7/28/99)
  1711       break;
  1710       break;
  1712     case Bytecodes::_invokehandle:
  1711     case Bytecodes::_invokehandle:
  1713       code = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokespecial;
  1712       code = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokespecial;
  1714       break;
  1713       break;
  1715     }
  1714     }
       
  1715   } else {
       
  1716     if (bc_raw == Bytecodes::_invokehandle) {
       
  1717       assert(!will_link, "should come here only for unlinked call");
       
  1718       code = Bytecodes::_invokespecial;
       
  1719     }
  1716   }
  1720   }
  1717 
  1721 
  1718   // Push appendix argument (MethodType, CallSite, etc.), if one.
  1722   // Push appendix argument (MethodType, CallSite, etc.), if one.
  1719   if (stream()->has_appendix()) {
  1723   bool patch_for_appendix = false;
       
  1724   int patching_appendix_arg = 0;
       
  1725   if (C1PatchInvokeDynamic &&
       
  1726       (Bytecodes::has_optional_appendix(bc_raw) && (!will_link || PatchALot))) {
       
  1727     Value arg = append(new Constant(new ObjectConstant(compilation()->env()->unloaded_ciinstance()), copy_state_before()));
       
  1728     apush(arg);
       
  1729     patch_for_appendix = true;
       
  1730     patching_appendix_arg = (will_link && stream()->has_appendix()) ? 0 : 1;
       
  1731   } else if (stream()->has_appendix()) {
  1720     ciObject* appendix = stream()->get_appendix();
  1732     ciObject* appendix = stream()->get_appendix();
  1721     Value arg = append(new Constant(new ObjectConstant(appendix)));
  1733     Value arg = append(new Constant(new ObjectConstant(appendix)));
  1722     apush(arg);
  1734     apush(arg);
  1723   }
  1735   }
  1724 
  1736 
  1730   ciMethod* exact_target = NULL;
  1742   ciMethod* exact_target = NULL;
  1731   Value better_receiver = NULL;
  1743   Value better_receiver = NULL;
  1732   if (UseCHA && DeoptC1 && klass->is_loaded() && target->is_loaded() &&
  1744   if (UseCHA && DeoptC1 && klass->is_loaded() && target->is_loaded() &&
  1733       !(// %%% FIXME: Are both of these relevant?
  1745       !(// %%% FIXME: Are both of these relevant?
  1734         target->is_method_handle_intrinsic() ||
  1746         target->is_method_handle_intrinsic() ||
  1735         target->is_compiled_lambda_form())) {
  1747         target->is_compiled_lambda_form()) &&
       
  1748       !patch_for_appendix) {
  1736     Value receiver = NULL;
  1749     Value receiver = NULL;
  1737     ciInstanceKlass* receiver_klass = NULL;
  1750     ciInstanceKlass* receiver_klass = NULL;
  1738     bool type_is_exact = false;
  1751     bool type_is_exact = false;
  1739     // try to find a precise receiver type
  1752     // try to find a precise receiver type
  1740     if (will_link && !target->is_static()) {
  1753     if (will_link && !target->is_static()) {
  1848   }
  1861   }
  1849 
  1862 
  1850   // check if we could do inlining
  1863   // check if we could do inlining
  1851   if (!PatchALot && Inline && klass->is_loaded() &&
  1864   if (!PatchALot && Inline && klass->is_loaded() &&
  1852       (klass->is_initialized() || klass->is_interface() && target->holder()->is_initialized())
  1865       (klass->is_initialized() || klass->is_interface() && target->holder()->is_initialized())
  1853       && target->is_loaded()) {
  1866       && target->is_loaded()
       
  1867       && !patch_for_appendix) {
  1854     // callee is known => check if we have static binding
  1868     // callee is known => check if we have static binding
  1855     assert(target->is_loaded(), "callee must be known");
  1869     assert(target->is_loaded(), "callee must be known");
  1856     if (code == Bytecodes::_invokestatic  ||
  1870     if (code == Bytecodes::_invokestatic  ||
  1857         code == Bytecodes::_invokespecial ||
  1871         code == Bytecodes::_invokespecial ||
  1858         code == Bytecodes::_invokevirtual && target->is_final_method() ||
  1872         code == Bytecodes::_invokevirtual && target->is_final_method() ||
  1899   // The bytecode (code) might change in this method so we are checking this very late.
  1913   // The bytecode (code) might change in this method so we are checking this very late.
  1900   const bool has_receiver =
  1914   const bool has_receiver =
  1901     code == Bytecodes::_invokespecial   ||
  1915     code == Bytecodes::_invokespecial   ||
  1902     code == Bytecodes::_invokevirtual   ||
  1916     code == Bytecodes::_invokevirtual   ||
  1903     code == Bytecodes::_invokeinterface;
  1917     code == Bytecodes::_invokeinterface;
  1904   Values* args = state()->pop_arguments(target->arg_size_no_receiver());
  1918   Values* args = state()->pop_arguments(target->arg_size_no_receiver() + patching_appendix_arg);
  1905   Value recv = has_receiver ? apop() : NULL;
  1919   Value recv = has_receiver ? apop() : NULL;
  1906   int vtable_index = Method::invalid_vtable_index;
  1920   int vtable_index = Method::invalid_vtable_index;
  1907 
  1921 
  1908 #ifdef SPARC
  1922 #ifdef SPARC
  1909   // Currently only supported on Sparc.
  1923   // Currently only supported on Sparc.