equal
deleted
inserted
replaced
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. |